Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. [Solved] Mindestdauer für Logikabfrage (z.B. 20 Min wahr)

    NEWS

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker goes Matter ... Matter Adapter in Stable

    [Solved] Mindestdauer für Logikabfrage (z.B. 20 Min wahr)

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

      Moin Moin,

      ich möchte in Blockly triggern, wenn eine Bedingung für einen definierten Zeitraum wahr ist.

      Z.B. Ventilstand von Sensor X ist kleiner als 20% für 20 Minuten.

      Dank Google kann ich auf einmaliges Unterschreiten des Schwellwertes triggern:

      <xml xmlns="https://developers.google.com/blockly/xml">
        <block type="on_ext" id="=qm@$Ij7CE[U}Wl2wcN(" x="188" y="213">
          <mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation>
          <field name="CONDITION">ne</field>
          <field name="ACK_CONDITION"></field>
          <value name="OID0">
            <shadow type="field_oid" id="lm32_6LQZ+#ElSG!`nZ9">
              <field name="oid">javascript.0.Calculated.Heating.ValvesAverage</field>
            </shadow>
          </value>
          <statement name="STATEMENT">
            <block type="controls_if" id="x~JBuYW4FmoO+knH*deB">
              <value name="IF0">
                <block type="logic_operation" id="?s%e?Ln%YLGl]@gT!!6C" inline="false">
                  <field name="OP">AND</field>
                  <value name="A">
                    <block type="logic_compare" id=":n~D1LRpsAVB:E={Jh#A">
                      <field name="OP">LT</field>
                      <value name="A">
                        <block type="on_source" id="z,Uk442;2*=XT%?kJi9d">
                          <field name="ATTR">state.val</field>
                        </block>
                      </value>
                      <value name="B">
                        <block type="math_number" id="9H4iBGWR/S7lb[.tzM+r">
                          <field name="NUM">20</field>
                        </block>
                      </value>
                    </block>
                  </value>
                  <value name="B">
                    <block type="logic_compare" id="Y9ki}D*8G1.%vuS`oEK^">
                      <field name="OP">GTE</field>
                      <value name="A">
                        <block type="on_source" id="2@l4,m4b]]EbTd,uLYt+">
                          <field name="ATTR">oldState.val</field>
                        </block>
                      </value>
                      <value name="B">
                        <block type="math_number" id="u+$n+|M*,BkzVIVIOwmF">
                          <field name="NUM">20</field>
                        </block>
                      </value>
                    </block>
                  </value>
                </block>
              </value>
              <statement name="DO0">
                <block type="comment" id="z(P5^vmE/F[Ywn|2M*y:">
                  <field name="COMMENT">Switch Heizungsprofil</field>
                </block>
              </statement>
            </block>
          </statement>
        </block>
      </xml>
      

      Aber ich habe keinen Lösungsansatz gefunden, das "Alter der letzten Änderung" des Logikvergleiches zu prüfen.

      Gibt es dort eine clevere, mir unbekannte Lösung?

      Danke, -MN

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

        @Morgennebel sagt:

        Ventilstand von Sensor X ist kleiner als 20% für 20 Minuten.

        Blockly_temp.JPG

        <xml xmlns="https://developers.google.com/blockly/xml">
         <variables>
           <variable type="timeout" id="timeout">timeout</variable>
         </variables>
         <block type="on_ext" id="=qm@$Ij7CE[U}Wl2wcN(" x="188" y="213">
           <mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation>
           <field name="CONDITION">ne</field>
           <field name="ACK_CONDITION"></field>
           <value name="OID0">
             <shadow type="field_oid" id="lm32_6LQZ+#ElSG!`nZ9">
               <field name="oid">javascript.0.Calculated.Heating.ValvesAverage</field>
             </shadow>
           </value>
           <statement name="STATEMENT">
             <block type="controls_if" id="x~JBuYW4FmoO+knH*deB">
               <mutation elseif="1"></mutation>
               <value name="IF0">
                 <block type="logic_compare" id=":n~D1LRpsAVB:E={Jh#A">
                   <field name="OP">GTE</field>
                   <value name="A">
                     <block type="on_source" id="z,Uk442;2*=XT%?kJi9d">
                       <field name="ATTR">state.val</field>
                     </block>
                   </value>
                   <value name="B">
                     <block type="math_number" id="9H4iBGWR/S7lb[.tzM+r">
                       <field name="NUM">20</field>
                     </block>
                   </value>
                 </block>
               </value>
               <statement name="DO0">
                 <block type="timeouts_cleartimeout" id="4x0.9pzGqaFw@x(C7JRO">
                   <field name="NAME">timeout</field>
                 </block>
               </statement>
               <value name="IF1">
                 <block type="logic_compare" id="Y9ki}D*8G1.%vuS`oEK^">
                   <field name="OP">GTE</field>
                   <value name="A">
                     <block type="on_source" id="2@l4,m4b]]EbTd,uLYt+">
                       <field name="ATTR">oldState.val</field>
                     </block>
                   </value>
                   <value name="B">
                     <block type="math_number" id="u+$n+|M*,BkzVIVIOwmF">
                       <field name="NUM">20</field>
                     </block>
                   </value>
                 </block>
               </value>
               <statement name="DO1">
                 <block type="timeouts_settimeout" id="8M7q(=1M!7N=vuSEvn#K">
                   <field name="NAME">timeout</field>
                   <field name="DELAY">20</field>
                   <field name="UNIT">min</field>
                   <statement name="STATEMENT">
                     <block type="comment" id="z(P5^vmE/F[Ywn|2M*y:">
                       <field name="COMMENT">Switch Heizungsprofil</field>
                     </block>
                   </statement>
                 </block>
               </statement>
             </block>
           </statement>
         </block>
        </xml>
        

        M 2 Replies Last reply Reply Quote 0
        • M
          Morgennebel @paul53 last edited by

          @paul53 Vielen Dank für die schnelle Hilfe. Gleich ausprobieren...

          Ciao, -MN

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

            @paul53 Nochmals Danke.

            Diese Lösung funktioniert jedoch nur, wenn sich die Werte nicht schneller als der definierte Zeitraum ändern.

            Beispiel:

            WERT: 22, 2.5 Min, WERT: 19, 2.5 Min, Wert: 17, 2.5 Min, Wert 15, 2.5 Min, Wert 17, 2.5 Min usw.

            D.h. der Wert eiert unterhalb des Schwellwertes, ändert sich jedoch. Jede Änderung führt dann zu einem Neusetzen des timeouts und der Ausführungsteil ("switch Heizungsprofil") wird nicht ausgeführt.

            Der Trigger löst auch nicht aus, wenn beim Start des Scriptes der ValvesAverage-Wert bereits unter 20% (Schwellwert) ist - denn der "vorherige Wert" ist niemals größer als 20...

            Hmmmm....

            Ciao, -MN

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

              @Morgennebel sagte:

              Diese Lösung funktioniert jedoch nur, wenn sich die Werte nicht schneller als der definierte Zeitraum ändern.
              Beispiel:
              WERT: 22, 2.5 Min, WERT: 19, 2.5 Min, Wert: 17, 2.5 Min, Wert 15, 2.5 Min, Wert 17, 2.5 Min usw.

              Nur bei der ersten Änderung 22 --> 19 ist die Bedingung "vorheriger Wert >= 20" erfüllt, also wird der Timer nur dann gestartet.

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

                @paul53 Genau.

                Das ist dann zwar eine schicke Lösung, aber nicht eine Lösung für meine Frage 🙂

                Denn 20 Minuten unter 20% würde auch bei Werten von 17.5, 18, 15, 12, 8, 9 jeweils mit 3 Minuten Unterschied wahr sein oder beim Start des Skriptes mit einem Startwert von unter 20...

                Ich werde Deinen Ansatz nochmals durchgrübeln müssen.

                Danke für den Denkanstoß und die Hilfe.

                Ciao, -MN

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

                  @Morgennebel sagte:

                  beim Start des Skriptes mit einem Startwert von unter 20...

                  Das muss außerhalb des Triggers ausgewertet werden (ohne Timeout).

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

                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  845
                  Online

                  32.0k
                  Users

                  80.5k
                  Topics

                  1.3m
                  Posts

                  2
                  7
                  241
                  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