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.
    • 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
                            • sts85
                              sts85 @sts85 last edited by sts85

                              Ob es elegant ist, sei dahingestellt, aber so geht es:

                              d389ad63-dcbe-4be5-bb50-4f5fc0794db6-image.png

                              var ids, id, intervalle, messages, idx, Intervall, msg, i, idm, message_there;
                              
                              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);
                              messages = 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)];
                                  messages[(idx - 1)] = 'Sensorwert zu alt: ' + String(await getName(id));
                                  msg = messages[(idx - 1)];
                                  if (parseFloat((new Date().getTime())) - getState(id).ts <= 900000) {
                                    (function () {if (Intervall) {clearInterval(Intervall); Intervall = null;}})();
                                    messages[(idx - 1)] = null;
                                  } else if (!Intervall) {
                                    console.log(msg);
                                    Intervall = setInterval(async function () {
                                      for (var i_index in ids) {
                                        i = ids[i_index];
                                        idm = ids.indexOf(i) + 1;
                                        message_there = intervalle[(idm - 1)];
                                        if (message_there != null) {
                                          console.log(('Sensorwert zu alt: ' + String(await getName(i))));
                                        }
                                      }
                                    }, 6000);
                                  }
                                  intervalle[(idx - 1)] = Intervall;
                                }
                              });
                              

                              Danke euch nochmals!

                              Edit: Kleiner Denkfehler, jetzt werden natürlich nich mehrere Intervalle ausgelöst...

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

                                @sts85

                                Dein jetziges Script verschickt sensorenanzahl^2 Meldungen im Höchstfall alle 6 Sekunden. Oder?

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

                                  @ticaki

                                  Haha, siehe edit. Hab ich auch gerade gemerkt. Ich darf hier natürlich nur einen Intervall nutzen.

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

                                    @sts85
                                    Als Nächstes dann draus eine Nachricht bilden die du dir bei Änderungen per Telegramm selbst zu schickst. 🙂

                                    Z.B
                                    ⚠️ Warmwassershelly hat sich seit 01:00:00 nicht mehr aktualisiert

                                    (Hier fieses grinse smiley einsetzten)

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

                                      @sts85 sagte: Ich darf hier natürlich nur einen Intervall nutzen.

                                      Ja, etwa so:

                                      Blockly_temp.JPG

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

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

                                        @sts85 sagte: Ich darf hier natürlich nur einen Intervall nutzen.

                                        Ja, etwa so:

                                        Blockly_temp.JPG

                                        Perfekt, super, läuft 1A.

                                        Hatte eben auch schon was gebastelt, aber dies ist hier noch ein wenig eleganter. Nur deine Zähl-Schleife habe ich durch eine "für jeden Wert" Schleife ersetzt.

                                        b5806609-9133-4f58-b2b4-6efbeb8e91fb-image.png

                                        Einiges gelernt...
                                        Nochmals vielen Dank euch allen! 🥳🎉

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

                                        Support us

                                        ioBroker
                                        Community Adapters
                                        Donate

                                        230
                                        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