Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Zeitdifferenz falsch + wie Benachrichtigung nur 2x erhalten

    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

    Zeitdifferenz falsch + wie Benachrichtigung nur 2x erhalten

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

      Hallo zusammen,

      ich habe einen akkubetriebenen ESP8266 mit einem DHT22 (Temperatur und Luftfeuchtigkeitssensor), der über mqtt alle 10 min die Werte an den iobroker schickt. Dazwischen geht er in den deepsleep um Energie zu sparen.
      Nun wollte ich mir eine (indirekte) Betriebsüberwachung basteln:

      Alle 10s wird von der aktuellen Uhrzeit der Zeitstempel des DPs abgezogen. Ist die Differenz größer 15 min wird über Telegram eine Nachricht verschickt.

      ea337858-7b10-4307-955d-f76bec3c3c92-grafik.png

      Zum Testen habe ich einen debug output vorangestellt. Dieser gibt mir z.B. dieses aus:

      javascript.0 2022-03-16 08:45:30.002	info	script.js.Testskripte.Alter_DP_blockly: 01:1508:4508:30
      

      01:15 -> Differenz aktuelle Zeit - Zeitstempel DP in Stunden und Minuten
      08:45 -> aktuelle Zeit in Stunden und Minuten
      08:30 -> Zeitstempel DP in Stunden und Minuten

      Die Differenz sollte mMn 15 min betragen und nicht 1h15 min. Woran liegt diese Abweichung? Interessanterweise schickt es die Nachricht auch nur bei Differenz >01:15. Also scheint es ja irgendwie doch zu stimmen?!

      Das Skript schickt mir nun alle 10s eine Nachricht, so lange die Differenz >15 min ist. Wie kann ich es umschreiben, dass es mir nur 2 Nachrichten schickt? Das cron Intervall werde ich später auf 10 min setzen, zum Testen ist es jedoch auf 10s gestellt.
      Geht dies über Schleifen? Folgendes hatte ich getestet:

      3a53265b-2449-4346-8407-0e4bd3520548-grafik.png

      Allerdings startet hier die Schleife alle 10s neu, oder?

      Hier noch mein blockly als Code:

      <xml xmlns="https://developers.google.com/blockly/xml">
       <block type="schedule" id="+/*YLtOH*Wk04Sm!(]AC" x="-162" y="213">
         <field name="SCHEDULE">*/10 * * * * *</field>
         <statement name="STATEMENT">
           <block type="debug" id="%rmG0E*VMzu6gM=okLj~">
             <field name="Severity">log</field>
             <value name="TEXT">
               <shadow type="text" id=")~T6I3a}?aSfq7mOD5{|">
                 <field name="TEXT">test</field>
               </shadow>
               <block type="text_join" id="FxJG)E2B6G;tVV#}K$n:">
                 <mutation items="3"></mutation>
                 <value name="ADD0">
                   <block type="convert_from_date" id="NLJl$^BJV0J,rwf-vyuV">
                     <mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation>
                     <field name="OPTION">hh:mm</field>
                     <value name="VALUE">
                       <block type="math_arithmetic" id="CIgH]Gxoe;3udD;AQQ06">
                         <field name="OP">MINUS</field>
                         <value name="A">
                           <shadow type="math_number" id="r=4mPm!sP0r|]NTP(ytM">
                             <field name="NUM">1</field>
                           </shadow>
                           <block type="time_get" id=":EZlfJ5U.0/tGt$T-6~Q">
                             <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" id="lK:}~a3A7^GyT,ZuoG9(">
                             <field name="ATTR">ts</field>
                             <field name="OID">mqtt.0.ESP_Easy.DHT.Temperatur</field>
                           </block>
                         </value>
                       </block>
                     </value>
                   </block>
                 </value>
                 <value name="ADD1">
                   <block type="convert_from_date" id="p]Rqbo2/H5xEdwa;aqgD">
                     <mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation>
                     <field name="OPTION">hh:mm</field>
                     <value name="VALUE">
                       <block type="time_get" id="]f9-g=1:?3o*riIPR.wp">
                         <mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation>
                         <field name="OPTION">object</field>
                       </block>
                     </value>
                   </block>
                 </value>
                 <value name="ADD2">
                   <block type="convert_from_date" id="~{cS21qky3K0I}H#KEIW">
                     <mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation>
                     <field name="OPTION">hh:mm</field>
                     <value name="VALUE">
                       <block type="get_value" id="bf%p:2-bH5#t]H{.]1Vj">
                         <field name="ATTR">ts</field>
                         <field name="OID">mqtt.0.ESP_Easy.DHT.Temperatur</field>
                       </block>
                     </value>
                   </block>
                 </value>
               </block>
             </value>
             <next>
               <block type="controls_if" id="Mk{/h0!u%75DhD~+M/y(">
                 <value name="IF0">
                   <block type="logic_compare" id="-c(0+VGS%yhMNX[uW$q;">
                     <field name="OP">GTE</field>
                     <value name="A">
                       <block type="convert_from_date" id="klg^yY*{/i-fOvIS2N6M">
                         <mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation>
                         <field name="OPTION">m</field>
                         <value name="VALUE">
                           <block type="math_arithmetic" id="of+)4h!3WJlJCW@3-8X;">
                             <field name="OP">MINUS</field>
                             <value name="A">
                               <shadow type="math_number" id=",4EuL.)Mg#^2#?F-!6OD">
                                 <field name="NUM">1</field>
                               </shadow>
                               <block type="time_get" id=",lWXJ*1_Zh`@kS;u/]P{">
                                 <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" id="1o/iyHVE=hbPEX-edX)a">
                                 <field name="NUM">1</field>
                               </shadow>
                               <block type="get_value" id="I6JD2HEy2RQw{4Dy`=Q/">
                                 <field name="ATTR">ts</field>
                                 <field name="OID">mqtt.0.ESP_Easy.DHT.Temperatur</field>
                               </block>
                             </value>
                           </block>
                         </value>
                       </block>
                     </value>
                     <value name="B">
                       <block type="math_number" id="gv;ZB6h0.%$2P[icg6X+">
                         <field name="NUM">2</field>
                       </block>
                     </value>
                   </block>
                 </value>
                 <statement name="DO0">
                   <block type="controls_repeat_ext" id="|E@7+G)HR0%zQy8T7:a*">
                     <value name="TIMES">
                       <shadow type="math_number" id="adK6X{5C6r.z.!B82^lr">
                         <field name="NUM">2</field>
                       </shadow>
                     </value>
                     <statement name="DO">
                       <block type="telegram" id="byk$jURhkb[XAY(n)yrv">
                         <field name="INSTANCE"></field>
                         <field name="LOG"></field>
                         <field name="SILENT">FALSE</field>
                         <field name="PARSEMODE">default</field>
                         <field name="DISABLE_WEB_PAGE_PREVIEW">FALSE</field>
                         <value name="MESSAGE">
                           <shadow type="text" id="=_nB~`xw(#Pr5$,kRrLV">
                             <field name="TEXT">Seit 15 min keine neue Temperaturmessung!🌱</field>
                           </shadow>
                         </value>
                         <next>
                           <block type="controls_flow_statements" id="tZ2W{6Yt?l+5J`SD9U]w">
                             <field name="FLOW">BREAK</field>
                           </block>
                         </next>
                       </block>
                     </statement>
                   </block>
                 </statement>
               </block>
             </next>
           </block>
         </statement>
       </block>
      </xml>
      

      Grüße

      paul53 Asgothian 2 Replies Last reply Reply Quote 0
      • paul53
        paul53 @ThoHilde last edited by paul53

        @thohilde sagte: Woran liegt diese Abweichung? Interessanterweise schickt es die Nachricht auch nur bei Differenz >01:15.

        Es liegt an der Zeitzone - siehe hier.

        1 Reply Last reply Reply Quote 0
        • Asgothian
          Asgothian Developer @ThoHilde last edited by Asgothian

          @thohilde Warum willst Du den Zeitstempel alle x Minuten prüfen. Die ganze Funktion sollte viel einfacher gehen:

          • Variable MsgCount auf 0.
          • Trigger auf den Datenpunkt, Wert wurde aktualisiert, darin:
          • anhalten Intervall
          • MsgCount = 0
          • Ausführen Intervall alle X minuten:
            -- Wenn MsgCount > 0 dann Nachricht an Telegramm: Sensor hat seit MsgCount*X Minuten keine Nachricht gesendet.
            -- Wenn MsgCount > 2 dann anhalten Intervall
            -- MsgCount= MsgCount+1

          Dabei muss X grösser als das Aktualisierungsintervall des Sensors sein, ansonsten bekommst du regelmässig Meldungen.

          A.

          paul53 T 2 Replies Last reply Reply Quote 1
          • paul53
            paul53 @Asgothian last edited by

            @asgothian sagte: Die ganze Funktion sollte viel einfacher gehen:

            Die Ausführungen als Bild:

            Bild_2022-03-16_130253.png

            1 Reply Last reply Reply Quote 1
            • T
              ThoHilde @Asgothian last edited by

              @asgothian Danke. Ich bin noch ziemlicher Anfänger in blockly. Interessant, wie man so ein Problem auch elegant lösen kann.
              Ich habe deine Textanleitung mal versucht umzusetzen. Mein blockly weicht dabei aber von @paul53 ab.

              ae3c4594-b8d6-4b70-af7a-196fd0848656-grafik.png

              Ist meine Variante falsch oder einfach nur aufgebläher und weniger elegant?

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

                @thohilde sagte: Ist meine Variante falsch oder einfach nur aufgebläher und weniger elegant?

                Beides. Falsch:

                • Trigger ändern in "wurde aktualisiert"
                • Nach dem Senden darf das Intervall nicht gestoppt werden
                • "sonst falls" wird nie ausgeführt

                Unnötig ist die Abfrage > 0.

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

                  @paul53 Danke.
                  Für mein Verständnis: das erste stoppen der zyklischen Ausführung ist dafür da, dass keine Nachricht gesendet wird, falls das Intervall gestartet wurde aber innerhalb der Zeit der DP doch geändert wird?

                  6e0faa35-a42a-4355-b2f6-197d05917037-grafik.png

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

                    @thohilde sagte: das erste stoppen der zyklischen Ausführung ist dafür da, dass keine Nachricht gesendet wird, falls das Intervall gestartet wurde aber innerhalb der Zeit der DP doch geändert wird?

                    Richtig: Aktualisiert wird (Wertänderung ist nicht nötig).

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

                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    942
                    Online

                    31.9k
                    Users

                    80.1k
                    Topics

                    1.3m
                    Posts

                    3
                    8
                    304
                    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