Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Alarm Script mit ON/OFF einer Steckdose

    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 Script mit ON/OFF einer Steckdose

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

      Folgende Thematik:

      Ich habe eine Netatmo Station, die in eine externe SQL-DB ihre Werte speichert, dank der Netatmo API. Gelegentlich kommt es aber vor, dass das Teil sich aufhängt oder was auch immer und keine Daten mehr sendet. Unglücklicherweise bekome ich das manchmal erst Stunden später mit und ärgere mich dann über fehlende Daten in der Datenbank.. 😉

      Nun lasse ich mir alle 2 Minuten mittels Node-Red den Zeitstempel des letzten DB Eintrages in einen Datenpunkt packen. Dieser wird mit meinem kleinen Script mit dem Zeitstempel der aktuellen Zeit verglichen. Wenn der Abstand zu groß ist, wird eine Email an mich versendet und die Tasmota Steckdose wo die Netatmo dran hängt, ausgeschaltet und 10 Sekunden später wieder angeschaltet.

      So weit so gut. Mein Problem ist aber, dass die Netatmo mitunter 10 Minuten später erst ihren ersten Datensatz ausspuckt. In dieser Zeit bekomme ich also mehrere Mails und die Netatmo wird mehrmals an und aus geschaltet und ist in einer Art Dauer-AN/AUS. Mein Script reagiert auf den von Node-Red geholten Timestamp...

      Wie kann man so eine Dauerschleife vermeiden? Muss ich mir einen zusätzlichen Datenpunkt einbauen, der so eine Art "Wartungsmodus" darstellt, welcher von dem Script vor Ablauf zuerst geprüft wird? Natürlich könnte ich auch die ganzen Zeiten so anpassen, dass das Script nicht mehrmals läuft, aber das klingt wenig elegant...

      Wie macht Ihr so etwas?

      
      const id_Netatmo_ts = 'node-red.0.Netatmo_LastEntry'; 
      const id_Netatmo_diff = 'node-red.0.Netatmo_LastEntry_Diff'; 
      
      on({id: id_Netatmo_ts, change: 'any'}, function (obj) {
          let ts_now = Math.round(new Date().getTime() / 1000)
          let ts_netatmo = getState(id_Netatmo_ts).val;
      
          let diff_minuten = Math.round(((ts_now - ts_netatmo) / 60));
          //console.log("Diffenrenz in Minuten: " + diff_minuten);
          setState(id_Netatmo_diff, diff_minuten, true);
      
          function wiederAN () {
             setState("sonoff.0.Tasmota-Netatmo.POWER",true);   
          }
          
          if (diff_minuten > 1) {
              setState("sonoff.0.Tasmota-Netatmo.POWER",false); 
              setTimeout(wiederAN, 10000); // 10 Sekunden
              
              sendTo("email", {
                  to:      "blub@gmx.net",
                  subject: "Alaaaarm",
                  text:    "Letzter Netatmo Datensatz wurde vor " + diff_minuten + " Minuten in die Datenbank geschrieben. \n Neustart! \n"
              });
          };       
      });
      
      

      Grüße
      Kai

      mickym 2 Replies Last reply Reply Quote 0
      • mickym
        mickym Most Active @xdelta last edited by mickym

        @xdelta Ich überprüfe Inaktivität meist super simpel mit der trigger Node. Da brauch ich keine Zeitstempel und nichts. Die trigger Node ist so konfiguriert, dass sei am Anfang also bei der 1. Nachricht "true" rausschickt (kann man auch sein lassen), dann nach der Zeitspanne die ich überwachen will "false", falls keine neue Nachricht kommt. Damit gibts keine Schleifen und der ganze Mechanismus wird erst dann angetriggert, wenn einmal eine Nachricht angekommen ist.

        In Deinem Fall würde also nach 2 Minuten eine Mail getriggert, wenn das der zu überwachende Zeitraum ist. Sobald dann aber keine Aktivität mehr stattfindet wird auch nichts mehr getriggert.

        So das ist alles:

        3882845b-b6d2-4f4e-abbd-437327bd105c-image.png

        Der Inaktivitätszeitraum, ab dem Alarm geschlagen wird, ist natürlich beliebig. 😉

        1 Reply Last reply Reply Quote 0
        • mickym
          mickym Most Active @xdelta last edited by mickym

          Ich bin davon ausgegangen, dass Netatmo auch direkt was in einen Datenpunkt (node-red.0.Netatmo_LastEntry) schreibt - deshalb die Idee mit dem Trigger.
          Wenn ich Dein Skript richtig interpretiere, wird dies ja angetriggert, wenn sich in dem Datenpunkt was ändert. Und wie gesagt, das kannst ja dann auch mit einer iobroker IN node überwachen.

          Theoretisch kannst Du den Trigger auch umdrehen. In dem Fall würde Deine Funktion immer wegen Zeitüberschreitung Alarm schlagen. Der Trigger sendet nur einmal eine Nachricht zu Beginn/Start und würde erst wieder zurückgesetzt, wenn keine Nachrichten mehr kommen (also keine Zeitüberschreitungen mehr stattfinden). Ist beides möglich.

          X 1 Reply Last reply Reply Quote 0
          • X
            xdelta @mickym last edited by

            @mickym

            Besten Dank für den Ansatz! Das node sehe ich mir direkt mal an. Klingt auf jeden Fall deutlich eleganter als immer mehr Variablen hin und her zu setzen... 😉

            Grüße
            Kai

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

            Support us

            ioBroker
            Community Adapters
            Donate

            883
            Online

            31.8k
            Users

            80.0k
            Topics

            1.3m
            Posts

            2
            4
            210
            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