Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] Script: Wand-Display ein/aus nach Bewegungsmelder

    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

    [gelöst] Script: Wand-Display ein/aus nach Bewegungsmelder

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

      Hallo,

      ich benötige nochmal ein wenig Hilfe von den scripterfahrenen Nutzern. 🙂

      Ich habe mir ein Script gebastelt, welches die erkannten Bewegungen (MOTION = true) eines Bewegungsmelders nutzt um per Webaufruf eines CGI-Scripts den HDMI-Port des Raspi 2 ein und aus zu schalten.

      Soweit funktioniert das Ganze auch super. Wechselt der Melder MOTION auf "true", geht das Display an, wechselt er auf false geht es aus. Einschaltdauer des HM-Bewegungsmelders ist bei 240 Sekunden (Standard).

      Nun will ich aber, dass mein Display nicht immer gleich nach 240 Sekunden aus geht, sondern das Ausschalten um 15 Minuten verzögert geschieht. Dazu habe ich einen timer hinzugefügt, welcher im Grunde auch tut was er soll…

      ABER

      Wenn der Bewegungsmelder während der Laufzeit des Timers wieder eine Bewegung erkennt, und auf "true" wechselt, wird der timer nicht gestoppt bzw. zurück gesetzt. Frage: Wo habe ich meinen Denkfehler bzw. das Wissensdefizit? 🙂

      // Script zum Schalten des Wand-Displays nach Bewegungsmelder
      
      // Datenpunkt-ID
      var idBewegung = "hm-rpc.0.MEQXXXXXXX.1.MOTION";
      
      // Variablendeklaration und Initialisierung bei Scriptstart
      var stateBewegung = getState(idBewegung).val;
      var display_on = 'http://[rechnername:port]/cgi-bin/display_on.cgi';
      var display_off = 'http://[rechnername:port]/cgi-bin/display_off.cgi';
      var request = require('request');
      
      // Auswertung des Status "Bewegung" / Ausschalten per Timer nach 15 Minuten!
      function switch_display() {
          if (stateBewegung === true) {
               if (timer) {
                clearTimeout(timer);
                timer = null;
              }  
              request (display_on);
          } else {
              var timer = setTimeout(function () {
              request (display_off);
              }, 15 * 60000);
          }
      }
      
      // Aufruf der Funktion bei Scriptstart
      switch_display();
      
      // Aufruf der Funktion bei Änderung
      on(idBewegung, function(dp) {
         stateBewegung = dp.newState.val;
         switch_display();
      });
      
      

      Schon mal vielen Dank im Voraus. 😉

      MfG,

      André

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

        timer muss global sein:

        // Script zum Schalten des Wand-Displays nach Bewegungsmelder
        
        // Datenpunkt-ID
        var idBewegung = "hm-rpc.0.MEQXXXXXXX.1.MOTION";
        
        // Variablendeklaration und Initialisierung bei Scriptstart
        var stateBewegung = getState(idBewegung).val;
        var display_on  = 'http://[rechnername:port]/cgi-bin/display_on.cgi';
        var display_off = 'http://[rechnername:port]/cgi-bin/display_off.cgi';
        var request = require('request');
        var timer;
        
        // Auswertung des Status "Bewegung" / Ausschalten per Timer nach 15 Minuten!
        function switch_display() {
            if (timer) {
                clearTimeout(timer);
                timer = null;
            }  
        
            if (stateBewegung === true) {
                request (display_on);
            } else {
                timer = setTimeout(function () {
                 request (display_off);
                 timer = null;
                }, 15 * 60000);
            }
        }
        
        // Aufruf der Funktion bei Scriptstart
        switch_display();
        
        // Aufruf der Funktion bei Änderung
        on(idBewegung, function(dp) {
           stateBewegung = dp.newState.val;
           switch_display();
        });
        
        1 Reply Last reply Reply Quote 0
        • blauholsten
          blauholsten Developer last edited by

          Bin zwar nicht erfahren, aber vielleicht klappt das

          // Script zum Schalten des Wand-Displays nach Bewegungsmelder
          
          // Datenpunkt-ID
          var idBewegung = "hm-rpc.0.MEQXXXXXXX.1.MOTION";
          
          // Variablendeklaration und Initialisierung bei Scriptstart
          var display_on = 'http://[rechnername:port]/cgi-bin/display_on.cgi';
          var display_off = 'http://[rechnername:port]/cgi-bin/display_off.cgi';
          var request = require('request');
          var timer = null;
          // Aufruf der Funktion bei Änderung
          on(idBewegung, function(dp) {
             if(dp.newState.val)
             {
             timer = null;
             request (display_on);
          
             timer = setTimeout(function() {
                  request (display_off);
                  }, 15 * 60000);
          
             }
          });
          

          EDIT: Bluefox war schneller :evil: 😄

          Vielleicht kannst du ja meins trotzdem probieren, ist ja um einiges kürzer.

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

            @blauholsten:

            Bin zwar nicht erfahren, aber vielleicht klappt das

            // Script zum Schalten des Wand-Displays nach Bewegungsmelder
            
            // Datenpunkt-ID
            var idBewegung = "hm-rpc.0.MEQXXXXXXX.1.MOTION";
            
            // Variablendeklaration und Initialisierung bei Scriptstart
            var display_on = 'http://[rechnername:port]/cgi-bin/display_on.cgi';
            var display_off = 'http://[rechnername:port]/cgi-bin/display_off.cgi';
            var request = require('request');
            var timer = null;
            // Aufruf der Funktion bei Änderung
            on(idBewegung, function(dp) {
               if(dp.newState.val)
               {
               timer = null;
               request (display_on);
               
               timer = setTimeout(function() {
                    request (display_off);
                    }, 15 * 60000);
               
               }
            });
            

            EDIT: Bluefox war schneller :evil: 😄

            Vielleicht kannst du ja meins trotzdem probieren, ist ja um einiges kürzer. `

            Dein Sckript ist fast auch ok. Nun wird er nach 15 min nach BewegungON und nicht nach BewegungOFF ausgeschaltet. Und auch wenn zwei BewegungON kommen, dann wird sich display trotzdem ausschalten.

            // Script zum Schalten des Wand-Displays nach Bewegungsmelder
            
            // Datenpunkt-ID
            var idBewegung = "hm-rpc.0.MEQXXXXXXX.1.MOTION";
            
            // Variablendeklaration und Initialisierung bei Scriptstart
            var display_on = 'http://[rechnername:port]/cgi-bin/display_on.cgi';
            var display_off = 'http://[rechnername:port]/cgi-bin/display_off.cgi';
            var request = require('request');
            var timer = null;
            
            // Aufruf der Funktion bei Änderung
            on(idBewegung, function(dp) {
                if (timer) {
            		clearTimeout(timer);
            		timer = null;
            	}
            
            	if (dp.newState.val) {
            	   request (display_on); 
            	} else {
            		timer = setTimeout(function() {
            			timer = null;
            			request (display_off);
                    }, 15 * 60000);
               }
            });
            

            2661_2019-01-04-main.zip.pdf

            1 Reply Last reply Reply Quote 0
            • blauholsten
              blauholsten Developer last edited by

              @Bluefox:

              Nun wird er nach 15 min nach BewegungON und nicht nach BewegungOFF ausgeschaltet. `

              huch das war ein Copy Fehler….````
              }
              else
              {

              
              Okay also reicht es nicht nur die var timer wieder null zu setzen, sondern man muss die timeout function leeren!–--->wieder was gelernt
              1 Reply Last reply Reply Quote 0
              • Bluefox
                Bluefox last edited by

                > wieder was gelernt
                Das wer der Grund warum ich zweiten Post geschrieben habe. 😉

                1 Reply Last reply Reply Quote 0
                • andre
                  andre Developer last edited by

                  Super, vielen Dank. Auch ich habe mal wieder was gelernt. 🙂 Habe mein Script jetzt ausgebessert. Mal sehen wie es sich morgen verhält.

                  MfG, Andre

                  Gesendet mit Tapatalk.

                  1 Reply Last reply Reply Quote 0
                  • andre
                    andre Developer last edited by

                    Habe es jetzt bereits eine ganze Weile in Betrieb. Klappt hervorragend. 🙂

                    Danke.

                    MfG,

                    André

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

                      @Bluefox:

                      timer muss global sein:

                      // Script zum Schalten des Wand-Displays nach Bewegungsmelder
                      
                      // Datenpunkt-ID
                      var idBewegung = "hm-rpc.0.MEQXXXXXXX.1.MOTION";
                      
                      // Variablendeklaration und Initialisierung bei Scriptstart
                      var stateBewegung = getState(idBewegung).val;
                      var display_on  = 'http://[rechnername:port]/cgi-bin/display_on.cgi';
                      var display_off = 'http://[rechnername:port]/cgi-bin/display_off.cgi';
                      var request = require('request');
                      var timer;
                      
                      // Auswertung des Status "Bewegung" / Ausschalten per Timer nach 15 Minuten!
                      function switch_display() {
                          if (timer) {
                              clearTimeout(timer);
                              timer = null;
                          }  
                      		
                          if (stateBewegung === true) {
                              request (display_on);
                          } else {
                              timer = setTimeout(function () {
                               request (display_off);
                               timer = null;
                              }, 15 * 60000);
                          }
                      }
                      
                      // Aufruf der Funktion bei Scriptstart
                      switch_display();
                      
                      // Aufruf der Funktion bei Änderung
                      on(idBewegung, function(dp) {
                         stateBewegung = dp.newState.val;
                         switch_display();
                      });
                      ```` `  
                      

                      Hallo,

                      ich kapiere das mit dem Timer nicht.

                      In dem Beispiel hier wartet er ja, bis der Bewegungsmelder wieder "false" ist.

                      Was mache ich aber bei einem Taster? (Ich will eine Bewässerung steuern, für 1 Stunde an, wenn nochmal gedrückt soll er eben ab dann eine "neue" Stunde laufen)

                      Wie mache ich das in dem Codeteil?

                      //  Ausschalten per Timer nach 15 Minuten!
                      function wasser() {
                          if (timer) {
                              clearTimeout(timer);
                              timer = null;
                          }  
                      
                          if (stateBewegung === true) {			//sowas habe ich ja bei einem Taster nicht???? dieses if...else...bei einem Taster, wie formuliere ich das um?
                              setState(Ventil, true);				
                          } else {
                              timer = setTimeout(function () {
                               setState(Ventil, false);				
                               timer = null;
                              }, 60 * 60000);
                          }
                      
                       // die function wasser wird mit on... gestartet
                      }
                      

                      Sorry, habe gerade einen Knoten…

                      1 Reply Last reply Reply Quote 0
                      • blauholsten
                        blauholsten Developer last edited by

                        @Solear:

                        @Bluefox:

                        timer muss global sein:

                        // Script zum Schalten des Wand-Displays nach Bewegungsmelder
                        
                        // Datenpunkt-ID
                        var idBewegung = "hm-rpc.0.MEQXXXXXXX.1.MOTION";
                        
                        // Variablendeklaration und Initialisierung bei Scriptstart
                        var stateBewegung = getState(idBewegung).val;
                        var display_on  = 'http://[rechnername:port]/cgi-bin/display_on.cgi';
                        var display_off = 'http://[rechnername:port]/cgi-bin/display_off.cgi';
                        var request = require('request');
                        var timer;
                        
                        // Auswertung des Status "Bewegung" / Ausschalten per Timer nach 15 Minuten!
                        function switch_display() {
                            if (timer) {
                                clearTimeout(timer);
                                timer = null;
                            }  
                        		
                            if (stateBewegung === true) {
                                request (display_on);
                            } else {
                                timer = setTimeout(function () {
                                 request (display_off);
                                 timer = null;
                                }, 15 * 60000);
                            }
                        }
                        
                        // Aufruf der Funktion bei Scriptstart
                        switch_display();
                        
                        // Aufruf der Funktion bei Änderung
                        on(idBewegung, function(dp) {
                           stateBewegung = dp.newState.val;
                           switch_display();
                        });
                        ```` `  
                        

                        Hallo,

                        ich kapiere das mit dem Timer nicht.

                        In dem Beispiel hier wartet er ja, bis der Bewegungsmelder wieder "false" ist.

                        Was mache ich aber bei einem Taster? (Ich will eine Bewässerung steuern, für 1 Stunde an, wenn nochmal gedrückt soll er eben ab dann eine "neue" Stunde laufen)

                        Wie mache ich das in dem Codeteil?

                        //  Ausschalten per Timer nach 15 Minuten!
                        function wasser() {
                            if (timer) {
                                clearTimeout(timer);
                                timer = null;
                            }  
                              
                            if (stateBewegung === true) {			//sowas habe ich ja bei einem Taster nicht???? dieses if...else...bei einem Taster, wie formuliere ich das um?
                                setState(Ventil, true);				
                            } else {
                                timer = setTimeout(function () {
                                 setState(Ventil, false);				
                                 timer = null;
                                }, 60 * 60000);
                            }
                            
                         // die function wasser wird mit on... gestartet
                        }
                        

                        Sorry, habe gerade einen Knoten… `

                        Hi probier mal:

                        // Script zum Starten einer Pumpe
                        
                        // Datenpunkt-ID
                        var idTaster = "DEIN TASTER";
                        var idPumpe = "DEINE PUMPE";
                        
                        // Variablendeklaration 
                        var timer;
                        
                        // Auswertung des Status "Bewegung" / Ausschalten per Timer nach 15 Minuten!
                        function taster() {
                            if (timer) {
                                clearTimeout(timer);
                                timer = null;
                            }  
                        
                            if (getState(idTaster).val) {
                                	setState(idPumpe, true);
                            } else {
                                timer = setTimeout(function () {
                                 setState(idPumpe, false);
                                 timer = null;
                                }, 60 * 60000);
                            }
                        }
                        
                        // Aufruf der Funktion bei Änderung
                        on(idTaster, function(dp) {
                        
                          taster();
                        
                        });
                        
                        1 Reply Last reply Reply Quote 0
                        • S
                          Solear last edited by

                          Vielen Dank!

                          Es klappt jedoch leider nicht. Der Timer bleibt einfach an.

                          Ich glaube, dass liegt daran, dass die Homematic Taster im Status nie auf "false" gehen, sondern immer auf "true" bleiben (im Foto die letzte Zeile).

                          Das Aktivieren mit on(); funktioniert deshalb auch nur wenn man auf ein "neues true" wartet:

                          on({id: idTaster, val: true}, function() {
                                 taster();
                          });
                          

                          Aber den Timer setzt er nicht zurück weil der Taster immer ein "true" zurückgibt, auch wenn er nicht gedrückt wird. Beim drücken wird das true im Foto nur ganz kurz grün und bleibt dann true.
                          1145_bildschirmfoto_vom_2016-06-01_19-34-35.png

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

                            Die Funktion taster() sollte nur bei einer Änderung von false auf true aufgerufen weden. Probier es mal so:

                            // Script zum Starten einer Pumpe
                            
                            // Datenpunkt-ID
                            var idTaster = "DEIN TASTER";
                            var idPumpe = "DEINE PUMPE";
                            
                            // Variablendeklaration 
                            var timer;
                            
                            function taster() {
                                if (timer) {
                                    clearTimeout(timer);   // löschen zum Retriggern
                                    timer = null;
                                }  
                                 setState(idPumpe, true);  // Ein
                                 timer = setTimeout(function () {
                                     setState(idPumpe, false);
                                 }, 60 * 60000);  // nach 60 Minuten aus
                            }
                            
                            // Aufruf der Funktion bei Änderung von false auf true
                            on({id: idTaster, val: true}, taster);
                            
                            1 Reply Last reply Reply Quote 0
                            • S
                              Solear last edited by

                              Jetzt klappt es, perfekt, vielen lieben Dank paul53 und blauholsten!!

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

                                Hallo

                                Falls es wen interessiert, hier mein Skript welches

                                • den Hauptwasserhahn per Taster oder Telegram für 60 Minuten aktiviert,

                                  • die Heckenbewässerung genauso aktiviert,
                                  • und beim ausschalten die Gartenrohre druckentlastet indem am ENde nochmal die Heckenbewässerung kurz aktiviert wird.

                                  ! ````
                                  // Script zum Starten der Heckenbewässerung mit Haupthahnaktivierung
                                  ! // Datenpunkt-ID
                                  var haupthahndauer = 60; // im Minuten
                                  var heckenbewdauer = 60;
                                  var idTasterHaupthahn = "hm-rpc.0.LTK005xxxx.2.PRESS_SHORT"/HM-PB-2-WM55-2 LTK005xxxx:2.PRESS_SHORT/;
                                  var idTasterHeckehatti = "hm-rpc.0.LTK005xxxx.1.PRESS_SHORT"/HM-PB-2-WM55-2 LTK005xxxx:1.PRESS_SHORT/;
                                  var idHaupthahn = "hm-rpc.0.LEQ08xxxxx.1.STATE"/Bewaesserung Haupthahn.STATE/;
                                  var idHeckehatti = "hm-rpc.0.LEQ088xxxx.2.STATE"/Bewaesserung Hecke Hatti.STATE/;
                                  ! // Variablendeklaration
                                  var timerheckehatti;
                                  var timerhaupthahn;
                                  ! // Haupthahn Zeitsteuerung
                                  function haupthahn() {
                                  if (timerhaupthahn) {
                                  clearTimeout(timerhaupthahn); // löschen zum Retriggern
                                  timerhaupthahn = null;
                                  }
                                  haupthahnan();
                                  timerhaupthahn = setTimeout(function () {
                                  haupthahnausentlueften();

                                   }, (haupthahndauer * 60000));  // nach 60 Minuten aus
                                  

                                  }

                                  ! // Hecken Zeitsteuerung
                                  function heckehatti() {
                                  if (timerheckehatti) {
                                  clearTimeout(timerheckehatti); // löschen zum Retriggern
                                  timerheckehatti = null;
                                  }

                                   heckehattian();
                                   setTimeout(haupthahn, 1000);
                                   timerheckehatti = setTimeout(function () {
                                       haupthahnausentlueften();
                                  
                                   }, (heckenbewdauer * 60000));  // nach 60 Minuten aus
                                  

                                  }

                                  ! // Steuerungsfunktionen
                                  function haupthahnausentlueften() {
                                  heckehattian();
                                  setTimeout(haupthahnaus, 1000);
                                  setTimeout(heckehattiaus, 10000);
                                  }
                                  ! function haupthahnan() {
                                  setState(idHaupthahn, true);
                                  }
                                  ! function haupthahnaus() {
                                  setState(idHaupthahn, false);
                                  }
                                  ! function heckehattian() {
                                  setState(idHeckehatti, true);
                                  }
                                  ! function heckehattiaus() {
                                  setState(idHeckehatti, false);
                                  }
                                  ! // Trigger
                                  on({id: idTasterHaupthahn, val: true}, haupthahn);
                                  on({id: idTasterHeckehatti, val: true}, heckehatti);
                                  ! on("telegram.0.communicate.request", function (obj) {
                                  if (obj.newState.val == "[Henrik]haupthahn" || obj.newState.val == "[Henrik]/haupthahn") {
                                  haupthahn();
                                  setState("telegram.0.communicate.request","leer");
                                  sendTo('telegram', 'Garten Haupthahn eingeschaltet für ' + haupthahndauer + ' Minuten' +
                                  '\n' +
                                  '\n' + '#Was noch?' +
                                  '\n' + '/torfoto' +
                                  '\n' + '/haus' +
                                  '\n' + '/heckehatti' +
                                  '\n' + '/reboot');

                                  }
                                  });

                                  ! on("telegram.0.communicate.request", function (obj) {
                                  if (obj.newState.val == "[Henrik]heckehatti" || obj.newState.val == "[Henrik]/heckehatti") {
                                  heckehatti();
                                  setState("telegram.0.communicate.request","leer");
                                  sendTo('telegram', 'Heckenbewässerung Hatti eingeschaltet für ' + heckenbewdauer + ' Minuten' +
                                  '\n' +
                                  '\n' + '#Was noch?' +
                                  '\n' + '/torfoto' +
                                  '\n' + '/haus' +
                                  '\n' + '/haupthahn' +
                                  '\n' + '/reboot');
                                  }
                                  });
                                  ! ````

                                  Ich würde aber sehr gerne noch per Telegram bzw. Datenpunkt abfragen, wie lange der Timer noch läuft.

                                  Der Code mal gekürzt auf das Time-relevante:

                                  var timerhaupthahn;
                                  
                                  function haupthahn() {
                                      if (timerhaupthahn) {
                                          clearTimeout(timerhaupthahn);   // löschen zum Retriggern
                                          timerhaupthahn = null;
                                      }  
                                       haupthahnan();
                                       timerhaupthahn = setTimeout(function () {
                                           haupthahnausentlueften();
                                  
                                       }, (haupthahndauer * 60000));  // nach 60 Minuten aus
                                  }
                                  

                                  Ich dachte, in der > var timerhaupthahn; steht immer die Restlaufzeit.

                                  Wenn ich das jedoch abfrage mit

                                  restlaufzeit = getState(timerhaupthahn);
                                  
                                  

                                  oder

                                  restlaufzeit = getState(timerhaupthahn).val;
                                  
                                  

                                  kommt immer entweder "null" oder "Skript error" (im 2. Beispiel) heraus.

                                  Kann man die Restlaufzeit nicht abfragen?

                                1 Reply Last reply Reply Quote 0
                                • blauholsten
                                  blauholsten Developer last edited by

                                  @Solear:

                                  Ich dachte, in der > var timerhaupthahn; steht immer die Restlaufzeit. `

                                  Ich weiß nicht ob das so möglich ist, aber ich glaube nicht.

                                  Probier mal das(Zitat paul53)

                                  var counter;
                                  
                                  function CountDown (seconds) {
                                     counter = seconds;
                                     var timer = setInterval(function () {
                                           if (counter > 0) {
                                              counter = counter - 1;
                                              log ("Im Count " + counter,"info")
                                           } else {
                                              clearInterval(timer);
                                              timer = null;
                                           }
                                        }, 1000);
                                  }
                                  
                                  CountDown(10);     
                                  

                                  Musst du natürlich für dich anpassen

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

                                    Hallo,

                                    noch eine Frage.

                                    Der Timerbefehl lässt sich ja zurücksetzen, so dass er neu anläuft, siehe einige Beiträge zuvor.

                                    Dass man den Timerstand nicht abfragen kann, ist schade, aber nicht zu ändern. Kann man den Timer Befehl aber wenigstens vorzeitig beenden oder abbrechen? Also sozusagen auf 100% setzten? Sozusagen das Gegenteil von clearTimeout.

                                    Gesendet von iPhone mit Tapatalk

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

                                      OK, hab es selbst gelöst.

                                      Einfach die Timerzeit ganz weit heruntersetzen.

                                      Also in diesem Fall die 60000 ersetzen durch zB 1000. wobei man das durch eine Variable darstellen kann, die dann je nach "Zeitbedarf" beliebig gefüllt wird.

                                      Ich probiere noch ein wenig herum und wenn ich ein sauberes Finalscript habe, stelle ich das in einem eigenen Thread zur Bewässerung vor.

                                      var timerhaupthahn;
                                      
                                      function haupthahn() {
                                          if (timerhaupthahn) {
                                              clearTimeout(timerhaupthahn);   // löschen zum Retriggern
                                              timerhaupthahn = null;
                                          }  
                                           haupthahnan();
                                           timerhaupthahn = setTimeout(function () {
                                               haupthahnausentlueften();
                                      
                                           }, (haupthahndauer * 60000));  // diese Zeiten individuell berechnen 
                                      }
                                      
                                      
                                      1 Reply Last reply Reply Quote 0
                                      • R
                                        RobS last edited by

                                        Hallo zusammen,

                                        ich habe versucht das obige Skript von Bluefox zur Aktivierung des Wandtablets für meine Zwecke anzupassen:

                                        // Script zum Schalten des Wand-Displays nach Bewegungsmelder
                                        
                                        // Datenpunkt-ID
                                        var idBewegung = "hm-rpc.1.MEQ1849126.3.MOTION"/*Bewegungsmelder Flur:3.MOTION*/;
                                        
                                        // Variablendeklaration und Initialisierung bei Scriptstart
                                        var display_on = ("hm-rpc.1.MEQ0201171.1.STATE"/*iPad-Starter:1.STATE*/,false);
                                        var display_off = ("hm-rpc.1.MEQ0201171.1.STATE"/*iPad-Starter:1.STATE*/,true);
                                        var request = require('request');
                                        var timer = null;
                                        
                                        // Aufruf der Funktion bei Änderung
                                        on(idBewegung, function(dp) {
                                            if (timer) {
                                              clearTimeout(timer);
                                              timer = null;
                                           }
                                        
                                           if (dp.newState.val) {
                                              request (display_on); 
                                           } else {
                                              timer = setTimeout(function() {
                                                 timer = null;
                                                 request (display_off);
                                                }, 15 * 60000);
                                           }
                                        });
                                        
                                        

                                        leider habe ich hiermit nur einen Haufen Fehlermeldungen im Log und einen Absturz der Javascriptinstanz erreicht.

                                        Ich habe allerdings auch nicht verstanden, was es mit dem Timer (der Global sein muss) auf sich hat. Verstehe das so, dass da ein extra Skript erforderlich ist!? Habe im Forum nichts konkretes gefunden…

                                        Ich habe übrigens die stromlose Statusanszeige als Starter des IPads im Einsatz. Nicht wundern "false" ist an und "true" aus. Über die Homematic-Direktverknüpfung funktioniert es auch einwandfrei, nur halt nicht mit einem Timer, der bei erneuter ewegung zurückgesetzt wird. Will außerdem möglichst viele Funktionen auf ioBroker übertragen.

                                        Vielen Dank für jede Hilfe,

                                        Beste Grüße, Rob

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

                                          @RobS:

                                          Hallo zusammen,

                                          ich habe versucht das obige Skript von Bluefox zur Aktivierung des Wandtablets für meine Zwecke anzupassen:

                                          // Script zum Schalten des Wand-Displays nach Bewegungsmelder
                                          
                                          // Datenpunkt-ID
                                          var idBewegung = "hm-rpc.1.MEQ1849126.3.MOTION"/*Bewegungsmelder Flur:3.MOTION*/;
                                          
                                          // Variablendeklaration und Initialisierung bei Scriptstart
                                          var display_on = ("hm-rpc.1.MEQ0201171.1.STATE"/*iPad-Starter:1.STATE*/,false);
                                          var display_off = ("hm-rpc.1.MEQ0201171.1.STATE"/*iPad-Starter:1.STATE*/,true);
                                          var request = require('request');
                                          var timer = null;
                                          
                                          // Aufruf der Funktion bei Änderung
                                          on(idBewegung, function(dp) {
                                              if (timer) {
                                                clearTimeout(timer);
                                                timer = null;
                                             }
                                          
                                             if (dp.newState.val) {
                                                request (display_on); 
                                             } else {
                                                timer = setTimeout(function() {
                                                   timer = null;
                                                   request (display_off);
                                                  }, 15 * 60000);
                                             }
                                          });
                                          
                                          

                                          leider habe ich hiermit nur einen Haufen Fehlermeldungen im Log und einen Absturz der Javascriptinstanz erreicht.

                                          Ich habe allerdings auch nicht verstanden, was es mit dem Timer (der Global sein muss) auf sich hat. Verstehe das so, dass da ein extra Skript erforderlich ist!? Habe im Forum nichts konkretes gefunden…

                                          Ich habe übrigens die stromlose Statusanszeige als Starter des IPads im Einsatz. Nicht wundern "false" ist an und "true" aus. Über die Homematic-Direktverknüpfung funktioniert es auch einwandfrei, nur halt nicht mit einem Timer, der bei erneuter ewegung zurückgesetzt wird. Will außerdem möglichst viele Funktionen auf ioBroker übertragen.

                                          Vielen Dank für jede Hilfe,

                                          Beste Grüße, Rob `

                                          Nee, da kommt einiges durcheinander. Mach lieber so:

                                          // Script zum Schalten des Wand-Displays nach Bewegungsmelder
                                          
                                          // Datenpunkt-ID
                                          var idBewegung = "hm-rpc.1.MEQ1849126.3.MOTION"/*Bewegungsmelder Flur:3.MOTION*/;
                                          
                                          // Variablendeklaration und Initialisierung bei Scriptstart
                                          var idDisplay = ("hm-rpc.1.MEQ0201171.1.STATE"/*iPad-Starter:1.STATE*/);
                                          
                                          var timer = null;
                                          
                                          // Aufruf der Funktion bei Änderung
                                          on(idBewegung, function(dp) {
                                              if (timer) { // wenn Timer läuft, wird er auf null gesetzt
                                                clearTimeout(timer);
                                                timer = null;
                                             }
                                          
                                             if (dp.newState.val) { // wenn erstmals Bewegung 
                                                setState(idDisplay, false);  // StromloseStatusanzeige kriegt false, also bei dir an
                                             } else { // wenn erstmals keine Bewegung wird timer gestartet
                                                timer = setTimeout(function() {
                                                   timer = null;
                                                   setState(idDisplay, true);  // Stausanzeige kriegt ein true, also bei dir aus
                                                  }, 15 * 60 * 1000); // nach 15 * 60s, also 15 Minuten
                                             }
                                          });
                                          
                                          

                                          Ein globales Skript brauchst du nicht. Das geht alles hier.

                                          Gruß

                                          Pix

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

                                            Super Pix, vielen Dank!

                                            Es funktioniert einwandfrei.

                                            Habe übrigens auch dein Skript zum Aktualisieren von Vis im Einsatz und seit vorhin auch die Sayit-Ansage mit Datum, Wetter und Geburtstag.

                                            Vielen Dank auch dafür, hast mir schon sehr oft geholfen!

                                            Grüße, Rob

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            670
                                            Online

                                            31.8k
                                            Users

                                            80.0k
                                            Topics

                                            1.3m
                                            Posts

                                            19
                                            44
                                            8632
                                            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