Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Hausstatus Script

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Hausstatus Script

    This topic has been deleted. Only users with topic management privileges can see it.
    • kmxak
      kmxak Most Active last edited by

      Guten Abend,

      ich würde mir gerne folgendes Script bauen:

      Per Telegram Status senden. Ein Script wird ausgeführt das Licht und Türen (ggf später mehr) checkt und wenn was an oder auf ist Rückmeldung gibt.

      Vom Aufbau her würde ich bei Status das Status js script aktivieren und im Script am Ende wieder deaktivieren.

      Fehlt mir nur der Inhalt vom Script. Das ist an sich auch nicht so kompliziert allerdings weiß ich nicht wie ich das Ergebnis am besten ausgegeben bekomme.

      Habe nun folgendes Blockly gebaut das mir 3 Türen und 3 Lichter auswertet.

      Funktion ist gegeben allerdings sagt er mir wenn was offen steht immer ein undefined davor.

      Auch würde ich es gerne etwas besser coden.

      Habe schon gedacht mit dem Listen Blockly zu arbeiten allerdings weiß ich nicht wie ich das machen soll.

      Weiß noch nicht mal ob das so richig ist.

      Ich hänge ja immer an die selbe var einen Text dran.

      var ti, li;
      
      // Türen Check
      if (getState("hm-rpc.0.***.1.STATE").val == true) {
        ti = String(ti) + String('Küchentür');
      }
      if (getState("hm-rpc.0.***.1.STATE").val == true) {
        ti = String(ti) + String('Wohnzimmertür');
      }
      if (getState("hm-rpc.0.***.1.STATE").val == true) {
        ti = String(ti) + String('Eingangstür');
      }
      // Licht Check
      if (getState("hm-rpc.0.***.1.STATE").val == true) {
        li = String(li) + String('Küche');
      }
      if (getState("hm-rpc.0.***.1.STATE").val == true) {
        li = String(li) + String('Kühlschrank');
      }
      if (getState("wifilight.0.192_168_2_***.on").val > 1) {
        li = String(li) + String('Arbeitsplatte');
      }
      sendTo("telegram.1", "send", {
          text: (['Status Infos ',ti,li].join(''))
      });
      
      1 Reply Last reply Reply Quote 0
      • apollon77
        apollon77 last edited by

        Initial ist der Wert deiner Variablen "undefined" weil du Ihnen keinen initialwert gibst. Also vor deiner Logik einmal dir Variablen auf "" (leerer Text) setzen. Dann sollte das undefined weg srin

        1 Reply Last reply Reply Quote 0
        • kmxak
          kmxak Most Active last edited by

          8-) Das wusste ich noch nicht danke dafür. Ist erledigt und funzt.

          Jetzt muss ich mir nur noch überlegen wie ich den Text formatiert bekomme damit es in der Ausagabe auch ordentlich wird.

          Noch eine kleine Extra Frage für Telegram Expterten: Mit \n kann man in eine neue Zeile wechseln dies Funktioniert aber nicht wenn ich es so mache

          Blockly Text Block mit Inhalt````
          Status Infos \n

          text: (['Status Infos \\n',ti,li].join(''))
          
          
          Edit:
          
          Hier mein aktualisiertes Script. (testweise auf unwahr da um diese zeit nix an ist :? )
          
          Läuft aber mit der Textausgabe bin ich immer noch nicht zufrieden. Hat da einer einen Tip wie ich die besser lösen kann? Sieht mir doch sehr anfänglich aus der code. :lol:
          
          >! ````
          var ti, li;
          >! ti = '';
          li = '';
          // Türen Check
          if (getState("hm-rpc.0.***.1.STATE").val == false) {
            ti = String(ti) + String('Küche');
            ti = String(ti) + String(', ');
          }
          if (getState("hm-rpc.0.***.1.STATE").val == false) {
            ti = String(ti) + String('Wohnzimmer');
            ti = String(ti) + String(', ');
          }
          if (getState("hm-rpc.0.***.1.STATE").val == false) {
            ti = String(ti) + String('Eingang');
          }
          // Licht Check
          if (getState("hm-rpc.0.***.1.STATE").val == false) {
            li = String(li) + String('Küche');
            li = String(li) + String(', ');
          }
          if (getState("hm-rpc.0.***.1.STATE").val == false) {
            li = String(li) + String('Kühlschrank');
            li = String(li) + String(', ');
          }
          if (getState("wifilight.0.***.on").val < 1) {
            li = String(li) + String('Arbeitsplatte');
          }
          sendTo("telegram.1", "send", {
              text: (['Status Lichter - ','Die Lichter: ',li.split(','),' sind noch an.','Status Türen - ','Die Türen: ',ti.split(','),' stehen noch offen.'].join(''))
          });
          

          2343_blockly.png

          1 Reply Last reply Reply Quote 0
          • BuZZy
            BuZZy last edited by

            Ich habe ein Script laufen welches alle Tür-/Fensterkontakte überwacht. Sobald ein Kontakt anschlägt, wird dieser in ein Datenpunkt geschrieben und zusätzlich die Anzahl der offenen Kontakte.

            Also wenn ich die Haustür öffne

            Welche: Haustür

            Anzahl: 1

            Oder wenn ich Schlafzimmerfenster öffne

            Welche: Schlafzimmer L, Schlafzimmer R

            Anzahl: 2

            Diese gebe ich dann einfach über Telegram wieder wenn ich schreibe "Sind fenster offen?" Dann kommt:

            Es sind alle Fenster schlossen..

            ODER

            Es sind 3 Fenster/Türen geöffnet: Schlafzimmer L, Schlafzimmer R, Haustür…....

            Such mal nach dem Lowbat Script hier im Forum, das kannst du entsprechend ganz einfach ändern auf Türkontakte.

            So sieht mein Script aus um alle Fensterkontakte zu überwachen (ohne Telegram Meldung) (Fensterkontakte sind im Gewerk "Fensterkontakte")

            createState('Watchdogs.Fenster.WieVieleSindOffen', 0);
            createState('Watchdogs.Fenster.WelcheSindOffen', " ");
            
            var cacheSelectorFENSTER  = $('channel(functions=Fensterkontakte)[state.id=*.STATE]');
            
            function countFenster(obj) {
               var textFENSTER      = [];
            
               cacheSelectorFENSTER.each(function (id, i) {
                  var status = getState(id).val;
                  var obj    = getObject(id);
                  if (status === true) {
                     textFENSTER.push(obj.common.name.substr(0, obj.common.name.indexOf(':')));
                  }                
               }); 
            
                setState("Watchdogs.Fenster.WelcheSindOffen",     textFENSTER.join(', '));
                setState("Watchdogs.Fenster.WieVieleSindOffen",   textFENSTER.length);
            }
            cacheSelectorFENSTER.on(function(obj) {
               countFenster(obj);
            });
            schedule("0 */1 * * *", function () {
                countFenster();
            });
            

            Wenn man 25 Fensterkontakte hat wird das Script welches du verwendest ganz schön "aufgeblasen".. 🙂

            Gruß

            1 Reply Last reply Reply Quote 0
            • kmxak
              kmxak Most Active last edited by

              Hi danke für das Script und den denkanstoß es über Gewerke zu machen.

              Nun habe ich nur noch das Problem das ich den Namen als HM-Sec-SCo …... angezeigt bekomme und nicht als z.B Küche.

              In der Homamatic habe ich schon Namen vergeben aber irgendwie nimmt der immer die Bezeichnung.

              Kann man das ändern?

              1 Reply Last reply Reply Quote 0
              • BuZZy
                BuZZy last edited by

                Hier mal wie es bei mir in der CCU2 aussieht und die Namen in ioBroker (die automatisch übernommen werden). Wenn die Namen nicht automatisch in ioBroker aktualisiert werden mal den Homematic REGA Adapter in ioBroker neu starten und prüfen ob die Übernahme der Namen aus der CCU aktiviert ist:
                3092_screenshot_-_22.09.2017___14_43_36.png
                3092_screenshot_-_22.09.2017___14_37_23.png
                3092_screenshot_-_22.09.2017___14_34_42.png

                1 Reply Last reply Reply Quote 0
                • lobomau
                  lobomau last edited by

                  @BuZZy:

                  Ich habe ein Script laufen welches alle Tür-/Fensterkontakte überwacht. Sobald ein Kontakt anschlägt, wird dieser in ein Datenpunkt geschrieben und zusätzlich die Anzahl der offenen Kontakte.

                  Also wenn ich die Haustür öffne

                  Welche: Haustür

                  Anzahl: 1

                  Oder wenn ich Schlafzimmerfenster öffne

                  Welche: Schlafzimmer L, Schlafzimmer R

                  Anzahl: 2

                  Diese gebe ich dann einfach über Telegram wieder wenn ich schreibe "Sind fenster offen?" Dann kommt:

                  Es sind alle Fenster schlossen..

                  ODER

                  Es sind 3 Fenster/Türen geöffnet: Schlafzimmer L, Schlafzimmer R, Haustür…....

                  Such mal nach dem Lowbat Script hier im Forum, das kannst du entsprechend ganz einfach ändern auf Türkontakte.

                  So sieht mein Script aus um alle Fensterkontakte zu überwachen (ohne Telegram Meldung) (Fensterkontakte sind im Gewerk "Fensterkontakte")

                  createState('Watchdogs.Fenster.WieVieleSindOffen', 0);
                  createState('Watchdogs.Fenster.WelcheSindOffen', " ");
                  
                  var cacheSelectorFENSTER  = $('channel(functions=Fensterkontakte)[state.id=*.STATE]');
                  
                  function countFenster(obj) {
                     var textFENSTER      = [];
                     
                     cacheSelectorFENSTER.each(function (id, i) {
                        var status = getState(id).val;
                        var obj    = getObject(id);
                        if (status === true) {
                           textFENSTER.push(obj.common.name.substr(0, obj.common.name.indexOf(':')));
                        }                
                     }); 
                  
                      setState("Watchdogs.Fenster.WelcheSindOffen",     textFENSTER.join(', '));
                      setState("Watchdogs.Fenster.WieVieleSindOffen",   textFENSTER.length);
                  }
                  cacheSelectorFENSTER.on(function(obj) {
                     countFenster(obj);
                  });
                  schedule("0 */1 * * *", function () {
                      countFenster();
                  });
                  

                  Wenn man 25 Fensterkontakte hat wird das Script welches du verwendest ganz schön "aufgeblasen".. 🙂

                  Gruß `
                  Einfach und funktioniert super! Danke dafür!

                  Bisher wurden nur die auf/zu-Kontakte betätigt. Bin mal gespannt ob es bei Fenster auf/zu/auf kipp auch so funktioniert.

                  Bei mir läuft alles wie Fenter und Türen unter der Funktion "Verschluss". Das war die einzige Änderung, die ich am Script vornehmen musste.
                  1146_unbenannt.jpg

                  1 Reply Last reply Reply Quote 0
                  • BuZZy
                    BuZZy last edited by

                    Bei Drehgriffsensoren wird es wohl nicht klappen, da das Script nur Objekte zählt wo der Wert "true" ist. Man müsste es also so anpassen, dass die Werte offen und gekippt gezählt werden, da ich aber keine Griffsensoren einsetze weiß ich nicht welche Werte für gekippt oder offen stehen. Aber die Anpassung ist easy.. Man muss halt nur wissen welcher Wert für gekippt und welcher Wert für weit offen steht und die if Abfrage entsprechend anpassen.

                    Gruß

                    Von unterwegs gesendet

                    1 Reply Last reply Reply Quote 0
                    • lobomau
                      lobomau last edited by

                      @BuZZy:

                      Bei Drehgriffsensoren wird es wohl nicht klappen, da das Script nur Objekte zählt wo der Wert "true" ist. Man müsste es also so anpassen, dass die Werte offen und gekippt gezählt werden, da ich aber keine Griffsensoren einsetze weiß ich nicht welche Werte für gekippt oder offen stehen. Aber die Anpassung ist easy.. Man muss halt nur wissen welcher Wert für gekippt und welcher Wert für weit offen steht und die if Abfrage entsprechend anpassen.

                      Gruß

                      Von unterwegs gesendet `
                      Mal schauen ob ich es angepasst bekomme. States lauten da:

                      "0": "CLOSED",

                      "1": "TILTED",

                      "2": "OPEN"

                      Edit: ich nehme an ich muss hier anpassen:

                      if (status === true)
                      

                      sowas wie "status ungleich 0" wäre dann wohl ok.

                      1 Reply Last reply Reply Quote 0
                      • BuZZy
                        BuZZy last edited by

                        Ich würd da dann neue Datenpunkte anlegen für gekippt und weit offen. So dass man eine Übersicht hat wie viele insgesamt geöffnet sind (egal ob gekippt oder weit), wie viele gekippt und wie viele weit offen sind. So hat man eine Übersicht über alles.. Wenn du nicht weiter kommst kannst du dich gerne melden. 🙂

                        Gruß

                        Von unterwegs gesendet

                        1 Reply Last reply Reply Quote 0
                        • BuZZy
                          BuZZy last edited by

                          @lobomau:

                          Edit: ich nehme an ich muss hier anpassen:

                          if (status === true)
                          

                          sowas wie "status ungleich 0" wäre dann wohl ok. `

                          Korrekt! 🙂

                          Gruß

                          Von unterwegs gesendet

                          1 Reply Last reply Reply Quote 0
                          • lobomau
                            lobomau last edited by

                            @Buzzy: ich habe dein oberes Script angepasst für meine Lichter. Es ist quasi 100% gleich. Es wird auch angezeigt welches Licht an, aber es wird nicht gezählt, ist immer 0. Kann ich es nicht einfach so übernehmen? So sieht es bei mir aus:

                            EDIT: paar Stunden später ist der Zähler am Funktionieren…. mal weiter beobachten.

                            createState('Watchdogs.Lichter.WieVieleSindOffen', 0);
                            createState('Watchdogs.Lichter.WelcheSindOffen', " ");
                            
                            var cacheSelectorLICHTER  = $('channel(functions=Licht)[state.id=*.STATE]');
                            
                            function countLichter(obj) {
                               var textLICHTER      = [];
                            
                               cacheSelectorLICHTER.each(function (id, i) {
                                  var status = getState(id).val;
                                  var obj    = getObject(id);
                                  if (status === true) {
                                     textLICHTER.push(obj.common.name.substr(0, obj.common.name.indexOf(':')));
                                  }                
                               }); 
                            
                                setState("Watchdogs.Lichter.WelcheSindOffen",     textLICHTER.join(', '));
                                setState("Watchdogs.Lichter.WieVieleSindOffen",   textLICHTER.length);
                            }
                            cacheSelectorLICHTER.on(function(obj) {
                               countLichter(obj);
                            });
                            schedule("0 */1 * * *", function () {
                                countLichter();
                            });
                            
                            1 Reply Last reply Reply Quote 0
                            • lobomau
                              lobomau last edited by

                              Inzwischen zählt er doch. Habe nichts geändert (außer js-controller update und damit auch iobroker neugestartet).

                              Mein Problem sind jetzt aber die Geräte von homematic IP, die haben zwei Kanäle mit STATE, die auch beide reagieren wenn Licht angehen.

                              Eine Möglichkeit wäre vielleicht wenn ich dem einen nicht mehr zuordne der Function Licht. Aber man es sicherlich auch so programmieren dass doppelte Namen nicht doppelt gezählt werden sollen.
                              1146_unbenannt.jpg

                              1 Reply Last reply Reply Quote 0
                              • BuZZy
                                BuZZy last edited by

                                @lobomau:

                                Inzwischen zählt er doch. Habe nichts geändert (außer js-controller update und damit auch iobroker neugestartet).

                                Mein Problem sind jetzt aber die Geräte von homematic IP, die haben zwei Kanäle mit STATE, die auch beide reagieren wenn Licht angehen.

                                Eine Möglichkeit wäre vielleicht wenn ich dem einen nicht mehr zuordne der Function Licht. Aber man es sicherlich auch so programmieren dass doppelte Namen nicht doppelt gezählt werden sollen. `

                                createState('Watchdogs.Lichter.WieVieleSindOffen', 0);
                                createState('Watchdogs.Lichter.WelcheSindOffen', " ");
                                
                                var cacheSelectorLICHTER  = $('channel(functions=Licht)[state.id=*.STATE]');
                                
                                function countLichter(obj) {
                                   var textLICHTER      = [];
                                
                                   cacheSelectorLICHTER.each(function (id, i) {
                                      var status = getState(id).val;
                                      var obj    = getObject(id);
                                      if (status === true && textLICHTER.indexOf(obj.common.name.substr(0, obj.common.name.indexOf(':'))) === -1) {
                                         textLICHTER.push(obj.common.name.substr(0, obj.common.name.indexOf(':')));
                                      }                
                                   }); 
                                
                                    setState("Watchdogs.Lichter.WelcheSindOffen",     textLICHTER.join(', '));
                                    setState("Watchdogs.Lichter.WieVieleSindOffen",   textLICHTER.length);
                                }
                                cacheSelectorLICHTER.on(function(obj) {
                                   countLichter(obj);
                                });
                                schedule("0 */1 * * *", function () {
                                    countLichter();
                                });
                                

                                Probier es mal da mit..

                                Gruß

                                1 Reply Last reply Reply Quote 0
                                • lobomau
                                  lobomau last edited by

                                  @BuZZy:

                                  @lobomau:

                                  Inzwischen zählt er doch. Habe nichts geändert (außer js-controller update und damit auch iobroker neugestartet).

                                  Mein Problem sind jetzt aber die Geräte von homematic IP, die haben zwei Kanäle mit STATE, die auch beide reagieren wenn Licht angehen.

                                  Eine Möglichkeit wäre vielleicht wenn ich dem einen nicht mehr zuordne der Function Licht. Aber man es sicherlich auch so programmieren dass doppelte Namen nicht doppelt gezählt werden sollen. `

                                  createState('Watchdogs.Lichter.WieVieleSindOffen', 0);
                                  createState('Watchdogs.Lichter.WelcheSindOffen', " ");
                                  
                                  var cacheSelectorLICHTER  = $('channel(functions=Licht)[state.id=*.STATE]');
                                  
                                  function countLichter(obj) {
                                     var textLICHTER      = [];
                                     
                                     cacheSelectorLICHTER.each(function (id, i) {
                                        var status = getState(id).val;
                                        var obj    = getObject(id);
                                        if (status === true && textLICHTER.indexOf(obj.common.name.substr(0, obj.common.name.indexOf(':'))) === -1) {
                                           textLICHTER.push(obj.common.name.substr(0, obj.common.name.indexOf(':')));
                                        }                
                                     }); 
                                  
                                      setState("Watchdogs.Lichter.WelcheSindOffen",     textLICHTER.join(', '));
                                      setState("Watchdogs.Lichter.WieVieleSindOffen",   textLICHTER.length);
                                  }
                                  cacheSelectorLICHTER.on(function(obj) {
                                     countLichter(obj);
                                  });
                                  schedule("0 */1 * * *", function () {
                                      countLichter();
                                  });
                                  

                                  Probier es mal da mit..

                                  Gruß `
                                  Cool. Läuft!

                                  1 Reply Last reply Reply Quote 0
                                  • First post
                                    Last post

                                  Support us

                                  ioBroker
                                  Community Adapters
                                  Donate

                                  816
                                  Online

                                  31.7k
                                  Users

                                  79.8k
                                  Topics

                                  1.3m
                                  Posts

                                  4
                                  15
                                  2083
                                  Loading More Posts
                                  • Oldest to Newest
                                  • Newest to Oldest
                                  • Most Votes
                                  Reply
                                  • Reply as topic
                                  Log in to reply
                                  Community
                                  Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                  The ioBroker Community 2014-2023
                                  logo