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.4k

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

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

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

Geplant Angeheftet Gesperrt Verschoben Blockly
blocklyjavascript
1.2k Beiträge 41 Kommentatoren 413.5k 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.
  • J Jan1

    @dslraser
    ja so gehts, @liv-in-sky war ein Tick schneller
    Ich kannte den Adapter überhaupt nicht und da ich auch kein VIS verwende, da mir etwas zu aufgebläht und nicht immer einfach zu verstehen, hatte ich genau nach so was gesucht:+1:

    liv-in-skyL Offline
    liv-in-skyL Offline
    liv-in-sky
    schrieb am zuletzt editiert von
    #8

    @Jan1
    @dslraser
    ich wußte, es kommt auf jede sekunde an, deshalb habe ich das bild weggelassen ;-) :-)

    @dslraser - super beschreibung deines projektes

    nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

    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...

      B Offline
      B Offline
      Bibo*13
      schrieb am zuletzt editiert von
      #9

      @dslraser Wie kann ich dein Skript wie in den Beispiel WAVs auf mehrere Temp-Sensoren erweitern? Gibt es da ein Bsp von Dir?
      Danke für Deine Super Arbeit

      dslraserD 1 Antwort Letzte Antwort
      0
      • B Bibo*13

        @dslraser Wie kann ich dein Skript wie in den Beispiel WAVs auf mehrere Temp-Sensoren erweitern? Gibt es da ein Bsp von Dir?
        Danke für Deine Super Arbeit

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

        @Bibo-13
        Edit: erster Beitrag geändert

        B 1 Antwort Letzte Antwort
        0
        • dslraserD dslraser

          @Bibo-13
          Edit: erster Beitrag geändert

          B Offline
          B Offline
          Bibo*13
          schrieb am zuletzt editiert von
          #11

          @dslraser Ok Danke. Ich dachte das wäre alles in einem Blockly abgehandelt. Das ist aber auch soi gut. Danke!

          dslraserD 2 Antworten Letzte Antwort
          0
          • B Bibo*13

            @dslraser Ok Danke. Ich dachte das wäre alles in einem Blockly abgehandelt. Das ist aber auch soi gut. Danke!

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

            @Bibo-13
            das kannst Du auch in einem Blockly machen. Dann mußt Du halt den "Umrechnungsteil" (Punkt/Komma), wenn Du es benötigst, mehrfach in einem Blockly anlegen. (hatte ich auch mal so)

            1 Antwort Letzte Antwort
            0
            • B Bibo*13

              @dslraser Ok Danke. Ich dachte das wäre alles in einem Blockly abgehandelt. Das ist aber auch soi gut. Danke!

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

              @Bibo-13
              ich habe gerade gesehen, das ich den Teil für die "Ansage" in meinem aktuellen Blocklys noch mal geändert habe. (sind dann deutlich weniger Bausteine) Wenn ich nächste Woche wieder da bin und Zeit habe, dann stelle ich nochmal das aktuelle Blockly hier rein.

              B 1 Antwort Letzte Antwort
              0
              • dslraserD dslraser

                @Bibo-13
                ich habe gerade gesehen, das ich den Teil für die "Ansage" in meinem aktuellen Blocklys noch mal geändert habe. (sind dann deutlich weniger Bausteine) Wenn ich nächste Woche wieder da bin und Zeit habe, dann stelle ich nochmal das aktuelle Blockly hier rein.

                B Offline
                B Offline
                Bibo*13
                schrieb am zuletzt editiert von
                #14

                @dslraser Danke suuuper

                dslraserD 1 Antwort Letzte Antwort
                0
                • B Bibo*13

                  @dslraser Danke suuuper

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

                  @Bibo-13
                  das aktuelle Blockly ist im ersten Beitrag.

                  B 1 Antwort Letzte Antwort
                  1
                  • dslraserD dslraser

                    @Bibo-13
                    das aktuelle Blockly ist im ersten Beitrag.

                    B Offline
                    B Offline
                    Bibo*13
                    schrieb am zuletzt editiert von
                    #16

                    @dslraser Herzlichen Dank

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

                      Hallo Zusammen,
                      ich habe das Blockly im ersten Beitrag aktualisiert. Es ist jetzt "universeller" und deutlich einfacher und kürzer.
                      Es muß für verschiedene Ansagen nur dieser Teil angepasst werden. Fast der gesamte Rest vom Blockly bleibt dann so für weitere Ansagen.

                      Bildschirmfoto 2019-10-31 um 10.55.14.png

                      Wenn man das Blockly für andere Ansagen kopiert, dann diesen Teil oben und den Trigger für die Routine anpassen, also hier einen weiteren Button für diese Ansage erstellen.
                      also da drinn (ganz rechts auf </> . klicken)

                      Bildschirmfoto 2019-10-31 um 11.17.21.png

                      ganz unten (der Rest bleibt so)

                      Bildschirmfoto 2019-10-31 um 11.17.42.png

                      Dann den veränderten Trigger hier verwenden

                      Bildschirmfoto 2019-10-31 um 11.25.39.png

                      Danach wie gehabt (iot einmal öffnen/ anschließend neue Geräte in der Amazon App suchen lassen und eine weitere Routine für diese Abfrage erstellen)

                      1 Antwort Letzte Antwort
                      2
                      • 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
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          307

                                          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