Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [Help] Skript Wassersensor auswerten

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    [Help] Skript Wassersensor auswerten

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

      Hallo zusammen,

      ich habe mir ein Skript gebastelt, welches den Status meiner Wassersensoren auswertet.
      Wenn ein Sensor auslöst, wird mir eine Nachricht per WhatsApp aufs Handy geschickt.
      Das funktioniert auch soweit ganz gut.

      n({id: Array.prototype.slice.apply($("state[id=*](functions=check_water)")), change: "ne"}, function (obj) {
        var value = obj.state.val;
        var oldValue = obj.oldState.val;
        if (!getState(obj.id).val== false) {
      WhatsAppBot(0, String((obj.common ? obj.common.name : "")) + ' – meldet Wasseraustritt!<br>*Bitte überprüfen!!!!*');
      }
      })
      

      Nun schreibt er mir in der Nachricht "Wassersensor Enthärtung water - meldet Wasseraustritt!
      Bitte überprüfen!"

      Meine Frage wäre, wie kann ich den Namen der Variable "water" aus dem Text filtern und ggf. noch den Raum mit ausgeben?

      Danke für eure Antworten.

      Grüße

      Diamand

      paul53 D 2 Replies Last reply Reply Quote 0
      • paul53
        paul53 @Diamand2k22 last edited by paul53

        @diamand2k22 sagte: "water" aus dem Text filtern

        obj.common.name.replace('water', '– meldet Wasseraustritt!<br>*Bitte überprüfen!!!!*')
        

        @diamand2k22 sagte in [Help] Skript Wassersensor auswerten:

        ggf. noch den Raum

        getObject(obj.id, 'rooms').enumNames[0];
        
        1 Reply Last reply Reply Quote 0
        • D
          Diamand2k22 @Diamand2k22 last edited by

          @diamand2k22 said in [Help] Skript Wassersensor auswerten:

          Hallo zusammen,

          ich habe mir ein Skript gebastelt, welches den Status meiner Wassersensoren auswertet.
          Wenn ein Sensor auslöst, wird mir eine Nachricht per WhatsApp aufs Handy geschickt.
          Das funktioniert auch soweit ganz gut.

          n({id: Array.prototype.slice.apply($("state[id=*](functions=check_water)")), change: "ne"}, function (obj) {
            var value = obj.state.val;
            var oldValue = obj.oldState.val;
            if (!getState(obj.id).val== false) {
          WhatsAppBot(0, String((obj.common ? obj.common.name : "")) + ' – meldet Wasseraustritt!<br>*Bitte überprüfen!!!!*');
          }
          })
          

          Nun schreibt er mir in der Nachricht "Wassersensor Enthärtung water - meldet Wasseraustritt!
          Bitte überprüfen!"

          Meine Frage wäre, wie kann ich den Namen der Variable "water" aus dem Text filtern und ggf. noch den Raum mit ausgeben?

          Danke für eure Antworten.

          Grüße

          Diamand

          Hallo Paul,

          danke für deine schnelle Antwort.
          Ich hab es jetzt so wie im Codefenster gelöst.
          So funktioniert es.

          Grüße

          on({id: Array.prototype.slice.apply($("state[id=*](functions=check_water)")), change: "ne"}, function (obj) {
            var value = obj.state.val;
            var oldValue = obj.oldState.val;
            if (!getState(obj.id).val== false) {
          WhatsAppBot(0, String ('*!!Achtung!!*<br>' + (obj.channelName ? obj.channelName :"")) + '<br>meldet Wasseraustritt!<br>*Bitte umgehend überprüfen!!!!*');
          }
          })
          
          paul53 1 Reply Last reply Reply Quote 0
          • paul53
            paul53 @Diamand2k22 last edited by paul53

            @diamand2k22 sagte: Ich hab es jetzt so wie im Codefenster gelöst.

            Weshalb zeigst Du den Javascript-Code, wenn es mittels Blockly erstellt wurde?
            Außerdem doppelte Verneinung: nicht Wert vom Objekt ID = falsch

            Bild_2022-08-26_220215402.png

            oder noch eleganter:

            Bild_2022-08-26_220710476.png

            1 Reply Last reply Reply Quote 0
            • D
              Diamand2k22 last edited by Diamand2k22

              Hallo Paul,

              ich habe das Script nicht mit Blockly erstellt, das ist alles im JavaScript verpackt.
              Hab mir das zusammenkopiert und entsprechend abgeändert.
              Jetzt lasse ich mir zusätzlich über den Alexa EchoDot noch eine Sprachnachricht ausgeben.
              So sieht mein Code so aus:

              createState('waterAlert', false);
              createState('waterAlertRoom', false);
               
              on({id: Array.prototype.slice.apply($("state[id=*](functions=check_water)")), change: "gt"}, async function (obj,id) {
                var value = obj.state.val;
                var oldValue = obj.oldState.val;
                var room = getObject(id, 'rooms').enumNames[0];
                  setState('javascript.0.waterAlert', true); 
                  setState('javascript.0.waterAlertRoom', room);
                  alarmOnAlexa();
                  nachrichtOnWhatsApp();
              }
              );
               
              function alarmOnAlexa(id){
                 if(getState('javascript.0.waterAlert').val)
                  {
                      var room = getObject(id, 'rooms').enumNames[0];
                      setState('alexa2.0.Echo-Devices.G090XG12149215R4.Commands.speak', 'Achtung! Im ' + room + ' wurde ein Wassereinbruch festgestellt!');
                      setTimeout(alarmOnAlexa, 5000);
                  }
              }
               
               function nachrichtOnWhatsApp(obj){
                  if(getState('javascript.0.waterAlert').val)
                  {
                     WhatsAppBot(0, String ('*!!Achtung!!*<br>' + (obj.channelName ? obj.channelName :"")) + '<br>meldet Wasseraustritt!<br>*Bitte umgehend überprüfen!!!!*');
                  }
              }
              

              Meine Fragen wären:
              Die Abfrage aus welchem Raum der Alarm kommt funktioniert nicht.
              Wie kann ich bei dem EchoDot die Lautstärke bei Alarm erhöhen und wenn der Alarm quittiert wurde wieder zurück stellen?

              Auszug aus dem Log:

              javascript.0
              705	2022-08-27 10:58:32.068	error	at processImmediate (node:internal/timers:466:21)
              
              javascript.0
              705	2022-08-27 10:58:32.068	error	at Immediate.<anonymous> (/opt/iobroker/node_modules/@iobroker/js-controller-adapter/src/lib/adapter/adapter.js:5909:56)
              
              javascript.0
              705	2022-08-27 10:58:32.067	error	at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/main.js:596:29)
              
              javascript.0
              705	2022-08-27 10:58:32.067	error	at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1212:38)
              
              javascript.0
              705	2022-08-27 10:58:32.066	error	at Object.<anonymous> (script.js.common.Test.Test:7:36)
              
              javascript.0
              705	2022-08-27 10:58:32.065	error	script.js.common.Test.Test: TypeError: Cannot read properties of null (reading 'enumNames')
              
              javascript.0
              705	2022-08-27 10:58:32.057	warn	script.js.common.Test.Test: Object "undefined" does not exist
              

              Danke und Grüße

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

                @diamand2k22 sagte: Die Abfrage aus welchem Raum der Alarm kommt funktioniert nicht.

                Vorschlag:

                createState('waterAlert', false, {type: 'boolean', name: 'Wasseralarm'});
                createState('waterAlertRoom', '', {type: 'string', name: 'Raum Wassereinbruch'});
                
                var timer = null;
                var room = '';
                
                function alarmOnAlexa() {
                    setState('alexa2.0.Echo-Devices.G090XG12149215R4.Commands.speak', 'Achtung! Im ' + room + ' wurde ein Wassereinbruch festgestellt!');
                    timer = setTimeout(alarmOnAlexa, 5000);
                }
                 
                function nachrichtOnWhatsApp(obj) {
                    WhatsAppBot(0, '*!!Achtung!!*<br>' + obj.channelName + '<br>meldet Wasseraustritt!<br>*Bitte umgehend überprüfen!!!!*');
                }
                
                on(Array.prototype.slice.apply($("*(functions=check_water)")), function(dp) {
                    if(dp.state.val) {
                        room = getObject(dp.id, 'rooms').enumNames[0];
                        setState('javascript.0.waterAlert', true, true); 
                        setState('javascript.0.waterAlertRoom', room, true);
                        alarmOnAlexa();
                        nachrichtOnWhatsApp(dp);
                    } else {
                        clearTimeout(timer);
                        setState('javascript.0.waterAlert', false, true); 
                    }
                });
                

                Woher kommt die Funktion WhatsAppBot()?

                1 Reply Last reply Reply Quote 0
                • D
                  Diamand2k22 last edited by

                  Hallo Paul,

                  danke dir es funktioniert nun perfekt.
                  Das einzige wäre noch die Lautstärke von echo dot bei Alarm hochzustellen und danach wieder auf den vorherigen Wert.

                  Grüße

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

                    @diamand2k22 sagte: Lautstärke von echo dot

                    Davon habe ich keine Ahnung.

                    1 Reply Last reply Reply Quote 0
                    • D
                      Diamand2k22 last edited by Diamand2k22

                      @paul53

                      ich hab das Problem dass die Abfrage in welchem Raum der Alarm auslöst als Wert dann [object Object], [object Object] zurück bekomme.
                      Hast du eine Idee was da falsch ist?

                      Die Abfrage wird mit:

                      room = getObject(dp.id, 'rooms').enumNames.join(', ');
                      

                      gemacht.

                      Die Variable room ist definiert mit:

                      var room = '';
                      

                      Unter objects sind die Räume wie folgt definiert:

                      room.JPG

                      Gruß diamand

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

                        @diamand2k22 sagte: [object Object], [object Object] zurück bekomme.

                        Sind die Raumnamen mehrsprachig? Wenn ja:

                                room = getObject(dp.id, 'rooms').enumNames;
                                for(let i = 0; i < room.length; i++) {
                                    if(typeof room[i] == 'object') room[i] = room[i].de; 
                                };
                                room = room.join(', ');
                        
                        D 1 Reply Last reply Reply Quote 0
                        • D
                          Diamand2k22 @paul53 last edited by

                          @paul53

                          Es funktioniert perfekt, danke dir!!

                          D 1 Reply Last reply Reply Quote 0
                          • D
                            Diamand2k22 @Diamand2k22 last edited by

                            @paul53

                            Hallo Paul,

                            wie kann ich beim Starten des Skriptes einmalig prüfen, ob ein Rauchmelder ausgelöst hat.
                            Aktuell bekomme ich keine Meldung wenn ich das Skript nach dem der Rauchmelder ausgelöst hat, starte.

                            Danke und Gruß

                            createState('0_userdata.0.Datenpunkte.Rauchmelder.smokeAlert'/*smokeAlert*/, false, {type: 'boolean', name: 'Feueralarm'});
                            createState('0_userdata.0.Datenpunkte.Rauchmelder.smokeAlertRoom'/*smokeAlertRoom*/, '', {type: 'string', name: 'Raum Feueralarm'});
                             
                            var timer = null;
                            var room = '';
                            var idEcho = "alexa2.0.Echo-Devices.G2A1A605204600ED"; 
                            var volume = getState(idEcho+".Player.volume"/*volume*/).val;
                            
                            function alarmOnAlexa() { 
                                    setState(idEcho+".Commands.speak"/*speak*/,'Achtung! Im ' + room + ' wurde Rauch festgestellt!');
                                    timer = setTimeout(alarmOnAlexa, 6000);
                            }
                            
                            function alexa2controll(){
                                setState(idEcho+".Player.controlPause"/*pause*/,true,false);
                                setState(idEcho+".Player.volume"/*volume*/,100);
                                alarmOnAlexa();
                                }
                            
                            function nachrichtOnWhatsApp(obj){
                                if(getState('0_userdata.0.Datenpunkte.Rauchmelder.smokeAlert'/*smokeAlert*/).val)
                                {
                                   WhatsAppBot(2, String ('*!!Achtung!!*<br>' + (obj.channelName ? obj.channelName :"")) + '<br>meldet Rauch/Feuer <br>im ' + room + '!<br>*Bitte sofort überprüfen!!!!*');
                                }
                            }
                            
                            on(Array.prototype.slice.apply($("state[id=*](functions=check_smoke)")), function(dp) {
                                if(dp.state.val) {
                                 room = getObject(dp.id, 'rooms').enumNames;
                                    for(let i = 0; i < room.length; i++) {
                                        if(typeof room[i] == 'object') room[i] = room[i].de; 
                                    };
                                    room = room.join(', ');
                                    setState('zigbee.0.0015bc0031015362.alarm'/*Manual Start of Siren - Esszimmer OG*/, true, true); 
                                    setState('zigbee.0.0015bc0031014470.alarm'/*Manual Start of Siren - Treppenhaus OG*/, true, true); 
                                    setState('zigbee.0.0015bc0031013f40.alarm'/*Manual Start of Siren - Arbeitszimmer EG*/, true, true); 
                                    setState('zigbee.0.0015bc0031013dc7.alarm'/*Manual Start of Siren - Esszimmer EG*/, true, true); 
                                    setState('zigbee.0.0015bc003101495b.alarm'/*Manual Start of Siren - Technikraum UG*/, true, true); 
                                    setState('0_userdata.0.Datenpunkte.Rauchmelder.smokeAlert'/*smokeAlert*/, true, true); 
                                    setState('0_userdata.0.Datenpunkte.Rauchmelder.smokeAlertRoom'/*smokeAlertRoom*/, room, true);
                                    alexa2controll();
                                    nachrichtOnWhatsApp(dp);
                                } else {
                                    clearTimeout(timer);
                                    setState('zigbee.0.0015bc0031015362.alarm'/*Manual Start of Siren - Esszimmer OG*/, false, true); 
                                    setState('zigbee.0.0015bc0031014470.alarm'/*Manual Start of Siren - Treppenhaus OG*/, false, true); 
                                    setState('zigbee.0.0015bc0031013f40.alarm'/*Manual Start of Siren - Arbeitszimmer EG*/, false, true); 
                                    setState('zigbee.0.0015bc0031013dc7.alarm'/*Manual Start of Siren - Esszimmer EG*/, false, true); 
                                    setState('zigbee.0.0015bc003101495b.alarm'/*Manual Start of Siren - Technikraum UG*/, false, true); 
                                    setState('0_userdata.0.Datenpunkte.Rauchmelder.smokeAlert'/*smokeAlert*/, false, true); 
                                    setState(idEcho+".Player.controlPause"/*pause*/,false,true);
                                    setState(idEcho+".Player.volume"/*volume*/,30);
                                }
                            });
                            
                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            845
                            Online

                            31.8k
                            Users

                            80.0k
                            Topics

                            1.3m
                            Posts

                            2
                            12
                            523
                            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