Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Gelöst: Blockly Oder-Verknüpfung

    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

    Gelöst: Blockly Oder-Verknüpfung

    This topic has been deleted. Only users with topic management privileges can see it.
    • Homoran
      Homoran Global Moderator Administrators @MartinP last edited by

      @martinp Aber dann bitte ein wenig Text zur Erklärung dazu!
      Einfach einen Screenshot ohne erkennbaren Zusammenhang zu posten, hilft dem Fragenden herzlich wenig

      1 Reply Last reply Reply Quote 1
      • MartinP
        MartinP @Asgothian last edited by MartinP

        @asgothian

        Mit Variablen könnte man den Zugriff auf den Objekt-Baum vermeiden:

        ddd35d03-40b3-40a1-8a05-dcb2fe9edfa2-grafik.png

        Eigentlich finde ich die Blocklys selbsterklärend

        Der Trick bei den beiden Triggern ist, dass man beim Abschalten des Alarms vorher den anderen Zustand prüfen muss

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

          @martinp sagte in Blockly Oder-Verknüpfung:

          Mit Variablen könnte man den Zugriff auf den Objekt-Baum vermeiden:

          Eine schöne Lösung für 2 DP. Dann kommt der mit 3, 4, 5 oder auch 20 Fenstern und fragt sich ob es nicht was besseres gibt 🙂

          Aber wie oben geschrieben - das würde den Thread kapern und die Frage des OP nicht wirklich beantworten

          A.

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

            @asgothian sagte in Blockly Oder-Verknüpfung:

            das würde den Thread kapern und die Frage des OP nicht wirklich beantworten

            Nunja, wenn die Hinweise zu einem leichter erweiterbaren Blockly führen, wäre dem Threadersteller vielleicht noch besser geholfen. Aber die Strukturen werden dadurch natürlich unübersichtlicher, Keep ist simple and stupid 😉

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

              @martinp

              Hinterm Spoiler mein Universeller Ansatz für n zu prüfende Elemente.

              Was je nach Anwendung angepasst werden muss ist die Liste der zu prüfenden Elemente (gerne auch per Selektor), die Bedingung beim Einlesen der Ist-Werte am Anfang. sowie die Bedingung für das "Alarm Setzen" und "löschen". So wie es ist würde es für den OP gehen, und den Alarm setzen wenn mindestens 1 Sensor offen meldet, und löschen wenn keiner mehr offen ist.

              Das ganze lohnt aber erst ab 3-5 Sensoren, vorher sind andere Methoden effektiver.

              A.


              Screenshot 2024-11-22 at 14.16.23.png

              <xml xmlns="https://developers.google.com/blockly/xml">
                <variables>
                  <variable id="z7dGtGTdWd=yX#`R{{B@">TriggerStates</variable>
                  <variable id="lkD1J,;IzM=DQLcG.5|S">OpenContacts</variable>
                  <variable id="amoGLBTN2N+h(t9?$1a^">TargetObject</variable>
                  <variable id="7(F.{kV~9TmDm7$:bcGE">Index</variable>
                </variables>
                <block type="variables_set" id="geabdFGp+}T2TWVPH4UE" x="37" y="138">
                  <field name="VAR" id="z7dGtGTdWd=yX#`R{{B@">TriggerStates</field>
                  <value name="VALUE">
                    <block type="lists_create_with" id="7oc/!KR!}TWk@PnPmc#l">
                      <mutation items="3"></mutation>
                      <value name="ADD0">
                        <block type="field_oid" id="C9Y.RW^k@fn!8B6{QZ8~">
                          <field name="oid">zigbee.0.00158d00025ee1b2.opened</field>
                        </block>
                      </value>
                      <value name="ADD1">
                        <block type="field_oid" id="ntd:._~)BN^v5q:7*jv8">
                          <field name="oid">zigbee.0.00158d00031305b7.opened</field>
                        </block>
                      </value>
                      <value name="ADD2">
                        <block type="field_oid" id="JqA*V)gb5T)(7Lra3,ED">
                          <field name="oid">zigbee.0.00158d0001dcfc5e.opened</field>
                        </block>
                      </value>
                    </block>
                  </value>
                  <next>
                    <block type="variables_set" id="SovLZ{^e*9-j1Y/76,B]">
                      <field name="VAR" id="lkD1J,;IzM=DQLcG.5|S">OpenContacts</field>
                      <value name="VALUE">
                        <block type="lists_create_with" id="P@_aH9^P!sT^rvYjcqLQ">
                          <mutation items="0"></mutation>
                        </block>
                      </value>
                      <next>
                        <block type="controls_forEach" id="Vou`^xt}+/cSs2`lWRp=">
                          <field name="VAR" id="amoGLBTN2N+h(t9?$1a^">TargetObject</field>
                          <value name="LIST">
                            <block type="variables_get" id="JKbQacAF:SE@CGtE+Gq(">
                              <field name="VAR" id="z7dGtGTdWd=yX#`R{{B@">TriggerStates</field>
                            </block>
                          </value>
                          <statement name="DO">
                            <block type="controls_if" id="C!Tkr[Hh4EH!t2Sr_fh]">
                              <value name="IF0">
                                <block type="logic_compare" id="@Wv8ocx5xriOXaqZpvN[">
                                  <field name="OP">GT</field>
                                  <value name="A">
                                    <block type="get_value" id="9$l?Ut^SJMt}1+`#|Qxk">
                                      <field name="ATTR">val</field>
                                      <field name="OID">ID auswählen</field>
                                    </block>
                                  </value>
                                  <value name="B">
                                    <block type="math_number" id="d0IxSPdDwtNeWY?-S+En">
                                      <field name="NUM">0</field>
                                    </block>
                                  </value>
                                </block>
                              </value>
                              <statement name="DO0">
                                <block type="lists_setIndex" id="ei2ri:vw31GJiJBTqH};">
                                  <mutation at="false"></mutation>
                                  <field name="MODE">INSERT</field>
                                  <field name="WHERE">LAST</field>
                                  <value name="LIST">
                                    <block type="variables_get" id="3#Hzvq8V(;weFbmbNOTM">
                                      <field name="VAR" id="lkD1J,;IzM=DQLcG.5|S">OpenContacts</field>
                                    </block>
                                  </value>
                                  <value name="TO">
                                    <block type="variables_get" id="hj_M`+v7|n}BNzFA:0^X">
                                      <field name="VAR" id="amoGLBTN2N+h(t9?$1a^">TargetObject</field>
                                    </block>
                                  </value>
                                </block>
                              </statement>
                            </block>
                          </statement>
                          <next>
                            <block type="on_ext" id="4WzNM7Og_wOS2/Uul1hz">
                              <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="}mU7xnk},xxWzi%A$!w[">
                                  <field name="oid">ID auswählen</field>
                                </shadow>
                                <block type="variables_get" id="5SH[{Bq@/LCw7PI#Da4`">
                                  <field name="VAR" id="z7dGtGTdWd=yX#`R{{B@">TriggerStates</field>
                                </block>
                              </value>
                              <statement name="STATEMENT">
                                <block type="variables_set" id="d5Ll8Nh4_VJ/nj[GwdV,">
                                  <field name="VAR" id="7(F.{kV~9TmDm7$:bcGE">Index</field>
                                  <value name="VALUE">
                                    <block type="lists_indexOf" id="6rQ)ZurAxPYNS9Pbl+qF">
                                      <field name="END">FIRST</field>
                                      <value name="VALUE">
                                        <block type="variables_get" id="aY0%)OT?|T~xGQe48FiW">
                                          <field name="VAR" id="lkD1J,;IzM=DQLcG.5|S">OpenContacts</field>
                                        </block>
                                      </value>
                                      <value name="FIND">
                                        <block type="on_source" id="Z*Lh~V)CvJ*GXcwF9R#o">
                                          <field name="ATTR">id</field>
                                        </block>
                                      </value>
                                    </block>
                                  </value>
                                  <next>
                                    <block type="controls_if" id="|!vroN*CLlQO|%72fq?0">
                                      <mutation else="1"></mutation>
                                      <value name="IF0">
                                        <block type="logic_compare" id="~(R$rBc!kEP]-5(b(U8i">
                                          <field name="OP">GT</field>
                                          <value name="A">
                                            <block type="on_source" id="V()q|sb_mlu^7{9ku8)j">
                                              <field name="ATTR">state.val</field>
                                            </block>
                                          </value>
                                          <value name="B">
                                            <block type="on_source" id="dk)hp$d:W9IDdo._c!L-">
                                              <field name="ATTR">oldState.val</field>
                                            </block>
                                          </value>
                                        </block>
                                      </value>
                                      <statement name="DO0">
                                        <block type="comment" id="Jj@6dS4(2Yw($NqQz?ek">
                                          <field name="COMMENT">IsOpen</field>
                                          <next>
                                            <block type="controls_if" id="{INLF:]]PZsm;-ronR/-">
                                              <value name="IF0">
                                                <block type="logic_compare" id="|~|Ra6F#B7U#Tsxo/W[s">
                                                  <field name="OP">LTE</field>
                                                  <value name="A">
                                                    <block type="variables_get" id="w.v7~{J~DDhecDt8``;$">
                                                      <field name="VAR" id="7(F.{kV~9TmDm7$:bcGE">Index</field>
                                                    </block>
                                                  </value>
                                                  <value name="B">
                                                    <block type="math_number" id="=r%/qvZA~jyhvmGd`X4R">
                                                      <field name="NUM">0</field>
                                                    </block>
                                                  </value>
                                                </block>
                                              </value>
                                              <statement name="DO0">
                                                <block type="lists_setIndex" id="B.s}5w8o[rJSD?1q4;Fg">
                                                  <mutation at="false"></mutation>
                                                  <field name="MODE">INSERT</field>
                                                  <field name="WHERE">LAST</field>
                                                  <value name="LIST">
                                                    <block type="variables_get" id="E{D@,b8#aH.649o)FZ{U">
                                                      <field name="VAR" id="lkD1J,;IzM=DQLcG.5|S">OpenContacts</field>
                                                    </block>
                                                  </value>
                                                  <value name="TO">
                                                    <block type="on_source" id="vHgXA)u;ME5.XYqPWQo^">
                                                      <field name="ATTR">id</field>
                                                    </block>
                                                  </value>
                                                </block>
                                              </statement>
                                            </block>
                                          </next>
                                        </block>
                                      </statement>
                                      <statement name="ELSE">
                                        <block type="comment" id="XMV+!?[QG~aBV/,0[1,1">
                                          <field name="COMMENT">IsClosed</field>
                                          <next>
                                            <block type="controls_if" id="su,@jVGp9ZAwJYU[s@TA">
                                              <value name="IF0">
                                                <block type="logic_compare" id="[]b6(9sL@BJvF}A%`lqz">
                                                  <field name="OP">GTE</field>
                                                  <value name="A">
                                                    <block type="variables_get" id="S,na9Z=(zF6wRGqnAB9A">
                                                      <field name="VAR" id="7(F.{kV~9TmDm7$:bcGE">Index</field>
                                                    </block>
                                                  </value>
                                                  <value name="B">
                                                    <block type="math_number" id="ttHu,;s*aZPGASplEtK+">
                                                      <field name="NUM">0</field>
                                                    </block>
                                                  </value>
                                                </block>
                                              </value>
                                              <statement name="DO0">
                                                <block type="lists_getIndex" id="faFVPoYx@i+Zgq^jNT_8">
                                                  <mutation statement="true" at="true"></mutation>
                                                  <field name="MODE">REMOVE</field>
                                                  <field name="WHERE">FROM_START</field>
                                                  <value name="VALUE">
                                                    <block type="variables_get" id="?Wa_(g*jPE*htOSiIH[r">
                                                      <field name="VAR" id="lkD1J,;IzM=DQLcG.5|S">OpenContacts</field>
                                                    </block>
                                                  </value>
                                                  <value name="AT">
                                                    <block type="variables_get" id="FWU#eirV-_h~=v.m^z@d">
                                                      <field name="VAR" id="7(F.{kV~9TmDm7$:bcGE">Index</field>
                                                    </block>
                                                  </value>
                                                </block>
                                              </statement>
                                            </block>
                                          </next>
                                        </block>
                                      </statement>
                                      <next>
                                        <block type="controls_if" id="geL~N#TBp,dL:YNu?w|:">
                                          <mutation else="1"></mutation>
                                          <value name="IF0">
                                            <block type="logic_compare" id="(G4Valke_]i8=p0)++jx">
                                              <field name="OP">GT</field>
                                              <value name="A">
                                                <block type="lists_length" id="j%aG3yIdA2MzS*~XS8N1">
                                                  <value name="VALUE">
                                                    <block type="variables_get" id="JpYUIU;Dxr*[gqnxNMW:">
                                                      <field name="VAR" id="lkD1J,;IzM=DQLcG.5|S">OpenContacts</field>
                                                    </block>
                                                  </value>
                                                </block>
                                              </value>
                                              <value name="B">
                                                <block type="math_number" id="IlmJN5dz|39])5$gaR40">
                                                  <field name="NUM">0</field>
                                                </block>
                                              </value>
                                            </block>
                                          </value>
                                          <statement name="DO0">
                                            <block type="comment" id="@UVj5+cknE;47(V^U[SH">
                                              <field name="COMMENT">Alarm Setzen</field>
                                            </block>
                                          </statement>
                                          <statement name="ELSE">
                                            <block type="comment" id="d9f=J:wqYy|(Ukl-d]._">
                                              <field name="COMMENT">Alarm löschen</field>
                                            </block>
                                          </statement>
                                        </block>
                                      </next>
                                    </block>
                                  </next>
                                </block>
                              </statement>
                            </block>
                          </next>
                        </block>
                      </next>
                    </block>
                  </next>
                </block>
              </xml>
              

              1 Reply Last reply Reply Quote 0
              • C
                cookiemonster1706 last edited by

                Vielen Dank für eure Unterstützung. Es funktioniert.
                Ich werde es mir nochmal im Detail anschauen, um es zu opitmieren.

                MartinP 1 Reply Last reply Reply Quote 0
                • MartinP
                  MartinP @cookiemonster1706 last edited by

                  @cookiemonster1706 sagte in Blockly Oder-Verknüpfung:

                  Vielen Dank für eure Unterstützung. Es funktioniert.

                  Dann ändere bitte noch den Threadtitel, indem du "Gelöst:" davorsetzt

                  1 Reply Last reply Reply Quote 0
                  • MartinP
                    MartinP last edited by MartinP

                    @asgothian sagte in Blockly Oder-Verknüpfung:

                    Hinterm Spoiler mein Universeller Ansatz für n zu prüfende Elemente.

                    Eine Frage zur Effizienz der Implementierung: Die Liste der gesetzten Datenpunkte ändert ja dynamisch ihre Größe - was für Penalties gibt es durch die dadurch verursachte Speicherverwaltung...

                    Wäre ggfs eine statische Liste, in der man die Zustände ablegt und nachher auf true abfragt effizienter?
                    Wenn man sich darauf verlassen könnte, dass immer abwechselnd von jedem Datenpunkt True oder False kommt, könnte man ggfs. auch einen einfachen Zähler nutzen...

                    Hereinkommende "Trues" inkrementieren, Hereinkommende "False" dekrementieren...

                    2fd1ed46-3f6e-4a78-9e0c-c570367dd2a1-grafik.png

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

                      @martinp sagte in Gelöst: Blockly Oder-Verknüpfung:

                      Wäre ggfs eine statische Liste, in der man die Zustände ablegt und nachher auf true abfragt effizienter?
                      Wenn man sich darauf verlassen könnte, dass immer abwechselnd von jedem Datenpunkt True oder False kommt, könnte man ggfs. auch einen einfachen Zähler nutzen...
                      Hereinkommende "Trues" inkrementieren, Hereinkommende "False" dekrementieren...

                      Das mit dem einfachen Zähler setzt voraus das da nichts schief geht. So hatte ich das am Anfang, aber meine Erfahrung damit war eher durchwachsen - der hat sich eigentlich ständig verzählt, so das oft die Meldung nicht zum Zustand gepasst hat. Unglücklicherweise wird das Verzählen eigentlich immer nur in eine Richtung erkannt - Jede Anwendung hat da ihre "Vorzugsrichtung". Im aktuellen Beispiel ist der Fall "es ist alles offen" eher selten, so das ein Verzählen nach oben kaum erkannt wird, aber dazu führt das der Alarm nie zurück gesetzt wird.

                      Das mit der statischen Liste ist auch so eine Sache - dann hat man statisch mehr Speicher belegt nur um nicht dynamisch zu arbeiten. Man braucht entweder eine Liste von Objekten mit properties oder zwei Listen die Synchron gehalten werden müssen - incl. dem durchgehen durch die Liste um zu ermitteln wieviele denn nun "wahr" und "falsch" zeigen. Wie genau der JS Garbage-Collector arbeitet weiss ich nicht - allerdings gehe ich davon aus das der Speicherplatz beim Austragen eines Elementes nicht sofort sondern mit Verzögerung freigegeben wird. Ich denke der Ansatz bildet da einen brauchbaren Kompromiss.

                      Natürlich kann man da je nach Situation alles mögliche optimieren - das war aber nie mein Ziel.
                      Was ich mir geschaffen hab war ein Skript welches ich einfach duplizieren kann, und welches auch dann funktioniert wenn der JS Adapter nicht beim Start alle States abonniert.

                      A.

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

                        Vielleicht ist das auch ein "fauler" Garbage Collector, der erstmal "abwartet" bis es eng wird, bevor er aufräumt - da könnte es sein, dass so lange auf dem Peak-Stand der Listengröße für offene Fenster verharrt wird, wie der Garbage Collector Ruhig bleibt, und der Speicherplatz auch bei anwachsender Listenlänge noch passt ...

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        474
                        Online

                        31.7k
                        Users

                        79.8k
                        Topics

                        1.3m
                        Posts

                        blockly
                        6
                        23
                        722
                        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