Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Blockly
  5. Fenster und andere Geräte zählen opt. Alexa Ansagen

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.3k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.0k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.4k

Fenster und andere Geräte zählen opt. Alexa Ansagen

Geplant Angeheftet Gesperrt Verschoben Blockly
blocklyjavascript
1.2k Beiträge 41 Kommentatoren 413.2k Aufrufe 71 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • dslraserD dslraser
    Versionen 1.6.7
    aktualisiert am 23.12.2020
    Typ Blockly mit JavaScript Funktionen
    verwendete Adapter je nach dem was im Blockly aktiviert ist
    verwendete Geräte verschieden - gemischt
    was kann das Blockly wird hier beschrieben

    Hallo Zusammen.
    Ich stelle hier mein Blockly zum Geräte zählen und optional zum Ansagen über den Alexa2 Adapter über speak, sowie optionaler Versand über Telegram / E-Mail zur Verfügung.
    Das gesamte Blockly nutzt "alias'e". Alle anderen benötigten Datenpunkte erstellt und löscht das Blockly selbst, je nach dem was verwendet werden soll.
    Wer also keine alias erstellen oder nutzen möchte kann an dieser Stelle aufhören zu lesen, für alle anderen Interessierten versuche ich möglichst genau zu beschreiben was zu tun ist.

    Mit Alexa geht dann z.B.

    • Alexa, welche Fenster sind noch auf
    • Alexa, welche Türen sind noch auf
    • Alexa, welche Steckdosen sind noch an
    • Alexa, welche Lampen sind noch an
    • Alexa, was machen die Batterien
    • Alexa, welche Bewegungsmelder sind aktiv
    • Alexa, wie sind die Temperaturen (Ansage, aller Temperaturen meiner Räume und Außentemperatur nacheinander in einer Ansage)

    Welche Frage in welcher Formulierung gestellt wird bestimmt Ihr natürlich selbst, da dies über eine Routine in der Alexa App gesteuert wird. Dazu später mehr.

    Ein Hinweis gleich noch zu Beginn. Da die Ansage am angesprochenen ECHO erfolgen soll, kann es vorkommen, das, wenn es mehrere ECHO's in Hörweite gibt, die Ansage an einem anderen ECHO ausgegeben wird, weil sich ein anderer ECHO "angesprochen fühlt". Wenn ich in einem Raum bin, wo mich nur ein ECHO hören kann, funktioniert es bei mir zuverlässig.

    Meine verwendeten Adapter dafür sind:

    • Alexa2 Adapter 3.4.0
    • iot Adapter 1.8.8
    • Javascript Adapter 4.10.8
    • Telegram Adapter 1.5.9 (optional)
    • E-Mail Adapter 1.0.7 (optional)
    • und wenn gewünscht (optional) iQontrol 1.5.2
    • TR-064 4.2.1 Anruferansage (optional Telegram/EMAIL-extra Blockly im zweiten Beitrag)

    SmartGeräte für den iot Adapter werden direkt im Blockly erstellt, das sind dann die Button für die spätere Routine in der Amazon App.
    Das Blockly legt die benötigten Datenpunkte wahlweise unter 0_userdata.0 oder javascript.x selbst an (x=Javascript Instanznummer). Für die Erstellung der Datenpunkte nutze ich das Script von @Mic in einer Funktion. Dafür muß die Option "Erlaube das Kommando "setObject" im Javascript Adapter erlaubt sein.

    Bildschirmfoto 2020-04-08 um 12.05.38.png

    Der Versand aller Nachrichten (Telegram oder EMAIL) ist immer schaltbar, z.B. wenn man eine Anwesenheitsfunktion hat, dann könnte man den Versand bei Abwesenheit "scharf" schalten.
    Die Button hingegen funktionieren immer. Hier könnte man jeweils eine Routine in der Alexa App anlegen und den Versand des Gerätestatus-Versand auslösen.
    Z.B.
    Alexa, schicke mir den Fensterstatus.
    Alexa, schicke mir den Lichtstatus
    Alexa, schicke mir den Steckdosenstatus usw...

    Über diesen Weg lasse ich mir auch zum Beispiel auf Anforderung den Batteriestatus aller meiner Geräte mit Batterien als Liste schicken. Oder auch, Alexa schicke mir ein Bild von der Eingangskamera. Wenn man es auf die Spitze treibt, dann geht auch: Alexa, schicke mir den kompletten Status und dann trudeln bei mir nacheinander Bilder von drei Kameras, alle Batteriezustände, eine Liste mit geöffneten/gekippten Fenstern, ein Liste mit eingeschalteten Lampen usw. usw. usw. ein.

    Wenn Ihr nun Lust auf das Blockly habt, dann ist jetzt einmalig etwas Fleißarbeit angesagt. Bevor Ihr das Blockly nutzen könnt, müssen die Alias für Eure Geräte, die Ihr im Blockly verwenden wollt, erstellt werden. Dafür eignet sich die Scriptvorlage von @CruziX hervorragend. Mit dieser Vorlage können alle Alias auf einmal erstellt werden. Eine Vorlage als Beispiel findet Ihr im Spoiler. An dieser Stelle sei gleich gesagt, sinnvolle Namen im Alias zu verwenden (id ist egal, nur der Name ist gemeint), da diese Namen dann für alles im Blockly verwendet werden, also alle Gerätenamen allgemein. Also immer so erstellen, das sich der Name auch z.B. für Alexa aussprechen lässt.
    In der id keine Leerzeichen/Sonderzeichen oder Umlaute verwenden, damit vermeidet man direkt im Vorfeld mögliche Fehler.
    Als erstes solltet ihr in den Aufzählungen neue Funktionen erstellen, diese kann man dann gleich im alias Script benutzen. Da auf das Plus drücken.
    Bildschirmfoto 2020-06-29 um 21.16.04.png
    dann auf das Plus bei neue benutzerdefinierte Gruppe klicken
    Bildschirmfoto 2020-06-29 um 21.16.19.png

    Ich habe folgende erstellt (wenn Ihr die gleichen nehmt müsst Ihr das nichtmal im Blockly umstellen)

    batterien_voll_leer_alias
    batterien_volt_alias
    bewegungsmelder_alias
    fenster_alias
    licht_alias
    steckdosen_alias
    temperaturen_alias
    tueren_alias
    batterien_prozent_alias

    Das sind die Selektoren im Blockly

    Bildschirmfoto 2020-12-19 um 09.07.55.png
    Bildschirmfoto 2020-12-19 um 09.08.22.png
    Bildschirmfoto 2020-12-19 um 09.08.51.png
    Bildschirmfoto 2020-12-19 um 09.09.21.png
    Bildschirmfoto 2020-12-19 um 09.09.59.png
    Bildschirmfoto 2020-12-19 um 09.10.34.png
    Bildschirmfoto 2020-12-19 um 09.11.17.png
    Bildschirmfoto 2020-12-19 um 09.12.00.png
    Bildschirmfoto 2020-12-19 um 09.12.32.png

    Das ganze sieht dann nach dem Blockly Start in den Objekten z.B. so aus: (wenn alle Schalter im Blockly auf wahr stehen)

    Bildschirmfoto 2020-12-02 um 19.33.40.png

    01_Anzeigen_und_Listen

    Bildschirmfoto 2020-12-02 um 19.43.57.png

    02_Trigger_und_Schalter

    Bildschirmfoto 2020-12-02 um 19.44.12.png

    03_HTML_Daten hat zwei Unterordner

    Bildschirmfoto 2020-12-02 um 19.44.31.png

    01_HTML_Hell_Dunkel_Festeinstellung ist nicht veränderbar und sieht so aus (helle Einstellung aktiv)

    Bildschirmfoto 2020-12-02 um 19.45.09.png

    03_HTML_Eigene_Einstellung enthält die gleichen Datenpunkte und wird beim ersten verwenden des Triggers mit Standardwerten befüllt. Diese Werte können dann mit eigenen Werten überschrieben werden.

    Und hier noch der Rest

    Bildschirmfoto 2020-12-02 um 19.45.42.png

    Die Bilder bzw. Icon links und rechts habe ich als Base64 eingefügt. Ich benutze dafür das hier: https://www.base64-image.de/

    Wenn iQontrol installiert ist, dann funktioniert auch der Pfad zu einem Icon (einfach den eingestellten Pfad zum Icon aus iQontrol kopieren und einfügen)
    In den eigenen 02_HTML_Eigene_Einstellungen kann alles selbst an die eigenen Wünsche angepasst werden.

    Hier noch ein kurzes GiF
    (klick auf das linke Icon schaltet die Farbeinstellungen durch. klick auf das rechte Icon blendet die Tabelle ein und aus bzw. schaltet auf aktiv/inaktiv)
    20201202_200704.gif



    Das ganze sieht dann so bei mir aus (ich habe immer nur die ersten fünf auf den Bildern)

    Bildschirmfoto 2020-07-04 um 19.22.51.png

    Bildschirmfoto 2020-07-04 um 19.26.55.png

    Bildschirmfoto 2020-06-30 um 15.46.33.png

    Bildschirmfoto 2020-06-30 um 15.46.48.png

    Bildschirmfoto 2020-06-30 um 15.47.02.png

    Bildschirmfoto 2020-06-30 um 15.47.15.png

    Bildschirmfoto 2020-07-04 um 19.23.12.png

    Bildschirmfoto 2020-06-30 um 15.47.46.png


    Im Beispielvideo werden die eigenen Alias ab Zeile 271 eingefügt, also ab dem ersten createAlias
    Video Beispiel:
    Alias_per_Script_erstellen.m4v
    In der Vorlage habe ich jeweils zwei meiner verwendeten Geräte als Beispiel eingefügt.
    Hier und in den folgenden Beiträgen versuche ich die Alias Funktion vom Script etwas zu erklären:
    Klick Erklärung alias Funktion

    /**************************************************************
    Github - https://github.com/xCruziX/ioBroker-Creating-Alias/blob/master/CreateAlias.js
       			Changelog
    Version 1.1.4
    - fix error by using bCreateAliasPath and bConvertExistingPath (has no target 9/Error creating alias-path)
    **************************************************************/
    
    /**************************************
       	Flags /
       	Variablen
    ***************************************/
    
    // typeAlias = 'boolean'; // oder 'number'
    // read = "val == 'Ein' ? true : false"; // Erkennung "Aus" --> false erfolgt automatisch  
    // write = "val ? 'Ein' : 'Aus'";
    // nameAlias = 'Licht Haustür';
    // role = 'switch';
    // desc = 'per Script erstellt';
    // min = 0; // nur Zahlen
    // max = 100; // nur Zahlen
    // unit = '%'; // nur für Zahlen
    // states = {0: 'Aus', 1: 'Auto', 2: 'Ein'}; // Zahlen (Multistate) oder Logikwert (z.B. Aus/Ein)
    
    
    let bCreateAliasPath = true;  // If this flag is true, each folder is created seperately so rooms and functions can be assigned.
    
    /*
    Requirements: bCreateAliasPath == true
    If this flag is true, existing folders in the path will be converted so rooms and functions can be assigned.
    */
    let bConvertExistingPath = false;
    
    /***************************************
       	Don't change anything from here /
       	Ab hier nichts verändern
    ***************************************/
    
    let arEnum = [];
    let arId = [];
    let timeoutAssignEnum;
    var callbackAlias = undefined;
    function createAlias(idSrc, idDst,raum, gewerk,typeAlias, read, write, nameAlias, role, desc, min, max, unit, states) {
     if(!idDst.includes('alias.0.'))
         idDst = 'alias.0.' + idDst;
     if(!existsObject(idSrc))
     {
         log('Source-Id ' + idSrc +' does not exists.','warn');
         return;
     }
     
     // Create the object Path for alias id, 
     // so you can assign rooms and function to the parents
     var createAliasPath = (id) => {
          if(bCreateAliasPath){
               let lisMergedIds = [];
               let mergedId = 'alias.0';
               id = id.replace(mergedId + '.', ''); // Remove prefix alias so it will not be changed
               let split = id.split('.'); 
               for(let i=0;i<split.length-1;i++){
                   mergedId += '.' + split[i];
                   lisMergedIds.push(mergedId);
               }
               
               function path(){
                   if(lisMergedIds.length == 0) {
                       alias();
                       return;
                   }
                   let tmpId = lisMergedIds[0];
                   lisMergedIds.splice(0,1); // remove element
                   if(!existsObject(tmpId) || bConvertExistingPath){ // not exists
                       let obj;
                       if(existsObject(tmpId))
                           obj = getObject(tmpId);
                       else
                           obj = {};
    
                       let bApply = false;
                       if(obj != undefined){
                           if(obj.type == undefined || String(obj.type) != 'meta'){
                               obj.type = 'meta';
                               bApply = true;
                           }
                           if(obj.common == undefined){
                               obj.common = {};
                               obj.common.type = 'meta.folder';
                               bApply = true;
                           }
                           else if(obj.common.type == undefined || String(obj.common.type) != 'meta.folder'){
                               obj.common.type = 'meta.folder';
                               bApply = true;
                           }
                           if(obj.native == undefined){
                               obj.native = {};
                               bApply = true;
                           }
                       }
                       else{
                           path();
                           log('Object is undefined');
                           return;
                       }
                       
    
                       if(bApply){
                           setObject(tmpId, obj, (err) =>{
                           if(!err){
                               log('Created Alias-Path ' + tmpId);
                               path();
                           }
                           else
                               log('Error creating alias-path','error');
                       });
                       }
                       else
                           path();
                       
                   }
               }
               path();
          }
          else
            alias();
     }
     
     
     function alias(){
         // Create alias object
         
           if(!existsObject(idDst)){
               let obj = {};
               obj.type = 'state';
               obj.common = getObject(idSrc).common;
               obj.common.alias = {};
               obj.common.alias.id = idSrc;
               if(typeAlias !== undefined) 
                   obj.common.type = typeAlias;
               if(obj.common.read !== undefined) 
                   obj.common.alias.read = read;
               if(obj.common.write !== undefined) 
                   obj.common.alias.write = write;
               if(nameAlias !== undefined) 
                   obj.common.name = nameAlias;
               if(role !== undefined) 
                   obj.common.role = role;
               if(desc !== undefined) 
                   obj.common.desc = desc;
               if(min !== undefined) 
                   obj.common.min = min;
               if(max !== undefined) 
                   obj.common.max = max;
               if(unit !== undefined) 
                   obj.common.unit = unit;
               if(states !== undefined) 
                   obj.common.states = states;
    
               obj.native = {};
               obj.common.custom = []; // Damit die Zuordnung zu iQontrol, Sql etc. nicht übernommen wird
               log('Created Alias-State ' + idDst);
               setObject(idDst, obj,(err) =>{ 
                   if(!err)
                       startAttach(); 
                   else
                       log('Error creating-alias','error');
               });
           }
           else
               startAttach();
     }
     
     
     // Save ID and Enum (room or function)
     var attach = (id, enu,value) => {
         if(id.length == 0){
             log('ID has lenght 0, can not attach to enum','warn');
             return;
         }
         if(value.length == 0){
             log('Value has lenght 0','warn');
             return;
         }
       
         let sEnuId = 'enum.' + enu + '.' + value;
         if(enu.length > 0 && existsObject(sEnuId)) 
         {
             let obj = getObject(sEnuId)
             let members = obj.common.members;
             if(!members.includes(id)){
                 arEnum.push(sEnuId);
                 arId.push(id);
             }
         }
         else
      	      log('Can not find enum ' + sEnuId,'warn');
     }
    
    function startAttach(){
       let bRoom = raum !== undefined && raum.length > 0;
       let bGewerk = gewerk !== undefined && gewerk.length > 0;
       
       if(bRoom)
           attach(idDst,'rooms',raum);
       if(bGewerk)
           attach(idDst,'functions',gewerk);
       if(bRoom || bGewerk){
               if(timeoutAssignEnum){
                   clearTimeout(timeoutAssignEnum);
                   timeoutAssignEnum = null;
               }
               timeoutAssignEnum = setTimeout(finishScript,100);
       }
    }
    
     createAliasPath(idDst);
    }
    
    function finishScript(){
       assignEnums();
    }
    
    // Add the saved IDs to the rooms/functions
    function assignEnums(){
    if(arEnum.length == 0 || arId.length == 0){
         return;
    }
    
    if(arEnum.length != arId.length){
         log('Arrays have different size','error');
         return;
    }
    let mapEnumId = new Map();
    
    for(let i=0;i < arEnum.length; i++){
        let enu = arEnum[i];
        let id = arId[i];
        if(existsObject(id)){
       	 let obj = getObject(enu)
       	 let members;
       	 if(!mapEnumId.has(enu)){
       		 members = obj.common.members;
       		 mapEnumId.set(enu,members);
       	 }
       	 else
       		 members = mapEnumId.get(enu);    
       	 if(!members.includes(id)){
       		  log("Adding " + id + " to " + enu);
       		  members.push(id);
       	 }	      
        }
        else
            log('Can not find Alias ' + id,'error');
    }
     
     function setMembers(members,enu,map){
         let obj = getObject(enu);
         obj.common.members = members;
         setObject(enu,obj);
     }
     mapEnumId.forEach(setMembers);
    }
    
    /**********************************************************
       	END /
       	ENDE
    **********************************************************/
    
    //////////////////////////////
    //  Fenster
    //////////////////////////////
    //2 x Fenstersensoren HMIP
    //einfache HMIP Fenstersensoren über rpc-Adapter in function fenster_alias
    //{0: 'geschlossen', 1: 'geöffnet'}
    createAlias('hm-rpc.0.xxx.1.STATE'/*Wohnzimmer Fenster links STATE*/, 'Fenster.Wohnzimmer_Fenster_links', undefined, 'fenster_alias', 'number', undefined, undefined, 'Wohnzimmer links', 'window.value', 'per Script erstellt', 0, 1, '',{0: 'geschlossen', 1: 'geöffnet'})
    createAlias('hm-rpc.0.xxx.1.STATE'/*Küche Fenster links STATE*/, 'Fenster.Kueche_Fenster_links', undefined, 'fenster_alias', 'number',undefined, undefined, 'Küche links', 'window.value', 'per Script erstellt', 0, 1, '',{0: 'geschlossen', 1: 'geöffnet'})
    
    //2 x Fenstersensoren HM
    //einfache HM Fenstersensoren über rpc-Adapter in function fenster_alias
    //{false: 'geschlossen', true: 'geöffnet'}
    createAlias('hm-rpc.0.xxx.1.STATE'/*Wohnzimmer Fenster links STATE*/, 'Fenster.Wohnzimmer_Fenster_links', undefined, 'fenster_alias', 'boolean', undefined, undefined, 'Wohnzimmer links', 'window.value', 'per Script erstellt', undefined, undefined, undefined, {false: 'geschlossen', true: 'geöffnet'})
    createAlias('hm-rpc.0.xxx.1.STATE'/*Küche Fenster links STATE*/, 'Fenster.Kueche_Fenster_links', undefined, 'fenster_alias', 'boolean',undefined, undefined, 'Küche links', 'window.value', 'per Script erstellt', undefined, undefined, undefined, {false: 'geschlossen', true: 'geöffnet'})
    
    
    //2 x Fensterdrehgriffe HMIP
    //HMIP Fensterdrehgriffe über rpc-Adapter in function fenster_alias
    //{0: 'geschlossen', 1: 'gekippt', 2: 'geöffnet'}
    createAlias('hm-rpc.0.xxx.1.STATE'/*Keller W-Baum Fenster STATE*/, 'Fenster.Keller_Weihnachtsbaum_Fenster', undefined, 'fenster_alias', 'number',undefined, undefined, 'Keller W Baum', 'window.value', 'per Script erstellt', 0, 2, '',{0: 'geschlossen', 1: 'gekippt', 2: 'geöffnet'})
    createAlias('hm-rpc.0.xxx.1.STATE'/*Keller Wohnzimmer Fenster mitte STATE*/, 'Fenster.Keller_Wohnzimmer_Fenster_mitte', undefined, 'fenster_alias', 'number',undefined, undefined, 'Keller Wohnzimmer mitte', 'window.value', 'per Script erstellt', 0, 2, '',{0: 'geschlossen', 1: 'gekippt', 2: 'geöffnet'})
    
    //2 x Fenster(Türen) Sensoren HMIP
    //einfache HMIP Fenstersensoren über rpc-Adapter in function tueren_alias
    //{0: 'geschlossen', 1: 'geöffnet'}
    createAlias('hm-rpc.0.xxx.1.STATE'/*Wohnzimmer Terrassentür STATE*/, 'Tueren.Terrassentuer', undefined, 'tueren_alias', 'number',undefined, undefined, 'Terrassentür', 'window.value', 'per Script erstellt', 0, 1, '',{0: 'geschlossen', 1: 'geöffnet'})
    createAlias('hm-rpc.0.xxx.1.STATE'/*Haustür STATE*/, 'Tueren.Haustuer', undefined, 'tueren_alias', 'number',undefined, undefined, 'Haustür', 'window.value', 'per Script erstellt', 0, 1, '',{0: 'geschlossen', 1: 'geöffnet'})
    
    //////////////////////////////
    //  Steckdosen
    //////////////////////////////
    //2 x Steckdosen
    //HMIP Steckdosen über rpc-Adapter in function steckdosen_alias
    //{false: 'aus', true: 'an'}
    createAlias('hm-rpc.0.xxx.3.STATE'/*Waschmaschine STATE*/, 'Steckdosen.Waschmaschine', undefined, 'steckdosen_alias', 'boolean', undefined, undefined, 'Waschmaschine', 'switch', 'per Script erstellt', undefined, undefined, undefined, {false: 'aus', true: 'an'})
    createAlias('hm-rpc.0.xxx.3.STATE'/*Geschirrspueler STATE*/, 'Steckdosen.Geschirrspueler', undefined, 'steckdosen_alias', 'boolean', undefined, undefined, 'Geschirrspüler', 'switch', 'per Script erstellt', undefined, undefined, undefined, {false: 'aus', true: 'an'})
    
    //////////////////////////////
    //  Bewegungsmelder
    //////////////////////////////
    //2 x Bewegungsmelder und 2 x Präsenzmelder und 1 x Erschütterungssensor
    //HMIP Bewegungsmelder und Präsenzmelder über rpc-Adapter in function bewegungsmelder_alias
    //{false: 'inaktiv', true: 'aktiv'}
    createAlias('hm-rpc.0.xxx.1.MOTION'/*Bewegungsmelder Weihnachtsbaumkeller MOTION*/, 'Bewegungsmelder.Bewegungsmelder_Weihnachtsbaumkeller', undefined, 'bewegungsmelder_alias', 'boolean', undefined, undefined, 'W Baum Keller', 'sensor.motion', 'per Script erstellt', undefined, undefined, undefined, {false: 'inaktiv', true: 'aktiv'})
    createAlias('hm-rpc.0.xxx.1.MOTION'/*Bewegungsmelder Heizungskeller MOTION*/, 'Bewegungsmelder.Bewegungsmelder_Heizungskeller', undefined, 'bewegungsmelder_alias', 'boolean', undefined, undefined, 'Heizungskeller', 'sensor.motion', 'per Script erstellt', undefined, undefined, undefined, {false: 'inaktiv', true: 'aktiv'})
    //ab hier 2 x Präsenzmelder
    createAlias('hm-rpc.0.xxx.1.PRESENCE_DETECTION_STATE'/*Präsenzmelder Badezimmer PRESENCE DETECTION STATE*/, 'Bewegungsmelder.Praesenzmelder_Badezimmer', undefined, 'bewegungsmelder_alias', 'boolean', undefined, undefined, 'Badezimmer', 'sensor.motion', 'per Script erstellt', undefined, undefined, undefined, {false: 'inaktiv', true: 'aktiv'})
    createAlias('hm-rpc.0.xxx.1.PRESENCE_DETECTION_STATE'/*Präsenzmelder Dusche PRESENCE DETECTION STATE*/, 'Bewegungsmelder.Praesenzmelder_Dusche', undefined, 'bewegungsmelder_alias', 'boolean', undefined, undefined, 'Dusche', 'sensor.motion', 'per Script erstellt', undefined, undefined, undefined, {false: 'inaktiv', true: 'aktiv'})
    //ab hier 1 x Erschütterungssensor
    createAlias('hm-rpc.0.xxx.1.MOTION'/*Briefkasten MOTION*/, 'Bewegungsmelder.Praesenzmelder_Briefkasten', undefined, 'bewegungsmelder_alias', 'boolean', undefined, undefined, 'Briefkasten', 'sensor.motion', 'per Script erstellt', undefined, undefined, undefined, {false: 'inaktiv', true: 'aktiv'})
    
    //////////////////////////////
    //  Licht
    //////////////////////////////
    //2 x HUE und 5 x HMIP Licht über HUE und rpc-Adapter in function licht_alias
    //{false: 'aus', true: 'an'}
    createAlias('hue.0.Badezimmerlampe_links.on'/*Badezimmerlampe links on*/, 'Licht.Badezimmer_Licht_links', undefined, 'licht_alias', 'boolean', undefined, undefined, 'Badezimmer links', 'switch.light', 'per Script erstellt', undefined, undefined, undefined, {false: 'aus', true: 'an'})
    createAlias('hue.0.Badezimmerlampe_rechts.on'/*Badezimmerlampe rechts on*/, 'Licht.Badezimmer_Licht_rechts', undefined, 'licht_alias', 'boolean', undefined, undefined, 'Badezimmer rechts', 'switch.light', 'per Script erstellt', undefined, undefined, undefined, {false: 'aus', true: 'an'})
    
    //ab hier 2 x Licht HMIP Steckdosen über rpc Adapter
    createAlias('hm-rpc.0.xxx.3.STATE'/*Kugellampe STATE*/, 'Licht.Wohnzimmer_Kugel_Licht', undefined, 'licht_alias', 'boolean', undefined, undefined, 'Kugellicht', 'switch.light', 'per Script erstellt', undefined, undefined, undefined, {false: 'aus', true: 'an'})
    createAlias('hm-rpc.0.xxx.3.STATE'/*Gäste WC Licht STATE*/, 'Licht.Gaeste_WC_Licht', undefined, 'licht_alias', 'boolean', undefined, undefined, 'Gäste WC Licht', 'switch.light', 'per Script erstellt', undefined, undefined, undefined, {false: 'aus', true: 'an'})
    
    //////////////////////////////
    //  Temperaturen
    //////////////////////////////
    //HMIP 2 x Temperaturen über rpc-Adapter in function temperaturen_alias
    createAlias('hm-rpc.0.xxx.1.ACTUAL_TEMPERATURE'/*Wandthermostat Schlafzimmer:1 ACTUAL TEMPERATURE*/, 'Temperaturen.Temperatur_Schlafzimmer', undefined, 'temperaturen_alias', 'number', 'Math.round(val * 10) / 10', undefined, 'Schlafzimmer', 'value.temperature', 'per Script erstellt', undefined, undefined, '°C', undefined)
    createAlias('hm-rpc.0.xxx.1.ACTUAL_TEMPERATURE'/*Wandthermostat Wohnzimmer:1 ACTUAL TEMPERATURE*/, 'Temperaturen.Temperatur_Wohnzimmer', undefined, 'temperaturen_alias', 'number', 'Math.round(val * 10) / 10', undefined, 'Wohnzimmer', 'value.temperature', 'per Script erstellt', undefined, undefined, '°C', undefined)
    
    //////////////////////////////
    //  Batterien_voll_leer
    //////////////////////////////
    //2 x Batterien voll-leer über boolean Wert false/true in function batterien_voll_leer_alias
    createAlias('hm-rpc.0.xxx.0.LOW_BAT'/*Wohnzimmer Fenster links:0 LOW BAT*/, 'Batterien_voll_leer.Wohnzimmer_Fenster_links', undefined, 'batterien_voll_leer_alias', 'boolean', undefined, undefined, 'Wohnzimmer Fenster links', 'indicator.lowbat', 'per Script erstellt', undefined, undefined, undefined, {false: 'voll', true: 'leer'})
    createAlias('hm-rpc.0.xxx.0.LOW_BAT'/*Küche Fenster links:0 LOW BAT*/, 'Batterien_voll_leer.Kueche_Fenster_links', undefined, 'batterien_voll_leer_alias', 'boolean', undefined, undefined, 'Küche Fenster links', 'indicator.lowbat', 'per Script erstellt', undefined, undefined, undefined, {false: 'voll', true: 'leer'})
    
    //////////////////////////////
    //  Batterien_Volt
    //////////////////////////////
    //2 x Batterien Volt Anzeige in function batterien_volt_alias
    createAlias('hm-rpc.0.xxx.0.OPERATING_VOLTAGE'/*Wohnzimmer Fenster links:0 OPERATING VOLTAGE*/, 'Batterien_Volt.Wohnzimmer_Fenster_links', undefined, 'batterien_volt_alias', 'number', undefined, undefined, 'Wohnzimmer Fenster links', 'value.voltage', 'per Script erstellt', undefined, undefined, 'Volt', undefined)
    createAlias('hm-rpc.0.xxx.0.OPERATING_VOLTAGE'/*Küche Fenster links:0 OPERATING VOLTAGE*/, 'Batterien_Volt.Kueche_Fenster_links', undefined, 'batterien_volt_alias', 'number', undefined, undefined, 'Küche Fenster links', 'value.voltage', 'per Script erstellt', undefined, undefined, 'Volt', undefined)
    
    


    nach dem Alias erstellen das hier beachten: Klick


    bitte das Blockly auf den eigenen Rechner downloaden und dort mit einem Editor öffnen und den gesamten Inhalt der Textdatei in die Zwischenablage kopieren und anschließend in ein neues leeres Blockly importieren. Nicht direkt im Browser öffnen und kopieren, dann kommt es oft zu Umlaute Fehlern im Blockly.

    Hier ist der Blockly Export


    Temperaturen_1-6-7.zip


    Batterien_Volt_1-6-7.zip


    Steckdosen_1-6-7.zip


    Lichter_1-6-7.zip


    Bewegungsmelder_1-6-7.zip


    Batterien_voll_leer_1-6-7.zip


    Fenster_1-6-7.zip


    Tueren_1-6-7.zip


    Batterien_Prozent_1-6-7.zip

    meine iQontrol Einstellungen


    Bildschirmfoto 2020-12-03 um 08.00.37.png

    Bildschirmfoto 2020-12-03 um 08.00.50.png

    Bildschirmfoto 2020-12-03 um 08.02.31.png

    Bildschirmfoto 2020-12-03 um 08.03.03.png

    Bildschirmfoto 2020-12-03 um 08.03.44.png

    Bildschirmfoto 2020-12-03 um 08.04.20.png

    Bildschirmfoto 2020-12-03 um 08.05.09.png

    Bildschirmfoto 2020-12-03 um 08.06.48.png

    Bildschirmfoto 2020-12-03 um 08.07.24.png

    Bildschirmfoto 2020-12-03 um 08.08.20.png

    Bildschirmfoto 2020-12-03 um 08.09.00.png


    Hier der Export von diesem View
    2020-12-20_iqontrol_0_selected_views.json.zip

    20201220_092104.jpg




    Zuerst muß das neue SmartGerät aus iot gesucht und gefunden werden. Dazu ist es wichtig einmal den iot Adapter zu öffnen und in den Reiter "SMART-GERÄTE" zu wechseln. Das neue Gerät sollte da sein, aber wenn man diesen Schritt nicht macht, dann werden von Alexa keine neuen Geräte gefunden. Danach kann der Adapter wieder geschlossen werden.
    Bildschirmfoto 2020-04-26 um 15.34.49.png
    Nun entweder in der App neue Geräte suchen lassen, oder kurz den Sprachbefehl: "Alexa, suche neue Geräte" ausführen. Wenn das durchgelaufen ist und ein neues oder mehrere neue Geräte gefunden wurden, dann geht es mit dem Einrichten der Routine weiter.

    neue Geräte suchen lassen in der Alexa App

    2020-06-30 15.03.38.jpg

    ein neues Gerät (oder mehrere) wurde gefunden

    2020-06-30 15.04.00.jpg
    alles überspringen und dann zu den Routinen. Dort dann auf das Plus (oben rechts) drücken und eine neue Routine anlegen. Satz bzw. Frage eingeben bei Stimme

    2020-06-30 15.04.36.jpg

    Dann als nächstes die Aktion hinzufügen (SmartHome), alle Geräte auswählen und das passende Gerät einfügen.

    2020-06-30 15.04.55.jpg

    Oben rechts auf speichern, dann kurz warten und ausprobieren...

    dslraserD Offline
    dslraserD Offline
    dslraser
    Forum Testing Most Active
    schrieb am zuletzt editiert von
    #18

    ich habe den ersten Beitrag ergänzt/geändert. Ich habe einzelne Blockly Exporte erstellt und eingefügt.

    Ansage am angesprochenen ECHO
    Ansage auf bestimmten ECHO
    Ansage auf Multiroom-Musikgruppe

    Alle Varianten funktionieren über ssml Ansagen.
    In allen Varianten ist die gewünschte Ansage-Lautstärke einstellbar.

    1 Antwort Letzte Antwort
    0
    • L Offline
      L Offline
      linux150
      schrieb am zuletzt editiert von
      #19

      Hi!
      Ich wollte mal DANKE sagen für das tolle Script.
      Hat mir den Einstieg in Blockly wirklich erleichtert.
      Meine Alexas sagen mir nun detailiert die Wetterwerte meiner privaten Wetterstation. Hab das Script noch erweitert und funktioniert tadellos!

      LG
      linux150

      1 Antwort Letzte Antwort
      1
      • C Offline
        C Offline
        CruziX
        schrieb am zuletzt editiert von
        #20

        Alternativ könnte auch die Routine selber als Trigger verwendet werden.
        Dadurch hat man nicht so viele Geräte in der Alexa app, aber natürlich mehr aufwand durch die Erstellung der Routinen

        1 Antwort Letzte Antwort
        0
        • dslraserD dslraser
          Versionen 1.6.7
          aktualisiert am 23.12.2020
          Typ Blockly mit JavaScript Funktionen
          verwendete Adapter je nach dem was im Blockly aktiviert ist
          verwendete Geräte verschieden - gemischt
          was kann das Blockly wird hier beschrieben

          Hallo Zusammen.
          Ich stelle hier mein Blockly zum Geräte zählen und optional zum Ansagen über den Alexa2 Adapter über speak, sowie optionaler Versand über Telegram / E-Mail zur Verfügung.
          Das gesamte Blockly nutzt "alias'e". Alle anderen benötigten Datenpunkte erstellt und löscht das Blockly selbst, je nach dem was verwendet werden soll.
          Wer also keine alias erstellen oder nutzen möchte kann an dieser Stelle aufhören zu lesen, für alle anderen Interessierten versuche ich möglichst genau zu beschreiben was zu tun ist.

          Mit Alexa geht dann z.B.

          • Alexa, welche Fenster sind noch auf
          • Alexa, welche Türen sind noch auf
          • Alexa, welche Steckdosen sind noch an
          • Alexa, welche Lampen sind noch an
          • Alexa, was machen die Batterien
          • Alexa, welche Bewegungsmelder sind aktiv
          • Alexa, wie sind die Temperaturen (Ansage, aller Temperaturen meiner Räume und Außentemperatur nacheinander in einer Ansage)

          Welche Frage in welcher Formulierung gestellt wird bestimmt Ihr natürlich selbst, da dies über eine Routine in der Alexa App gesteuert wird. Dazu später mehr.

          Ein Hinweis gleich noch zu Beginn. Da die Ansage am angesprochenen ECHO erfolgen soll, kann es vorkommen, das, wenn es mehrere ECHO's in Hörweite gibt, die Ansage an einem anderen ECHO ausgegeben wird, weil sich ein anderer ECHO "angesprochen fühlt". Wenn ich in einem Raum bin, wo mich nur ein ECHO hören kann, funktioniert es bei mir zuverlässig.

          Meine verwendeten Adapter dafür sind:

          • Alexa2 Adapter 3.4.0
          • iot Adapter 1.8.8
          • Javascript Adapter 4.10.8
          • Telegram Adapter 1.5.9 (optional)
          • E-Mail Adapter 1.0.7 (optional)
          • und wenn gewünscht (optional) iQontrol 1.5.2
          • TR-064 4.2.1 Anruferansage (optional Telegram/EMAIL-extra Blockly im zweiten Beitrag)

          SmartGeräte für den iot Adapter werden direkt im Blockly erstellt, das sind dann die Button für die spätere Routine in der Amazon App.
          Das Blockly legt die benötigten Datenpunkte wahlweise unter 0_userdata.0 oder javascript.x selbst an (x=Javascript Instanznummer). Für die Erstellung der Datenpunkte nutze ich das Script von @Mic in einer Funktion. Dafür muß die Option "Erlaube das Kommando "setObject" im Javascript Adapter erlaubt sein.

          Bildschirmfoto 2020-04-08 um 12.05.38.png

          Der Versand aller Nachrichten (Telegram oder EMAIL) ist immer schaltbar, z.B. wenn man eine Anwesenheitsfunktion hat, dann könnte man den Versand bei Abwesenheit "scharf" schalten.
          Die Button hingegen funktionieren immer. Hier könnte man jeweils eine Routine in der Alexa App anlegen und den Versand des Gerätestatus-Versand auslösen.
          Z.B.
          Alexa, schicke mir den Fensterstatus.
          Alexa, schicke mir den Lichtstatus
          Alexa, schicke mir den Steckdosenstatus usw...

          Über diesen Weg lasse ich mir auch zum Beispiel auf Anforderung den Batteriestatus aller meiner Geräte mit Batterien als Liste schicken. Oder auch, Alexa schicke mir ein Bild von der Eingangskamera. Wenn man es auf die Spitze treibt, dann geht auch: Alexa, schicke mir den kompletten Status und dann trudeln bei mir nacheinander Bilder von drei Kameras, alle Batteriezustände, eine Liste mit geöffneten/gekippten Fenstern, ein Liste mit eingeschalteten Lampen usw. usw. usw. ein.

          Wenn Ihr nun Lust auf das Blockly habt, dann ist jetzt einmalig etwas Fleißarbeit angesagt. Bevor Ihr das Blockly nutzen könnt, müssen die Alias für Eure Geräte, die Ihr im Blockly verwenden wollt, erstellt werden. Dafür eignet sich die Scriptvorlage von @CruziX hervorragend. Mit dieser Vorlage können alle Alias auf einmal erstellt werden. Eine Vorlage als Beispiel findet Ihr im Spoiler. An dieser Stelle sei gleich gesagt, sinnvolle Namen im Alias zu verwenden (id ist egal, nur der Name ist gemeint), da diese Namen dann für alles im Blockly verwendet werden, also alle Gerätenamen allgemein. Also immer so erstellen, das sich der Name auch z.B. für Alexa aussprechen lässt.
          In der id keine Leerzeichen/Sonderzeichen oder Umlaute verwenden, damit vermeidet man direkt im Vorfeld mögliche Fehler.
          Als erstes solltet ihr in den Aufzählungen neue Funktionen erstellen, diese kann man dann gleich im alias Script benutzen. Da auf das Plus drücken.
          Bildschirmfoto 2020-06-29 um 21.16.04.png
          dann auf das Plus bei neue benutzerdefinierte Gruppe klicken
          Bildschirmfoto 2020-06-29 um 21.16.19.png

          Ich habe folgende erstellt (wenn Ihr die gleichen nehmt müsst Ihr das nichtmal im Blockly umstellen)

          batterien_voll_leer_alias
          batterien_volt_alias
          bewegungsmelder_alias
          fenster_alias
          licht_alias
          steckdosen_alias
          temperaturen_alias
          tueren_alias
          batterien_prozent_alias

          Das sind die Selektoren im Blockly

          Bildschirmfoto 2020-12-19 um 09.07.55.png
          Bildschirmfoto 2020-12-19 um 09.08.22.png
          Bildschirmfoto 2020-12-19 um 09.08.51.png
          Bildschirmfoto 2020-12-19 um 09.09.21.png
          Bildschirmfoto 2020-12-19 um 09.09.59.png
          Bildschirmfoto 2020-12-19 um 09.10.34.png
          Bildschirmfoto 2020-12-19 um 09.11.17.png
          Bildschirmfoto 2020-12-19 um 09.12.00.png
          Bildschirmfoto 2020-12-19 um 09.12.32.png

          Das ganze sieht dann nach dem Blockly Start in den Objekten z.B. so aus: (wenn alle Schalter im Blockly auf wahr stehen)

          Bildschirmfoto 2020-12-02 um 19.33.40.png

          01_Anzeigen_und_Listen

          Bildschirmfoto 2020-12-02 um 19.43.57.png

          02_Trigger_und_Schalter

          Bildschirmfoto 2020-12-02 um 19.44.12.png

          03_HTML_Daten hat zwei Unterordner

          Bildschirmfoto 2020-12-02 um 19.44.31.png

          01_HTML_Hell_Dunkel_Festeinstellung ist nicht veränderbar und sieht so aus (helle Einstellung aktiv)

          Bildschirmfoto 2020-12-02 um 19.45.09.png

          03_HTML_Eigene_Einstellung enthält die gleichen Datenpunkte und wird beim ersten verwenden des Triggers mit Standardwerten befüllt. Diese Werte können dann mit eigenen Werten überschrieben werden.

          Und hier noch der Rest

          Bildschirmfoto 2020-12-02 um 19.45.42.png

          Die Bilder bzw. Icon links und rechts habe ich als Base64 eingefügt. Ich benutze dafür das hier: https://www.base64-image.de/

          Wenn iQontrol installiert ist, dann funktioniert auch der Pfad zu einem Icon (einfach den eingestellten Pfad zum Icon aus iQontrol kopieren und einfügen)
          In den eigenen 02_HTML_Eigene_Einstellungen kann alles selbst an die eigenen Wünsche angepasst werden.

          Hier noch ein kurzes GiF
          (klick auf das linke Icon schaltet die Farbeinstellungen durch. klick auf das rechte Icon blendet die Tabelle ein und aus bzw. schaltet auf aktiv/inaktiv)
          20201202_200704.gif



          Das ganze sieht dann so bei mir aus (ich habe immer nur die ersten fünf auf den Bildern)

          Bildschirmfoto 2020-07-04 um 19.22.51.png

          Bildschirmfoto 2020-07-04 um 19.26.55.png

          Bildschirmfoto 2020-06-30 um 15.46.33.png

          Bildschirmfoto 2020-06-30 um 15.46.48.png

          Bildschirmfoto 2020-06-30 um 15.47.02.png

          Bildschirmfoto 2020-06-30 um 15.47.15.png

          Bildschirmfoto 2020-07-04 um 19.23.12.png

          Bildschirmfoto 2020-06-30 um 15.47.46.png


          Im Beispielvideo werden die eigenen Alias ab Zeile 271 eingefügt, also ab dem ersten createAlias
          Video Beispiel:
          Alias_per_Script_erstellen.m4v
          In der Vorlage habe ich jeweils zwei meiner verwendeten Geräte als Beispiel eingefügt.
          Hier und in den folgenden Beiträgen versuche ich die Alias Funktion vom Script etwas zu erklären:
          Klick Erklärung alias Funktion

          /**************************************************************
          Github - https://github.com/xCruziX/ioBroker-Creating-Alias/blob/master/CreateAlias.js
             			Changelog
          Version 1.1.4
          - fix error by using bCreateAliasPath and bConvertExistingPath (has no target 9/Error creating alias-path)
          **************************************************************/
          
          /**************************************
             	Flags /
             	Variablen
          ***************************************/
          
          // typeAlias = 'boolean'; // oder 'number'
          // read = "val == 'Ein' ? true : false"; // Erkennung "Aus" --> false erfolgt automatisch  
          // write = "val ? 'Ein' : 'Aus'";
          // nameAlias = 'Licht Haustür';
          // role = 'switch';
          // desc = 'per Script erstellt';
          // min = 0; // nur Zahlen
          // max = 100; // nur Zahlen
          // unit = '%'; // nur für Zahlen
          // states = {0: 'Aus', 1: 'Auto', 2: 'Ein'}; // Zahlen (Multistate) oder Logikwert (z.B. Aus/Ein)
          
          
          let bCreateAliasPath = true;  // If this flag is true, each folder is created seperately so rooms and functions can be assigned.
          
          /*
          Requirements: bCreateAliasPath == true
          If this flag is true, existing folders in the path will be converted so rooms and functions can be assigned.
          */
          let bConvertExistingPath = false;
          
          /***************************************
             	Don't change anything from here /
             	Ab hier nichts verändern
          ***************************************/
          
          let arEnum = [];
          let arId = [];
          let timeoutAssignEnum;
          var callbackAlias = undefined;
          function createAlias(idSrc, idDst,raum, gewerk,typeAlias, read, write, nameAlias, role, desc, min, max, unit, states) {
           if(!idDst.includes('alias.0.'))
               idDst = 'alias.0.' + idDst;
           if(!existsObject(idSrc))
           {
               log('Source-Id ' + idSrc +' does not exists.','warn');
               return;
           }
           
           // Create the object Path for alias id, 
           // so you can assign rooms and function to the parents
           var createAliasPath = (id) => {
                if(bCreateAliasPath){
                     let lisMergedIds = [];
                     let mergedId = 'alias.0';
                     id = id.replace(mergedId + '.', ''); // Remove prefix alias so it will not be changed
                     let split = id.split('.'); 
                     for(let i=0;i<split.length-1;i++){
                         mergedId += '.' + split[i];
                         lisMergedIds.push(mergedId);
                     }
                     
                     function path(){
                         if(lisMergedIds.length == 0) {
                             alias();
                             return;
                         }
                         let tmpId = lisMergedIds[0];
                         lisMergedIds.splice(0,1); // remove element
                         if(!existsObject(tmpId) || bConvertExistingPath){ // not exists
                             let obj;
                             if(existsObject(tmpId))
                                 obj = getObject(tmpId);
                             else
                                 obj = {};
          
                             let bApply = false;
                             if(obj != undefined){
                                 if(obj.type == undefined || String(obj.type) != 'meta'){
                                     obj.type = 'meta';
                                     bApply = true;
                                 }
                                 if(obj.common == undefined){
                                     obj.common = {};
                                     obj.common.type = 'meta.folder';
                                     bApply = true;
                                 }
                                 else if(obj.common.type == undefined || String(obj.common.type) != 'meta.folder'){
                                     obj.common.type = 'meta.folder';
                                     bApply = true;
                                 }
                                 if(obj.native == undefined){
                                     obj.native = {};
                                     bApply = true;
                                 }
                             }
                             else{
                                 path();
                                 log('Object is undefined');
                                 return;
                             }
                             
          
                             if(bApply){
                                 setObject(tmpId, obj, (err) =>{
                                 if(!err){
                                     log('Created Alias-Path ' + tmpId);
                                     path();
                                 }
                                 else
                                     log('Error creating alias-path','error');
                             });
                             }
                             else
                                 path();
                             
                         }
                     }
                     path();
                }
                else
                  alias();
           }
           
           
           function alias(){
               // Create alias object
               
                 if(!existsObject(idDst)){
                     let obj = {};
                     obj.type = 'state';
                     obj.common = getObject(idSrc).common;
                     obj.common.alias = {};
                     obj.common.alias.id = idSrc;
                     if(typeAlias !== undefined) 
                         obj.common.type = typeAlias;
                     if(obj.common.read !== undefined) 
                         obj.common.alias.read = read;
                     if(obj.common.write !== undefined) 
                         obj.common.alias.write = write;
                     if(nameAlias !== undefined) 
                         obj.common.name = nameAlias;
                     if(role !== undefined) 
                         obj.common.role = role;
                     if(desc !== undefined) 
                         obj.common.desc = desc;
                     if(min !== undefined) 
                         obj.common.min = min;
                     if(max !== undefined) 
                         obj.common.max = max;
                     if(unit !== undefined) 
                         obj.common.unit = unit;
                     if(states !== undefined) 
                         obj.common.states = states;
          
                     obj.native = {};
                     obj.common.custom = []; // Damit die Zuordnung zu iQontrol, Sql etc. nicht übernommen wird
                     log('Created Alias-State ' + idDst);
                     setObject(idDst, obj,(err) =>{ 
                         if(!err)
                             startAttach(); 
                         else
                             log('Error creating-alias','error');
                     });
                 }
                 else
                     startAttach();
           }
           
           
           // Save ID and Enum (room or function)
           var attach = (id, enu,value) => {
               if(id.length == 0){
                   log('ID has lenght 0, can not attach to enum','warn');
                   return;
               }
               if(value.length == 0){
                   log('Value has lenght 0','warn');
                   return;
               }
             
               let sEnuId = 'enum.' + enu + '.' + value;
               if(enu.length > 0 && existsObject(sEnuId)) 
               {
                   let obj = getObject(sEnuId)
                   let members = obj.common.members;
                   if(!members.includes(id)){
                       arEnum.push(sEnuId);
                       arId.push(id);
                   }
               }
               else
            	      log('Can not find enum ' + sEnuId,'warn');
           }
          
          function startAttach(){
             let bRoom = raum !== undefined && raum.length > 0;
             let bGewerk = gewerk !== undefined && gewerk.length > 0;
             
             if(bRoom)
                 attach(idDst,'rooms',raum);
             if(bGewerk)
                 attach(idDst,'functions',gewerk);
             if(bRoom || bGewerk){
                     if(timeoutAssignEnum){
                         clearTimeout(timeoutAssignEnum);
                         timeoutAssignEnum = null;
                     }
                     timeoutAssignEnum = setTimeout(finishScript,100);
             }
          }
          
           createAliasPath(idDst);
          }
          
          function finishScript(){
             assignEnums();
          }
          
          // Add the saved IDs to the rooms/functions
          function assignEnums(){
          if(arEnum.length == 0 || arId.length == 0){
               return;
          }
          
          if(arEnum.length != arId.length){
               log('Arrays have different size','error');
               return;
          }
          let mapEnumId = new Map();
          
          for(let i=0;i < arEnum.length; i++){
              let enu = arEnum[i];
              let id = arId[i];
              if(existsObject(id)){
             	 let obj = getObject(enu)
             	 let members;
             	 if(!mapEnumId.has(enu)){
             		 members = obj.common.members;
             		 mapEnumId.set(enu,members);
             	 }
             	 else
             		 members = mapEnumId.get(enu);    
             	 if(!members.includes(id)){
             		  log("Adding " + id + " to " + enu);
             		  members.push(id);
             	 }	      
              }
              else
                  log('Can not find Alias ' + id,'error');
          }
           
           function setMembers(members,enu,map){
               let obj = getObject(enu);
               obj.common.members = members;
               setObject(enu,obj);
           }
           mapEnumId.forEach(setMembers);
          }
          
          /**********************************************************
             	END /
             	ENDE
          **********************************************************/
          
          //////////////////////////////
          //  Fenster
          //////////////////////////////
          //2 x Fenstersensoren HMIP
          //einfache HMIP Fenstersensoren über rpc-Adapter in function fenster_alias
          //{0: 'geschlossen', 1: 'geöffnet'}
          createAlias('hm-rpc.0.xxx.1.STATE'/*Wohnzimmer Fenster links STATE*/, 'Fenster.Wohnzimmer_Fenster_links', undefined, 'fenster_alias', 'number', undefined, undefined, 'Wohnzimmer links', 'window.value', 'per Script erstellt', 0, 1, '',{0: 'geschlossen', 1: 'geöffnet'})
          createAlias('hm-rpc.0.xxx.1.STATE'/*Küche Fenster links STATE*/, 'Fenster.Kueche_Fenster_links', undefined, 'fenster_alias', 'number',undefined, undefined, 'Küche links', 'window.value', 'per Script erstellt', 0, 1, '',{0: 'geschlossen', 1: 'geöffnet'})
          
          //2 x Fenstersensoren HM
          //einfache HM Fenstersensoren über rpc-Adapter in function fenster_alias
          //{false: 'geschlossen', true: 'geöffnet'}
          createAlias('hm-rpc.0.xxx.1.STATE'/*Wohnzimmer Fenster links STATE*/, 'Fenster.Wohnzimmer_Fenster_links', undefined, 'fenster_alias', 'boolean', undefined, undefined, 'Wohnzimmer links', 'window.value', 'per Script erstellt', undefined, undefined, undefined, {false: 'geschlossen', true: 'geöffnet'})
          createAlias('hm-rpc.0.xxx.1.STATE'/*Küche Fenster links STATE*/, 'Fenster.Kueche_Fenster_links', undefined, 'fenster_alias', 'boolean',undefined, undefined, 'Küche links', 'window.value', 'per Script erstellt', undefined, undefined, undefined, {false: 'geschlossen', true: 'geöffnet'})
          
          
          //2 x Fensterdrehgriffe HMIP
          //HMIP Fensterdrehgriffe über rpc-Adapter in function fenster_alias
          //{0: 'geschlossen', 1: 'gekippt', 2: 'geöffnet'}
          createAlias('hm-rpc.0.xxx.1.STATE'/*Keller W-Baum Fenster STATE*/, 'Fenster.Keller_Weihnachtsbaum_Fenster', undefined, 'fenster_alias', 'number',undefined, undefined, 'Keller W Baum', 'window.value', 'per Script erstellt', 0, 2, '',{0: 'geschlossen', 1: 'gekippt', 2: 'geöffnet'})
          createAlias('hm-rpc.0.xxx.1.STATE'/*Keller Wohnzimmer Fenster mitte STATE*/, 'Fenster.Keller_Wohnzimmer_Fenster_mitte', undefined, 'fenster_alias', 'number',undefined, undefined, 'Keller Wohnzimmer mitte', 'window.value', 'per Script erstellt', 0, 2, '',{0: 'geschlossen', 1: 'gekippt', 2: 'geöffnet'})
          
          //2 x Fenster(Türen) Sensoren HMIP
          //einfache HMIP Fenstersensoren über rpc-Adapter in function tueren_alias
          //{0: 'geschlossen', 1: 'geöffnet'}
          createAlias('hm-rpc.0.xxx.1.STATE'/*Wohnzimmer Terrassentür STATE*/, 'Tueren.Terrassentuer', undefined, 'tueren_alias', 'number',undefined, undefined, 'Terrassentür', 'window.value', 'per Script erstellt', 0, 1, '',{0: 'geschlossen', 1: 'geöffnet'})
          createAlias('hm-rpc.0.xxx.1.STATE'/*Haustür STATE*/, 'Tueren.Haustuer', undefined, 'tueren_alias', 'number',undefined, undefined, 'Haustür', 'window.value', 'per Script erstellt', 0, 1, '',{0: 'geschlossen', 1: 'geöffnet'})
          
          //////////////////////////////
          //  Steckdosen
          //////////////////////////////
          //2 x Steckdosen
          //HMIP Steckdosen über rpc-Adapter in function steckdosen_alias
          //{false: 'aus', true: 'an'}
          createAlias('hm-rpc.0.xxx.3.STATE'/*Waschmaschine STATE*/, 'Steckdosen.Waschmaschine', undefined, 'steckdosen_alias', 'boolean', undefined, undefined, 'Waschmaschine', 'switch', 'per Script erstellt', undefined, undefined, undefined, {false: 'aus', true: 'an'})
          createAlias('hm-rpc.0.xxx.3.STATE'/*Geschirrspueler STATE*/, 'Steckdosen.Geschirrspueler', undefined, 'steckdosen_alias', 'boolean', undefined, undefined, 'Geschirrspüler', 'switch', 'per Script erstellt', undefined, undefined, undefined, {false: 'aus', true: 'an'})
          
          //////////////////////////////
          //  Bewegungsmelder
          //////////////////////////////
          //2 x Bewegungsmelder und 2 x Präsenzmelder und 1 x Erschütterungssensor
          //HMIP Bewegungsmelder und Präsenzmelder über rpc-Adapter in function bewegungsmelder_alias
          //{false: 'inaktiv', true: 'aktiv'}
          createAlias('hm-rpc.0.xxx.1.MOTION'/*Bewegungsmelder Weihnachtsbaumkeller MOTION*/, 'Bewegungsmelder.Bewegungsmelder_Weihnachtsbaumkeller', undefined, 'bewegungsmelder_alias', 'boolean', undefined, undefined, 'W Baum Keller', 'sensor.motion', 'per Script erstellt', undefined, undefined, undefined, {false: 'inaktiv', true: 'aktiv'})
          createAlias('hm-rpc.0.xxx.1.MOTION'/*Bewegungsmelder Heizungskeller MOTION*/, 'Bewegungsmelder.Bewegungsmelder_Heizungskeller', undefined, 'bewegungsmelder_alias', 'boolean', undefined, undefined, 'Heizungskeller', 'sensor.motion', 'per Script erstellt', undefined, undefined, undefined, {false: 'inaktiv', true: 'aktiv'})
          //ab hier 2 x Präsenzmelder
          createAlias('hm-rpc.0.xxx.1.PRESENCE_DETECTION_STATE'/*Präsenzmelder Badezimmer PRESENCE DETECTION STATE*/, 'Bewegungsmelder.Praesenzmelder_Badezimmer', undefined, 'bewegungsmelder_alias', 'boolean', undefined, undefined, 'Badezimmer', 'sensor.motion', 'per Script erstellt', undefined, undefined, undefined, {false: 'inaktiv', true: 'aktiv'})
          createAlias('hm-rpc.0.xxx.1.PRESENCE_DETECTION_STATE'/*Präsenzmelder Dusche PRESENCE DETECTION STATE*/, 'Bewegungsmelder.Praesenzmelder_Dusche', undefined, 'bewegungsmelder_alias', 'boolean', undefined, undefined, 'Dusche', 'sensor.motion', 'per Script erstellt', undefined, undefined, undefined, {false: 'inaktiv', true: 'aktiv'})
          //ab hier 1 x Erschütterungssensor
          createAlias('hm-rpc.0.xxx.1.MOTION'/*Briefkasten MOTION*/, 'Bewegungsmelder.Praesenzmelder_Briefkasten', undefined, 'bewegungsmelder_alias', 'boolean', undefined, undefined, 'Briefkasten', 'sensor.motion', 'per Script erstellt', undefined, undefined, undefined, {false: 'inaktiv', true: 'aktiv'})
          
          //////////////////////////////
          //  Licht
          //////////////////////////////
          //2 x HUE und 5 x HMIP Licht über HUE und rpc-Adapter in function licht_alias
          //{false: 'aus', true: 'an'}
          createAlias('hue.0.Badezimmerlampe_links.on'/*Badezimmerlampe links on*/, 'Licht.Badezimmer_Licht_links', undefined, 'licht_alias', 'boolean', undefined, undefined, 'Badezimmer links', 'switch.light', 'per Script erstellt', undefined, undefined, undefined, {false: 'aus', true: 'an'})
          createAlias('hue.0.Badezimmerlampe_rechts.on'/*Badezimmerlampe rechts on*/, 'Licht.Badezimmer_Licht_rechts', undefined, 'licht_alias', 'boolean', undefined, undefined, 'Badezimmer rechts', 'switch.light', 'per Script erstellt', undefined, undefined, undefined, {false: 'aus', true: 'an'})
          
          //ab hier 2 x Licht HMIP Steckdosen über rpc Adapter
          createAlias('hm-rpc.0.xxx.3.STATE'/*Kugellampe STATE*/, 'Licht.Wohnzimmer_Kugel_Licht', undefined, 'licht_alias', 'boolean', undefined, undefined, 'Kugellicht', 'switch.light', 'per Script erstellt', undefined, undefined, undefined, {false: 'aus', true: 'an'})
          createAlias('hm-rpc.0.xxx.3.STATE'/*Gäste WC Licht STATE*/, 'Licht.Gaeste_WC_Licht', undefined, 'licht_alias', 'boolean', undefined, undefined, 'Gäste WC Licht', 'switch.light', 'per Script erstellt', undefined, undefined, undefined, {false: 'aus', true: 'an'})
          
          //////////////////////////////
          //  Temperaturen
          //////////////////////////////
          //HMIP 2 x Temperaturen über rpc-Adapter in function temperaturen_alias
          createAlias('hm-rpc.0.xxx.1.ACTUAL_TEMPERATURE'/*Wandthermostat Schlafzimmer:1 ACTUAL TEMPERATURE*/, 'Temperaturen.Temperatur_Schlafzimmer', undefined, 'temperaturen_alias', 'number', 'Math.round(val * 10) / 10', undefined, 'Schlafzimmer', 'value.temperature', 'per Script erstellt', undefined, undefined, '°C', undefined)
          createAlias('hm-rpc.0.xxx.1.ACTUAL_TEMPERATURE'/*Wandthermostat Wohnzimmer:1 ACTUAL TEMPERATURE*/, 'Temperaturen.Temperatur_Wohnzimmer', undefined, 'temperaturen_alias', 'number', 'Math.round(val * 10) / 10', undefined, 'Wohnzimmer', 'value.temperature', 'per Script erstellt', undefined, undefined, '°C', undefined)
          
          //////////////////////////////
          //  Batterien_voll_leer
          //////////////////////////////
          //2 x Batterien voll-leer über boolean Wert false/true in function batterien_voll_leer_alias
          createAlias('hm-rpc.0.xxx.0.LOW_BAT'/*Wohnzimmer Fenster links:0 LOW BAT*/, 'Batterien_voll_leer.Wohnzimmer_Fenster_links', undefined, 'batterien_voll_leer_alias', 'boolean', undefined, undefined, 'Wohnzimmer Fenster links', 'indicator.lowbat', 'per Script erstellt', undefined, undefined, undefined, {false: 'voll', true: 'leer'})
          createAlias('hm-rpc.0.xxx.0.LOW_BAT'/*Küche Fenster links:0 LOW BAT*/, 'Batterien_voll_leer.Kueche_Fenster_links', undefined, 'batterien_voll_leer_alias', 'boolean', undefined, undefined, 'Küche Fenster links', 'indicator.lowbat', 'per Script erstellt', undefined, undefined, undefined, {false: 'voll', true: 'leer'})
          
          //////////////////////////////
          //  Batterien_Volt
          //////////////////////////////
          //2 x Batterien Volt Anzeige in function batterien_volt_alias
          createAlias('hm-rpc.0.xxx.0.OPERATING_VOLTAGE'/*Wohnzimmer Fenster links:0 OPERATING VOLTAGE*/, 'Batterien_Volt.Wohnzimmer_Fenster_links', undefined, 'batterien_volt_alias', 'number', undefined, undefined, 'Wohnzimmer Fenster links', 'value.voltage', 'per Script erstellt', undefined, undefined, 'Volt', undefined)
          createAlias('hm-rpc.0.xxx.0.OPERATING_VOLTAGE'/*Küche Fenster links:0 OPERATING VOLTAGE*/, 'Batterien_Volt.Kueche_Fenster_links', undefined, 'batterien_volt_alias', 'number', undefined, undefined, 'Küche Fenster links', 'value.voltage', 'per Script erstellt', undefined, undefined, 'Volt', undefined)
          
          


          nach dem Alias erstellen das hier beachten: Klick


          bitte das Blockly auf den eigenen Rechner downloaden und dort mit einem Editor öffnen und den gesamten Inhalt der Textdatei in die Zwischenablage kopieren und anschließend in ein neues leeres Blockly importieren. Nicht direkt im Browser öffnen und kopieren, dann kommt es oft zu Umlaute Fehlern im Blockly.

          Hier ist der Blockly Export


          Temperaturen_1-6-7.zip


          Batterien_Volt_1-6-7.zip


          Steckdosen_1-6-7.zip


          Lichter_1-6-7.zip


          Bewegungsmelder_1-6-7.zip


          Batterien_voll_leer_1-6-7.zip


          Fenster_1-6-7.zip


          Tueren_1-6-7.zip


          Batterien_Prozent_1-6-7.zip

          meine iQontrol Einstellungen


          Bildschirmfoto 2020-12-03 um 08.00.37.png

          Bildschirmfoto 2020-12-03 um 08.00.50.png

          Bildschirmfoto 2020-12-03 um 08.02.31.png

          Bildschirmfoto 2020-12-03 um 08.03.03.png

          Bildschirmfoto 2020-12-03 um 08.03.44.png

          Bildschirmfoto 2020-12-03 um 08.04.20.png

          Bildschirmfoto 2020-12-03 um 08.05.09.png

          Bildschirmfoto 2020-12-03 um 08.06.48.png

          Bildschirmfoto 2020-12-03 um 08.07.24.png

          Bildschirmfoto 2020-12-03 um 08.08.20.png

          Bildschirmfoto 2020-12-03 um 08.09.00.png


          Hier der Export von diesem View
          2020-12-20_iqontrol_0_selected_views.json.zip

          20201220_092104.jpg




          Zuerst muß das neue SmartGerät aus iot gesucht und gefunden werden. Dazu ist es wichtig einmal den iot Adapter zu öffnen und in den Reiter "SMART-GERÄTE" zu wechseln. Das neue Gerät sollte da sein, aber wenn man diesen Schritt nicht macht, dann werden von Alexa keine neuen Geräte gefunden. Danach kann der Adapter wieder geschlossen werden.
          Bildschirmfoto 2020-04-26 um 15.34.49.png
          Nun entweder in der App neue Geräte suchen lassen, oder kurz den Sprachbefehl: "Alexa, suche neue Geräte" ausführen. Wenn das durchgelaufen ist und ein neues oder mehrere neue Geräte gefunden wurden, dann geht es mit dem Einrichten der Routine weiter.

          neue Geräte suchen lassen in der Alexa App

          2020-06-30 15.03.38.jpg

          ein neues Gerät (oder mehrere) wurde gefunden

          2020-06-30 15.04.00.jpg
          alles überspringen und dann zu den Routinen. Dort dann auf das Plus (oben rechts) drücken und eine neue Routine anlegen. Satz bzw. Frage eingeben bei Stimme

          2020-06-30 15.04.36.jpg

          Dann als nächstes die Aktion hinzufügen (SmartHome), alle Geräte auswählen und das passende Gerät einfügen.

          2020-06-30 15.04.55.jpg

          Oben rechts auf speichern, dann kurz warten und ausprobieren...

          M Offline
          M Offline
          MyMeyer
          schrieb am zuletzt editiert von
          #21

          @dslraser Hi,
          beim Import bekomme ich diesen Fehler:

          359d3c4f-0dd4-4b16-a41b-f06a4c6660f1-image.png

          Speichern unter.... habe ich gemacht mit der Datei.

          MyMeyer

          >>> Hardware: Intel I5 mit ****Debian ProxMox OS: Debian **** <<< >>> Network with UniFi <<<
          >>> HomeMatic CCU-2 (Wired und Funk) / Philips HUE / Echo.DOT / Echo.SHOW / Xiaomi Smart-Home / Xiaomi Robot Vacuum Cleaner / Synology DS 918+ / Shelly 1&2 <<<

          dslraserD 1 Antwort Letzte Antwort
          0
          • M MyMeyer

            @dslraser Hi,
            beim Import bekomme ich diesen Fehler:

            359d3c4f-0dd4-4b16-a41b-f06a4c6660f1-image.png

            Speichern unter.... habe ich gemacht mit der Datei.

            dslraserD Offline
            dslraserD Offline
            dslraser
            Forum Testing Most Active
            schrieb am zuletzt editiert von dslraser
            #22

            @MyMeyer
            welche Version hat Dein Javascript Adapter ? (ich habe 4.3.4 installiert, damit geht es)
            Welches Blockly hast Du versucht zu importieren ?

            M 1 Antwort Letzte Antwort
            0
            • dslraserD dslraser

              @MyMeyer
              welche Version hat Dein Javascript Adapter ? (ich habe 4.3.4 installiert, damit geht es)
              Welches Blockly hast Du versucht zu importieren ?

              M Offline
              M Offline
              MyMeyer
              schrieb am zuletzt editiert von
              #23

              @dslraser sagte in Alexa Ansagen über ssml:

              @MyMeyer
              welche Version hat Dein Javascript Adapter ? (ich habe 4.3.4 installiert, damit geht es)
              Welches Blockly hast Du versucht zu importieren ?

              Hi. JS 4.3.2 und dieses Blocky. blocklyexport-fenster-ansage-am-angesprochenem-echo.

              MyMeyer

              >>> Hardware: Intel I5 mit ****Debian ProxMox OS: Debian **** <<< >>> Network with UniFi <<<
              >>> HomeMatic CCU-2 (Wired und Funk) / Philips HUE / Echo.DOT / Echo.SHOW / Xiaomi Smart-Home / Xiaomi Robot Vacuum Cleaner / Synology DS 918+ / Shelly 1&2 <<<

              dslraserD 2 Antworten Letzte Antwort
              0
              • M MyMeyer

                @dslraser sagte in Alexa Ansagen über ssml:

                @MyMeyer
                welche Version hat Dein Javascript Adapter ? (ich habe 4.3.4 installiert, damit geht es)
                Welches Blockly hast Du versucht zu importieren ?

                Hi. JS 4.3.2 und dieses Blocky. blocklyexport-fenster-ansage-am-angesprochenem-echo.

                dslraserD Offline
                dslraserD Offline
                dslraser
                Forum Testing Most Active
                schrieb am zuletzt editiert von dslraser
                #24

                @MyMeyer
                mit einer bestimmten Javascript Adapter Version gab es diese Probleme, ich glaube es war sogar diese die Du hast. Installiere mal bitte die 4.3.4

                1 Antwort Letzte Antwort
                0
                • M MyMeyer

                  @dslraser sagte in Alexa Ansagen über ssml:

                  @MyMeyer
                  welche Version hat Dein Javascript Adapter ? (ich habe 4.3.4 installiert, damit geht es)
                  Welches Blockly hast Du versucht zu importieren ?

                  Hi. JS 4.3.2 und dieses Blocky. blocklyexport-fenster-ansage-am-angesprochenem-echo.

                  dslraserD Offline
                  dslraserD Offline
                  dslraser
                  Forum Testing Most Active
                  schrieb am zuletzt editiert von
                  #25

                  @MyMeyer
                  ja, diese Version hatte das Problem. Wurde aber behoben.

                  https://github.com/ioBroker/ioBroker.javascript/issues/441

                  M 1 Antwort Letzte Antwort
                  1
                  • dslraserD dslraser
                    Versionen 1.6.7
                    aktualisiert am 23.12.2020
                    Typ Blockly mit JavaScript Funktionen
                    verwendete Adapter je nach dem was im Blockly aktiviert ist
                    verwendete Geräte verschieden - gemischt
                    was kann das Blockly wird hier beschrieben

                    Hallo Zusammen.
                    Ich stelle hier mein Blockly zum Geräte zählen und optional zum Ansagen über den Alexa2 Adapter über speak, sowie optionaler Versand über Telegram / E-Mail zur Verfügung.
                    Das gesamte Blockly nutzt "alias'e". Alle anderen benötigten Datenpunkte erstellt und löscht das Blockly selbst, je nach dem was verwendet werden soll.
                    Wer also keine alias erstellen oder nutzen möchte kann an dieser Stelle aufhören zu lesen, für alle anderen Interessierten versuche ich möglichst genau zu beschreiben was zu tun ist.

                    Mit Alexa geht dann z.B.

                    • Alexa, welche Fenster sind noch auf
                    • Alexa, welche Türen sind noch auf
                    • Alexa, welche Steckdosen sind noch an
                    • Alexa, welche Lampen sind noch an
                    • Alexa, was machen die Batterien
                    • Alexa, welche Bewegungsmelder sind aktiv
                    • Alexa, wie sind die Temperaturen (Ansage, aller Temperaturen meiner Räume und Außentemperatur nacheinander in einer Ansage)

                    Welche Frage in welcher Formulierung gestellt wird bestimmt Ihr natürlich selbst, da dies über eine Routine in der Alexa App gesteuert wird. Dazu später mehr.

                    Ein Hinweis gleich noch zu Beginn. Da die Ansage am angesprochenen ECHO erfolgen soll, kann es vorkommen, das, wenn es mehrere ECHO's in Hörweite gibt, die Ansage an einem anderen ECHO ausgegeben wird, weil sich ein anderer ECHO "angesprochen fühlt". Wenn ich in einem Raum bin, wo mich nur ein ECHO hören kann, funktioniert es bei mir zuverlässig.

                    Meine verwendeten Adapter dafür sind:

                    • Alexa2 Adapter 3.4.0
                    • iot Adapter 1.8.8
                    • Javascript Adapter 4.10.8
                    • Telegram Adapter 1.5.9 (optional)
                    • E-Mail Adapter 1.0.7 (optional)
                    • und wenn gewünscht (optional) iQontrol 1.5.2
                    • TR-064 4.2.1 Anruferansage (optional Telegram/EMAIL-extra Blockly im zweiten Beitrag)

                    SmartGeräte für den iot Adapter werden direkt im Blockly erstellt, das sind dann die Button für die spätere Routine in der Amazon App.
                    Das Blockly legt die benötigten Datenpunkte wahlweise unter 0_userdata.0 oder javascript.x selbst an (x=Javascript Instanznummer). Für die Erstellung der Datenpunkte nutze ich das Script von @Mic in einer Funktion. Dafür muß die Option "Erlaube das Kommando "setObject" im Javascript Adapter erlaubt sein.

                    Bildschirmfoto 2020-04-08 um 12.05.38.png

                    Der Versand aller Nachrichten (Telegram oder EMAIL) ist immer schaltbar, z.B. wenn man eine Anwesenheitsfunktion hat, dann könnte man den Versand bei Abwesenheit "scharf" schalten.
                    Die Button hingegen funktionieren immer. Hier könnte man jeweils eine Routine in der Alexa App anlegen und den Versand des Gerätestatus-Versand auslösen.
                    Z.B.
                    Alexa, schicke mir den Fensterstatus.
                    Alexa, schicke mir den Lichtstatus
                    Alexa, schicke mir den Steckdosenstatus usw...

                    Über diesen Weg lasse ich mir auch zum Beispiel auf Anforderung den Batteriestatus aller meiner Geräte mit Batterien als Liste schicken. Oder auch, Alexa schicke mir ein Bild von der Eingangskamera. Wenn man es auf die Spitze treibt, dann geht auch: Alexa, schicke mir den kompletten Status und dann trudeln bei mir nacheinander Bilder von drei Kameras, alle Batteriezustände, eine Liste mit geöffneten/gekippten Fenstern, ein Liste mit eingeschalteten Lampen usw. usw. usw. ein.

                    Wenn Ihr nun Lust auf das Blockly habt, dann ist jetzt einmalig etwas Fleißarbeit angesagt. Bevor Ihr das Blockly nutzen könnt, müssen die Alias für Eure Geräte, die Ihr im Blockly verwenden wollt, erstellt werden. Dafür eignet sich die Scriptvorlage von @CruziX hervorragend. Mit dieser Vorlage können alle Alias auf einmal erstellt werden. Eine Vorlage als Beispiel findet Ihr im Spoiler. An dieser Stelle sei gleich gesagt, sinnvolle Namen im Alias zu verwenden (id ist egal, nur der Name ist gemeint), da diese Namen dann für alles im Blockly verwendet werden, also alle Gerätenamen allgemein. Also immer so erstellen, das sich der Name auch z.B. für Alexa aussprechen lässt.
                    In der id keine Leerzeichen/Sonderzeichen oder Umlaute verwenden, damit vermeidet man direkt im Vorfeld mögliche Fehler.
                    Als erstes solltet ihr in den Aufzählungen neue Funktionen erstellen, diese kann man dann gleich im alias Script benutzen. Da auf das Plus drücken.
                    Bildschirmfoto 2020-06-29 um 21.16.04.png
                    dann auf das Plus bei neue benutzerdefinierte Gruppe klicken
                    Bildschirmfoto 2020-06-29 um 21.16.19.png

                    Ich habe folgende erstellt (wenn Ihr die gleichen nehmt müsst Ihr das nichtmal im Blockly umstellen)

                    batterien_voll_leer_alias
                    batterien_volt_alias
                    bewegungsmelder_alias
                    fenster_alias
                    licht_alias
                    steckdosen_alias
                    temperaturen_alias
                    tueren_alias
                    batterien_prozent_alias

                    Das sind die Selektoren im Blockly

                    Bildschirmfoto 2020-12-19 um 09.07.55.png
                    Bildschirmfoto 2020-12-19 um 09.08.22.png
                    Bildschirmfoto 2020-12-19 um 09.08.51.png
                    Bildschirmfoto 2020-12-19 um 09.09.21.png
                    Bildschirmfoto 2020-12-19 um 09.09.59.png
                    Bildschirmfoto 2020-12-19 um 09.10.34.png
                    Bildschirmfoto 2020-12-19 um 09.11.17.png
                    Bildschirmfoto 2020-12-19 um 09.12.00.png
                    Bildschirmfoto 2020-12-19 um 09.12.32.png

                    Das ganze sieht dann nach dem Blockly Start in den Objekten z.B. so aus: (wenn alle Schalter im Blockly auf wahr stehen)

                    Bildschirmfoto 2020-12-02 um 19.33.40.png

                    01_Anzeigen_und_Listen

                    Bildschirmfoto 2020-12-02 um 19.43.57.png

                    02_Trigger_und_Schalter

                    Bildschirmfoto 2020-12-02 um 19.44.12.png

                    03_HTML_Daten hat zwei Unterordner

                    Bildschirmfoto 2020-12-02 um 19.44.31.png

                    01_HTML_Hell_Dunkel_Festeinstellung ist nicht veränderbar und sieht so aus (helle Einstellung aktiv)

                    Bildschirmfoto 2020-12-02 um 19.45.09.png

                    03_HTML_Eigene_Einstellung enthält die gleichen Datenpunkte und wird beim ersten verwenden des Triggers mit Standardwerten befüllt. Diese Werte können dann mit eigenen Werten überschrieben werden.

                    Und hier noch der Rest

                    Bildschirmfoto 2020-12-02 um 19.45.42.png

                    Die Bilder bzw. Icon links und rechts habe ich als Base64 eingefügt. Ich benutze dafür das hier: https://www.base64-image.de/

                    Wenn iQontrol installiert ist, dann funktioniert auch der Pfad zu einem Icon (einfach den eingestellten Pfad zum Icon aus iQontrol kopieren und einfügen)
                    In den eigenen 02_HTML_Eigene_Einstellungen kann alles selbst an die eigenen Wünsche angepasst werden.

                    Hier noch ein kurzes GiF
                    (klick auf das linke Icon schaltet die Farbeinstellungen durch. klick auf das rechte Icon blendet die Tabelle ein und aus bzw. schaltet auf aktiv/inaktiv)
                    20201202_200704.gif



                    Das ganze sieht dann so bei mir aus (ich habe immer nur die ersten fünf auf den Bildern)

                    Bildschirmfoto 2020-07-04 um 19.22.51.png

                    Bildschirmfoto 2020-07-04 um 19.26.55.png

                    Bildschirmfoto 2020-06-30 um 15.46.33.png

                    Bildschirmfoto 2020-06-30 um 15.46.48.png

                    Bildschirmfoto 2020-06-30 um 15.47.02.png

                    Bildschirmfoto 2020-06-30 um 15.47.15.png

                    Bildschirmfoto 2020-07-04 um 19.23.12.png

                    Bildschirmfoto 2020-06-30 um 15.47.46.png


                    Im Beispielvideo werden die eigenen Alias ab Zeile 271 eingefügt, also ab dem ersten createAlias
                    Video Beispiel:
                    Alias_per_Script_erstellen.m4v
                    In der Vorlage habe ich jeweils zwei meiner verwendeten Geräte als Beispiel eingefügt.
                    Hier und in den folgenden Beiträgen versuche ich die Alias Funktion vom Script etwas zu erklären:
                    Klick Erklärung alias Funktion

                    /**************************************************************
                    Github - https://github.com/xCruziX/ioBroker-Creating-Alias/blob/master/CreateAlias.js
                       			Changelog
                    Version 1.1.4
                    - fix error by using bCreateAliasPath and bConvertExistingPath (has no target 9/Error creating alias-path)
                    **************************************************************/
                    
                    /**************************************
                       	Flags /
                       	Variablen
                    ***************************************/
                    
                    // typeAlias = 'boolean'; // oder 'number'
                    // read = "val == 'Ein' ? true : false"; // Erkennung "Aus" --> false erfolgt automatisch  
                    // write = "val ? 'Ein' : 'Aus'";
                    // nameAlias = 'Licht Haustür';
                    // role = 'switch';
                    // desc = 'per Script erstellt';
                    // min = 0; // nur Zahlen
                    // max = 100; // nur Zahlen
                    // unit = '%'; // nur für Zahlen
                    // states = {0: 'Aus', 1: 'Auto', 2: 'Ein'}; // Zahlen (Multistate) oder Logikwert (z.B. Aus/Ein)
                    
                    
                    let bCreateAliasPath = true;  // If this flag is true, each folder is created seperately so rooms and functions can be assigned.
                    
                    /*
                    Requirements: bCreateAliasPath == true
                    If this flag is true, existing folders in the path will be converted so rooms and functions can be assigned.
                    */
                    let bConvertExistingPath = false;
                    
                    /***************************************
                       	Don't change anything from here /
                       	Ab hier nichts verändern
                    ***************************************/
                    
                    let arEnum = [];
                    let arId = [];
                    let timeoutAssignEnum;
                    var callbackAlias = undefined;
                    function createAlias(idSrc, idDst,raum, gewerk,typeAlias, read, write, nameAlias, role, desc, min, max, unit, states) {
                     if(!idDst.includes('alias.0.'))
                         idDst = 'alias.0.' + idDst;
                     if(!existsObject(idSrc))
                     {
                         log('Source-Id ' + idSrc +' does not exists.','warn');
                         return;
                     }
                     
                     // Create the object Path for alias id, 
                     // so you can assign rooms and function to the parents
                     var createAliasPath = (id) => {
                          if(bCreateAliasPath){
                               let lisMergedIds = [];
                               let mergedId = 'alias.0';
                               id = id.replace(mergedId + '.', ''); // Remove prefix alias so it will not be changed
                               let split = id.split('.'); 
                               for(let i=0;i<split.length-1;i++){
                                   mergedId += '.' + split[i];
                                   lisMergedIds.push(mergedId);
                               }
                               
                               function path(){
                                   if(lisMergedIds.length == 0) {
                                       alias();
                                       return;
                                   }
                                   let tmpId = lisMergedIds[0];
                                   lisMergedIds.splice(0,1); // remove element
                                   if(!existsObject(tmpId) || bConvertExistingPath){ // not exists
                                       let obj;
                                       if(existsObject(tmpId))
                                           obj = getObject(tmpId);
                                       else
                                           obj = {};
                    
                                       let bApply = false;
                                       if(obj != undefined){
                                           if(obj.type == undefined || String(obj.type) != 'meta'){
                                               obj.type = 'meta';
                                               bApply = true;
                                           }
                                           if(obj.common == undefined){
                                               obj.common = {};
                                               obj.common.type = 'meta.folder';
                                               bApply = true;
                                           }
                                           else if(obj.common.type == undefined || String(obj.common.type) != 'meta.folder'){
                                               obj.common.type = 'meta.folder';
                                               bApply = true;
                                           }
                                           if(obj.native == undefined){
                                               obj.native = {};
                                               bApply = true;
                                           }
                                       }
                                       else{
                                           path();
                                           log('Object is undefined');
                                           return;
                                       }
                                       
                    
                                       if(bApply){
                                           setObject(tmpId, obj, (err) =>{
                                           if(!err){
                                               log('Created Alias-Path ' + tmpId);
                                               path();
                                           }
                                           else
                                               log('Error creating alias-path','error');
                                       });
                                       }
                                       else
                                           path();
                                       
                                   }
                               }
                               path();
                          }
                          else
                            alias();
                     }
                     
                     
                     function alias(){
                         // Create alias object
                         
                           if(!existsObject(idDst)){
                               let obj = {};
                               obj.type = 'state';
                               obj.common = getObject(idSrc).common;
                               obj.common.alias = {};
                               obj.common.alias.id = idSrc;
                               if(typeAlias !== undefined) 
                                   obj.common.type = typeAlias;
                               if(obj.common.read !== undefined) 
                                   obj.common.alias.read = read;
                               if(obj.common.write !== undefined) 
                                   obj.common.alias.write = write;
                               if(nameAlias !== undefined) 
                                   obj.common.name = nameAlias;
                               if(role !== undefined) 
                                   obj.common.role = role;
                               if(desc !== undefined) 
                                   obj.common.desc = desc;
                               if(min !== undefined) 
                                   obj.common.min = min;
                               if(max !== undefined) 
                                   obj.common.max = max;
                               if(unit !== undefined) 
                                   obj.common.unit = unit;
                               if(states !== undefined) 
                                   obj.common.states = states;
                    
                               obj.native = {};
                               obj.common.custom = []; // Damit die Zuordnung zu iQontrol, Sql etc. nicht übernommen wird
                               log('Created Alias-State ' + idDst);
                               setObject(idDst, obj,(err) =>{ 
                                   if(!err)
                                       startAttach(); 
                                   else
                                       log('Error creating-alias','error');
                               });
                           }
                           else
                               startAttach();
                     }
                     
                     
                     // Save ID and Enum (room or function)
                     var attach = (id, enu,value) => {
                         if(id.length == 0){
                             log('ID has lenght 0, can not attach to enum','warn');
                             return;
                         }
                         if(value.length == 0){
                             log('Value has lenght 0','warn');
                             return;
                         }
                       
                         let sEnuId = 'enum.' + enu + '.' + value;
                         if(enu.length > 0 && existsObject(sEnuId)) 
                         {
                             let obj = getObject(sEnuId)
                             let members = obj.common.members;
                             if(!members.includes(id)){
                                 arEnum.push(sEnuId);
                                 arId.push(id);
                             }
                         }
                         else
                      	      log('Can not find enum ' + sEnuId,'warn');
                     }
                    
                    function startAttach(){
                       let bRoom = raum !== undefined && raum.length > 0;
                       let bGewerk = gewerk !== undefined && gewerk.length > 0;
                       
                       if(bRoom)
                           attach(idDst,'rooms',raum);
                       if(bGewerk)
                           attach(idDst,'functions',gewerk);
                       if(bRoom || bGewerk){
                               if(timeoutAssignEnum){
                                   clearTimeout(timeoutAssignEnum);
                                   timeoutAssignEnum = null;
                               }
                               timeoutAssignEnum = setTimeout(finishScript,100);
                       }
                    }
                    
                     createAliasPath(idDst);
                    }
                    
                    function finishScript(){
                       assignEnums();
                    }
                    
                    // Add the saved IDs to the rooms/functions
                    function assignEnums(){
                    if(arEnum.length == 0 || arId.length == 0){
                         return;
                    }
                    
                    if(arEnum.length != arId.length){
                         log('Arrays have different size','error');
                         return;
                    }
                    let mapEnumId = new Map();
                    
                    for(let i=0;i < arEnum.length; i++){
                        let enu = arEnum[i];
                        let id = arId[i];
                        if(existsObject(id)){
                       	 let obj = getObject(enu)
                       	 let members;
                       	 if(!mapEnumId.has(enu)){
                       		 members = obj.common.members;
                       		 mapEnumId.set(enu,members);
                       	 }
                       	 else
                       		 members = mapEnumId.get(enu);    
                       	 if(!members.includes(id)){
                       		  log("Adding " + id + " to " + enu);
                       		  members.push(id);
                       	 }	      
                        }
                        else
                            log('Can not find Alias ' + id,'error');
                    }
                     
                     function setMembers(members,enu,map){
                         let obj = getObject(enu);
                         obj.common.members = members;
                         setObject(enu,obj);
                     }
                     mapEnumId.forEach(setMembers);
                    }
                    
                    /**********************************************************
                       	END /
                       	ENDE
                    **********************************************************/
                    
                    //////////////////////////////
                    //  Fenster
                    //////////////////////////////
                    //2 x Fenstersensoren HMIP
                    //einfache HMIP Fenstersensoren über rpc-Adapter in function fenster_alias
                    //{0: 'geschlossen', 1: 'geöffnet'}
                    createAlias('hm-rpc.0.xxx.1.STATE'/*Wohnzimmer Fenster links STATE*/, 'Fenster.Wohnzimmer_Fenster_links', undefined, 'fenster_alias', 'number', undefined, undefined, 'Wohnzimmer links', 'window.value', 'per Script erstellt', 0, 1, '',{0: 'geschlossen', 1: 'geöffnet'})
                    createAlias('hm-rpc.0.xxx.1.STATE'/*Küche Fenster links STATE*/, 'Fenster.Kueche_Fenster_links', undefined, 'fenster_alias', 'number',undefined, undefined, 'Küche links', 'window.value', 'per Script erstellt', 0, 1, '',{0: 'geschlossen', 1: 'geöffnet'})
                    
                    //2 x Fenstersensoren HM
                    //einfache HM Fenstersensoren über rpc-Adapter in function fenster_alias
                    //{false: 'geschlossen', true: 'geöffnet'}
                    createAlias('hm-rpc.0.xxx.1.STATE'/*Wohnzimmer Fenster links STATE*/, 'Fenster.Wohnzimmer_Fenster_links', undefined, 'fenster_alias', 'boolean', undefined, undefined, 'Wohnzimmer links', 'window.value', 'per Script erstellt', undefined, undefined, undefined, {false: 'geschlossen', true: 'geöffnet'})
                    createAlias('hm-rpc.0.xxx.1.STATE'/*Küche Fenster links STATE*/, 'Fenster.Kueche_Fenster_links', undefined, 'fenster_alias', 'boolean',undefined, undefined, 'Küche links', 'window.value', 'per Script erstellt', undefined, undefined, undefined, {false: 'geschlossen', true: 'geöffnet'})
                    
                    
                    //2 x Fensterdrehgriffe HMIP
                    //HMIP Fensterdrehgriffe über rpc-Adapter in function fenster_alias
                    //{0: 'geschlossen', 1: 'gekippt', 2: 'geöffnet'}
                    createAlias('hm-rpc.0.xxx.1.STATE'/*Keller W-Baum Fenster STATE*/, 'Fenster.Keller_Weihnachtsbaum_Fenster', undefined, 'fenster_alias', 'number',undefined, undefined, 'Keller W Baum', 'window.value', 'per Script erstellt', 0, 2, '',{0: 'geschlossen', 1: 'gekippt', 2: 'geöffnet'})
                    createAlias('hm-rpc.0.xxx.1.STATE'/*Keller Wohnzimmer Fenster mitte STATE*/, 'Fenster.Keller_Wohnzimmer_Fenster_mitte', undefined, 'fenster_alias', 'number',undefined, undefined, 'Keller Wohnzimmer mitte', 'window.value', 'per Script erstellt', 0, 2, '',{0: 'geschlossen', 1: 'gekippt', 2: 'geöffnet'})
                    
                    //2 x Fenster(Türen) Sensoren HMIP
                    //einfache HMIP Fenstersensoren über rpc-Adapter in function tueren_alias
                    //{0: 'geschlossen', 1: 'geöffnet'}
                    createAlias('hm-rpc.0.xxx.1.STATE'/*Wohnzimmer Terrassentür STATE*/, 'Tueren.Terrassentuer', undefined, 'tueren_alias', 'number',undefined, undefined, 'Terrassentür', 'window.value', 'per Script erstellt', 0, 1, '',{0: 'geschlossen', 1: 'geöffnet'})
                    createAlias('hm-rpc.0.xxx.1.STATE'/*Haustür STATE*/, 'Tueren.Haustuer', undefined, 'tueren_alias', 'number',undefined, undefined, 'Haustür', 'window.value', 'per Script erstellt', 0, 1, '',{0: 'geschlossen', 1: 'geöffnet'})
                    
                    //////////////////////////////
                    //  Steckdosen
                    //////////////////////////////
                    //2 x Steckdosen
                    //HMIP Steckdosen über rpc-Adapter in function steckdosen_alias
                    //{false: 'aus', true: 'an'}
                    createAlias('hm-rpc.0.xxx.3.STATE'/*Waschmaschine STATE*/, 'Steckdosen.Waschmaschine', undefined, 'steckdosen_alias', 'boolean', undefined, undefined, 'Waschmaschine', 'switch', 'per Script erstellt', undefined, undefined, undefined, {false: 'aus', true: 'an'})
                    createAlias('hm-rpc.0.xxx.3.STATE'/*Geschirrspueler STATE*/, 'Steckdosen.Geschirrspueler', undefined, 'steckdosen_alias', 'boolean', undefined, undefined, 'Geschirrspüler', 'switch', 'per Script erstellt', undefined, undefined, undefined, {false: 'aus', true: 'an'})
                    
                    //////////////////////////////
                    //  Bewegungsmelder
                    //////////////////////////////
                    //2 x Bewegungsmelder und 2 x Präsenzmelder und 1 x Erschütterungssensor
                    //HMIP Bewegungsmelder und Präsenzmelder über rpc-Adapter in function bewegungsmelder_alias
                    //{false: 'inaktiv', true: 'aktiv'}
                    createAlias('hm-rpc.0.xxx.1.MOTION'/*Bewegungsmelder Weihnachtsbaumkeller MOTION*/, 'Bewegungsmelder.Bewegungsmelder_Weihnachtsbaumkeller', undefined, 'bewegungsmelder_alias', 'boolean', undefined, undefined, 'W Baum Keller', 'sensor.motion', 'per Script erstellt', undefined, undefined, undefined, {false: 'inaktiv', true: 'aktiv'})
                    createAlias('hm-rpc.0.xxx.1.MOTION'/*Bewegungsmelder Heizungskeller MOTION*/, 'Bewegungsmelder.Bewegungsmelder_Heizungskeller', undefined, 'bewegungsmelder_alias', 'boolean', undefined, undefined, 'Heizungskeller', 'sensor.motion', 'per Script erstellt', undefined, undefined, undefined, {false: 'inaktiv', true: 'aktiv'})
                    //ab hier 2 x Präsenzmelder
                    createAlias('hm-rpc.0.xxx.1.PRESENCE_DETECTION_STATE'/*Präsenzmelder Badezimmer PRESENCE DETECTION STATE*/, 'Bewegungsmelder.Praesenzmelder_Badezimmer', undefined, 'bewegungsmelder_alias', 'boolean', undefined, undefined, 'Badezimmer', 'sensor.motion', 'per Script erstellt', undefined, undefined, undefined, {false: 'inaktiv', true: 'aktiv'})
                    createAlias('hm-rpc.0.xxx.1.PRESENCE_DETECTION_STATE'/*Präsenzmelder Dusche PRESENCE DETECTION STATE*/, 'Bewegungsmelder.Praesenzmelder_Dusche', undefined, 'bewegungsmelder_alias', 'boolean', undefined, undefined, 'Dusche', 'sensor.motion', 'per Script erstellt', undefined, undefined, undefined, {false: 'inaktiv', true: 'aktiv'})
                    //ab hier 1 x Erschütterungssensor
                    createAlias('hm-rpc.0.xxx.1.MOTION'/*Briefkasten MOTION*/, 'Bewegungsmelder.Praesenzmelder_Briefkasten', undefined, 'bewegungsmelder_alias', 'boolean', undefined, undefined, 'Briefkasten', 'sensor.motion', 'per Script erstellt', undefined, undefined, undefined, {false: 'inaktiv', true: 'aktiv'})
                    
                    //////////////////////////////
                    //  Licht
                    //////////////////////////////
                    //2 x HUE und 5 x HMIP Licht über HUE und rpc-Adapter in function licht_alias
                    //{false: 'aus', true: 'an'}
                    createAlias('hue.0.Badezimmerlampe_links.on'/*Badezimmerlampe links on*/, 'Licht.Badezimmer_Licht_links', undefined, 'licht_alias', 'boolean', undefined, undefined, 'Badezimmer links', 'switch.light', 'per Script erstellt', undefined, undefined, undefined, {false: 'aus', true: 'an'})
                    createAlias('hue.0.Badezimmerlampe_rechts.on'/*Badezimmerlampe rechts on*/, 'Licht.Badezimmer_Licht_rechts', undefined, 'licht_alias', 'boolean', undefined, undefined, 'Badezimmer rechts', 'switch.light', 'per Script erstellt', undefined, undefined, undefined, {false: 'aus', true: 'an'})
                    
                    //ab hier 2 x Licht HMIP Steckdosen über rpc Adapter
                    createAlias('hm-rpc.0.xxx.3.STATE'/*Kugellampe STATE*/, 'Licht.Wohnzimmer_Kugel_Licht', undefined, 'licht_alias', 'boolean', undefined, undefined, 'Kugellicht', 'switch.light', 'per Script erstellt', undefined, undefined, undefined, {false: 'aus', true: 'an'})
                    createAlias('hm-rpc.0.xxx.3.STATE'/*Gäste WC Licht STATE*/, 'Licht.Gaeste_WC_Licht', undefined, 'licht_alias', 'boolean', undefined, undefined, 'Gäste WC Licht', 'switch.light', 'per Script erstellt', undefined, undefined, undefined, {false: 'aus', true: 'an'})
                    
                    //////////////////////////////
                    //  Temperaturen
                    //////////////////////////////
                    //HMIP 2 x Temperaturen über rpc-Adapter in function temperaturen_alias
                    createAlias('hm-rpc.0.xxx.1.ACTUAL_TEMPERATURE'/*Wandthermostat Schlafzimmer:1 ACTUAL TEMPERATURE*/, 'Temperaturen.Temperatur_Schlafzimmer', undefined, 'temperaturen_alias', 'number', 'Math.round(val * 10) / 10', undefined, 'Schlafzimmer', 'value.temperature', 'per Script erstellt', undefined, undefined, '°C', undefined)
                    createAlias('hm-rpc.0.xxx.1.ACTUAL_TEMPERATURE'/*Wandthermostat Wohnzimmer:1 ACTUAL TEMPERATURE*/, 'Temperaturen.Temperatur_Wohnzimmer', undefined, 'temperaturen_alias', 'number', 'Math.round(val * 10) / 10', undefined, 'Wohnzimmer', 'value.temperature', 'per Script erstellt', undefined, undefined, '°C', undefined)
                    
                    //////////////////////////////
                    //  Batterien_voll_leer
                    //////////////////////////////
                    //2 x Batterien voll-leer über boolean Wert false/true in function batterien_voll_leer_alias
                    createAlias('hm-rpc.0.xxx.0.LOW_BAT'/*Wohnzimmer Fenster links:0 LOW BAT*/, 'Batterien_voll_leer.Wohnzimmer_Fenster_links', undefined, 'batterien_voll_leer_alias', 'boolean', undefined, undefined, 'Wohnzimmer Fenster links', 'indicator.lowbat', 'per Script erstellt', undefined, undefined, undefined, {false: 'voll', true: 'leer'})
                    createAlias('hm-rpc.0.xxx.0.LOW_BAT'/*Küche Fenster links:0 LOW BAT*/, 'Batterien_voll_leer.Kueche_Fenster_links', undefined, 'batterien_voll_leer_alias', 'boolean', undefined, undefined, 'Küche Fenster links', 'indicator.lowbat', 'per Script erstellt', undefined, undefined, undefined, {false: 'voll', true: 'leer'})
                    
                    //////////////////////////////
                    //  Batterien_Volt
                    //////////////////////////////
                    //2 x Batterien Volt Anzeige in function batterien_volt_alias
                    createAlias('hm-rpc.0.xxx.0.OPERATING_VOLTAGE'/*Wohnzimmer Fenster links:0 OPERATING VOLTAGE*/, 'Batterien_Volt.Wohnzimmer_Fenster_links', undefined, 'batterien_volt_alias', 'number', undefined, undefined, 'Wohnzimmer Fenster links', 'value.voltage', 'per Script erstellt', undefined, undefined, 'Volt', undefined)
                    createAlias('hm-rpc.0.xxx.0.OPERATING_VOLTAGE'/*Küche Fenster links:0 OPERATING VOLTAGE*/, 'Batterien_Volt.Kueche_Fenster_links', undefined, 'batterien_volt_alias', 'number', undefined, undefined, 'Küche Fenster links', 'value.voltage', 'per Script erstellt', undefined, undefined, 'Volt', undefined)
                    
                    


                    nach dem Alias erstellen das hier beachten: Klick


                    bitte das Blockly auf den eigenen Rechner downloaden und dort mit einem Editor öffnen und den gesamten Inhalt der Textdatei in die Zwischenablage kopieren und anschließend in ein neues leeres Blockly importieren. Nicht direkt im Browser öffnen und kopieren, dann kommt es oft zu Umlaute Fehlern im Blockly.

                    Hier ist der Blockly Export


                    Temperaturen_1-6-7.zip


                    Batterien_Volt_1-6-7.zip


                    Steckdosen_1-6-7.zip


                    Lichter_1-6-7.zip


                    Bewegungsmelder_1-6-7.zip


                    Batterien_voll_leer_1-6-7.zip


                    Fenster_1-6-7.zip


                    Tueren_1-6-7.zip


                    Batterien_Prozent_1-6-7.zip

                    meine iQontrol Einstellungen


                    Bildschirmfoto 2020-12-03 um 08.00.37.png

                    Bildschirmfoto 2020-12-03 um 08.00.50.png

                    Bildschirmfoto 2020-12-03 um 08.02.31.png

                    Bildschirmfoto 2020-12-03 um 08.03.03.png

                    Bildschirmfoto 2020-12-03 um 08.03.44.png

                    Bildschirmfoto 2020-12-03 um 08.04.20.png

                    Bildschirmfoto 2020-12-03 um 08.05.09.png

                    Bildschirmfoto 2020-12-03 um 08.06.48.png

                    Bildschirmfoto 2020-12-03 um 08.07.24.png

                    Bildschirmfoto 2020-12-03 um 08.08.20.png

                    Bildschirmfoto 2020-12-03 um 08.09.00.png


                    Hier der Export von diesem View
                    2020-12-20_iqontrol_0_selected_views.json.zip

                    20201220_092104.jpg




                    Zuerst muß das neue SmartGerät aus iot gesucht und gefunden werden. Dazu ist es wichtig einmal den iot Adapter zu öffnen und in den Reiter "SMART-GERÄTE" zu wechseln. Das neue Gerät sollte da sein, aber wenn man diesen Schritt nicht macht, dann werden von Alexa keine neuen Geräte gefunden. Danach kann der Adapter wieder geschlossen werden.
                    Bildschirmfoto 2020-04-26 um 15.34.49.png
                    Nun entweder in der App neue Geräte suchen lassen, oder kurz den Sprachbefehl: "Alexa, suche neue Geräte" ausführen. Wenn das durchgelaufen ist und ein neues oder mehrere neue Geräte gefunden wurden, dann geht es mit dem Einrichten der Routine weiter.

                    neue Geräte suchen lassen in der Alexa App

                    2020-06-30 15.03.38.jpg

                    ein neues Gerät (oder mehrere) wurde gefunden

                    2020-06-30 15.04.00.jpg
                    alles überspringen und dann zu den Routinen. Dort dann auf das Plus (oben rechts) drücken und eine neue Routine anlegen. Satz bzw. Frage eingeben bei Stimme

                    2020-06-30 15.04.36.jpg

                    Dann als nächstes die Aktion hinzufügen (SmartHome), alle Geräte auswählen und das passende Gerät einfügen.

                    2020-06-30 15.04.55.jpg

                    Oben rechts auf speichern, dann kurz warten und ausprobieren...

                    dslraserD Offline
                    dslraserD Offline
                    dslraser
                    Forum Testing Most Active
                    schrieb am zuletzt editiert von dslraser
                    #26

                    @dslraser

                    23.12.2019 setzen der Ansagelautstärke korrigiert. Exporte im ersten Post.

                    L 1 Antwort Letzte Antwort
                    0
                    • dslraserD dslraser

                      @MyMeyer
                      ja, diese Version hatte das Problem. Wurde aber behoben.

                      https://github.com/ioBroker/ioBroker.javascript/issues/441

                      M Offline
                      M Offline
                      MyMeyer
                      schrieb am zuletzt editiert von MyMeyer
                      #27

                      @dslraser sagte in Alexa Ansagen über ssml:

                      @MyMeyer
                      ja, diese Version hatte das Problem. Wurde aber behoben.

                      https://github.com/ioBroker/ioBroker.javascript/issues/441

                      :+1: Danke...
                      Habe die neue Version installiert und nun lief auch der Import.

                      Gruß
                      MyMeyer

                      MyMeyer

                      >>> Hardware: Intel I5 mit ****Debian ProxMox OS: Debian **** <<< >>> Network with UniFi <<<
                      >>> HomeMatic CCU-2 (Wired und Funk) / Philips HUE / Echo.DOT / Echo.SHOW / Xiaomi Smart-Home / Xiaomi Robot Vacuum Cleaner / Synology DS 918+ / Shelly 1&2 <<<

                      1 Antwort Letzte Antwort
                      1
                      • dslraserD dslraser

                        @dslraser

                        23.12.2019 setzen der Ansagelautstärke korrigiert. Exporte im ersten Post.

                        L Offline
                        L Offline
                        linux150
                        schrieb am zuletzt editiert von
                        #28

                        @dslraser
                        Hallo!
                        Ich hab ja dein Script mit meinen Sensoren ausgebaut.
                        Was genau muss ich denn da jetzt bei meinem Script ändern?
                        Bei mir kommt im Log jetzt

                        javascript.0	2019-12-23 14:29:45.542	warn	(1369) at processImmediate (timers.js:658:5)
                        javascript.0	2019-12-23 14:29:45.541	warn	(1369) at tryOnImmediate (timers.js:676:5)
                        javascript.0	2019-12-23 14:29:45.541	warn	(1369) at runCallback (timers.js:705:18)
                        javascript.0	2019-12-23 14:29:45.540	warn	(1369) at Immediate.setImmediate (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:226:41)
                        javascript.0	2019-12-23 14:29:45.540	warn	(1369) at change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:4745:37)
                        javascript.0	2019-12-23 14:29:45.539	warn	(1369) at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/main.js:364:25)
                        javascript.0	2019-12-23 14:29:45.539	warn	(1369) at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:963:38)
                        javascript.0	2019-12-23 14:29:45.538	warn	(1369) at Object.<anonymous> (script.js.common.Temperaturansage_komplett:620:3)
                        javascript.0	2019-12-23 14:29:45.537	warn	(1369) at setStateDelayed (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1302:25)
                        javascript.0	2019-12-23 14:29:45.537	warn	(1369) at Object.setState (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1258:20)
                        javascript.0	2019-12-23 14:29:45.534	warn	(1369) State "alexa2.0.Echo-Devices.5DD04228BFA44B5684355A5DFB817B43.Commands.ssml" not found
                        javascript.0	2019-12-23 14:29:45.534	warn	(1369) at processImmediate (timers.js:658:5)
                        javascript.0	2019-12-23 14:29:45.533	warn	(1369) at tryOnImmediate (timers.js:676:5)
                        javascript.0	2019-12-23 14:29:45.533	warn	(1369) at runCallback (timers.js:705:18)
                        javascript.0	2019-12-23 14:29:45.532	warn	(1369) at Immediate.setImmediate (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:226:41)
                        javascript.0	2019-12-23 14:29:45.532	warn	(1369) at change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:4745:37)
                        javascript.0	2019-12-23 14:29:45.531	warn	(1369) at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/main.js:364:25)
                        javascript.0	2019-12-23 14:29:45.531	warn	(1369) at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:963:38)
                        javascript.0	2019-12-23 14:29:45.530	warn	(1369) at Object.<anonymous> (script.js.common.Temperaturansage_komplett:619:3)
                        javascript.0	2019-12-23 14:29:45.529	warn	(1369) at setStateDelayed (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1302:25)
                        javascript.0	2019-12-23 14:29:45.528	warn	(1369) at Object.setState (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1258:20)
                        javascript.0	2019-12-23 14:29:45.518	warn	(1369) State "alexa2.0.Echo-Devices.5DD04228BFA44B5684355A5DFB817B43.Commands.speak-volume" not found
                        

                        Java Adapter ist bei mir 4.1.12

                        lg
                        linux150

                        dslraserD 2 Antworten Letzte Antwort
                        0
                        • L linux150

                          @dslraser
                          Hallo!
                          Ich hab ja dein Script mit meinen Sensoren ausgebaut.
                          Was genau muss ich denn da jetzt bei meinem Script ändern?
                          Bei mir kommt im Log jetzt

                          javascript.0	2019-12-23 14:29:45.542	warn	(1369) at processImmediate (timers.js:658:5)
                          javascript.0	2019-12-23 14:29:45.541	warn	(1369) at tryOnImmediate (timers.js:676:5)
                          javascript.0	2019-12-23 14:29:45.541	warn	(1369) at runCallback (timers.js:705:18)
                          javascript.0	2019-12-23 14:29:45.540	warn	(1369) at Immediate.setImmediate (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:226:41)
                          javascript.0	2019-12-23 14:29:45.540	warn	(1369) at change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:4745:37)
                          javascript.0	2019-12-23 14:29:45.539	warn	(1369) at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/main.js:364:25)
                          javascript.0	2019-12-23 14:29:45.539	warn	(1369) at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:963:38)
                          javascript.0	2019-12-23 14:29:45.538	warn	(1369) at Object.<anonymous> (script.js.common.Temperaturansage_komplett:620:3)
                          javascript.0	2019-12-23 14:29:45.537	warn	(1369) at setStateDelayed (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1302:25)
                          javascript.0	2019-12-23 14:29:45.537	warn	(1369) at Object.setState (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1258:20)
                          javascript.0	2019-12-23 14:29:45.534	warn	(1369) State "alexa2.0.Echo-Devices.5DD04228BFA44B5684355A5DFB817B43.Commands.ssml" not found
                          javascript.0	2019-12-23 14:29:45.534	warn	(1369) at processImmediate (timers.js:658:5)
                          javascript.0	2019-12-23 14:29:45.533	warn	(1369) at tryOnImmediate (timers.js:676:5)
                          javascript.0	2019-12-23 14:29:45.533	warn	(1369) at runCallback (timers.js:705:18)
                          javascript.0	2019-12-23 14:29:45.532	warn	(1369) at Immediate.setImmediate (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:226:41)
                          javascript.0	2019-12-23 14:29:45.532	warn	(1369) at change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:4745:37)
                          javascript.0	2019-12-23 14:29:45.531	warn	(1369) at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/main.js:364:25)
                          javascript.0	2019-12-23 14:29:45.531	warn	(1369) at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:963:38)
                          javascript.0	2019-12-23 14:29:45.530	warn	(1369) at Object.<anonymous> (script.js.common.Temperaturansage_komplett:619:3)
                          javascript.0	2019-12-23 14:29:45.529	warn	(1369) at setStateDelayed (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1302:25)
                          javascript.0	2019-12-23 14:29:45.528	warn	(1369) at Object.setState (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1258:20)
                          javascript.0	2019-12-23 14:29:45.518	warn	(1369) State "alexa2.0.Echo-Devices.5DD04228BFA44B5684355A5DFB817B43.Commands.speak-volume" not found
                          

                          Java Adapter ist bei mir 4.1.12

                          lg
                          linux150

                          dslraserD Offline
                          dslraserD Offline
                          dslraser
                          Forum Testing Most Active
                          schrieb am zuletzt editiert von
                          #29

                          @linux150
                          welches Blockly hast Du genommen und von wann ? Ich hatte heute was geändert, nicht das da was fehlt ?

                          1 Antwort Letzte Antwort
                          0
                          • L linux150

                            @dslraser
                            Hallo!
                            Ich hab ja dein Script mit meinen Sensoren ausgebaut.
                            Was genau muss ich denn da jetzt bei meinem Script ändern?
                            Bei mir kommt im Log jetzt

                            javascript.0	2019-12-23 14:29:45.542	warn	(1369) at processImmediate (timers.js:658:5)
                            javascript.0	2019-12-23 14:29:45.541	warn	(1369) at tryOnImmediate (timers.js:676:5)
                            javascript.0	2019-12-23 14:29:45.541	warn	(1369) at runCallback (timers.js:705:18)
                            javascript.0	2019-12-23 14:29:45.540	warn	(1369) at Immediate.setImmediate (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:226:41)
                            javascript.0	2019-12-23 14:29:45.540	warn	(1369) at change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:4745:37)
                            javascript.0	2019-12-23 14:29:45.539	warn	(1369) at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/main.js:364:25)
                            javascript.0	2019-12-23 14:29:45.539	warn	(1369) at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:963:38)
                            javascript.0	2019-12-23 14:29:45.538	warn	(1369) at Object.<anonymous> (script.js.common.Temperaturansage_komplett:620:3)
                            javascript.0	2019-12-23 14:29:45.537	warn	(1369) at setStateDelayed (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1302:25)
                            javascript.0	2019-12-23 14:29:45.537	warn	(1369) at Object.setState (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1258:20)
                            javascript.0	2019-12-23 14:29:45.534	warn	(1369) State "alexa2.0.Echo-Devices.5DD04228BFA44B5684355A5DFB817B43.Commands.ssml" not found
                            javascript.0	2019-12-23 14:29:45.534	warn	(1369) at processImmediate (timers.js:658:5)
                            javascript.0	2019-12-23 14:29:45.533	warn	(1369) at tryOnImmediate (timers.js:676:5)
                            javascript.0	2019-12-23 14:29:45.533	warn	(1369) at runCallback (timers.js:705:18)
                            javascript.0	2019-12-23 14:29:45.532	warn	(1369) at Immediate.setImmediate (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:226:41)
                            javascript.0	2019-12-23 14:29:45.532	warn	(1369) at change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:4745:37)
                            javascript.0	2019-12-23 14:29:45.531	warn	(1369) at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/main.js:364:25)
                            javascript.0	2019-12-23 14:29:45.531	warn	(1369) at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:963:38)
                            javascript.0	2019-12-23 14:29:45.530	warn	(1369) at Object.<anonymous> (script.js.common.Temperaturansage_komplett:619:3)
                            javascript.0	2019-12-23 14:29:45.529	warn	(1369) at setStateDelayed (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1302:25)
                            javascript.0	2019-12-23 14:29:45.528	warn	(1369) at Object.setState (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1258:20)
                            javascript.0	2019-12-23 14:29:45.518	warn	(1369) State "alexa2.0.Echo-Devices.5DD04228BFA44B5684355A5DFB817B43.Commands.speak-volume" not found
                            

                            Java Adapter ist bei mir 4.1.12

                            lg
                            linux150

                            dslraserD Offline
                            dslraserD Offline
                            dslraser
                            Forum Testing Most Active
                            schrieb am zuletzt editiert von dslraser
                            #30

                            @linux150
                            das wird nicht gefunden...

                            javascript.0	2019-12-23 14:29:45.518	warn	(1369) State "alexa2.0.Echo-Devices.5DD04228BFA44B5684355A5DFB817B43.Commands.speak-volume" not found
                            

                            Hast Du den Alexa2 Adapter installiert ?
                            Schau mal nach ob es diesen DP aus der Fehlermeldung bei Dir in den Objekten gibt.
                            Wenn ja, was ist das für ein Gerät, womit Du die Abfrage startest ?
                            Sollte es Dein Handy sein, oder This Device, da wird diese Abfrage nicht unterstützt. Dort gibt es diese Sprachausgabe nicht.

                            L 1 Antwort Letzte Antwort
                            0
                            • dslraserD dslraser

                              @linux150
                              das wird nicht gefunden...

                              javascript.0	2019-12-23 14:29:45.518	warn	(1369) State "alexa2.0.Echo-Devices.5DD04228BFA44B5684355A5DFB817B43.Commands.speak-volume" not found
                              

                              Hast Du den Alexa2 Adapter installiert ?
                              Schau mal nach ob es diesen DP aus der Fehlermeldung bei Dir in den Objekten gibt.
                              Wenn ja, was ist das für ein Gerät, womit Du die Abfrage startest ?
                              Sollte es Dein Handy sein, oder This Device, da wird diese Abfrage nicht unterstützt. Dort gibt es diese Sprachausgabe nicht.

                              L Offline
                              L Offline
                              linux150
                              schrieb am zuletzt editiert von linux150
                              #31

                              @dslraser
                              Hi,
                              habe über Webinterface den Datenpunkt getriggert, und da dürfte beim Alexa Adapter was nicht gestimmt haben.
                              Hab jetzt mal vor Ort die Ansage direkt gestartet, und jetzt hat wieder alles funktioniert. Auch per WI übern Datenpunkt startet die Ansage jetzt wieder. Evtl. hat die Seriennummer nicht gepasst ... Egal

                              Mit deinem Blockly hab ich vor ca. 2 Wochen begonnen, und alle meine Sensoren eingebunden.

                              Aber wie gesagt es wäre schön wenn du mir sagen könntest was du geändert hast damit ich mein Script anpassen könnte.
                              Ein neuer Import bringt mir ja nix, denn dann sind ja meine Anpassungen alle weg...
                              Außer ich hab eh keinen Bedarf was zu ändern ?

                              lg
                              linux150

                              dslraserD 1 Antwort Letzte Antwort
                              0
                              • L linux150

                                @dslraser
                                Hi,
                                habe über Webinterface den Datenpunkt getriggert, und da dürfte beim Alexa Adapter was nicht gestimmt haben.
                                Hab jetzt mal vor Ort die Ansage direkt gestartet, und jetzt hat wieder alles funktioniert. Auch per WI übern Datenpunkt startet die Ansage jetzt wieder. Evtl. hat die Seriennummer nicht gepasst ... Egal

                                Mit deinem Blockly hab ich vor ca. 2 Wochen begonnen, und alle meine Sensoren eingebunden.

                                Aber wie gesagt es wäre schön wenn du mir sagen könntest was du geändert hast damit ich mein Script anpassen könnte.
                                Ein neuer Import bringt mir ja nix, denn dann sind ja meine Anpassungen alle weg...
                                Außer ich hab eh keinen Bedarf was zu ändern ?

                                lg
                                linux150

                                dslraserD Offline
                                dslraserD Offline
                                dslraser
                                Forum Testing Most Active
                                schrieb am zuletzt editiert von dslraser
                                #32

                                @linux150
                                Ich habe das setzen der Lautstärke verändert. Importieren kannst Du das neue Blockly ja trotzdem. Wenn Du nur einen Teil aus Deinem Blockly anschließend tauschen willst, dann geht das ja auch recht einfach.
                                Du mußt nur das aus Deinem Blockly, was Du gern exportieren möchtest, z.B. Deine Geräte, anklicken, oder wenn es mehrere sind in z.B. einen falls Baustein ins Maul packen (nicht speichern) und nur den gesamten Baustein(also z.B. das falls) samt Inhalt makieren / anklicken und auf exportieren gehen. Dann wird nur dieser Teil erxportiert. Diesen dann ins neue Blockly importieren und austauschen.

                                L 1 Antwort Letzte Antwort
                                0
                                • dslraserD dslraser

                                  @linux150
                                  Ich habe das setzen der Lautstärke verändert. Importieren kannst Du das neue Blockly ja trotzdem. Wenn Du nur einen Teil aus Deinem Blockly anschließend tauschen willst, dann geht das ja auch recht einfach.
                                  Du mußt nur das aus Deinem Blockly, was Du gern exportieren möchtest, z.B. Deine Geräte, anklicken, oder wenn es mehrere sind in z.B. einen falls Baustein ins Maul packen (nicht speichern) und nur den gesamten Baustein(also z.B. das falls) samt Inhalt makieren / anklicken und auf exportieren gehen. Dann wird nur dieser Teil erxportiert. Diesen dann ins neue Blockly importieren und austauschen.

                                  L Offline
                                  L Offline
                                  linux150
                                  schrieb am zuletzt editiert von
                                  #33

                                  @dslraser
                                  Danke, das ist ein guter Ansatz. Das werde ich mal testen. :+1:

                                  1 Antwort Letzte Antwort
                                  0
                                  • dslraserD Offline
                                    dslraserD Offline
                                    dslraser
                                    Forum Testing Most Active
                                    schrieb am zuletzt editiert von
                                    #34

                                    Ich habe ich noch eine Möglichkeit der Ansagen erstellt. Dort geht die Ansage über die Funktionen und Aufzählungen. Dort gehen noch einige Dinge mehr...

                                    https://forum.iobroker.net/post/346230

                                    1 Antwort Letzte Antwort
                                    0
                                    • EuloE Offline
                                      EuloE Offline
                                      Eulo
                                      schrieb am zuletzt editiert von Eulo
                                      #35

                                      Bei mir sind die Datenpunkte erstellt, sie sind im iot vorhanden aber ich habe alexa schon gefühlt 1000 mal suchen lassen, und sie findet einfach nichts. Woran könnte das liegen?

                                      dslraserD 1 Antwort Letzte Antwort
                                      0
                                      • EuloE Eulo

                                        Bei mir sind die Datenpunkte erstellt, sie sind im iot vorhanden aber ich habe alexa schon gefühlt 1000 mal suchen lassen, und sie findet einfach nichts. Woran könnte das liegen?

                                        dslraserD Offline
                                        dslraserD Offline
                                        dslraser
                                        Forum Testing Most Active
                                        schrieb am zuletzt editiert von
                                        #36

                                        @ginvibe
                                        welches Blockly hast Du genommen ?

                                        EuloE 1 Antwort Letzte Antwort
                                        0
                                        • dslraserD dslraser

                                          @ginvibe
                                          welches Blockly hast Du genommen ?

                                          EuloE Offline
                                          EuloE Offline
                                          Eulo
                                          schrieb am zuletzt editiert von Eulo
                                          #37

                                          @dslraser said in Alexa Ansagen über ssml:

                                          @ginvibe
                                          welches Blockly hast Du genommen ?

                                          Offene Fenster abfrage und Batteriestatus aus deinem Post Vorlage Telegram offene Fenster und mehr

                                          dslraserD 1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          650

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe