Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Alarmmeldung, sofern viele unreach in kurzer Zeit. Kann ein Könner drauf gucken?

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Alarmmeldung, sofern viele unreach in kurzer Zeit. Kann ein Könner drauf gucken?

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

      Hallo zusammen,

      als Ergänzung meines Alarmanlagenskripts schwebt mir vor, einen Alarm einzubauen, sofern innerhalb kurzer Zeit (definierbar, z.B. 10 Sekunden) eine Menge X der Sensoren plötzlich "unreach" melden.

      Das könnte in meiner laienhaften Vorstellung der Fall sein, falls jemand mit einem Jammer sich dem Haus nähert. Zugegeben, wer so vorbereitet ist, der wird wohl auch sonst sich kaum aufhalten lassen, aber sei es drum. Es schadet ja nicht.

      Mein Problem besteht darin, dass ich zum einen den Trigger "unreach" nutzen muss, andererseits danach das Skript sich ja nicht mehr selber triggern soll. Außerdem lässt sich so ein Skript wohl nur schwer testen (wie Glasbruchsensoren auch :lol: ), daher wäre ich dankbar, wenn ein paar von den Könnern hier einmal draufgucken

      Gedachter Ablauf:

      Sensor 1 (im Sinne von "der erste") wird unerreichbar, CCU2 merkt das
      Unreachmeldung in iobroker wird gesetzt und triggered das Skript
      Timer startet, bspl. 10 Sekunden
      Am Ende des Timers wird function ausgeführt, die nochmal über alle Sensoren (aus "Verschluss") läuft und zählt.
      Sofern count > z.B. 3 --> telegram
      
      

      Hier ist mein Ansatz (ich tippe den gerade im Forum zusammen, Flüchtigkeitsfehler also garantiert enthalten):

      
      // VARIABLEN
      
      var triggered = false;  			// Var als Bedingung, damit während der Laufzeit nicht ständig neu getriggered wird
      var timing = 15;				// Zeit in Sekunden, nach deren Ablauf durchgezählt wird 
      var minCount = 3;			// Mindestanzahl an unreach Meldungen im definierten Gewerk die erreicht sein müssen, um Alarm auszulösen
      var nachricht;				// Telegram Nachricht 
      
      var cacheSelectorUNREACH  = $('channel[state.id=*.UNREACH](functions="Verschluss")');		// Test soll sich nur auf die sicherheitsrelevanten Sensoren beziehen, kein Alarm wg. ausgestöpselter Steckdosen o.ä.
      
      // TRIGGER
      
      cacheSelectorUNREACH.on(function(obj) {   
      
      	if(!triggered) {	
      
         		setTimeout(countUNREACH(obj), timing * 1000);
         		triggered = true;
         	}
      });
      
      // FUNCTION
      
      function countUNREACH(obj) {
      
      	var count = 0;
      
         		cacheSelectorUNREACH.each(function (id, i) {
            			var status = getState(id).val; 
            			if (status === true) {
            			++count;                                       
         		}); 
      
         	triggered = false;
      
      	if(count >= minCount){
      
      		nachricht = "Ungewöhnliche Anzahl von Unreach-Meldungen. Insgesamt " +count +" Sensoren nicht erreichbar";
      		sendTo('telegram.0', nachricht);
      		}
      	}
      }
      
      

      Funktioniert das so, habe ich etwas übersehen?

      Vielen Dank vorab

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

        Die Callback-Funktion in setTimeout wird falsch aufgerufen.

                 setTimeout(countUNREACH, timing * 1000);
        

        Die Funktion countUNREACH() benötigt keinen Übergabeparameter, der nicht in der Funktion ausgewertet wird

        function countUNREACH() {
        

        Bei der Abfrage von status fehlt die schließende geschweifte Klammer oder (da nur ein Kommando) ohne Klammern

                       if (status) ++count;
        
        1 Reply Last reply Reply Quote 0
        • T
          tempestas last edited by

          Hallo Paul,

          vielen Dank für die Rückmeldungen, werde ich anpassen.

          Falsch ist glaube ich meine "if(!triggered)" Abfrage, oder? ich starte ja mit triggered = false, d.h. die Abfrage prüft auf true und würde damit niemals stimmen. Denn true wird ja erst später gesetzt

          // VARIABLEN
          
          var triggered = false;           // Var als Bedingung, damit während der Laufzeit nicht ständig neu getriggered wird
          var timing = 15;            // Zeit in Sekunden, nach deren Ablauf durchgezählt wird 
          var minCount = 3;         // Mindestanzahl an unreach Meldungen im definierten Gewerk die erreicht sein müssen, um Alarm auszulösen
          var nachricht;            // Telegram Nachricht 
          
          var cacheSelectorUNREACH  = $('channel[state.id=*.UNREACH](functions="Verschluss")');      // Test soll sich nur auf die sicherheitsrelevanten Sensoren beziehen, kein Alarm wg. ausgestöpselter Steckdosen o.ä.
          
          // TRIGGER
          
          cacheSelectorUNREACH.on(function() {   
          
             if(triggered == false) {   
          
                   setTimeout(countUNREACH, timing * 1000);
                   triggered = true;
                }
          });
          
          // FUNCTION
          
          function countUNREACH() {
          
             var count = 0;
          
                   cacheSelectorUNREACH.each(function (id, i) {
                         var status = getState(id).val; 
                         if (status === true) ++count;                                       
                   }); 
          
                triggered = false;
          
             if(count >= minCount){
          
                nachricht = "Ungewöhnliche Anzahl von Unreach-Meldungen. Insgesamt " +count +" Sensoren nicht erreichbar";
                sendTo('telegram.0', nachricht);
                }
             }
          }
          
          
          1 Reply Last reply Reply Quote 0
          • paul53
            paul53 last edited by

            @tempestas:

            Falsch ist glaube ich meine "if(!triggered)" Abfrage, oder? ich starte ja mit triggered = false, d.h. die Abfrage prüft auf true und würde damit niemals stimmen. `
            Nein, die Abfrage if(!triggered) prüft auf false und entspricht der Abfrage if(triggered == false).

            Unter sendTo() ist eine schließende geschweifte Klammer zuviel. Das müsste allerdings schon der JS-Editor anmeckern ?

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

              Hallo Paul,

              Ich dachte, "!" würde immer negieren; und da ich initial "triggered = false" setze, war ich der Meinung, es prüft auf ungleich false, mithin true. Danke fürs richtigstellen. Edit: bei genauerer Überlegung hätte ich mir das auch denken können. Da habe ich mich selbst verschlimmbessert…

              Kann gut sein, dass eine Klammer fehlt oder zuviel ist. Wie gesagt habe ich es nicht im JS Editor geschrieben sondern nur hier im Forum, bin nicht daheim.

              Von der Logik her passt aber alles?

              Danke dir!

              Steffen

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

              Support us

              ioBroker
              Community Adapters
              Donate

              398
              Online

              31.7k
              Users

              79.8k
              Topics

              1.3m
              Posts

              2
              5
              406
              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