Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Mehrere Heizkörper Synchronisiseren, value storm

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Mehrere Heizkörper Synchronisiseren, value storm

    This topic has been deleted. Only users with topic management privileges can see it.
    • S
      Smo @paul53 last edited by

      @paul53 Jetzt wirds wild. Jetzt updatet er logischerweise nicht mehr, aber das Thermostat auf den der Regler im VIS wirkt springt hin und her. Also beeinflussen sich die drei wahrscheinlich gar nicht so dass sie sich aufschaukeln, sondern der Fehler liegt weiter vorn. Nur wo? Vom VIS ausgehen kanns ja eigentlich nicht, oder? Das schreibt doch einfach den Wert in den DP, und dann ists gut.

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

        @paul53 Kommando zurück: Verzögerung scheint zu helfen. Das Vis buffert scheinbar nur die Eingaben, und da man, um das ausulösen paar mal schnell den Wert ändern muss, sah es so aus, ald würds springen. Hörte dann aber wieder auf, und wurde nicht immer schneller bis zum Absturz wie vorher.

        Great SUN 1 Reply Last reply Reply Quote 0
        • Great SUN
          Great SUN @Smo last edited by

          @smo @paul53

          Das mit dem Verzögern halte ich auch für Sinnvoll. Im JS würde ich das in etwa so machen:
          Erstmal entweder mit $() die Heizkörpergruppe selektieren, oder, wenn das nicht geht, die ID's in einem json Objekt hinterlegen. Dann für alle den Gleichen on request machen:

          function changeGroupObject(sourceObjId, groupObjListId, settingsJson) {
              for(const [settingId, settingVal] of Object.entries(settingsJson)) {
                  var currVal = getState(sourceObjId + '.' + settingId).val;
                 if(currVal != settingVal) {
                     console.log('setting changed after call, ignoring request');
                     return;
                 }
             }
             var groupObjIdArr = JSON.parse(getState(groupObjListId).val);
             for(const destObjId of groupObjIdArr) {
                 if(destObjId == sourceObjId) {
                     continue;
                 }
                 for(const [settingId, settingVal] of Object.entries(settingsJson)) {
                     setState(destObjId + '.' + settingId, settingVal);
                 }
          }
          var groupObjIdArr = JSON.parse(getState(groupObjListId).val);
          var syncSettingArr = ['STATE.temperature', 'STATE.windowopen'];
          for(const destObjId of groupObjIdArr) {
              for(const settingId of syncSettingArr) {
                  on({id: destObjId + '.' + settingId, change: 'ne'}, async function(obj) {
                      setTimeout(function () { changeGroupObject(destObjId, groupObjListId, {settingId: obj.state.val});. 2000); // 2sec, könnte man drüber nachdenken, das zu ändern ;-)
                  })
              }
          }
          

          Mit dem Code oben könnte man von der Basis her auch noch verschiedene Werte gleichzeitig prüfen und verändern, so dass bei mehreren Änderungen nur ein setState aufgerufen werden muss pro Gerät/Eigenschaft.

          Ich hoffe, das hilft Dir evtl. etwas 😉

          S 1 Reply Last reply Reply Quote 1
          • S
            Smo @Great SUN last edited by

            @great-sun Ehrlich gesagt, ich guck da rein wie die Sau ins Uhrwerk. Zu modernes Zeugs für mich. Ich kann Bourne Shell und bissel awk, dann hörts auf 🙂 Drum bin ich ganz dankbar für Blockly, auch wenn man sich da auch manchmal fragt... 🙂 Trotzdem vielen Dank, und auch @paul53 nochmal. Funktioniert alles, und ich bin wieder bissel schlauer.

            Great SUN 1 Reply Last reply Reply Quote 0
            • Great SUN
              Great SUN @Smo last edited by

              @smo Ich habe im Grunde das setzen der Werte ausgelagert und aus der Gruppenkonfiguration heraus einen onChange Listener gebaut, der auf alle Werte lauscht, die Du synchronisieren willst.

              Jede Änderung an den Werten eines Gruppenmitglieds führt dazu, dass der Code separat einen Timer mit 2sec anwirft, der dann nach den 2sec eine Funktion aufruft, die prüft, ob der/die Wert(e) sich seit dem Aufruf verändert haben. Ist dem der Fall, macht sie gar nichts.
              So umgeht man das setzen der Werte egal wie die Zeitliche Abfolge aussieht und ob da irgendwo zwischendrin etwas hängt oder so, denn nur wenn der Wert sich seit dem Aufruf nicht verändert hat (2sec), wird auch etwas synchronisiert.
              Solltest Du also zum Beispiel einen Wert versehentlich ändern und binnen 2sec wieder zurück setzen, passiert nichts.

              S 1 Reply Last reply Reply Quote 0
              • H
                hm_krause last edited by

                @great-sun

                Hallo,
                kannst Du mir bitte Dein Script zur Verfügung stellen.
                Würde das gern mal nachbauen wollen.
                MfG

                Great SUN 1 Reply Last reply Reply Quote 0
                • Great SUN
                  Great SUN @hm_krause last edited by

                  @hm_krause Ich hab alles, was ich dazu geschrieben habe bis jetzt direkt hier geschrieben, aber ich kann Dir gerne mal eine Einführung in das geben, was ich sonst so schreibe, oder das script mit Dir zusammen für Dich machen.

                  1 Reply Last reply Reply Quote 0
                  • S
                    Smo @Great SUN last edited by

                    @great-sun Nochmal gegenchecken ob die Änderung nach dem Ablauf des Timers noch genau so besteht ist ne ziemlich gute Idee 🙂 Gleich mit eingebaut:

                    <xml xmlns="https://developers.google.com/blockly/xml">
                      <variables>
                        <variable id="xwP+E7r*%:9g!Q/8k!*u">Kueche</variable>
                        <variable id="i}L,KT[`hM%j=fb;7(]g">Stube-Ost</variable>
                        <variable id="LJYmQ224PvX(za_jPm!_">Stube-Sued</variable>
                        <variable id="PL6ZeJ*=r3uKgdG-:cQC">Temperatur</variable>
                        <variable type="timeout" id="timeout">timeout</variable>
                        <variable id="d|fQQ^z{.5`R~GJleE[U">idZiel1</variable>
                        <variable id="~avL/#WiGg4U,4l5M5+L">idZiel2</variable>
                      </variables>
                      <block type="variables_set" id="}`|5T^zl8rrO05gh{9td" x="-162" y="-362">
                        <field name="VAR" id="xwP+E7r*%:9g!Q/8k!*u">Kueche</field>
                        <value name="VALUE">
                          <block type="field_oid" id="cVcm=hQi#;N[p(`f|saz">
                            <field name="oid">zigbee.0.84fd27fffea5aa76.current_heating_setpoint</field>
                          </block>
                        </value>
                        <next>
                          <block type="variables_set" id="D#=Oy8`3ZC$2p8z5,^*o">
                            <field name="VAR" id="i}L,KT[`hM%j=fb;7(]g">Stube-Ost</field>
                            <value name="VALUE">
                              <block type="field_oid" id=",dWvxR6VD`sHLg2K%Q1B">
                                <field name="oid">zigbee.0.84fd27fffea5a776.current_heating_setpoint</field>
                              </block>
                            </value>
                            <next>
                              <block type="variables_set" id=";`XS`L?KTPd/AWs0J:3~">
                                <field name="VAR" id="LJYmQ224PvX(za_jPm!_">Stube-Sued</field>
                                <value name="VALUE">
                                  <block type="field_oid" id="Th$Wq$lmufG.x_qeP**b">
                                    <field name="oid">zigbee.0.cc86ecfffeb7ff1a.current_heating_setpoint</field>
                                  </block>
                                </value>
                                <next>
                                  <block type="on_ext" id="rNCavHPQHqv[%LtqKZw~">
                                    <mutation xmlns="http://www.w3.org/1999/xhtml" items="3"></mutation>
                                    <field name="CONDITION">ne</field>
                                    <field name="ACK_CONDITION">false</field>
                                    <value name="OID0">
                                      <shadow type="field_oid" id="]:K7sxy+Z1=fLir+S/O;">
                                        <field name="oid">zigbee.0.b4e3f9fffe11af85.current_heating_setpoint</field>
                                      </shadow>
                                      <block type="variables_get" id="*QY%|A3{Okrmh2OMTG.*">
                                        <field name="VAR" id="xwP+E7r*%:9g!Q/8k!*u">Kueche</field>
                                      </block>
                                    </value>
                                    <value name="OID1">
                                      <shadow type="field_oid" id="uy;(g-Jex[e?@d9?h_]@">
                                        <field name="oid">default</field>
                                      </shadow>
                                      <block type="variables_get" id="P7vBCrFl8E]IT;tc4973">
                                        <field name="VAR" id="i}L,KT[`hM%j=fb;7(]g">Stube-Ost</field>
                                      </block>
                                    </value>
                                    <value name="OID2">
                                      <shadow type="field_oid" id="J:G4DbTwRa)_X7ShcRnV">
                                        <field name="oid">default</field>
                                      </shadow>
                                      <block type="variables_get" id="sxUf:.!$H]L8MEptV:iv">
                                        <field name="VAR" id="LJYmQ224PvX(za_jPm!_">Stube-Sued</field>
                                      </block>
                                    </value>
                                    <statement name="STATEMENT">
                                      <block type="controls_if" id="oi*@RHmtQ{8m54wIwb[7">
                                        <value name="IF0">
                                          <block type="logic_compare" id="GAXt}vZ_/puqs=w9D{t9">
                                            <field name="OP">NEQ</field>
                                            <value name="A">
                                              <block type="on_source" id="^p7CtQ3=z}Fv!JBL:}|6">
                                                <field name="ATTR">state.from</field>
                                              </block>
                                            </value>
                                            <value name="B">
                                              <block type="text" id="$=8NvT]JGeg]dQX##U@3">
                                                <field name="TEXT">system.adapter.javascript.0</field>
                                              </block>
                                            </value>
                                          </block>
                                        </value>
                                        <statement name="DO0">
                                          <block type="variables_set" id="@m)|afm9vfkId3MwaxBg">
                                            <field name="VAR" id="PL6ZeJ*=r3uKgdG-:cQC">Temperatur</field>
                                            <value name="VALUE">
                                              <block type="on_source" id="RRck8Pm/jASL,?|E^eFC">
                                                <field name="ATTR">state.val</field>
                                              </block>
                                            </value>
                                            <next>
                                              <block type="timeouts_cleartimeout" id="6qBn%jN)iTq=Rj.z]9oJ">
                                                <field name="NAME">timeout</field>
                                                <next>
                                                  <block type="timeouts_settimeout" id=".}%W2Ft85m2#Tu/oT(qK">
                                                    <field name="NAME">timeout</field>
                                                    <field name="DELAY">1500</field>
                                                    <field name="UNIT">ms</field>
                                                    <statement name="STATEMENT">
                                                      <block type="controls_if" id="C@^DUGSfh(=XA`:)nTOj">
                                                        <value name="IF0">
                                                          <block type="logic_compare" id="8ojH(8HOSMs7a@FHhc[d">
                                                            <field name="OP">EQ</field>
                                                            <value name="A">
                                                              <block type="variables_get" id="#a;*GGU,pfWi(ZRlLM[@">
                                                                <field name="VAR" id="PL6ZeJ*=r3uKgdG-:cQC">Temperatur</field>
                                                              </block>
                                                            </value>
                                                            <value name="B">
                                                              <block type="get_value_var" id="wzkw~11W=+#OYI0V|Is_">
                                                                <field name="ATTR">val</field>
                                                                <value name="OID">
                                                                  <shadow type="text" id="Ok$F/iT$bcwE99!;fKU/">
                                                                    <field name="TEXT"></field>
                                                                  </shadow>
                                                                  <block type="on_source" id="*Qo~ytz3k,oxXfLWBn^W">
                                                                    <field name="ATTR">id</field>
                                                                  </block>
                                                                </value>
                                                              </block>
                                                            </value>
                                                          </block>
                                                        </value>
                                                        <statement name="DO0">
                                                          <block type="logic_switch_case" id=".h;5GTblOo.hLH`R;cq#">
                                                            <mutation xmlns="http://www.w3.org/1999/xhtml" case="1" default="1"></mutation>
                                                            <value name="CONDITION">
                                                              <block type="on_source" id="%[P7X^cdD^twDGYo@w]/">
                                                                <field name="ATTR">id</field>
                                                              </block>
                                                            </value>
                                                            <value name="CASECONDITION0">
                                                              <block type="variables_get" id="Mgi]C=yW!W,z]xnt_cJw">
                                                                <field name="VAR" id="xwP+E7r*%:9g!Q/8k!*u">Kueche</field>
                                                              </block>
                                                            </value>
                                                            <statement name="CASE0">
                                                              <block type="variables_set" id="@lEY@(,h*MTSy:e{caEI">
                                                                <field name="VAR" id="d|fQQ^z{.5`R~GJleE[U">idZiel1</field>
                                                                <value name="VALUE">
                                                                  <block type="variables_get" id="t1PcK,}-Vzug_07*0Sgs">
                                                                    <field name="VAR" id="i}L,KT[`hM%j=fb;7(]g">Stube-Ost</field>
                                                                  </block>
                                                                </value>
                                                                <next>
                                                                  <block type="variables_set" id="4}Y3aRhQ].{x$*fr~Owv">
                                                                    <field name="VAR" id="~avL/#WiGg4U,4l5M5+L">idZiel2</field>
                                                                    <value name="VALUE">
                                                                      <block type="variables_get" id="OH!Fw#;8r$qP_@y5b!;L">
                                                                        <field name="VAR" id="LJYmQ224PvX(za_jPm!_">Stube-Sued</field>
                                                                      </block>
                                                                    </value>
                                                                  </block>
                                                                </next>
                                                              </block>
                                                            </statement>
                                                            <value name="CASECONDITION1">
                                                              <block type="variables_get" id="cS=Esi8cP[@Xq7oe1w,0">
                                                                <field name="VAR" id="i}L,KT[`hM%j=fb;7(]g">Stube-Ost</field>
                                                              </block>
                                                            </value>
                                                            <statement name="CASE1">
                                                              <block type="variables_set" id="HW/iFSllX1%qK+G!o-gV">
                                                                <field name="VAR" id="d|fQQ^z{.5`R~GJleE[U">idZiel1</field>
                                                                <value name="VALUE">
                                                                  <block type="variables_get" id="qZVI[pTbd.qFfykJy$lf">
                                                                    <field name="VAR" id="LJYmQ224PvX(za_jPm!_">Stube-Sued</field>
                                                                  </block>
                                                                </value>
                                                                <next>
                                                                  <block type="variables_set" id="(Hfwzk)Nd#Zs#ZFY`^=|">
                                                                    <field name="VAR" id="~avL/#WiGg4U,4l5M5+L">idZiel2</field>
                                                                    <value name="VALUE">
                                                                      <block type="variables_get" id="N3DfM30dZIj]2{%s|WR0">
                                                                        <field name="VAR" id="xwP+E7r*%:9g!Q/8k!*u">Kueche</field>
                                                                      </block>
                                                                    </value>
                                                                  </block>
                                                                </next>
                                                              </block>
                                                            </statement>
                                                            <statement name="ONDEFAULT">
                                                              <block type="variables_set" id="dth`4:`=z]+0HiS*P|%;">
                                                                <field name="VAR" id="d|fQQ^z{.5`R~GJleE[U">idZiel1</field>
                                                                <value name="VALUE">
                                                                  <block type="variables_get" id="B-Vde1A]D,6w@^k#_5bq">
                                                                    <field name="VAR" id="xwP+E7r*%:9g!Q/8k!*u">Kueche</field>
                                                                  </block>
                                                                </value>
                                                                <next>
                                                                  <block type="variables_set" id="WV,SGvU~}|:J;FR@HO@`">
                                                                    <field name="VAR" id="~avL/#WiGg4U,4l5M5+L">idZiel2</field>
                                                                    <value name="VALUE">
                                                                      <block type="variables_get" id="e,2/_qXR3v(S~ZDB:Q#y">
                                                                        <field name="VAR" id="i}L,KT[`hM%j=fb;7(]g">Stube-Ost</field>
                                                                      </block>
                                                                    </value>
                                                                  </block>
                                                                </next>
                                                              </block>
                                                            </statement>
                                                            <next>
                                                              <block type="control_ex" id="m8n(ez~Ih}c!g.tJCO_+" inline="true">
                                                                <field name="TYPE">false</field>
                                                                <field name="CLEAR_RUNNING">FALSE</field>
                                                                <value name="OID">
                                                                  <shadow type="field_oid" id="CTD:j1@O(mDK$,v{Uh;c">
                                                                    <field name="oid">Object ID</field>
                                                                  </shadow>
                                                                  <block type="variables_get" id="f4#m[n3|OFPcq-0cuvX2">
                                                                    <field name="VAR" id="d|fQQ^z{.5`R~GJleE[U">idZiel1</field>
                                                                  </block>
                                                                </value>
                                                                <value name="VALUE">
                                                                  <shadow type="logic_boolean" id="+pi$o-3WYA;Hv-`7j^]p">
                                                                    <field name="BOOL">TRUE</field>
                                                                  </shadow>
                                                                  <block type="on_source" id="tc{BuczraO#{E-GtWH:~">
                                                                    <field name="ATTR">state.val</field>
                                                                  </block>
                                                                </value>
                                                                <value name="DELAY_MS">
                                                                  <shadow type="math_number" id="`-HY6@Y1WUq`#z6WzM@N">
                                                                    <field name="NUM">0</field>
                                                                  </shadow>
                                                                </value>
                                                                <next>
                                                                  <block type="control_ex" id="*8t)fh|aw6pOWtpC4#PW" inline="true">
                                                                    <field name="TYPE">false</field>
                                                                    <field name="CLEAR_RUNNING">FALSE</field>
                                                                    <value name="OID">
                                                                      <shadow type="field_oid">
                                                                        <field name="oid">Object ID</field>
                                                                      </shadow>
                                                                      <block type="variables_get" id="$wO;{`X9C?,n2q4a/iiq">
                                                                        <field name="VAR" id="~avL/#WiGg4U,4l5M5+L">idZiel2</field>
                                                                      </block>
                                                                    </value>
                                                                    <value name="VALUE">
                                                                      <shadow type="logic_boolean">
                                                                        <field name="BOOL">TRUE</field>
                                                                      </shadow>
                                                                      <block type="on_source" id="/f,=NCV*|v^xcO4[i_={">
                                                                        <field name="ATTR">state.val</field>
                                                                      </block>
                                                                    </value>
                                                                    <value name="DELAY_MS">
                                                                      <shadow type="math_number" id="n*d/SJvg$g)CYTW}0dD-">
                                                                        <field name="NUM">0</field>
                                                                      </shadow>
                                                                    </value>
                                                                  </block>
                                                                </next>
                                                              </block>
                                                            </next>
                                                          </block>
                                                        </statement>
                                                      </block>
                                                    </statement>
                                                  </block>
                                                </next>
                                              </block>
                                            </next>
                                          </block>
                                        </statement>
                                      </block>
                                    </statement>
                                  </block>
                                </next>
                              </block>
                            </next>
                          </block>
                        </next>
                      </block>
                    </xml>
                    
                    Great SUN paul53 2 Replies Last reply Reply Quote 0
                    • Great SUN
                      Great SUN @Smo last edited by

                      @smo Freut mich 🙂
                      Aber bis ich Blockly im XML lesen lerne, hab ich mein Smart Home fertig 😄

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

                        @smo sagte: ob die Änderung nach dem Ablauf des Timers noch genau so besteht ist ne ziemlich gute Idee

                        Diese zusätzliche Abfrage ist sinnlos: Hätte sich der Wert innerhalb der Verzögerungszeit geändert, würde getriggert, der Timer gestoppt und neu gestartet. Eine Wertänderung während der Verzögerung führt also zu keiner Aktion.

                        Anmerkung: Bei Trigger auf "unbestätigte Änderung" kann der Sollwert nicht mehr an einem Thermostat für alle 3 Thermostate geändert werden. Geräte senden immer "bestätigt".

                        S 1 Reply Last reply Reply Quote 1
                        • S
                          Smo @paul53 last edited by

                          @paul53 Hast recht. Mit beidem 🙂 Man sollte sowas nicht nebenbei auf der Arbeit machen 🙂

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          527
                          Online

                          31.7k
                          Users

                          79.7k
                          Topics

                          1.3m
                          Posts

                          5
                          24
                          956
                          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