NEWS
Timeout richtig verwenden
-
Servus!
Irgendwie stehe ich bisschen auf dem Schlauch: Ich möchte in mein Skript eine Abfrage einbauen, die mir mitteilt, wenn die Tauchpumpe länger, als 20 Sekunden läuft. Schon klar, daß das irgendwie mit einem Timeout geht, aber ich komme nicht drauf.
Anbei mein Skript:<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="EP`a-qu0Mi)#+F^5KaM)">Tauchpumpe_aktiv?</variable> </variables> <block type="variables_set" id="vB%/(%QK-.|VB8olH+F+" x="-62" y="-137"> <field name="VAR" id="EP`a-qu0Mi)#+F^5KaM)">Tauchpumpe_aktiv?</field> <value name="VALUE"> <block type="logic_boolean" id="Zt3N#kbH0XjK+}5)pbJ^"> <field name="BOOL">FALSE</field> </block> </value> <next> <block type="on" id="?*7pS-cANelnRStH5fpi"> <field name="OID">sonoff.0.Tauchpumpe.ENERGY_Power</field> <field name="CONDITION">ne</field> <field name="ACK_CONDITION"></field> <statement name="STATEMENT"> <block type="controls_if" id="*bOx]47]yxIByA#qqt3J"> <mutation elseif="1"></mutation> <value name="IF0"> <block type="logic_operation" id="Z=d#73]O`zyDGC~L|Jn/" inline="false"> <field name="OP">AND</field> <value name="A"> <block type="logic_compare" id=".(cUpb9mFzXnI.u`/RGu"> <field name="OP">GTE</field> <value name="A"> <block type="on_source" id="+L|D9(N^L/_9p**AC4Y#"> <field name="ATTR">state.val</field> </block> </value> <value name="B"> <block type="math_number" id="IRXiQ:Tf}.:}u-F;(J?|"> <field name="NUM">3</field> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="!+aTX:f8zpg?koPwXqU9"> <field name="OP">EQ</field> <value name="A"> <block type="variables_get" id="~^+uLCVDphEA1T3csQ;4"> <field name="VAR" id="EP`a-qu0Mi)#+F^5KaM)">Tauchpumpe_aktiv?</field> </block> </value> <value name="B"> <block type="logic_boolean" id="m9)+OzK@16j;{0FErZe_"> <field name="BOOL">FALSE</field> </block> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="variables_set" id="yj^]v8#=,-=xs,C$1:0m"> <field name="VAR" id="EP`a-qu0Mi)#+F^5KaM)">Tauchpumpe_aktiv?</field> <value name="VALUE"> <block type="logic_boolean" id="c%J}.8a#0L-%7wEqRPVF"> <field name="BOOL">TRUE</field> </block> </value> <next> <block type="telegram" id=")43X.^NP$KHLnE,ZJK[m"> <field name="INSTANCE"></field> <field name="LOG"></field> <field name="SILENT">FALSE</field> <field name="PARSEMODE">default</field> <value name="MESSAGE"> <shadow type="text" id="B`kyTY5/jBuR@[lQA^oW"> <field name="TEXT">Tauchpumpe läuft</field> </shadow> </value> </block> </next> </block> </statement> <value name="IF1"> <block type="logic_operation" id="ypsA%)wGaJm%m/NKb;=i" inline="false"> <field name="OP">AND</field> <value name="A"> <block type="logic_operation" id="BJcJfH;;~Zs!Cb;|si9H"> <field name="OP">AND</field> <value name="A"> <block type="logic_compare" id="`of^ix$+JJ:q+jB]LuGW"> <field name="OP">LT</field> <value name="A"> <block type="on_source" id="%%:?,%fLZ^rP#abOHUuC"> <field name="ATTR">state.val</field> </block> </value> <value name="B"> <block type="math_number" id="}xv`$j.L]mt%:X1mr]{E"> <field name="NUM">3</field> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="RAy_B|_N=),^/yP4_=go"> <field name="OP">GT</field> <value name="A"> <block type="on_source" id="iz,6l+`khcZXn548=_mG"> <field name="ATTR">state.val</field> </block> </value> <value name="B"> <block type="math_number" id="6g$-XC4nL#:SQe2k#6MS"> <field name="NUM">0</field> </block> </value> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="Q+6~nu9t9);pkS12`.AL"> <field name="OP">EQ</field> <value name="A"> <block type="variables_get" id="cpnf;Gi35/{P3:nPjq[W"> <field name="VAR" id="EP`a-qu0Mi)#+F^5KaM)">Tauchpumpe_aktiv?</field> </block> </value> <value name="B"> <block type="logic_boolean" id="J57c)XE#PG(Da`u;jg#,"> <field name="BOOL">TRUE</field> </block> </value> </block> </value> </block> </value> <statement name="DO1"> <block type="variables_set" id=":eS4G4/zu.ky;:[2FzJN"> <field name="VAR" id="EP`a-qu0Mi)#+F^5KaM)">Tauchpumpe_aktiv?</field> <value name="VALUE"> <block type="logic_boolean" id="ly}z},:j05vr{-G[6+~L"> <field name="BOOL">FALSE</field> </block> </value> <next> <block type="telegram" id="9?I2K.J*.|N*=,2aN+V_"> <field name="INSTANCE"></field> <field name="LOG"></field> <field name="SILENT">FALSE</field> <field name="PARSEMODE">default</field> <value name="MESSAGE"> <shadow type="text" id="m0]cKJ`QA.tao?AAm`!P"> <field name="TEXT">Tauchpumpe fertig</field> </shadow> </value> </block> </next> </block> </statement> </block> </statement> </block> </next> </block> </xml>
Danke Euch!
-
@invidianer schau mal, dort https://forum.iobroker.net/post/110978 ist das für Jscript beschrieben. Das was innerhalb der function steht, wird nach Ablauf der Zeit ausgeführt. Ist etwas ungewöhnlich, weil das dann vor der timeout-Zeit steht und nicht danach.
-
@klassisch
Danke! Das ist je bestimmt geil, wenn man es versteht
Kann man das in Blockly denn gar nicht machen? Wofür gibt es in Blockly dann diese olivefarbenen "timeout"-Dinger? -
@invidianer vielleicht so; Mein erstes Blockly.
schickt nach 5 Sekunden eine Mail. Führt nach 5 Sekunden das aus, was innerhalb der "Zange" ist,
-
Hilft mir leider nicht weiter.
Hier mein Blockly als Bild.Im erstren "mache"-Bereich muß geprüft werden, ob die Pumpe länger, als 20 Sekunden läiuft.
-
@invidianer sagte: Im erstren "mache"-Bereich muß geprüft werden, ob die Pumpe länger, als 20 Sekunden läiuft.
-
@invidianer
Durch Prüfung der Variable timeout lässt es sich vereinfachen. -
Cool, danke!!
Wen wir nochmal MEINE Version (der Einfachheit) nehmen:
Dann ist es also so, daß der aktuelle "Durchlauf" innerhalb der "mache"-Zange (Tauchpumpe aktiv) unterbrochen wird, sobald sich der Stromverbrauch wieder unter 3 Watt befindet und dann die "mache"-Zange für Tauchpumpe inaktiv abgearbeitet wird?
Ich war davon ausgegangen, daß die "mache"-Zange (Tauchpumpe aktiv) auf jeden Fall zuerst mal komplett ausgeführt wird, also auch der Timeout unabhängig davon, ob sich der Stromverbrauch mittlerweile geändert hat. Dem ist also nicht so? -
@invidianer sagte: der aktuelle "Durchlauf" innerhalb der "mache"-Zange (Tauchpumpe aktiv) unterbrochen wird, sobald sich der Stromverbrauch wieder unter 3 Watt befindet
Nein, es wird nichts unterbrochen: Der Timeout läuft weiter, wenn er nicht im sonst-Zweig gestoppt wird.
-
@paul53
Hmm, das bedeutet, auch, wenn die Pumpe nach 5 Sekunden längst fertig ist, wartet er erst insgesamt 20 Sekunden und meldet erst dann, daß sie fertig ist? -
@invidianer sagte: wenn die Pumpe nach 5 Sekunden längst fertig ist, wartet er erst insgesamt 20 Sekunden und meldet erst dann, daß sie fertig ist?
Nein, die Verzögerung wirkt nur auf die Meldung, dass die Pumpe seit 20 s läuft.