NEWS
Fertiges Blockly zum Zählen der offenen Rolläden
-
Hi,
ich habe mir analog zu den Beispielen von offenen Fenstern, ein Blockly geschrieben, dass zählt, wie viele Rolläden offen (=100%), geschlossen (=0%) oder halb offen (zwischen 0 und 100%) sind. Bei mir kommen hmip-broll Aktoren zum Einsatz.
Ihr müsst dazu bei allen Rollädenaktoren in den Datenpunkten noch z.B. RollaedenZaehlen zuweisen. Dafür müsst ihr über den Aufzählungen-Tab noch "RollaedenZaehlen" hinzufügen und dann in den Objekten zuweisen.
Das Skript schreibt in eigene Datenpunkte (werden mit beim ersten Start angelegt):
- sind alle zu (boolean)
- sind alle offen (boolean)
- Anzahl offen
- Anzahl geschlossen
- Anzahl halb offen
Vielleicht kann es ja der ein oder andere gebrauchen.
<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="~fXmm]cs9@kWJtnzgMdY">x</variable> <variable id="%?VN@CIuprPL^)/Vq+J%">y</variable> <variable id="f-jw%YzIkQ|7M7aZ_5H$">z</variable> <variable id="af3}6;=EWK*5OziK#}WO">i</variable> </variables> <block type="create" id="@*7aXYReA;^u7ccg^?fc" x="-487" y="-437"> <field name="NAME">0_userdata.0.EigeneDatenpunkte.Sonstiges.RollaedenHalbOffen</field> <value name="VALUE"> <block type="text" id="D)q9N%ag2=-L1Cn2RJ|p"> <field name="TEXT">0</field> </block> </value> <value name="COMMON"> <block type="text" id="B,LYkW^q0HfMDRk.L/eb"> <field name="TEXT">{ "type": "number", "min": 0, "max": 100}</field> </block> </value> <next> <block type="create" id="x/A|wi9@7jWRtz%b=iEW"> <field name="NAME">0_userdata.0.EigeneDatenpunkte.Sonstiges.RollaedenOffen</field> <value name="VALUE"> <block type="text" id="pZU~[}L9B@VdlSDo{3a)"> <field name="TEXT">0</field> </block> </value> <value name="COMMON"> <block type="text" id="SNsh*w1VgN~SOV#$q/s%"> <field name="TEXT">{ "type": "number", "min": 0, "max": 100}</field> </block> </value> <next> <block type="create" id="2a/[^FldGCdHM@V3hB45"> <field name="NAME">0_userdata.0.EigeneDatenpunkte.Sonstiges.RollaedenGeschlossen</field> <value name="VALUE"> <block type="text" id="Dk#a(:1E#o(9:EUma]r;"> <field name="TEXT">0</field> </block> </value> <value name="COMMON"> <block type="text" id="|-t0B/@/x$`+_k;,)qm{"> <field name="TEXT">{ "type": "number", "min": 0, "max": 100}</field> </block> </value> <next> <block type="create" id=":J/n$$91pUDc{*/_ks)L"> <field name="NAME">0_userdata.0.EigeneDatenpunkte.Sonstiges.RollaedenAllezu</field> <value name="VALUE"> <block type="text" id="5L2Bvg$W_oeB@IW*N)4t"> <field name="TEXT">false</field> </block> </value> <value name="COMMON"> <block type="text" id="ej:u%iJV!9Xvg[-hwY)t"> <field name="TEXT">{ "type": "boolean"}</field> </block> </value> <next> <block type="create" id="4T*f=r^KbuFu)==Wi]?_"> <field name="NAME">0_userdata.0.EigeneDatenpunkte.Sonstiges.RollaedenAlleOffen</field> <value name="VALUE"> <block type="text" id="2Qx6e6COg[x(Pc3SSc1."> <field name="TEXT">false</field> </block> </value> <value name="COMMON"> <block type="text" id="RRc}4`g_vUdf]Y{|]sg$"> <field name="TEXT">{ "type": "boolean"}</field> </block> </value> </block> </next> </block> </next> </block> </next> </block> </next> </block> <block type="on_ext" id="TQx$s0oyxmN_V)~[iKTS" x="262" y="-12"> <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="-b9]cCOxK+rJk=rNg#u("> <field name="oid">default</field> </shadow> <block type="selector" id=";kt]4=H)NB2?9{Udat+U"> <field name="TEXT">state[id=*](functions=RollaedenZaehlen)</field> </block> </value> <statement name="STATEMENT"> <block type="variables_set" id="@KB*bPajWnxY)XG[bJg,"> <field name="VAR" id="~fXmm]cs9@kWJtnzgMdY">x</field> <value name="VALUE"> <block type="math_number" id="0DS~L3[Q$(^K|?kvMO:/"> <field name="NUM">0</field> </block> </value> <next> <block type="variables_set" id="ZWhUhZIZvLShVf1?~8~Q"> <field name="VAR" id="%?VN@CIuprPL^)/Vq+J%">y</field> <value name="VALUE"> <block type="math_number" id="/+J_x3OfNX/TA9V_=85$"> <field name="NUM">0</field> </block> </value> <next> <block type="variables_set" id="wYN@EdtYjPE(=j=)D-l*"> <field name="VAR" id="f-jw%YzIkQ|7M7aZ_5H$">z</field> <value name="VALUE"> <block type="math_number" id="R5+NHv/N@n/dS}tc;Bh,"> <field name="NUM">0</field> </block> </value> <next> <block type="controls_forEach" id="Q2F(YOTb(|I2`1u)*#QG"> <field name="VAR" id="af3}6;=EWK*5OziK#}WO">i</field> <value name="LIST"> <block type="selector" id="WN4%kE2xoScAj%kwMg@}"> <field name="TEXT">state[id=*](functions=RollaedenZaehlen)</field> </block> </value> <statement name="DO"> <block type="controls_if" id="[CK9x=`~P|N;7Kix/t#~"> <mutation elseif="1" else="1"></mutation> <value name="IF0"> <block type="logic_compare" id="Sl}%:}zTmdB]1E1iEjeD"> <field name="OP">EQ</field> <value name="A"> <block type="get_value_var" id="N]gjyA?Nz)3j0eSYYzy!"> <field name="ATTR">val</field> <value name="OID"> <shadow type="field_oid" id="HuJ+#G{11q*Wc)+:^CXl"> <field name="oid">Object ID</field> </shadow> <block type="variables_get" id=",=9@wGeSb29pCK#fQPEc"> <field name="VAR" id="af3}6;=EWK*5OziK#}WO">i</field> </block> </value> </block> </value> <value name="B"> <block type="math_number" id="`8Ms,i0w}){H+;*elYR|"> <field name="NUM">100</field> </block> </value> </block> </value> <statement name="DO0"> <block type="math_change" id="vb`7V[9cir{X}r5)P){u"> <field name="VAR" id="~fXmm]cs9@kWJtnzgMdY">x</field> <value name="DELTA"> <shadow type="math_number" id="Gy}yn:Tj.LSCYm|@|LeG"> <field name="NUM">1</field> </shadow> </value> </block> </statement> <value name="IF1"> <block type="logic_compare" id="B_qbzCxJ4y^VOQ2w/aN4"> <field name="OP">EQ</field> <value name="A"> <block type="get_value_var" id="KDEY4S2:otSr{jH(Muc."> <field name="ATTR">val</field> <value name="OID"> <shadow type="field_oid" id="HuJ+#G{11q*Wc)+:^CXl"> <field name="oid">Object ID</field> </shadow> <block type="variables_get" id=":q22VAcb*oC5U/G8QT50"> <field name="VAR" id="af3}6;=EWK*5OziK#}WO">i</field> </block> </value> </block> </value> <value name="B"> <block type="math_number" id="Rgq#4P1HGn8-VhUpv.D$"> <field name="NUM">0</field> </block> </value> </block> </value> <statement name="DO1"> <block type="math_change" id="v+|mOhsYmj=I40l,V3)D"> <field name="VAR" id="%?VN@CIuprPL^)/Vq+J%">y</field> <value name="DELTA"> <shadow type="math_number" id="(Ng4fYlKo:=WTT^*97)w"> <field name="NUM">1</field> </shadow> </value> </block> </statement> <statement name="ELSE"> <block type="math_change" id="8$^@!+,mJ4uUREN5NTpG"> <field name="VAR" id="f-jw%YzIkQ|7M7aZ_5H$">z</field> <value name="DELTA"> <shadow type="math_number" id=")h09jEa*|/tE-FTbQA!N"> <field name="NUM">1</field> </shadow> </value> </block> </statement> </block> </statement> <next> <block type="comment" id="w!FjI4awA[-^G37I:x2%"> <field name="COMMENT">Es gibt 16 Rolläden</field> <next> <block type="controls_if" id="z)Qv5[`t*oGo2al*uFFk"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_compare" id="/.x_MbRw2wzE+FENHGp8"> <field name="OP">EQ</field> <value name="A"> <block type="variables_get" id="{N!cV*0TQ_`MEBsI2hM-"> <field name="VAR" id="~fXmm]cs9@kWJtnzgMdY">x</field> </block> </value> <value name="B"> <block type="math_number" id="[Au:6vJ{tXy@4q5aBIVa"> <field name="NUM">16</field> </block> </value> </block> </value> <statement name="DO0"> <block type="update" id="2ZL0]N-YqobY*YF{~$c]"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.EigeneDatenpunkte.Sonstiges.RollaedenAlleOffen</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id=",aGg4Z9yzCy)g9o+xdDg"> <field name="BOOL">TRUE</field> </block> </value> </block> </statement> <statement name="ELSE"> <block type="update" id="x-o8PD^M6am:uZ|QK31T"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.EigeneDatenpunkte.Sonstiges.RollaedenAlleOffen</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="n|2.mBsLs?fG*lE7GI,E"> <field name="BOOL">FALSE</field> </block> </value> </block> </statement> <next> <block type="controls_if" id="z4/A8YO-.%6oL$9zbKcB"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_compare" id="?]~7CyjJ-Lsev2j{]sI1"> <field name="OP">EQ</field> <value name="A"> <block type="variables_get" id="Aj-k2hm/e6[[Kjo,0f81"> <field name="VAR" id="%?VN@CIuprPL^)/Vq+J%">y</field> </block> </value> <value name="B"> <block type="math_number" id="Z6sowd8o7$)P9Cp.^G!a"> <field name="NUM">16</field> </block> </value> </block> </value> <statement name="DO0"> <block type="update" id="jGvA.U1n.bDC6XFO[S:H"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.EigeneDatenpunkte.Sonstiges.RollaedenAllezu</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="AOA)?J57OG++KqLlg[RA"> <field name="BOOL">TRUE</field> </block> </value> </block> </statement> <statement name="ELSE"> <block type="update" id="2@/ab#4({`k-4rsItRGq"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.EigeneDatenpunkte.Sonstiges.RollaedenAllezu</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="_Xf@]hjMx0/@)^nKd^nv"> <field name="BOOL">FALSE</field> </block> </value> </block> </statement> <next> <block type="controls_if" id="~.ZJ^B9{Z1`0]$Um19t{"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_compare" id="au69C``=={W5NkQ^fH0]"> <field name="OP">NEQ</field> <value name="A"> <block type="math_arithmetic" id="!9bYaQ7FUp$jHWmYWK.-"> <field name="OP">ADD</field> <value name="A"> <shadow type="math_number" id="H;R]%D2FN~A$*7uDq|CG"> <field name="NUM">1</field> </shadow> <block type="math_arithmetic" id="]8Q3DG-a9-H50~-:f^RD"> <field name="OP">ADD</field> <value name="A"> <shadow type="math_number" id=")S9s].H#-vXsJVE?}Fth"> <field name="NUM">1</field> </shadow> <block type="variables_get" id="T%Rhb9/M2(u6/]W.258^"> <field name="VAR" id="~fXmm]cs9@kWJtnzgMdY">x</field> </block> </value> <value name="B"> <shadow type="math_number" id="vYm,3L+S;O[ANr5*Wcx7"> <field name="NUM">1</field> </shadow> <block type="variables_get" id="e|DX2wD#3pFI1s(njeXV"> <field name="VAR" id="%?VN@CIuprPL^)/Vq+J%">y</field> </block> </value> </block> </value> <value name="B"> <shadow type="math_number" id="GT2Vph#g^;zyIT:P![d?"> <field name="NUM">1</field> </shadow> <block type="variables_get" id="L7H++Qn%,lO%^esTP}(M"> <field name="VAR" id="f-jw%YzIkQ|7M7aZ_5H$">z</field> </block> </value> </block> </value> <value name="B"> <block type="math_number" id="^U6fc=6XEZwWfy!KxH4$"> <field name="NUM">16</field> </block> </value> </block> </value> <statement name="DO0"> <block type="update" id="ky1m/(AF[k;GC$O/bh#x"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.EigeneDatenpunkte.Sonstiges.RollaedenGeschlossen</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="math_number" id="{OaI.w;Zv!Su~j51IO#{"> <field name="NUM">999</field> </block> </value> <next> <block type="update" id="F[%1ADKG2C(uU/H%W064"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.EigeneDatenpunkte.Sonstiges.RollaedenHalbOffen</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="math_number" id="LsmNJhcc*}ty@6;lJGM5"> <field name="NUM">999</field> </block> </value> <next> <block type="update" id="b,ug,L?Lu#8nrLeUoS~4"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.EigeneDatenpunkte.Sonstiges.RollaedenOffen</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="math_number" id="2P1`uX=8;vI(s(;hs`Nv"> <field name="NUM">999</field> </block> </value> <next> <block type="telegram" id="/QJu7UV|4Hzz!oyb%2c{"> <field name="INSTANCE"></field> <field name="LOG"></field> <field name="SILENT">FALSE</field> <field name="PARSEMODE">default</field> <field name="ESCAPING">FALSE</field> <field name="DISABLE_WEB_PAGE_PREVIEW">FALSE</field> <value name="MESSAGE"> <shadow type="text" id="ly)%rJ=Db$J,OdGuYbS["> <field name="TEXT">Rolladen Zähl Skript: Anzahl gezählter Rolläden stimmt nicht!</field> </shadow> </value> </block> </next> </block> </next> </block> </next> </block> </statement> <statement name="ELSE"> <block type="update" id="NXXhKjEE=fN[VGr/ctC|"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.EigeneDatenpunkte.Sonstiges.RollaedenGeschlossen</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="variables_get" id="vDxGi}KzOj+cclRRfe3Y"> <field name="VAR" id="%?VN@CIuprPL^)/Vq+J%">y</field> </block> </value> <next> <block type="update" id="cg`{=FqpTT2rPj{+e%/E"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.EigeneDatenpunkte.Sonstiges.RollaedenHalbOffen</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="variables_get" id="qmIb*GO8eDE$j$!5-y7V"> <field name="VAR" id="f-jw%YzIkQ|7M7aZ_5H$">z</field> </block> </value> <next> <block type="update" id="YTE_ksjr3%IHH~Ih_}i="> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.EigeneDatenpunkte.Sonstiges.RollaedenOffen</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="variables_get" id="%[W0C*FjDFA*0_xw$!o$"> <field name="VAR" id="~fXmm]cs9@kWJtnzgMdY">x</field> </block> </value> </block> </next> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </statement> </block> </xml>
-
@mading Wenn man seiner Buchführung traut, kann man das natürlich auch in einem kleineren kompakteren Skript ausführen.
Man muss bei jeder Änderung nur den Gesamt-Zähler für den vorherigen Zustand der jeweils veränderten Rollade um 1 vermindern, und den Gesamt-Zähler für den neuen Zustand der Rollade um 1 erhöhen.
Dein Script hat den Vorteil, dass das Bild komplett neu durch Abfrage der entsprechenden Datenpukte aufgebaut wird, und man nicht nur aufgrund der Änderung EINES Zustandes die neuen Zustandswerte ermittelt.
Der Nachteil ist, dass man eben alle Datenpunkte durchgehen muss, was ggfs eine gewisse Last bedeutet...
Dein Script geht in meinen Augen etwas übervorsichtig an die Sache heran ...
-
@martinp hey, danke für das Feedback und guter Punkt, stimmt!
-
@mading Wobei ich auch nachlesen müsste, wie man herausfinden kann, WELCHES der Elemente aus der Liste den Trigger ausgelöst hat.
Ich bin aber absolut sicher, dass es da etwas gibt ....
Ich automatisiere mein Haus aktuell noch sehr punktuell, da gibt es noch nicht viel "gleiches" was ich in solcher Art Blocklys verarbeiten müsste ...
Meine Rolladen werden noch von alten Billig-Schaltern (DUOMATIC 50) mit winzigen Tasten und Displays gesteuert ... nicht einmal ein Jahreskalender ...
-
@martinp sagte in Fertiges Blockly zum Zählen der offenen Rolläden:
wie man herausfinden kann, WELCHES der Elemente aus der Liste den Trigger ausgelöst hat.
Du kannst die auslösende Objekt-ID einfach mit dem entsprechenden Baustein aus dem Trigger-Bereich rausbekommen:
-
@martinp sagte in Fertiges Blockly zum Zählen der offenen Rolläden:
Der Nachteil ist, dass man eben alle Datenpunkte durchgehen muss, was ggfs eine gewisse Last bedeutet...
Beim nochmal drüber nachdenken: Du musst aber dennoch auf alle Rolläden spezifisch triggern, da du ja nicht weisst, welcher sich ändert. Ob sich da viel an der Last verändert (mein Trigger oder auf alle spezifisch triggern) vermag ich nicht zu sagen.
-
@mading said in Fertiges Blockly zum Zählen der offenen Rolläden:
@martinp sagte in Fertiges Blockly zum Zählen der offenen Rolläden:
Der Nachteil ist, dass man eben alle Datenpunkte durchgehen muss, was ggfs eine gewisse Last bedeutet...
Beim nochmal drüber nachdenken: Du musst aber dennoch auf alle Rolläden spezifisch triggern, da du ja nicht weisst, welcher sich ändert. Ob sich da viel an der Last verändert (mein Trigger oder auf alle spezifisch triggern) vermag ich nicht zu sagen.
Siehe den Post von @haus-automatisierung vor Deinem.
Im Prinzip sollte das eine akademische Diskussion sein .... so oft werden die Rolladen nicht fahren. Optimieren wäre sinnvoll, wenn die Ereignisse von einer ähnlichen Sammlung von Datenpunkten nur so hereinprasseln ...
Nachtrag: Nichtsdestotrotz sollte man auffällige Zeitfresser in Skripten vermeiden. Die Skripte werden streng sequentiell nacheinander ausgeführt. (kein Multitasking). Solange ein Skript bearbeitet wird, müssen alle anderen Skripte auf ihre Bearbeitung warten ...
Meist sind aber die Skripte nicht so Zeitkritisch, dass ein paar Millisekunden Verzug ein Problem darstellen ...
-
@martinp Es ist immer spannend, wenn einzelne Scripts hier im Detail optimiert werden sollen, während etliche Adapter alle paar Sekunden etwas tun. Wenn man wirklich so streng ist, müsste man also eigentlich Code-Reviews von allen Adaptern machen, bevor man diese selbst einsetzt.
Überleg mal, wie groß alleine der Performance-Hebel ist, wenn man nicht mehr "Alle States beim Start abonnieren" nutzen würde (im JavaScript-Adapter). Da spart man ohne Ende Ressourcen, aber kann halt vieles in Blockly nicht mehr nutzen (sondern müsste auf JavaScript ausweichen).
In diesem Fall ist es aus meiner Sicht total egal ob die paar Zeilen da öfter durchlaufen werden als nötig. Da kann man sich beruhigt neuen Themen widmen.
-
@haus-automatisierung Schrieb ich ja, "akademische Diskussion"...
Würde aber den Code auch sicher übersichtlicher machen, wenn man da gezielt nur die Deltas bearbeitet...