Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Watchdog für Alter der Datenpunkte

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Watchdog für Alter der Datenpunkte

    This topic has been deleted. Only users with topic management privileges can see it.
    • sts85
      sts85 @crunchip last edited by

      @crunchip Ja, aber auch hier gilt: Wenn mehr als 25h nichts passiert ist, gibt es wahrscheinlich ein Problem oder das Gerät wird nicht genutzt. Ein solches Gerät würde ich hier nicht überwachen wollen. Zumal Zigbee hier gleich den online/offline Flag mitbringt, auf den könnte man direkt triggern.

      Es muss aber immer einen Coordinator/Server geben, der diesen Status setzt. Damit sind wir wieder bei meinem Skript, der das für nicht-Zigbee-Sensoren übernehmen soll.

      Dennoch danke für den Hinweis.

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

        @sts85 sagte: ist die Variable nicht nur innerhalb der Schleife sondern global im Skript gültig.

        So ist es. Du benötigst ein Array für die Timer-Variable(n) und evtl. eines für darfSenden. Beispiel hier.

        @sts85 sagte in Watchdog für Alter der Datenpunkte:

        ich bekomme es nicht hin, automatisch aus der Objekt-ID einen sinnvollen Namen dafür zu extrahieren

        Wie sehen die DP-IDs aus?

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

          @paul53 Oh, das sieht vielversprechend aus; ist ja sehr ähnlich. Vielleicht bekomme ich es anhand des Beispiels hin.

          Kann ich denn die Intervalle mit dynamischen Namen belegen? Man kann in den Baustein keine Variable einfügen, sondern muss ihn direkt benennen?!

          Hier ein Beispiel für eine Objekt-ID: mqtt.0.Sensor.ESP8266-IBC.IBCFuellmenge

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

            @sts85 sagte: Kann ich denn die Intervalle mit dynamischen Namen belegen?

            Wozu? Alle Intervall-Variablen werden in einem Array abgelegt.

            @sts85 sagte in Watchdog für Alter der Datenpunkte:

            Beispiel für eine Objekt-ID: mqtt.0.Sensor.ESP8266-IBC.IBCFuellmenge

            Wenn der Name eindeutig ist, sollte man besser diesen verwenden.

            Du prüfts auf einen Zeitstempel älter als 15 min. Das kann man auch mit einem Timeout von 15 Minuten, der bei jedem Trigger des zugehörigen Datenpunktes vorher gestoppt wird.

            Blockly_temp.JPG

            Anmerkung: "setze Intervall" und "setze timeout" lassen sich erst zum Schluss selektieren (evtl. vorher in die Javascript-Ansicht und wieder zurück wechseln).

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

              @paul53 Schon mal danke.
              Das Problem ist aber, dass der Datenpunkt ja nicht aktualisiert wird, wenn keine neuen Werte rein kommen. Damit kann ich darauf ja auch nicht triggern, sonst wäre es viel einfacher.
              Wenn z. B. nach einem Stromausfall der ioBroker neu startet und dabei auch ein Sensor keine Werte mehr liefert, dann wird der jeweilige Datenpunkt ja nicht mehr aktualisiert, da keine neuen Werte mehr rein kommen. Hier hilft also nur die Überprüfung des Alters des DP oder habe ich einen Denkfehler?

              Somit funktioniert doch auch der Trigger auf die Änderung der ids nicht, richtig?

              paul53 T 2 Replies Last reply Reply Quote 0
              • paul53
                paul53 @sts85 last edited by paul53

                @sts85 sagte: der Datenpunkt ja nicht aktualisiert wird, wenn keine neuen Werte rein kommen.

                Wenn er nicht (mehr) aktualisiert wird, läuft timeout ab und liefert die Nachricht.

                @sts85 sagte in Watchdog für Alter der Datenpunkte:

                Wenn z. B. nach einem Stromausfall der ioBroker neu startet und dabei auch ein Sensor keine Werte mehr liefert

                Das ist ein Sonderfall, der mit dieser Lösung nicht abgedeckt wird.
                Wenn man eine Zeitplan-Trigger verwendet, kann man den Namen mittels einer JS-Funktion mit Ergebnis ermitteln:

                return getObject(id).common.name;
                

                Blockly_temp.JPG

                sts85 1 Reply Last reply Reply Quote 0
                • T
                  ticaki Developer @sts85 last edited by

                  @sts85 sagte in Watchdog für Alter der Datenpunkte:

                  @paul53 Schon mal danke.
                  Wenn z. B. nach einem Stromausfall der ioBroker neu startet und dabei auch ein Sensor keine Werte mehr liefert, dann wird der jeweilige Datenpunkt ja nicht mehr aktualisiert, da keine neuen Werte mehr rein kommen. Hier hilft also nur die Überprüfung des Alters des DP oder habe ich einen Denkfehler?

                  In meinem Javascript, ist aber aktuell nur für einen Datenpunkt. Beende/Starte ich den Timeout beim Aktualieren und beim Neustart des Skripts. (Naja ich trigger auf nen Zeitwert den ich alle X abfrage, aber ist wie ein Timeout, nur das ich es selbst mache.)

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

                    @paul53 said in Watchdog für Alter der Datenpunkte:

                    @sts85 sagte: der Datenpunkt ja nicht aktualisiert wird, wenn keine neuen Werte rein kommen.

                    Wenn er nicht (mehr) aktualisiert wird, läuft timeout ab und liefert die Nachricht.

                    @sts85 sagte in Watchdog für Alter der Datenpunkte:

                    Wenn z. B. nach einem Stromausfall der ioBroker neu startet und dabei auch ein Sensor keine Werte mehr liefert

                    Das ist ein Sonderfall, der mit dieser Lösung nicht abgedeckt wird.
                    Wenn man eine Zeitplan-Trigger verwendet, kann man den Namen mittels einer JS-Funktion mit Ergebnis ermitteln:

                    return getObject(id).common.name;
                    

                    Blockly_temp.JPG

                    Wow, super. Vielen lieben Dank! Es funktioniert.... fast. Leider gibt er jetzt immer dieselbe Nachricht im Intervall aus. Also der Nachrichteninhalt ist immer identisch. Ich denke, da muss ich die msg auch in einer Liste speichern.
                    Du hast mir aber super weiter geholfen und ich habe das Prinzip mit der Variable Intervall und den Listen kapiert.

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

                      @sts85 sagte: Leider gibt er jetzt immer dieselbe Nachricht im Intervall aus.

                      Wirklich? Zu jeder ID (und somit zu jedem Namen) gehört ein eigenes Intervall, an dessen Callback-Funktion die zugehörige Nachricht übergeben wird.

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

                        @paul53
                        In der Message außerhalb des Intervalls klappt es. Sobald diese innerhalb ist, bleibt sie gleich (letztverwendete Nachricht, so wie ich das sehe).
                        Hab es bisher noch nicht hinbekommen. Da macht es auch keinen Unterschied, die msg in eine Liste zu schreiben und anhand des Index auszuwählen. In dem Intervall bleibt die Nachricht gleich.

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

                          @sts85 sagte: In dem Intervall bleibt die Nachricht gleich.

                          Poste bitte den erzeugten Javascript-Code ohne die letzte Zeile in Code tags.
                          Vermutung: Es gibt zwei Variablen Intervall?

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

                            @paul53 said in Watchdog für Alter der Datenpunkte:

                            @sts85 sagte: In dem Intervall bleibt die Nachricht gleich.

                            Poste bitte den erzeugten Javascript-Code ohne die letzte Zeile in Code tags.
                            Vermutung: Es gibt zwei Variablen Intervall?

                            Du hattest Recht, es gab zwei Variablen Intervall. Ich habe die Variable gelöscht. Die Intervall-Bausteine ebenfalls gelöscht und neu eingefügt. Danach die "richtige" Intervall-Variable gewählt. Nun habe ich das:

                            var ids, id, intervalle, idx, Intervall, msg;
                            
                            function listsRepeat(value, n) {
                              var array = [];
                              for (var i = 0; i < n; i++) {
                                array[i] = value;
                              }
                              return array;
                            }
                            
                            // Beschreibe diese Funktion …
                            async function getName(id) {
                                return getObject(id).common.name;
                            }
                            
                            
                            ids = Array.prototype.slice.apply($("state[id=*](functions=watchdog)"));
                            intervalle = listsRepeat(null, ids.length);
                            schedule("*/2 * * * * *", async function () {
                              for (var id_index in ids) {
                                id = ids[id_index];
                                idx = ids.indexOf(id) + 1;
                                Intervall = intervalle[(idx - 1)];
                                if (parseFloat((new Date().getTime())) - getState(id).ts <= 900000) {
                                  (function () {if (Intervall) {clearInterval(Intervall); Intervall = null;}})();
                                } else if (!Intervall) {
                                  msg = 'Sensorwert zu alt: ' + String(await getName(id));
                                  console.log(msg);
                                  Intervall = setInterval(async function () {
                                    console.log(msg);
                                  }, 6000);
                                }
                                intervalle[(idx - 1)] = Intervall;
                              }
                            });
                            

                            Das Ergebnis ist aber dasselbe?!

                            Edit: Die timings sind nur für debugging-Zwecke

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

                              @sts85 sagte: Das Ergebnis ist aber dasselbe?!

                              Gerade getestet: Du hast recht. Erklären kann ich mir das Verhalten aber nicht.

                              T 1 Reply Last reply Reply Quote 0
                              • T
                                ticaki Developer @paul53 last edited by ticaki

                                @paul53
                                msg muss als 3. Parameter an die interne Intervall Funktion übergeben werden. Das geht doch auch bei seinterval?

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

                                  @ticaki sagte: msg muss als 3. Parameter an die interne Intervall Funktion übergeben werden.

                                  Gerade getestet: Funktioniert auch nicht.

                                  T 1 Reply Last reply Reply Quote 0
                                  • T
                                    ticaki Developer @paul53 last edited by

                                    @paul53

                                    Hast auch

                                    function(msg)
                                    

                                    Geändert?

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

                                      @ticaki sagte: function(msg)

                                      Damit funktioniert es. Ist aber keine Option für Blockly?

                                      T sts85 2 Replies Last reply Reply Quote 0
                                      • T
                                        ticaki Developer @paul53 last edited by

                                        @paul53
                                        Statt der Intervall reference die Nachricht im Array speichern mit nur einem Intervall der das Array überprüft und die Nachricht verschickt?

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

                                          @paul53 @ticaki

                                          Danke euch.
                                          So schnell kommt man an die Grenzen von Blockly - ich dachte nur, ich hab was grundlegend nicht verstanden.
                                          Zur Not muss ich das direkt in Javascript umsetzen, nur bin ich mit der Programmiersprache nicht vertraut, auch wenn grundlegende Programmierkenntnisse vorhanden sind.

                                          1 Reply Last reply Reply Quote 0
                                          • sts85
                                            sts85 @ticaki last edited by sts85

                                            @ticaki said in Watchdog für Alter der Datenpunkte:

                                            @paul53
                                            Statt der Intervall reference die Nachricht im Array speichern mit nur einem Intervall der das Array überprüft und die Nachricht verschickt?

                                            Den Ansatz hatte ich auch eben, hab es aber in Blockly noch nicht so schnell umgesetzt bekommen.
                                            Dann kommen alle betroffenen Meldungen immer gemeinsam, das wäre aber vollkommen OK.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            201
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            blockly monitoring
                                            4
                                            30
                                            1347
                                            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