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? -
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? -
@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.
-
@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. -
@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.
-
@andreas-9 sagte: Pause wird ja ungene verwendet
Ich bevorzuge auch die Version mit den Timeouts in einer Funktion.
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden

