Navigation

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

    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

    Alarm Ansage mit Wiederholung per Script

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

      Hallo,

      ich habe eine per vpn eingebundene ccu2 in den iobroker eingebunden. Wenn dort Alarm ausgelöst wird, wird die Variable (Systemintern, bereits vorhanden) "hm-rega.1.alarms" auch von 0 auf 1 gesetzt. In Vis gesetzte Bilder werden entsprechend signalisiert.

      Per Sayit lasse ich dann "Alarm" sagen. Das solle sich alle 2 Minuten wiederholen.

      Leider wird das ganze nur 1x wiederholt, dann ist schluss.

      Gleiches Script verwende ich, wenn die Haustür zu lange geöffnet ist. Dort funktioniert das Script exakt, d.h. die Ansage "Tür zu lange offen" kommt fortwährend. Variable dort "hm-rpc.0.LEQ0000000.1.STATE".

      Kann mir jemand noch ein Tipp geben, wie ich eine MP3 (Alarmsirene) mit starten kann? in Sayit kann ich nur einen Gong oder einen vorgegebenes Signal ("Sci-Fi") vor der Ansage starten.

      var idSayIt  = "sayit.1.tts.text"; // Hier die entsprechende SayIt Text ID
      var idSayIt2  = "sayit.2.tts.text"; // Hier die entsprechende SayIt Text ID
      var idButton = "hm-rega.1.alarms"; // Test ID
      var lastSay  = null;
      var timer    = null;
      
      // Bei Tastendruck wird folgender Text gesprochen
      subscribe(idButton, function (obj) {
         if (obj.newState.val) {
            if (!lastSay || ((new Date()).getTime() - lastSay) > 3000) {
               lastSay = (new Date()).getTime();
               setState (idSayIt, "de;50;Alarm");
            }
            // Starte timer für 2 Minuten
            if (!timer) {
               timer = setTimeout(function () {
                  timer = null;
                  setState (idSayIt2, "de;50;Alarm");
                  setState (idSayIt, "de;50;Alarm");
               }, 120000);
            }
         } else {
            // Alarm beendet. Falls timer läuft = stopp
            if (timer) {
               clearTimeout(timer);
               timer = null;
            }
         }
      
      });
      
      1 Reply Last reply Reply Quote 0
      • Schuko80
        Schuko80 last edited by

        Vielleicht bin ich jetzt zu schnell, arbeite mich selber gerade erst in JavaScript ein. Aber muß das nicht setInterval heißen statt setTimeout

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

          Na ja, bei meiner Haustür hat es bisher zumindest seit 9 Monaten problemlos funktioniert.

          Ich habe gerade bei der Haustür getestet:

          Hier gibt's auch keine Wiederholungen mehr! Das muss mit dem Update des Javascript-Adapters erfolgt sein….

          ich muss mal lesen, wie ich diesen downgrade...

          1 Reply Last reply Reply Quote 0
          • T
            tempestas last edited by

            So gehts

            // Einstellungen
            
            createState('javascript.1.alarm.triggertest', false, {
              read: true, 
              write: true, 
              name: "Löckengelöt", 
              type: "boolean", 
              def: false
            });
            
            var idSayIt  = "sayit.1.tts.text"; // Hier die entsprechende SayIt Text ID
            var idButton = 'javascript.1.alarm.triggertest'; // Test ID
            var timer;
            
            var maxrepeat   = 5;          // maximale Anzahl der Wdh. der Ansage
            var interval = 10;                 // Abstand zwischen den Ansagen in Sekunden
            
            // function
            
            function repeatAlarm(){
              count--;
            
              if(count > 0){ setState(idSayIt, "de;10;Dies ist ein Testalarm");
              log("Der Testalarm wird noch "+count +" mal ausgeführt." );
            
              }
            
              else { 
                clearInterval(timer);
                log("Interval nach Ablauf der maximalen Anzahl beendet");
                setState(idButton, false);
              }
            
            }
            
            // Trigger
            
            on({id: idButton, change: "ne"}, function(obj){
              if(obj.state.val) { 
                count = maxrepeat;
                timer = setInterval(repeatAlarm, interval * 1000);
              } 
              else {
                  clearInterval(timer);
                  log("Manuell beendet");
                    setState(idButton, false);      
              }
            });
            
            
            1 Reply Last reply Reply Quote 0
            • S
              Semenchkare last edited by

              Hallo,

              untertänigsten Dank! Das ist es! Ich habe es so zum Laufen bekommen:

              var idSayIt0  = "sayit.0.tts.text"; // Hier die entsprechende SayIt Text ID
              var idSayIt3  = "sayit.3.tts.text"; // Hier die entsprechende SayIt Text ID
              //var idButton = 'javascript.1.alarm.triggertest'; // Test ID
              var idButton = 'hm-rega.1.alarms'; // Test ID
              var timer;
              
              var maxrepeat   = 5;          // maximale Anzahl der Wdh. der Ansage
              var interval = 30;                 // Abstand zwischen den Ansagen in Sekunden
              
              // function
              
              function repeatAlarm(){
                count--;
              
                if(count > 0){ setState(idSayIt0, "de;70;Alarm");
                setState(idSayIt3, "de;70;Alarm");
                log("Der Alarm wird noch "+count +" mal ausgeführt." );
              
                }
              
                else { 
                  clearInterval(timer);
                  log("Interval nach Ablauf der maximalen Anzahl beendet");
                  setState(idButton, false);
                }
              
              }
              
              // Trigger
              
              on({id: idButton, change: "ne"}, function(obj){
                if(obj.state.val) { 
                  count = maxrepeat;
                  timer = setInterval(repeatAlarm, interval * 1000);
                } 
                else {
                    clearInterval(timer);
                    log("Manuell beendet");
                      setState(idButton, false);      
                }
              });
              
              1 Reply Last reply Reply Quote 0
              • T
                tempestas last edited by

                Das ist doch schön. Setze bitte das Topic dann auf [gelöst] (erstes Posting editeren, Betreff anpassen)

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

                  Hallo Profis:

                  Ich komm einfach nicht weiter. Seh bestimmt den Wald vor lauter Bäume nicht 🙂

                  Ich möchte durch einen Tastendruck dass ein Text für einen bestimmte Anzahl angesagt wird.

                  Hab jetzt als Sayit einfach eine Logausgabe angeben um um zu testen.

                  Wenn ich dass so laufen lasse, startet der Prozess immer von neuem, möchte aber dass er einmal durchläuft.

                  In diesem Fall soll sich also die Logausgabe 5 mal wiederholen, mit einer Pause von 3 Sekunden zwischen den Ausgaben und danach auf einen weiteren Tastendruck warten.

                  Gruß

                  Stephan

                  var idButton = "hm-rpc.0.NEQ0929126.8.PRESS_SHORT";
                  var timer;
                  var maxrepeat   = 5;          // maximale Anzahl der Wdh. der Ansage
                  var interval = 3;                // Abstand zwischen den Ansagen in Sekunden
                  
                  // function
                  
                  function repeatAlarm(){
                    count--;
                  
                    if(count > 0){ 
                    log("Der Alarm wird noch "+count +" mal ausgeführt." );
                  
                    }
                  
                    else { 
                      clearInterval(timer);
                      log("Interval nach Ablauf der maximalen Anzahl beendet");
                      setState(idButton, false);
                    }
                  
                  }
                  
                  // Trigger
                  
                  on({id: idButton, change: "ne"}, function(obj){
                    if(obj.state.val) { 
                      log("Tastendruck");
                      count = maxrepeat;
                      timer = setInterval(repeatAlarm, interval * 1000);
                    } 
                    else {
                        clearInterval(timer);
                        log("Manuell beendet");
                          setState(idButton, false);      
                    }
                  });
                  
                  1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 last edited by

                    Ein HM-Taster (PRESS_SHORT) liefert immer true. Versuche es mal so:

                    var idButton = "hm-rpc.0.NEQ0929126.8.PRESS_SHORT";
                    var timer;
                    var maxrepeat   = 5;          // maximale Anzahl der Wdh. der Ansage
                    var interval = 3;                // Abstand zwischen den Ansagen in Sekunden
                    var count = 0;
                    
                    function repeatAlarm(){
                      count--;
                      if(count > 0){ 
                        log("Der Alarm wird noch "+count +" mal ausgeführt." );
                      } else { 
                        clearInterval(timer);
                        log("Interval nach Ablauf der maximalen Anzahl beendet");
                      }
                    }
                    
                    // Trigger
                    on({id: idButton}, function(){
                      log("Tastendruck");
                      if(count > 0) {
                        clearInterval(timer); // Abbruch bei erneutem Tastendruck
                        count = 0;
                      } else {
                        count = maxrepeat;
                        repeatAlarm();
                        timer = setInterval(repeatAlarm, interval * 1000);
                      }  
                    });
                    
                    1 Reply Last reply Reply Quote 0
                    • S
                      sruhsam last edited by

                      Hallo Paul,

                      das wars, nachdem ich die variable "count" noch deklariert habe, lauft es.

                      Vielen leiben Dank …..

                      Gruß

                      Stephan 😄

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

                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      969
                      Online

                      31.7k
                      Users

                      79.9k
                      Topics

                      1.3m
                      Posts

                      5
                      9
                      956
                      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