Skip to content
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Blockly
  5. Watchdog für Alter der Datenpunkte

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.2k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.9k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.1k

Watchdog für Alter der Datenpunkte

Geplant Angeheftet Gesperrt Verschoben Blockly
blocklymonitoring
30 Beiträge 4 Kommentatoren 2.5k Aufrufe 3 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • sts85S sts85

    Hallo zusammen,

    ich möchte einen Watchdog für die Änderung von Datenpunkten setzen, um meine Sensoren zu überwachen.

    Da ich nicht auf die Änderung des Wertes triggern kann (ansonsten würde nach Neustart des Skripts bei einem bereits defekten Sensors nicht getriggert werden), habe ich einen Zeitplan definiert, der periodisch abfragt, ob sich der Zeitstempel bestimmter Sensoren geändert hat. Die betreffenden Datenpunkte habe ich in die iobroker Funktionen "watchdog" "gelegt".

    Das ganze funktioniert auch so weit. Nun möchte ich möglichst schnell eine Info über einen defekten Sensor erhalten, aber sobald der Alarm ausgelöst wurde nicht immer wieder eine Nachricht erhalten, sondern ich würde hier gerne eine Kadenz einbauen. Also Abfrage der Sensor-Zeiten z. B. alle 5 min, aber die Benachrichtigung nur einmal direkt und dann z. B. jede Stunde. Daran scheitere ich gerade, da dies natürlich für jeden Sensor einzeln funktionieren soll.

    28a5dd9a-aea1-47f7-9ac8-667b6b9304f8-image.png

    <xml xmlns="https://developers.google.com/blockly/xml">
      <variables>
        <variable id="5MS[62qBDEe5efRr9Als">darfSenden</variable>
        <variable id=".TPfY;gG|C!d+S9;2kUC">listWert</variable>
        <variable type="timeout" id="timeout">timeout</variable>
      </variables>
      <block type="variables_set" id="1F}o;zLV8NIL/[Dj*I_3" x="112" y="-487">
        <field name="VAR" id="5MS[62qBDEe5efRr9Als">darfSenden</field>
        <value name="VALUE">
          <block type="logic_boolean" id=")36{:!hXet^s}olc,G+I">
            <field name="BOOL">TRUE</field>
          </block>
        </value>
        <next>
          <block type="schedule" id="0iraJ-umJfZ2v8^G.U@t">
            <field name="SCHEDULE">*/5 * * * *</field>
            <statement name="STATEMENT">
              <block type="controls_forEach" id="5Cd:JpJ$16NKFfIZF.P[">
                <field name="VAR" id=".TPfY;gG|C!d+S9;2kUC">listWert</field>
                <value name="LIST">
                  <block type="selector" id="t8{}nQK1MHjhE!B_FyuF">
                    <field name="TEXT">state[id=*](functions=watchdog)</field>
                  </block>
                </value>
                <statement name="DO">
                  <block type="controls_if" id="Nfk=2r6]vAsd7(c*(^:N">
                    <value name="IF0">
                      <block type="logic_operation" id="Po:r62z?T6j6OSD{KhoR">
                        <field name="OP">AND</field>
                        <value name="A">
                          <block type="variables_get" id="P}[j-O%B:qLd[v:fJ2u8">
                            <field name="VAR" id="5MS[62qBDEe5efRr9Als">darfSenden</field>
                          </block>
                        </value>
                        <value name="B">
                          <block type="logic_compare" id="o)H%]$-3F7S+uO?*`iyU">
                            <field name="OP">GT</field>
                            <value name="A">
                              <block type="math_arithmetic" id="5?)xuy1JV0{6,Er4:_3y">
                                <field name="OP">MINUS</field>
                                <value name="A">
                                  <shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number">
                                    <field name="NUM">1</field>
                                  </shadow>
                                  <block type="time_get" id=",r8wfoe=oFD4%j2V5tm6">
                                    <mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation>
                                    <field name="OPTION">object</field>
                                  </block>
                                </value>
                                <value name="B">
                                  <shadow type="math_number">
                                    <field name="NUM">1</field>
                                  </shadow>
                                  <block type="get_value_var" id="e5J$}Zf)s@N[@ZNw9gL[">
                                    <field name="ATTR">ts</field>
                                    <value name="OID">
                                      <shadow type="text">
                                        <field name="TEXT"></field>
                                      </shadow>
                                      <block type="variables_get" id="z+~]lSD*$L%_0O`6Rg0G">
                                        <field name="VAR" id=".TPfY;gG|C!d+S9;2kUC">listWert</field>
                                      </block>
                                    </value>
                                  </block>
                                </value>
                              </block>
                            </value>
                            <value name="B">
                              <block type="math_number" id="~5v16u^15UCUf4X6Y#cK">
                                <field name="NUM">900000</field>
                              </block>
                            </value>
                          </block>
                        </value>
                      </block>
                    </value>
                    <statement name="DO0">
                      <block type="debug" id="~rf5W:iu_SC6_*)ZUR}[">
                        <field name="Severity">log</field>
                        <value name="TEXT">
                          <shadow type="text" id="QpSou#H}T[T[LjsA8{P/">
                            <field name="TEXT">BME280 Luftsensor: Sensorwert zu alt.</field>
                          </shadow>
                          <block type="text_join" id="V{6a/D`C].v1G#qzN{,k">
                            <mutation items="2"></mutation>
                            <value name="ADD0">
                              <block type="text" id="6Ga/v*xFkhcl|~Q5fX!H">
                                <field name="TEXT">Sensorwert zu alt: </field>
                              </block>
                            </value>
                            <value name="ADD1">
                              <block type="variables_get" id="{9-B4S/J$KyW(D3=4j2.">
                                <field name="VAR" id=".TPfY;gG|C!d+S9;2kUC">listWert</field>
                              </block>
                            </value>
                          </block>
                        </value>
                        <next>
                          <block type="timeouts_cleartimeout" id="+1PM+[i;{oU5d8X!:D(y">
                            <field name="NAME">timeout</field>
                            <next>
                              <block type="timeouts_settimeout" id="Sl/!Vg[9|%lmlAD:dQ1s">
                                <field name="NAME">timeout</field>
                                <field name="DELAY">60</field>
                                <field name="UNIT">min</field>
                                <statement name="STATEMENT">
                                  <block type="variables_set" id="FsMK!|s_[qe.=)]ko/ob">
                                    <field name="VAR" id="5MS[62qBDEe5efRr9Als">darfSenden</field>
                                    <value name="VALUE">
                                      <block type="logic_boolean" id="#gN-[|7]hjh/y7%~.lce">
                                        <field name="BOOL">TRUE</field>
                                      </block>
                                    </value>
                                  </block>
                                </statement>
                                <next>
                                  <block type="variables_set" id="rsQ9ig,9DHcV7w;2A=2X">
                                    <field name="VAR" id="5MS[62qBDEe5efRr9Als">darfSenden</field>
                                    <value name="VALUE">
                                      <block type="logic_boolean" id="L,1EWAq:h:p3/=ap/kkK">
                                        <field name="BOOL">FALSE</field>
                                      </block>
                                    </value>
                                  </block>
                                </next>
                              </block>
                            </next>
                          </block>
                        </next>
                      </block>
                    </statement>
                  </block>
                </statement>
              </block>
            </statement>
          </block>
        </next>
      </block>
      <block type="variables_set" id="EhVj/|!D0?IbfP{#;s@=" x="193" y="1193">
        <field name="VAR" id="5MS[62qBDEe5efRr9Als">darfSenden</field>
        <value name="VALUE">
          <block type="logic_boolean" id="tH:WpL%tM0RP.^AHqnv0">
            <field name="BOOL">TRUE</field>
          </block>
        </value>
      </block>
    </xml>
    

    Ich bekomme es nicht hin, dass der Timeout bzw. die Variable "darfSenden" für jeden "lstWert" separat betrachtet wird. Offensichtlich ist die Variable nicht nur innerhalb der Schleife sondern global im Skript gültig.
    So wie es jetzt gestaltet ist, wird der Alarm mit dem ersten Sensor ausgelöst und ab dann natürlich nicht mehr, da "darfSenden" dann wahr ist.

    Ich wollte schon Datenpunkte mit einem darfSenden oder Alarm_flag für jeden Sensor separat erstellen, aber das soll dann das Skript automatisiert tun und ich bekomme es nicht hin, automatisch aus der Objekt-ID einen sinnvollen Namen dafür zu extrahieren und einen Datenpunkt zu erzeugen.

    Hat jemand eine Idee? Ich möchte nicht für jeden Sensor ein eigenes Skript oder eine eigene Funktion.

    Danke!

    paul53P Offline
    paul53P Offline
    paul53
    schrieb am zuletzt editiert von paul53
    #6

    @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?

    Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
    Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

    sts85S 1 Antwort Letzte Antwort
    0
    • paul53P 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?

      sts85S Offline
      sts85S Offline
      sts85
      schrieb am zuletzt editiert von
      #7

      @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

      paul53P 1 Antwort Letzte Antwort
      0
      • sts85S sts85

        @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

        paul53P Offline
        paul53P Offline
        paul53
        schrieb am zuletzt editiert von paul53
        #8

        @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).

        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

        sts85S 1 Antwort Letzte Antwort
        0
        • paul53P 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).

          sts85S Offline
          sts85S Offline
          sts85
          schrieb am zuletzt editiert von
          #9

          @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?

          paul53P T 2 Antworten Letzte Antwort
          0
          • sts85S sts85

            @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?

            paul53P Offline
            paul53P Offline
            paul53
            schrieb am zuletzt editiert von paul53
            #10

            @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

            Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
            Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

            sts85S 1 Antwort Letzte Antwort
            0
            • sts85S sts85

              @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?

              T Nicht stören
              T Nicht stören
              ticaki
              schrieb am zuletzt editiert von
              #11

              @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.)

              Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

              Spenden

              1 Antwort Letzte Antwort
              0
              • paul53P 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

                sts85S Offline
                sts85S Offline
                sts85
                schrieb am zuletzt editiert von
                #12

                @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.

                paul53P 1 Antwort Letzte Antwort
                0
                • sts85S sts85

                  @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.

                  paul53P Offline
                  paul53P Offline
                  paul53
                  schrieb am zuletzt editiert von paul53
                  #13

                  @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.

                  Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                  Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                  sts85S 1 Antwort Letzte Antwort
                  0
                  • paul53P 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.

                    sts85S Offline
                    sts85S Offline
                    sts85
                    schrieb am zuletzt editiert von
                    #14

                    @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.

                    paul53P 1 Antwort Letzte Antwort
                    0
                    • sts85S sts85

                      @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.

                      paul53P Offline
                      paul53P Offline
                      paul53
                      schrieb am zuletzt editiert von paul53
                      #15

                      @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?

                      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                      sts85S 1 Antwort Letzte Antwort
                      0
                      • paul53P 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?

                        sts85S Offline
                        sts85S Offline
                        sts85
                        schrieb am zuletzt editiert von sts85
                        #16

                        @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

                        paul53P 1 Antwort Letzte Antwort
                        0
                        • sts85S 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

                          paul53P Offline
                          paul53P Offline
                          paul53
                          schrieb am zuletzt editiert von paul53
                          #17

                          @sts85 sagte: Das Ergebnis ist aber dasselbe?!

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

                          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                          T 1 Antwort Letzte Antwort
                          0
                          • paul53P paul53

                            @sts85 sagte: Das Ergebnis ist aber dasselbe?!

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

                            T Nicht stören
                            T Nicht stören
                            ticaki
                            schrieb am zuletzt editiert von ticaki
                            #18

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

                            Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                            Spenden

                            paul53P 1 Antwort Letzte Antwort
                            0
                            • T ticaki

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

                              paul53P Offline
                              paul53P Offline
                              paul53
                              schrieb am zuletzt editiert von
                              #19

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

                              Gerade getestet: Funktioniert auch nicht.

                              Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                              Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                              T 1 Antwort Letzte Antwort
                              0
                              • paul53P paul53

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

                                Gerade getestet: Funktioniert auch nicht.

                                T Nicht stören
                                T Nicht stören
                                ticaki
                                schrieb am zuletzt editiert von
                                #20

                                @paul53

                                Hast auch

                                function(msg)
                                

                                Geändert?

                                Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                                Spenden

                                paul53P 1 Antwort Letzte Antwort
                                0
                                • T ticaki

                                  @paul53

                                  Hast auch

                                  function(msg)
                                  

                                  Geändert?

                                  paul53P Offline
                                  paul53P Offline
                                  paul53
                                  schrieb am zuletzt editiert von paul53
                                  #21

                                  @ticaki sagte: function(msg)

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

                                  Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                                  Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                                  T sts85S 2 Antworten Letzte Antwort
                                  0
                                  • paul53P paul53

                                    @ticaki sagte: function(msg)

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

                                    T Nicht stören
                                    T Nicht stören
                                    ticaki
                                    schrieb am zuletzt editiert von
                                    #22

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

                                    Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                                    Spenden

                                    sts85S 1 Antwort Letzte Antwort
                                    0
                                    • paul53P paul53

                                      @ticaki sagte: function(msg)

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

                                      sts85S Offline
                                      sts85S Offline
                                      sts85
                                      schrieb am zuletzt editiert von
                                      #23

                                      @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 Antwort Letzte Antwort
                                      0
                                      • T ticaki

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

                                        sts85S Offline
                                        sts85S Offline
                                        sts85
                                        schrieb am zuletzt editiert von sts85
                                        #24

                                        @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.

                                        sts85S 1 Antwort Letzte Antwort
                                        0
                                        • sts85S 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.

                                          sts85S Offline
                                          sts85S Offline
                                          sts85
                                          schrieb am zuletzt editiert von sts85
                                          #25

                                          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 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          741

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe