NEWS
Manchmal Endlosschleife. Wie kann das sein (mit Code)?
-
Kann mir jemand erklären, wieso es bei diesem Code
Zu einer Endlosschleife mit diesem Log kommen kann?
2021-10-25 10:31:06.712 - warn: javascript.0 (750) script.js.common.Heizung_NG: Blasen: start 2021-10-25 10:31:06.713 - warn: javascript.0 (750) script.js.common.Heizung_NG: Start Durchlauf: 3 2021-10-25 10:31:06.950 - warn: javascript.0 (750) script.js.common.Heizung_NG: Blasen: start 2021-10-25 10:31:06.951 - warn: javascript.0 (750) script.js.common.Heizung_NG: Start Durchlauf: 3 2021-10-25 10:31:07.301 - warn: javascript.0 (750) script.js.common.Heizung_NG: Blasen: start 2021-10-25 10:31:07.302 - warn: javascript.0 (750) script.js.common.Heizung_NG: Start Durchlauf: 3 2021-10-25 10:31:07.651 - warn: javascript.0 (750) script.js.common.Heizung_NG: Blasen: start 2021-10-25 10:31:07.652 - warn: javascript.0 (750) script.js.common.Heizung_NG: Start Durchlauf: 3 2021-10-25 10:31:08.007 - warn: javascript.0 (750) script.js.common.Heizung_NG: Blasen: start 2021-10-25 10:31:08.008 - warn: javascript.0 (750) script.js.common.Heizung_NG: Start Durchlauf: 3 2021-10-25 10:31:08.358 - warn: javascript.0 (750) script.js.common.Heizung_NG: Blasen: start 2021-10-25 10:31:08.359 - warn: javascript.0 (750) script.js.common.Heizung_NG: Start Durchlauf: 3 2021-10-25 10:31:08.708 - warn: javascript.0 (750) script.js.common.Heizung_NG: Blasen: start 2021-10-25 10:31:08.709 - warn: javascript.0 (750) script.js.common.Heizung_NG: Start Durchlauf: 3 2021-10-25 10:31:09.058 - warn: javascript.0 (750) script.js.common.Heizung_NG: Blasen: start 2021-10-25 10:31:09.059 - warn: javascript.0 (750) script.js.common.Heizung_NG: Start Durchlauf: 3 2021-10-25 10:31:09.408 - warn: javascript.0 (750) script.js.common.Heizung_NG: Blasen: start 2021-10-25 10:31:09.409 - warn: javascript.0 (750) script.js.common.Heizung_NG: Start Durchlauf: 3 ...
Wie man sieht ist "Durchlauf" doch 3 und die Schleife "SendeHeizungAn" müsste damit doch unterbrochen werden (was sie ja auch meistens wird, nur manchmal...).
Für mich auch irgendwie seltsam, dass jeder Durchlauf recht genau alle 350ms passiert, aber der 2. bereits nach 200ms.
Das ist für einen Computer doch schon eine ganz schöne Abweichung, oder?
Oder kann diese Abweichung durchs Log sein, da dies im Verhältnis sehr träge ist? -
@padrino ich denke mal, 350 ms sind einfach zu wenig. Aber da wir ja auch nur einen kleinen Teil des Scripts sehen kann ich nur spekulieren...
Muss das denn wirklich so schnell sein? Probier mal mit z.B. 2 Sekunden
-
@padrino sagte: Schleife "SendeHeizungAn" müsste damit doch unterbrochen werden (was sie ja auch meistens wird, nur manchmal...).
Dann laufen mehrere Intervalle parallel, weil offenbar ein weiteres "stop Intervall" an anderer Stelle fehlt.
-
@ahnungsbefreit
Nun, ich denke, der Rest des Skripts ist so Kraut und Rüben...
Aber man sieht doch, wo es schleift, oder? Durch den Debug Code kann nicht sonst wo das Problem liegen, oder?Und nein, so schnell müssen muss es nicht.
Ich werde es mal langsamer versuchen, mal schauen.
Aber da es eh selten passiert, kann es dauern, bis ich zu einem Ergebnis komme. -
@padrino sagte: der Rest des Skripts ist so Kraut und Rüben...
Was wohl der Grund dafür ist, dass mehrere Intervalle parallel laufen, die nicht mehr gestoppt werden können.
-
@paul53
Ja, es gibt schon noch andere Intervalle, wie z.B. "SendeHeizungAus".
Aber "SendeHeizungAn" gibt es nur an der einen Stelle und wird dort meiner Meinung nach auch terminiert (in 2 Fällen). -
@paul53 sagte in Manchmal Endlosschleife. Wie kann das sein (mit Code)?:
@padrino sagte: der Rest des Skripts ist so Kraut und Rüben...
Was wohl der Grund dafür ist, dass mehrere Intervalle parallel laufen, die nicht mehr gestoppt werden können.
So habe ich das jetzt nicht gemeint.
-
@paul53
Ok, hier das ganze Skript (bitte gnädig mit mir sein =)), ich lerne noch und versuche immer weiter (mich) zu verbessern...<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="QqcV%p0(#2Rh:vc%kEr5">Durchlauf</variable> <variable id="-cSH92g]DI-(Ea|-h,-1">Temperatur_Sicherung</variable> <variable id="VM630S3@k/?a5/ZjyNaV">Hysterese</variable> <variable type="timeout" id="HauptCode">HauptCode</variable> <variable type="interval" id="SendeHeizungAus">SendeHeizungAus</variable> <variable type="interval" id="SendeHeizungAn">SendeHeizungAn</variable> <variable id="-2G8WI+sSU.C6]0+B7(S">Durchlauf_Backup</variable> </variables> <block type="on_ext" id="h[t=r`:KGU5|-ZBW)imh" x="-237" y="-101"> <mutation xmlns="http://www.w3.org/1999/xhtml" items="2"></mutation> <field name="CONDITION">ne</field> <field name="ACK_CONDITION"></field> <value name="OID0"> <shadow xmlns="http://www.w3.org/1999/xhtml" id="%LfKf[YxNg0nM*c%n=hm" type="field_oid"> <field name="oid">default</field> </shadow> <block type="field_oid" id="0AU/r0iZYcDNVv=84ic*"> <field name="oid">rflink.0.channels.Oregon_TempHygro_1.TEMP</field> </block> </value> <value name="OID1"> <shadow xmlns="http://www.w3.org/1999/xhtml" id="h45CZw)VNw_BI;IGG~0D" type="field_oid"> <field name="oid">default</field> </shadow> <block type="field_oid" id="ushAYDyi0c]jIaKLL|ZK"> <field name="oid">0_userdata.0.Nachtspeicher_WZ.N8S_Sollwert</field> </block> </value> <statement name="STATEMENT"> <block type="variables_set" id="]H_1W!:ie4UnpaWtHbO,"> <field name="VAR" id="QqcV%p0(#2Rh:vc%kEr5">Durchlauf</field> <value name="VALUE"> <block type="math_number" id="oEy2jM~:n%JR!(n5X[}v"> <field name="NUM">1</field> </block> </value> <next> <block type="controls_if" id=";vPT*_*v!ZzgMmQv[05U"> <value name="IF0"> <block type="logic_compare" id="T8%@/jeZYUammJT@s($x"> <field name="OP">EQ</field> <value name="A"> <block type="on_source" id="QX,Y1Zd^P4TaVvv2vS-s"> <field name="ATTR">state.val</field> </block> </value> <value name="B"> <block type="math_number" id="?/3=^%zidCmzvr73[?Gu"> <field name="NUM">100</field> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="%k=6YCK}aaz}E9d{QhE["> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">alexa2.0.Echo-Devices.XXX.Commands.announcement</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="text" id="{KW2%REEIMI%QZ[-X/aj"> <field name="TEXT">,</field> </block> </value> <next> <block type="update" id="Ia_C@l7T]ie74W~i(%L?"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="true"></mutation> <field name="OID">0_userdata.0.Nachtspeicher_WZ.N8S_Sollwert</field> <field name="WITH_DELAY">TRUE</field> <field name="DELAY_MS">5000</field> <field name="UNIT">ms</field> <field name="CLEAR_RUNNING">FALSE</field> <value name="VALUE"> <block type="variables_get" id="$x+7W:,]UN;lFEg9e^XZ"> <field name="VAR" id="-cSH92g]DI-(Ea|-h,-1">Temperatur_Sicherung</field> </block> </value> </block> </next> </block> </statement> <next> <block type="controls_if" id=";#n4*Fm0wZYW]lrr])PL"> <value name="IF0"> <block type="logic_compare" id=",]#=Y:|9`MYv0#E(YR^8"> <field name="OP">EQ</field> <value name="A"> <block type="on_source" id="Ps)/}t06Dh.N9+HD)de["> <field name="ATTR">state.val</field> </block> </value> <value name="B"> <block type="math_number" id="(AGE7r2,ZySH2`rD.937"> <field name="NUM">0</field> </block> </value> </block> </value> <statement name="DO0"> <block type="variables_set" id="x.W*}A6Y3ln3Sg,^3D$w"> <field name="VAR" id="-cSH92g]DI-(Ea|-h,-1">Temperatur_Sicherung</field> <value name="VALUE"> <block type="on_source" id="?P#_*9{DcU5l`E-AKm9p"> <field name="ATTR">oldState.val</field> </block> </value> </block> </statement> <next> <block type="controls_if" id="-I2Fygjs}n)8;c}SM{M$"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_compare" id="Gd7@_ocz?zy8b@w@7v/G"> <field name="OP">EQ</field> <value name="A"> <block type="on_source" id="f-%C_m1=E!+mS!WU)^T-"> <field name="ATTR">id</field> </block> </value> <value name="B"> <block type="text" id="OU7UP+2qkG|t`(ri=b=D"> <field name="TEXT">rflink.0.channels.Oregon_TempHygro_1.TEMP</field> </block> </value> </block> </value> <statement name="DO0"> <block type="variables_set" id="3*;v6E}xM#l,oSdOQ-R4"> <field name="VAR" id="VM630S3@k/?a5/ZjyNaV">Hysterese</field> <value name="VALUE"> <block type="math_number" id="R.i$-G9Q,,P]kOKj-AP/"> <field name="NUM">0.2</field> </block> </value> </block> </statement> <statement name="ELSE"> <block type="variables_set" id="1bSVCwd6P!tu[7cw8N*c"> <field name="VAR" id="VM630S3@k/?a5/ZjyNaV">Hysterese</field> <value name="VALUE"> <block type="math_number" id="n`|:CiSfyW-WW7n@1hl6"> <field name="NUM">0</field> </block> </value> <next> <block type="controls_if" id="MzIO!Q^=nSD}%g?kKWDa"> <value name="IF0"> <block type="logic_compare" id="P{#ZgHJUNPWEvn2v+/Jt"> <field name="OP">EQ</field> <value name="A"> <block type="on_source" id="=|{/_oa}ENm.nO0.KvOY"> <field name="ATTR">oldState.val</field> </block> </value> <value name="B"> <block type="math_number" id="pkAFj(ibp*.J5-GumnwK"> <field name="NUM">0</field> </block> </value> </block> </value> <statement name="DO0"> <block type="controls_if" id=")}5_ZpBITBIPSh~$en2M"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_compare" id="3GC}oQlu):8o=6/bkeY1"> <field name="OP">LTE</field> <value name="A"> <block type="on_source" id="xGFLKE,~)M#b,!RKSOs!"> <field name="ATTR">state.val</field> </block> </value> <value name="B"> <block type="get_value" id="bD^ABL`Vmp!8sxc;Lfwv"> <field name="ATTR">val</field> <field name="OID">rflink.0.channels.Oregon_TempHygro_1.TEMP</field> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="+0o*%]Hy|}Ay(BqnG+I*"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">alexa2.0.Echo-Devices.XXX.Commands.speak</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="text_join" id="o|UdKyhWm0nPcoka@_B}"> <mutation items="3"></mutation> <value name="ADD0"> <block type="text" id="=.k42I=r+4iz/1,5q*bc"> <field name="TEXT">Die Temperatur ist, mit </field> </block> </value> <value name="ADD1"> <block type="get_value" id="Wl;.H^wmX@nUxp#EchWb"> <field name="ATTR">val</field> <field name="OID">rflink.0.channels.Oregon_TempHygro_1.TEMP</field> </block> </value> <value name="ADD2"> <block type="text" id="^q9!Z+N}_j!EAsfL)[KU"> <field name="TEXT"> Grad, bereits erreicht.</field> </block> </value> </block> </value> </block> </statement> <statement name="ELSE"> <block type="control" id="rQt(N%IHMX|{KIijsl(5"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">alexa2.0.Echo-Devices.XXX.Commands.speak</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="text_join" id="dyLdmos*%|`ZlyxPk*g#"> <mutation items="3"></mutation> <value name="ADD0"> <block type="text" id="!#|6p,?e^STa1I}+[M!!"> <field name="TEXT">Heizung auf </field> </block> </value> <value name="ADD1"> <block type="get_value" id="TjMENZpQ!qyAaD(`vgWg"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.Nachtspeicher_WZ.N8S_Sollwert</field> </block> </value> <value name="ADD2"> <block type="text" id="6=7`DZ-~Bw4.x]4s,ZbY"> <field name="TEXT"> Grad.</field> </block> </value> </block> </value> </block> </statement> </block> </statement> </block> </next> </block> </statement> <next> <block type="timeouts_settimeout" id="]mpH@E.+w)f1yO:U``c2"> <field name="NAME">HauptCode</field> <field name="DELAY">150</field> <field name="UNIT">ms</field> <statement name="STATEMENT"> <block type="controls_if" id="t5xC*4epAK^BDx)5jQ%U"> <value name="IF0"> <block type="logic_operation" id="9KEQVY^,=U#_8/!HU3)K" inline="false"> <field name="OP">OR</field> <value name="A"> <block type="logic_operation" id="M/ebV^m/gX*5/4Y{SH+#" inline="false"> <field name="OP">AND</field> <value name="A"> <block type="logic_operation" id="R+NJ.)nY**6lOqK@.QT*" inline="false"> <field name="OP">OR</field> <value name="A"> <block type="logic_compare" id="5x86%LE1p(RGQ5(3N?se"> <field name="OP">GTE</field> <value name="A"> <block type="get_value" id="Q@u3F!MZq_P9nwdpsT4g"> <field name="ATTR">val</field> <field name="OID">rflink.0.channels.Oregon_TempHygro_1.TEMP</field> </block> </value> <value name="B"> <block type="get_value" id="!wwzTzni)b72^j!1wZ`U"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.Nachtspeicher_WZ.N8S_Sollwert</field> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="Exm]u?{duQm/lnmu^.rA"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="#WFM]T?}J_l,H9$:Rphc"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.Nachtspeicher_WZ.N8S_Sollwert</field> </block> </value> <value name="B"> <block type="math_number" id="Tr^l=/7HF-R000te`/Hv"> <field name="NUM">0</field> </block> </value> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="h$E$t_fnJ2$Z9R{1Rm9D"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="mi;w;g6y,nj2-,kL.sC="> <field name="ATTR">val</field> <field name="OID">0_userdata.0.Nachtspeicher_WZ.N8S_Gebläse</field> </block> </value> <value name="B"> <block type="logic_boolean" id="w,M,f_F${:h|U[m+r~N!"> <field name="BOOL">TRUE</field> </block> </value> </block> </value> </block> </value> <value name="B"> <block type="logic_operation" id="b[kZ6Fi55E(:~Qh{;q$~"> <field name="OP">AND</field> <value name="A"> <block type="logic_operation" id="L0`_LiSZ+[nV+3k%n|zx" inline="false"> <field name="OP">AND</field> <value name="A"> <block type="logic_operation" id="/_!Lz-ofNT1YK`Zv@k2O" inline="false"> <field name="OP">AND</field> <value name="A"> <block type="logic_compare" id="7sgz(tJ8`:rk!1eVUo{."> <field name="OP">EQ</field> <value name="A"> <block type="on_source" id="75:^U3)f2}mg1.$Yg,.*"> <field name="ATTR">id</field> </block> </value> <value name="B"> <block type="text" id="OzOw(2LB/%j!Kg`O5st:"> <field name="TEXT">rflink.0.channels.Oregon_TempHygro_1.TEMP</field> </block> </value> </block> </value> <value name="B"> <block type="logic_operation" id="zr|}R!Ol5J/3CAKcPVc," inline="false"> <field name="OP">AND</field> <value name="A"> <block type="logic_compare" id="PVn[8B!MB(J=~w@a~5nR" inline="false"> <field name="OP">GT</field> <value name="A"> <block type="on_source" id="NiN{`?!9]+C/%7*ku/)!"> <field name="ATTR">state.val</field> </block> </value> <value name="B"> <block type="on_source" id="uR+C~FK##Q8ohIQ5e+A1"> <field name="ATTR">oldState.val</field> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="Z_7^5(hayww=2kGG$2NS"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="KLAWInhr_MNR7ql?*8d0"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.Nachtspeicher_WZ.N8S_Gebläse</field> </block> </value> <value name="B"> <block type="logic_boolean" id="R0qp@rDT_f/cTZVMKTd/"> <field name="BOOL">FALSE</field> </block> </value> </block> </value> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="6|xF}zSUm{eGjj.2HnI3"> <field name="OP">GT</field> <value name="A"> <block type="get_value" id="1GpjLP=Zuykd7/rf6|=!"> <field name="ATTR">val</field> <field name="OID">rflink.0.channels.Oregon_TempHygro_1.TEMP</field> </block> </value> <value name="B"> <block type="get_value" id="k=[FJ7`Fn4*kSl:U*,jl"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.Nachtspeicher_WZ.N8S_Sollwert</field> </block> </value> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="E$$hYkVb-(L*g|loKHk9"> <field name="OP">GT</field> <value name="A"> <block type="get_value" id="tHO7Bymb={Rs6T)u?OSU"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.Nachtspeicher_WZ.N8S_Sollwert</field> </block> </value> <value name="B"> <block type="math_number" id="6Fd8*2T:C_.EIO(`la;k"> <field name="NUM">0</field> </block> </value> </block> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="timeouts_setinterval" id="{F~lc_KU5[3*v@zNAgio"> <field name="NAME">SendeHeizungAus</field> <field name="INTERVAL">500</field> <field name="UNIT">ms</field> <statement name="STATEMENT"> <block type="controls_if" id="ylhL~C|Mqz.#pungG`WP"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_compare" id="8vVexu:2!$!qf5V*i`KI"> <field name="OP">LTE</field> <value name="A"> <block type="variables_get" id="PF/pkhv0{]I+5-[XiUON"> <field name="VAR" id="QqcV%p0(#2Rh:vc%kEr5">Durchlauf</field> </block> </value> <value name="B"> <block type="math_number" id="K2%B%np4#`q.qx?dt4R{"> <field name="NUM">2</field> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="@lP~x/(P.Wc]|2}jv2mI"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">broadlink2.0.RMPROPLUS-42-fb-44.L.HeizungAusRF</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id=",:9VW`G|x3xp)J;|Ea)A"> <field name="BOOL">TRUE</field> </block> </value> <next> <block type="debug" id="iVYA9`l^+KEMn6V}8Y.)"> <field name="Severity">warn</field> <value name="TEXT"> <shadow type="text" id="81H+$3NDM@sfV7vY_q*p"> <field name="TEXT">Sende "stopp"</field> </shadow> </value> <next> <block type="variables_set" id="-4]Cj[BbrCGFb3wt1d2r"> <field name="VAR" id="-2G8WI+sSU.C6]0+B7(S">Durchlauf_Backup</field> <value name="VALUE"> <block type="variables_get" id="!edq2XE30C4En!}al|QJ"> <field name="VAR" id="QqcV%p0(#2Rh:vc%kEr5">Durchlauf</field> </block> </value> <next> <block type="variables_set" id="6+[VI*`7I%Z9pZJCin_f"> <field name="VAR" id="QqcV%p0(#2Rh:vc%kEr5">Durchlauf</field> <value name="VALUE"> <block type="math_arithmetic" id="2V)7aC_UUo5u7b/,vP6c"> <field name="OP">ADD</field> <value name="A"> <shadow xmlns="http://www.w3.org/1999/xhtml" id="}4k#4a5ReRCw.L-#;{MI" type="math_number"> <field name="NUM">1</field> </shadow> <block type="variables_get" id="k0*oT6Rc/u~N*zl}OPWI"> <field name="VAR" id="QqcV%p0(#2Rh:vc%kEr5">Durchlauf</field> </block> </value> <value name="B"> <shadow type="math_number" id="{v5EBajL~P-k}rm@ho/F"> <field name="NUM">1</field> </shadow> </value> </block> </value> </block> </next> </block> </next> </block> </next> </block> </statement> <statement name="ELSE"> <block type="variables_set" id="PFjUs/yOtGsUaOGaV|_("> <field name="VAR" id="-2G8WI+sSU.C6]0+B7(S">Durchlauf_Backup</field> <value name="VALUE"> <block type="math_arithmetic" id="2w:W*,6bWwO:9aL4Gs}*"> <field name="OP">ADD</field> <value name="A"> <shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number"> <field name="NUM">1</field> </shadow> <block type="variables_get" id="3;aY$28P-:#eHHRI8_H|"> <field name="VAR" id="-2G8WI+sSU.C6]0+B7(S">Durchlauf_Backup</field> </block> </value> <value name="B"> <shadow type="math_number" id="zN}{5wV##GniElj32]Ze"> <field name="NUM">1</field> </shadow> </value> </block> </value> <next> <block type="update" id="eH.|OBdW|.pI$j)}EM;e"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.Nachtspeicher_WZ.N8S_Gebläse</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="r!oa5z8xW5KAdiu/Hal:"> <field name="BOOL">FALSE</field> </block> </value> <next> <block type="debug" id="C@]SULoZSp6uyUCj4$,D"> <field name="Severity">warn</field> <value name="TEXT"> <shadow type="text" id="+))hOIFdqYPXrNxp#.:Y"> <field name="TEXT">Blasen: stopp</field> </shadow> </value> <next> <block type="debug" id="0t6V=)P=URY.cSe-]54I"> <field name="Severity">warn</field> <value name="TEXT"> <shadow type="text" id="Ssin.FzA]0[v/0-fhRf$"> <field name="TEXT"></field> </shadow> <block type="text_join" id="Xp!g}UaNp5^kW7m_}W!a"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="F$Pj{[(W+XZHcq`R_uh|"> <field name="TEXT">Stopp Durchlauf: </field> </block> </value> <value name="ADD1"> <block type="variables_get" id="}?1eqRU2/13,~4.s=*Dp"> <field name="VAR" id="QqcV%p0(#2Rh:vc%kEr5">Durchlauf</field> </block> </value> </block> </value> <next> <block type="timeouts_clearinterval" id="w$NmGQI16lK3vZZ]o*gt"> <field name="NAME">SendeHeizungAus</field> <next> <block type="controls_if" id="%VqB//=kUvYKLjW*2/w8"> <value name="IF0"> <block type="logic_compare" id="gR@BIr~CLqXViSe)`Zz2"> <field name="OP">GT</field> <value name="A"> <block type="variables_get" id="3Uvxk#6e3eJC%H$2M0iI"> <field name="VAR" id="-2G8WI+sSU.C6]0+B7(S">Durchlauf_Backup</field> </block> </value> <value name="B"> <block type="variables_get" id="$GzH}-C}]Dy$3I+-K!dM"> <field name="VAR" id="QqcV%p0(#2Rh:vc%kEr5">Durchlauf</field> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="H^p|k2Ff9m;]*.UEfoF5"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">alexa2.0.Echo-Devices.c4cc7739a8a74f86877c930e49b1126b.Commands.announcement</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="text" id="^+[pw#Hk~HFngv(?Oy)B"> <field name="TEXT">Achtung, die Heizung läuft amok!</field> </block> </value> <next> <block type="control" id="xMEw#qrkIMg%hmHm9.#O"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">alexa2.0.Contacts.AF3WWDPXIX7YHTC57F6G77L62NHQ.textMessage</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="text_join" id="rNG?B^c3#bVh*_83T$@%"> <mutation items="2"></mutation> <value name="ADD0"> <block type="time_get" id="#(fnSU#5R,G)$`[_4O[x"> <mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation> <field name="OPTION">hh:mm</field> </block> </value> <value name="ADD1"> <block type="text" id="*q9v9|Q;!4[p^9pz-dvk"> <field name="TEXT">: Achtung, die Heizung läuft amok!</field> </block> </value> </block> </value> <next> <block type="debug" id="8Fh8Sk9Vb,}]w|8_u/tW"> <field name="Severity">error</field> <value name="TEXT"> <shadow type="text" id="B+TkQ-8~-A?tA)[l}}v/"> <field name="TEXT"></field> </shadow> <block type="text" id="oRozgK$MOx0#n]LV3`[="> <field name="TEXT">Achtung, die Heizung läuft amok!</field> </block> </value> <next> <block type="timeouts_clearinterval" id="Dl16?:eG6r-tRPTM8hK3"> <field name="NAME">SendeHeizungAus</field> </block> </next> </block> </next> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </statement> </block> </statement> </block> </statement> <next> <block type="controls_if" id="o(l3{1OnvqB?S}jb-{Da"> <value name="IF0"> <block type="logic_operation" id="B(Uu-PGgEa$,5u]8u4L$" inline="false"> <field name="OP">AND</field> <value name="A"> <block type="logic_compare" id="KmV,Tp;[m~nT*0Y}67rj" inline="false"> <field name="OP">LT</field> <value name="A"> <block type="get_value" id="t)sWjtNQyLx1AvnvT`=Y"> <field name="ATTR">val</field> <field name="OID">rflink.0.channels.Oregon_TempHygro_1.TEMP</field> </block> </value> <value name="B"> <block type="math_rndfixed" id="m|4:10dDK@a$[8(/BV{O"> <field name="n">1</field> <value name="x"> <shadow type="math_number" id="ybgBy0j8@(5%r%PIbIeg"> <field name="NUM">3.1234</field> </shadow> <block type="math_arithmetic" id="_i=E;Xy;b`e`Hlnh.JRA"> <field name="OP">MINUS</field> <value name="A"> <shadow xmlns="http://www.w3.org/1999/xhtml" id="rZ7cy{-lhMibIFkd=ZG(" type="math_number"> <field name="NUM">1</field> </shadow> <block type="get_value" id="@]A3Y+QG(H5*m%@vIT7T"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.Nachtspeicher_WZ.N8S_Sollwert</field> </block> </value> <value name="B"> <shadow xmlns="http://www.w3.org/1999/xhtml" id="`OiT2Do4-YPvmejIA]^H" type="math_number"> <field name="NUM">1</field> </shadow> <block type="variables_get" id="0GC)98K!yW~@l1WnyYfi"> <field name="VAR" id="VM630S3@k/?a5/ZjyNaV">Hysterese</field> </block> </value> </block> </value> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="bC7T:B#lL}#v#=hYd#Hc"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="vg(LUR9*We]ouz;RrN[/"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.Nachtspeicher_WZ.N8S_Gebläse</field> </block> </value> <value name="B"> <block type="logic_boolean" id="wts~Zv+5({fIH*b)i];d"> <field name="BOOL">FALSE</field> </block> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="timeouts_setinterval" id="KGMGf:A4nkKy--Lm_hRx"> <field name="NAME">SendeHeizungAn</field> <field name="INTERVAL">500</field> <field name="UNIT">ms</field> <statement name="STATEMENT"> <block type="controls_if" id="7iMnhc4}tL!p97jI}2=:"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_compare" id="Ou-h6KX`t(_m)w~Q2bRF"> <field name="OP">LTE</field> <value name="A"> <block type="variables_get" id="u,)Jq7u;KEK/lfH/BEe}"> <field name="VAR" id="QqcV%p0(#2Rh:vc%kEr5">Durchlauf</field> </block> </value> <value name="B"> <block type="math_number" id="JU`O+vb:2{}RV~{.+t8X"> <field name="NUM">2</field> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="b2uw8S2L0~kZ)@x}S`~y"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">broadlink2.0.RMPROPLUS-42-fb-44.L.HeizungAnRF</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="7!YQqL*E,M3VumGzWd8j"> <field name="BOOL">TRUE</field> </block> </value> <next> <block type="debug" id="rK/}lAUse3G.+[qffWzI"> <field name="Severity">warn</field> <value name="TEXT"> <shadow type="text" id="`4jwkR:b]qfqs*fTsQgh"> <field name="TEXT">Sende "start"</field> </shadow> </value> <next> <block type="variables_set" id=";)/UY3WxG4P5mEtwmTE["> <field name="VAR" id="QqcV%p0(#2Rh:vc%kEr5">Durchlauf</field> <value name="VALUE"> <block type="math_arithmetic" id="G7`b1X?kB#8gR4)3bzR2"> <field name="OP">ADD</field> <value name="A"> <shadow xmlns="http://www.w3.org/1999/xhtml" id="}4k#4a5ReRCw.L-#;{MI" type="math_number"> <field name="NUM">1</field> </shadow> <block type="variables_get" id="w*vd}^INu-ky)Ul3P-^W"> <field name="VAR" id="QqcV%p0(#2Rh:vc%kEr5">Durchlauf</field> </block> </value> <value name="B"> <shadow type="math_number" id="bX|_;^hR7N`}:H1a*n[:"> <field name="NUM">1</field> </shadow> </value> </block> </value> </block> </next> </block> </next> </block> </statement> <statement name="ELSE"> <block type="update" id="0(~RDO:ns-t^;u89#VbI"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.Nachtspeicher_WZ.N8S_Gebläse</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="xOU2c]pcwn#]g)=/JIVe"> <field name="BOOL">TRUE</field> </block> </value> <next> <block type="debug" id="s:1`]aLRI-IF]MimLi}="> <field name="Severity">warn</field> <value name="TEXT"> <shadow type="text" id="Hc,=%!#e^Bl,fesZxBUs"> <field name="TEXT">Blasen: start</field> </shadow> </value> <next> <block type="debug" id="zPBhU:7l~A)r)R].zSMi"> <field name="Severity">warn</field> <value name="TEXT"> <shadow type="text" id="U^gu01#Qx+}ld];K`|g/"> <field name="TEXT"></field> </shadow> <block type="text_join" id="/=+JI[=}N=7=IU8u.oVN"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="7)JsiIRA7pc97DOGjt{z"> <field name="TEXT">Start Durchlauf: </field> </block> </value> <value name="ADD1"> <block type="variables_get" id="v_gdZoDObUI};.BytgSB"> <field name="VAR" id="QqcV%p0(#2Rh:vc%kEr5">Durchlauf</field> </block> </value> </block> </value> <next> <block type="timeouts_clearinterval" id="IqzmTP2`/z}*(gg0WFfP"> <field name="NAME">SendeHeizungAn</field> </block> </next> </block> </next> </block> </next> </block> </statement> </block> </statement> </block> </statement> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </next> </block> </statement> </block> </xml>
-
@padrino
Ich habe mal nur um Änderungen ergänzt, die verhindern, dass Timer mehrfach gestartet werden können.
-
@paul53
Danke, werde ich mal anschauen und probieren...
Das mit der Variablen vom Intervallnamen ist ja mal interessant.
Das geht? -
@padrino sagte in Manchmal Endlosschleife. Wie kann das sein (mit Code)?:
Das geht?
Ja, das geht. Letztendlich erzeugt der Block
einen Aufruf bei dem der Code innerhalb des Intervalls ausgelagert wird. Dieser Aufruf gibt ein sogenanntes "Handle" zurück - eine Möglichkeit das Intervall zu beenden / zu überwachen. Intern speichert dieser Block das Handle in der Variablen SendeHeizungAn, welche dieser Block
dann nutzt. Blockly isoliert dieses allerdings vom Nutzer, so das um mit der Variable zu arbeiten eine Variable mit genau diesem Namen angelegt werden muss.@padrino sagte in Manchmal Endlosschleife. Wie kann das sein (mit Code)?:
Ok, hier das ganze Skript (bitte gnädig mit mir sein =)), ich lerne noch und versuche immer weiter (mich) zu verbessern...
Ich bin so frei gewesen mir das Skript mal vollständig anzuschauen. Das sieht doch ordentlich aus. Die von @paul eingefügte Absicherung gegen Mehrfachstart von "HauptCode" sowie "SendeHeizungAus" hat gefehlt.
Dieses solltest Du als "best practice" für jedes Intervall / jeden Timeout übernehmen. Sofern es keinen expliziten Grund gibt das nicht zu tun sollte vor jedem "start Timeout" oder "start Intervall" ein passender "stop Timeout" oder "stop Intervall" Block stehen.
Das führt mich dann auch zu den weiteren Kommentaren - diese bitte als Ratschläge ansehen wie Du Dinge besser machen kannst, nicht als Kritik:
-
Du nutzt an einer Stelle einen "Aktualisiere" Block mit einer Verzögerung von 5 Sekunden. Auch bei diesen Blöcken sollte der Haken bei "löschen falls läuft" immer dann gesetzt sein wenn es nicht einen dedizierten Grund gibt den offen zu lassen. Letztendlich ist es da wie mit dem Timeout. Wenn der Haken nicht gesetzt wird und der Baustein
wird 2 mal innerhalb von 5 Sekunden ausgeführt dann wird der Wert selber auch 2 mal aktualisiert - jeweils mit 5 Sekunden Verzögerung. Mit dem haken würde der erste Aufruf ignoriert so das nur die 2. Aktualisierung durch kommt. -
Du hast in deinem Hauptcode 2 grosse Falls Blöcke - einen zum Einschalten der Heizung, einen zum Ausschalten der Heizung. Die beiden Bedingungen für Heizung Ein und Heizung Aus sind dabei nicht exklusiv - es gibt ein Fenster bei denen beide Bedingungen nach meiner Analyse wahr werden können. (Aufruf des Triggers durch eine ein Ansteigen von Oregon_TempHygro_1.TEMP => Hysterese wird auf 0.2 gesetzt. Wenn jetzt z.Bsp die Temperatu 18.1 Grad ,der Sollwert 18 Grad und das Gebläse aus ist dann sind beide Bedingungen Wahr. (Istwert < Sollwert - Hysterese, Istwert > Sollwert).
Abhilfe schafft ein Falls/SonstFalls Konstrukt an Stelle von 2 unabhängigen "Falls" Blöcken. An den kommst du über das Zahnrad im Falls Block.
Diesen würde ich immer dann nutzen wenn über verschiedene Bedingungen 2 gegeläufige Aktionen ausgeführt werden (Heizung an oder Heizung aus). -
Du holst verschiedene Werte mehrfach im Skript (TempHygro_1.TEMP, N8S_Sollwert, N8S_Gebläse). An der Stelle macht es dann aus Performance-Gründen Sinn die Werte direkt am Anfang einmal zu holen und in lokale Variablen zu sichern. Auch wenn der Block klein ist steht hinter jedem "Value of ..." Block ein Zugriff auf die Objektdatenbank, der je nach Optimierung im Code mehr oder weniger Ressourcen braucht.
Auch die Lesbarkeit des Codes ist meiner Meinung nach besser wenn die relevanten Eingangsdaten an einer Stelle aus der Datenbank geholt und in passend benannte Variablen kopiert werden.
-
-
@asgothian
Vielen Dank für Deine sehr detaillierte Antwort, finde ich extrem intersannt/informativ.
Und keine Angst, Kritik kann ja auch positiv sein.
Werde versuchen, das mit dem "Stopp vor Start" zu beherzigen.
Die beiden Bedingungen sind über die Zeit gewachsen und daher auch ein ganz schöner Flickenteppich, den ich zu säubern bisher immer vor mir her schiebe - läuft ja.
(Ist auch der Hauptgrund, wieso ich von "Kraut und Rüben" sprach.)
Aber, jetzt wo Du Dir die Zeit genommen hast da genauer drauf zu schauen, werde ich mir die wohl mal zur Brust nehmen.
Was die mehrmaligen Aufrufe des gleichen Werts angeht, da hast Du (wie bei allem ) natürlich völlig Recht, mache ich (inzwischen) eigentlich auch, aber den Code habe ich schon eine Weile... glaube, das hatten wir schon.