NEWS
Bewässerung mit Schleife
-
Ich versuche eine Bewässerungssteuerung aufzubauen.
Das Magnetventil kommuniziert per MQTT, das funktioniert.
Nun will ich ein Blockly schreiben, dass einen Bodenfeuchtesensor (der funktioniert) abfragt und bei Unterschreiten der Giess-Schwelle das Ventil einschaltet.
Das Ventil soll für 30 Sek offen sein und dann wieder schließen.
Wenn dann nach ca 5 Min. Wartezeit die Bodenfeuchte noch unter der (oberen) Feuchte-Schwelle ist, dann soll nochmals für 30 Sek. bewässert werden.
Diese Schleife soll maximal 3x wiederholt werden.
Ich habe das mal so probiert:<block xmlns="https://developers.google.com/blockly/xml" type="on" id="Gis*AbH[ZWPQmZ9kEyRe" x="-188" y="-462"> <field name="OID">0_userdata.0.Bodenfeuchte.giessalarm</field> <field name="CONDITION">true</field> <field name="ACK_CONDITION"></field> <statement name="STATEMENT"> <block type="debug" id="mxFJUE0lG`x~$61cdtd5"> <field name="Severity">error</field> <value name="TEXT"> <shadow type="text" id="kw#t5A%:+@DzhRLdTbA-"> <field name="TEXT">giessen ist wahr!</field> </shadow> </value> <next> <block type="controls_if" id="x$F(H03~oZpoBDwx(77;"> <value name="IF0"> <block type="logic_compare" id="Q;4[1%6SE_-B=Oqv.9`U"> <field name="OP">LT</field> <value name="A"> <block type="get_value_var" id="73aPk14dgE;]f%.q~wje"> <field name="ATTR">val</field> <value name="OID"> <shadow type="field_oid" id="!+~8!l}XZW)xOhn%TkuG"> <field name="oid">mqtt.0.Bodenfeuchte.Zitronenbaum.Feuchtigkeit</field> </shadow> </value> </block> </value> <value name="B"> <block type="get_value_var" id=".HTGY5%g~S6h^;FPnc~V"> <field name="ATTR">val</field> <value name="OID"> <shadow type="field_oid" id="k[Vo/xRpUilcj6qVa4{e"> <field name="oid">0_userdata.0.Bodenfeuchte.Giessschwelle</field> </shadow> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="controls_repeat_ext" id="nEuR@]%;?$K8C4%G4$Iu"> <value name="TIMES"> <shadow type="math_number" id="gQU^:x-kWvcWdQ~c*8Ho"> <field name="NUM">3</field> </shadow> </value> <statement name="DO"> <block type="controls_if" id="bf=;fx}QzPz/;f@7dk!Q"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_compare" id="!}j)8_*HcAx=}o`uU-m$"> <field name="OP">LT</field> <value name="A"> <block type="get_value_var" id="a}aAY.zO4QQqA$a5*b0v"> <field name="ATTR">val</field> <value name="OID"> <shadow type="field_oid" id="*GOO.g^l3j?FX2yx|z*r"> <field name="oid">mqtt.0.Bodenfeuchte.Zitronenbaum.Feuchtigkeit</field> </shadow> </value> </block> </value> <value name="B"> <block type="get_value_var" id="yAkc;5:]-A@{8B1{u.mg"> <field name="ATTR">val</field> <value name="OID"> <shadow type="field_oid" id="/SK`bau{8cD565(OEB9h"> <field name="oid">0_userdata.0.Bodenfeuchte.Feuchteschwelle</field> </shadow> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="debug" id="+3$#yTk(ZNnO*w.FB1Y)"> <field name="Severity">error</field> <value name="TEXT"> <shadow type="text" id="U{KUwLn:+k8!)Kvi@c*,"> <field name="TEXT">giesszyklus an</field> </shadow> </value> <next> <block type="control" id="2ainF?e~eeh))*=cc`6h"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">mqtt.0.Gartenpumpe</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="^7}I9D-[$K;vK8@S]*Ge"> <field name="BOOL">TRUE</field> </block> </value> <next> <block type="timeouts_settimeout" id="4k2)k+YYKo@XTmx0i0sM"> <field name="NAME">giessdauer</field> <field name="DELAY">30</field> <field name="UNIT">sec</field> <statement name="STATEMENT"> <block type="control" id="2CX[gpCjkp6Np]jO+3W?"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">mqtt.0.Gartenpumpe</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="!EJEzpsUw#_0kfS.Z7P;"> <field name="BOOL">FALSE</field> </block> </value> </block> </statement> <next> <block type="timeouts_settimeout" id="$}**H|?wg|55QFikjmDw"> <field name="NAME">wartezeit</field> <field name="DELAY">1</field> <field name="UNIT">min</field> <statement name="STATEMENT"> <block type="debug" id="1O$O_!4|@IN;H%vE4zrx"> <field name="Severity">error</field> <value name="TEXT"> <shadow type="text" id="ENJ^fV5!iCDI?YmZd[Sl"> <field name="TEXT">Wartezeit</field> </shadow> </value> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </statement> <statement name="ELSE"> <block type="controls_flow_statements" id="5PAKb(0]^?Dsj|W-eh@O"> <field name="FLOW">BREAK</field> </block> </statement> <next> <block type="debug" id="wJ/KaV_7H[EtAUqo$]u+"> <field name="Severity">error</field> <value name="TEXT"> <shadow type="text" id="A|NaC8pz4^PP#%J*ne@O"> <field name="TEXT">Schleife beendet</field> </shadow> </value> <next> <block type="update" id="?i;vV{^J6`_G7zul^od:"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.Bodenfeuchte.giessalarm</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="eeGz+#R]!zI=[:.Ry3ys"> <field name="BOOL">FALSE</field> </block> </value> </block> </next> </block> </next> </block> </statement> </block> </statement> </block> </next> </block> </statement> </block>
Was passiert ist, dass die Schleife 3x rasend schnell durchlaufen wird. Vollkommen unabhängig von den Giess und Wartezeiten. Also: Solange der erste Giesszyklus läuft (30 Sek) wird die Schleife schon beendet und keine weiteren Giesszyklen werden ausgelöst obohl die Bodenfeuchte nicht angestiegen ist.
Wie kann ich das bsser machen? -
-
@paul53 Vielen Dank! So funktionierts!
Ich habe deinen Vorschlag mit der functon genommen.
Noch ne Frage: Ich hatte zuerst versucht das Blockly "Wiederhole solange" oder "Wiederhole bis" zu verwenden.
Das hat regelmäßig zum Neustart der javascript-Instanz geführt.
Könnte man doe o.a. Problematik auch mit Schleifen lösen? -
@andreas-9 sagte: versucht das Blockly "Wiederhole solange" oder "Wiederhole bis" zu verwenden.
Das führt regelmäßig zu einer Endlosschleife, wenn man die Abbruchbedingung falsch (z.B. einen DP-Wert) wählt.
-
@paul53 Dann geht das also nicht:
"Wiederhole bis" DP Bodenfeuchtigkeit > DPFeuchteschwelle? -
@andreas-9 sagte: Dann geht das also nicht:
Nicht, wenn die Schleife unverzögert durchläuft. Das führt zum Absturz der JS-Instanz.
Mit einer ausreichend langen Pause (90 s) in der Schleife würde es funktionieren. -
@paul53 said in Bewässerung mit Schleife:
Pause (90 s) in der Schleife würde
Ahhh... Aber Pause wird ja ungene verwendet - hab ich mal gehört.
-
@andreas-9 sagte: Pause wird ja ungene verwendet
Ich bevorzuge auch die Version mit den Timeouts in einer Funktion.
-
@paul53 said in Bewässerung mit Schleife:
Ich bevorzuge auch die Version mit den Timeouts in einer Funktion.
Prima! Nochmals vielen Dank!