Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Mit on() auf Sensoren in einem Gewerk triggern

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Mit on() auf Sensoren in einem Gewerk triggern

    This topic has been deleted. Only users with topic management privileges can see it.
    • R
      rascal last edited by

      Hallo,

      ich habe Sensoren in einem Gewerk "Alarmanlage".

      ich weis, dass das Gewerk in enum.Names[0] steht.

      Wie setzte ich das jetzt in dem on() Befehl um?

      on({id: /\.enumNames[0]$/, val: "Alarmanlage"}, ... 
      

      funktioniert nicht 😞

      Ich würde mich über einen kleinen Schups in die richtige Richtung freuen, danke

      1 Reply Last reply Reply Quote 0
      • P
        pix last edited by

        Hallo,

        mach es, wie im http://forum.iobroker.com/viewtopic.php?f=21&t=473.

        Alle STATE Datenpunkte im Gewerk Alarmanlage:

        var cacheSelectorState  = $('channel[state.id=*.STATE](functions="Alarmanlage")');
        
        cacheSelectorState.on(function(obj) {    // bei Zustandänderung *. STATE im Gewerk Alarmanlage
            // machWas(obj);
        })
        
        

        Gruß,

        Pix

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

          @rascal:

          ich habe Sensoren in einem Gewerk "Alarmanlage".

          ich weis, dass das Gewerk in enum.Names[0] steht. `
          Hast Du es mal versucht mit

          $('channel(Names=Alarmanlage)').on(function(dp) {
          	...
          });
          
          1 Reply Last reply Reply Quote 0
          • Bluefox
            Bluefox last edited by

            @rascal:

            Hallo,

            ich habe Sensoren in einem Gewerk "Alarmanlage".

            ich weis, dass das Gewerk in enum.Names[0] steht.

            Wie setzte ich das jetzt in dem on() Befehl um?

            on({id: /\.enumNames[0]$/, val: "Alarmanlage"}, ... 
            

            funktioniert nicht 😞

            Ich würde mich über einen kleinen Schups in die richtige Richtung freuen, danke `
            Wenn es unbedingt RegEx sein muss, dann so:

            on({id: new RegExp("\\." + enumNames[0] + "$"), val: "Alarmanlage"}, ... 
            

            Ansonsten sollte mit selector $ schon gehen.

            1 Reply Last reply Reply Quote 0
            • R
              rascal last edited by

              danke für die Antworten, ich brings aber nicht hin 😞

              Ganzes Script - soll mal eine Alarmanlage werden, zum Testen habe ich aber einen Dimmer (Stehlampe) und eine Variable (…Alarmanlage_test) genommen:

              function alarm(dp)
              {
                  var name = dp.enumNames[0];
                  log("-----------------------TEST Alarmanlage, ausgelöster Sensor: "+ name, "info");
              
                  //setState("sayit.1.tts.text"/*Text to speech*/, name);
                  //log(JSON.stringify(dp), "info");
              }
              
              on({id: "javascript.1.Alarmanlage_test"/*Alarmanlage_test*/, change: "any"}, function(dp) {alarm(dp)});
              on({id: "hm-rpc.0.KEQ0904416.1.LEVEL"/*Licht_DBR_Stehlampe.LEVEL*/, val: 25}, function(dp) {alarm(dp)});
              $('channel(Names=Innenbeleuchtung)').on(function(dp) {alarm(dp)});
              on({id: new RegExp("\\." + enumNames[0] + "$"), val: "Innenbeleuchtung"}, function(dp) {alarm(dp)});
              

              bei:

              on({id: new RegExp("\\." + enumNames[0] + "$"), val: "Innenbeleuchtung"}, function(dp) {alarm(dp)});
              

              schreibt er mir:````
              14:58:39.849 [error] javascript.0 script.js.Surveillance.Test_Alarmanlage: ReferenceError: enumNames is not defined at script.js.Surveillance.Test_Alarmanlage:13:28

              
              bei:
              

              $('channel(Names=Innenbeleuchtung)').on(function(dp) {alarm(dp)});

              macht er gar nichts.
              
              bei:
              

              on({id: "hm-rpc.0.KEQ0904416.1.LEVEL"/Licht_DBR_Stehlampe.LEVEL/, val: 25}, function(dp) {alarm(dp)});

              gibt er mir "Innenbeleuchtung" im Log aus.
              1 Reply Last reply Reply Quote 0
              • Bluefox
                Bluefox last edited by

                @rascal:

                danke für die Antworten, ich brings aber nicht hin 😞

                Ganzes Script - soll mal eine Alarmanlage werden, zum Testen habe ich aber einen Dimmer (Stehlampe) und eine Variable (…Alarmanlage_test) genommen:

                function alarm(dp)
                {
                    var name = dp.enumNames[0];
                    log("-----------------------TEST Alarmanlage, ausgelöster Sensor: "+ name, "info");
                    
                    //setState("sayit.1.tts.text"/*Text to speech*/, name);
                    //log(JSON.stringify(dp), "info");
                }
                
                on({id: "javascript.1.Alarmanlage_test"/*Alarmanlage_test*/, change: "any"}, function(dp) {alarm(dp)});
                on({id: "hm-rpc.0.KEQ0904416.1.LEVEL"/*Licht_DBR_Stehlampe.LEVEL*/, val: 25}, function(dp) {alarm(dp)});
                $('channel(Names=Innenbeleuchtung)').on(function(dp) {alarm(dp)});
                on({id: new RegExp("\\." + enumNames[0] + "$"), val: "Innenbeleuchtung"}, function(dp) {alarm(dp)});
                

                bei:

                on({id: new RegExp("\\." + enumNames[0] + "$"), val: "Innenbeleuchtung"}, function(dp) {alarm(dp)});
                

                schreibt er mir:````
                14:58:39.849 [error] javascript.0 script.js.Surveillance.Test_Alarmanlage: ReferenceError: enumNames is not defined at script.js.Surveillance.Test_Alarmanlage:13:28

                
                bei:
                

                $('channel(Names=Innenbeleuchtung)').on(function(dp) {alarm(dp)});

                macht er gar nichts.
                
                bei:
                

                on({id: "hm-rpc.0.KEQ0904416.1.LEVEL"/Licht_DBR_Stehlampe.LEVEL/, val: 25}, function(dp) {alarm(dp)});

                gibt er mir "Innenbeleuchtung" im Log aus. `  
                
                $('channel(functions=Innenbeleuchtung)[state.id=*.STATE]').on(function (event) {
                    var _obj = getObject(event.id, 'functions');
                    log(_obj.enumNames[0]);
                });
                
                1 Reply Last reply Reply Quote 0
                • R
                  rascal last edited by

                  danke, mit dem kann ich arbeiten 😄

                  1 Reply Last reply Reply Quote 0
                  • R
                    rascal last edited by

                    Hey,

                    noch eine Frage dazu:

                    $('channel(functions=Innenbeleuchtung)[state.id=*.STATE]').on(function (event) {
                        var _obj = getObject(event.id, 'functions');
                        log(_obj.enumNames[0]);
                    });
                    

                    kann man da auch 2 Gewerke abfragen? wie "Innenbeleuchtung" && " Aussenbeleuchtung"?

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

                      @rascal:

                      Hey,

                      noch eine Frage dazu:

                      $('channel(functions=Innenbeleuchtung)[state.id=*.STATE]').on(function (event) {
                          var _obj = getObject(event.id, 'functions');
                          log(_obj.enumNames[0]);
                      });
                      

                      kann man da auch 2 Gewerke abfragen? wie "Innenbeleuchtung" && " Aussenbeleuchtung"? `

                      $('channel(functions=Innenbeleuchtung)(functions=Aussenbeleuchtung)[state.id=*.STATE]').on(function (event) {
                          var _obj = getObject(event.id, 'functions');
                          log(_obj.enumNames[0]);
                      });
                      
                      1 Reply Last reply Reply Quote 0
                      • R
                        rascal last edited by

                        du bist der Beste!

                        1 Reply Last reply Reply Quote 0
                        • R
                          rascal last edited by

                          Hey again,

                          funktioniert soweit alles super, aber ich habe noch eine Frage 🙂

                          kann man dabei auch eine "change: gt" einbauen?

                          $('channel(functions=Innenbeleuchtung)(functions=Aussenbeleuchtung)[state.id=*.STATE]').on(function (event) {
                              var _obj = getObject(event.id, 'functions');
                              log(_obj.enumNames[0]);
                          });
                          
                          1 Reply Last reply Reply Quote 0
                          • paul53
                            paul53 last edited by

                            @rascal:

                            kann man dabei auch eine "change: gt" einbauen? `
                            Vielleicht so:

                            $('channel(functions=Innenbeleuchtung)(functions=Aussenbeleuchtung)[state.id=*.STATE]').on(function (event) {
                            	if(event.state.val > event.oldState.val) {
                            		var _obj = getObject(event.id, 'functions');
                            		log(_obj.enumNames[0]);
                            	}
                            });
                            
                            1 Reply Last reply Reply Quote 0
                            • R
                              rascal last edited by

                              Hallo,

                              habe ein neues Problemchen mit meinem Skript.

                              Ich habe ein Schließerkontaktinterface. Auf dem hängen das Einfahrtstor und die Eingangstüre mittels Reedkontakt + ein optischer Regensensor.

                              Das Tor und die Türe habe ich in den Gewerken Alarmanlagensensor_aussen + Verschluß

                              Den Regensensor habe ich nur im Gewerk Wetter.

                              Nun triggere ich mit dem Script auf das Gewerk Alarmanlagensensor_aussen, was auch super funktioniert… allerdings triggert er dabei auch auf den Regensensor... warum? (ich habe es im Moment so abgefangen, dass er in die if-Schleife nur reingeht, wenn es nicht der Regensensor ist... was natürlich etwas unschön gelöst ist 😞

                              Noch zu erwähnen wäre, dass in der Aufzählung im iobroker der Regensensor unter Alarmanlage_aussen gar nicht aufscheint, die beiden Anderen aber schon.

                              Script:

                              $('channel(functions=Alarmanlagensensor_aussen)[state.id=*.STATE]').on(function (event) {
                              
                                  var _obj = getObject(event.id, 'functions');
                                  log("---------------------------------------------------"+ event.channelName, "info");
                                  //log(JSON.stringify(event), "info");
                              
                                  var Alarmanlagenstatus = getState("hm-rega.0.2111"/*Sicherheitsstufe*/);
                                  if((Alarmanlagenstatus.val > 0) && (event.channelName != "Regensensor zu/leer=trocken"))
                                  {
                                      setState(sayit_vol, 100);
                                      setState(sayit_txt, "Der "+ event.channelName +" hat Bewegung festgestellt.");
                                      setState("telegram.0.communicate.response"/*Send text through telegram*/, "Der "+ event.channelName +" hat Bewegung festgestellt.");
                                  }
                              

                              421_unbenannt.jpg
                              421_unbenannt2.jpg

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

                                @rascal:

                                Hallo,

                                habe ein neues Problemchen mit meinem Skript.

                                Ich habe ein Schließerkontaktinterface. Auf dem hängen das Einfahrtstor und die Eingangstüre mittels Reedkontakt + ein optischer Regensensor.

                                Das Tor und die Türe habe ich in den Gewerken Alarmanlagensensor_aussen + Verschluß

                                Den Regensensor habe ich nur im Gewerk Wetter.

                                Nun triggere ich mit dem Script auf das Gewerk Alarmanlagensensor_aussen, was auch super funktioniert… allerdings triggert er dabei auch auf den Regensensor... warum? (ich habe es im Moment so abgefangen, dass er in die if-Schleife nur reingeht, wenn es nicht der Regensensor ist... was natürlich etwas unschön gelöst ist 😞

                                Noch zu erwähnen wäre, dass in der Aufzählung im iobroker der Regensensor unter Alarmanlage_aussen gar nicht aufscheint, die beiden Anderen aber schon.

                                Script:

                                $('channel(functions=Alarmanlagensensor_aussen)[state.id=*.STATE]').on(function (event) {
                                
                                    var _obj = getObject(event.id, 'functions');
                                    log("---------------------------------------------------"+ event.channelName, "info");
                                    //log(JSON.stringify(event), "info");
                                    
                                    var Alarmanlagenstatus = getState("hm-rega.0.2111"/*Sicherheitsstufe*/);
                                    if((Alarmanlagenstatus.val > 0) && (event.channelName != "Regensensor zu/leer=trocken"))
                                    {
                                        setState(sayit_vol, 100);
                                        setState(sayit_txt, "Der "+ event.channelName +" hat Bewegung festgestellt.");
                                        setState("telegram.0.communicate.response"/*Send text through telegram*/, "Der "+ event.channelName +" hat Bewegung festgestellt.");
                                    }
                                ```` `  
                                

                                Was kommt bei dir:

                                $('channel(functions=Alarmanlagensensor_aussen)[state.id=*.STATE]').each(function (id) {
                                	console.log(id);
                                });
                                
                                
                                1 Reply Last reply Reply Quote 0
                                • Bluefox
                                  Bluefox last edited by

                                  @Bluefox:

                                  @rascal:

                                  Hallo,

                                  habe ein neues Problemchen mit meinem Skript.

                                  Ich habe ein Schließerkontaktinterface. Auf dem hängen das Einfahrtstor und die Eingangstüre mittels Reedkontakt + ein optischer Regensensor.

                                  Das Tor und die Türe habe ich in den Gewerken Alarmanlagensensor_aussen + Verschluß

                                  Den Regensensor habe ich nur im Gewerk Wetter.

                                  Nun triggere ich mit dem Script auf das Gewerk Alarmanlagensensor_aussen, was auch super funktioniert… allerdings triggert er dabei auch auf den Regensensor... warum? (ich habe es im Moment so abgefangen, dass er in die if-Schleife nur reingeht, wenn es nicht der Regensensor ist... was natürlich etwas unschön gelöst ist 😞

                                  Noch zu erwähnen wäre, dass in der Aufzählung im iobroker der Regensensor unter Alarmanlage_aussen gar nicht aufscheint, die beiden Anderen aber schon.

                                  Script:

                                  $('channel(functions=Alarmanlagensensor_aussen)[state.id=*.STATE]').on(function (event) {
                                  
                                      var _obj = getObject(event.id, 'functions');
                                      log("---------------------------------------------------"+ event.channelName, "info");
                                      //log(JSON.stringify(event), "info");
                                      
                                      var Alarmanlagenstatus = getState("hm-rega.0.2111"/*Sicherheitsstufe*/);
                                      if((Alarmanlagenstatus.val > 0) && (event.channelName != "Regensensor zu/leer=trocken"))
                                      {
                                          setState(sayit_vol, 100);
                                          setState(sayit_txt, "Der "+ event.channelName +" hat Bewegung festgestellt.");
                                          setState("telegram.0.communicate.response"/*Send text through telegram*/, "Der "+ event.channelName +" hat Bewegung festgestellt.");
                                      }
                                  ```` `  
                                  

                                  Was kommt bei dir:

                                  $('channel(functions=Alarmanlagensensor_aussen)[state.id=*.STATE]').each(function (id) {
                                  	console.log(id);
                                  });
                                  
                                  ```` `  
                                  

                                  Man muss darauf achten, dass 'channel(functions=Alarmanlagensensor_aussen)[state.id=*.STATE]

                                  nur alle states mit Namen ".STATE" sucht. Um andere States, z.b. Bewegungsmelder aufzulisten, muss man die auch mitnehmen.

                                  channel(functions=Alarmanlagensensor_aussen)[state.id=.STATE][state.id=.MOTION]

                                  1 Reply Last reply Reply Quote 0
                                  • S
                                    Solear last edited by

                                    edit: Kommando zurück, ein Neustart der VM hat geholfen. Funktioniert jetzt.

                                    @paul53:

                                    @rascal:

                                    kann man dabei auch eine "change: gt" einbauen? `
                                    Vielleicht so:

                                    $('channel(functions=Innenbeleuchtung)(functions=Aussenbeleuchtung)[state.id=*.STATE]').on(function (event) {
                                    	if(event.state.val > event.oldState.val) {
                                    		var _obj = getObject(event.id, 'functions');
                                    		log(_obj.enumNames[0]);
                                    	}
                                    });
                                    ```` `  
                                    

                                    Ich möchte meine "Alarmanlage" auch scripten.

                                    Er soll alle Änderungen im Gewerk "Alarm" registrieren.

                                    Das habe ich genauso so als Tetsskript erstmal zum vortasten, bevor ich es um Anwesenheitsprüfung ergänze:

                                    $('channel(functions=Alarm)[state.id=*.STATE]').on(function (event) {
                                       if(event.state.val > event.oldState.val) {
                                          var _obj = getObject(event.id, 'functions');
                                          log(_obj.enumNames[0]);
                                          sendTo("pushover", {message: 'ALARM: Fenster wurden geöffnet', priority: 1});
                                       }
                                    });
                                    

                                    Das functions ist ja gleichzusetzen mit den Gewerken aus der CCU2. Eigentlich sollte im Log irgendetwas erscheinen, wenn ich ein Fenster öffne. Das Testfenster (HM Fenstersensor) ist dem Gewerk "Alarm" zugeordnet und gibt einen STATE aus. In iobroker im Reiter "Aufzählungen" erscheint auch unter enum.functions der Punkt Alarm und der Fenstersensor ist dort angezeigt.

                                    Das Log bleibt aber leer und ich bekomme keine Pushovernachricht (die Pushoverfunktion funktioniert definitiv).

                                    Habe ich jetzt irgend etwas vergessen oder einen Denkfehler?

                                    edit: Kommando zurück, ein Neustart der VM hat geholfen. Funktioniert jetzt.

                                    1 Reply Last reply Reply Quote 0
                                    • S
                                      Solear last edited by

                                      So,

                                      jetzt habe ich mir auch ein kleines Alarmscript (irgendeine Fensteröffnung = Pushovermeldung) gebastelt, welches die Besonderheit hat, dass es die beiden Kellerfenstersensoren nicht meldet, sofern diese beiden Fenster vom Entfeuchtungsscript automatisch geöffnet/geschlossen worden sind.

                                      Außerdem sendet es nur eine Meldung, wenn die Personenanzahl weniger als 1 ist (also niemand zuhause ist). Das habe ich über den Geofence Adapter gelöst.

                                      Es scheint so zu klappen alles, vielleicht nicht elegant, aber ich kann denn Code nachvollziehen.

                                      // Forum: http://forum.iobroker.net/viewtopic.php?f=21&t=2473
                                      // Horcht an allen Gewerken (functions) unter "Alarm" und sendet bei Statusänderung
                                      // Schließt die beiden Kellerfenster vom Alarm aus, sofern das Lüftungsscript die Öffnung/Schließung angestoßen hat:
                                      // wenn Jalousieaktorstatus (= Aktor für die Fenstermotoren) auf WORKING steht, dann werden die Kellerfenster ausgeschlossen!
                                      
                                      // IDs deklarieren
                                      var jemandzuhauseid = "geofency.0.atHomeCount"/*atHomeCount*/;
                                      var kellerscriptsiid = "hm-rpc.0.MEQ03xxxxx.1.WORKING"/*Fensteröffner Keller Sicherungsraum:1.WORKING*/;        // liest den Jalousieaktor aus, WORKING = in Arbeit
                                      var kellerscriptwaid = "hm-rpc.0.MEQ05xxxxx.1.WORKING"/*Fensteröffner Keller Waschraum:1.WORKING*/;
                                      
                                      $('channel(functions=Alarm)[state.id=*.STATE]').on(function (event) {                                           // An "Alarm"-Gewerke nach Statusänderungen prüfen 
                                      
                                          var _obj = getObject(event.id, 'functions');
                                          log("---------------------------------------------------"+ event.channelName, "info");
                                      
                                          var jemandzuhause = getState(jemandzuhauseid).val;                                                          // IDs auslesen 
                                          var kellerscriptsi = getState(kellerscriptsiid).val;
                                          var kellerscriptwa = getState(kellerscriptwaid).val;
                                      
                                          if((event.channelName !== 'Fenstersensor Keller Sicherungsraum' && kellerscriptsi !== true) ||              // Ausschluss Kellerfenster bei automatischer Öffnung/Schließung
                                              (event.channelName !== 'Fenstersensor Keller Waschraum' && kellerscriptwa !== true)) 
                                                  {
                                                      if (jemandzuhause < 1)                                                                           // Prüft ob jemand Zuhause ist
                                                      {                                                                               
                                                          sendTo("pushover", {message: 'ALARM: ' + event.channelName + ' hat angeschlagen!', priority: 1});       // wenn nein, Alarmnachricht
                                                          //setState(sayit_vol, 100);
                                                          //setState(sayit_txt, "Der "+ event.channelName +" hat angeschlagen.");
                                                      }
                                                  }
                                      }); 
                                      
                                      
                                      1 Reply Last reply Reply Quote 0
                                      • First post
                                        Last post

                                      Support us

                                      ioBroker
                                      Community Adapters
                                      Donate

                                      806
                                      Online

                                      31.7k
                                      Users

                                      79.7k
                                      Topics

                                      1.3m
                                      Posts

                                      5
                                      17
                                      2149
                                      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