NEWS
Timeout in einer Schleife
-
Hallo liebe Gemeinde, notgedrungen musste ich meine Klärgruben-Steuerung beerdigen. Darum habe ich mir gedacht, das kann doch genauso gut mein iobroker übernehmen. Daher habe ich ein Sonoff 4CH Relay genommen, Tasmota darauf gemacht und steuer damit meine 4 Magnetventile in meiner Klärgrube. Nun muss ich noch die Schaltzeiten einrichten und fertig...! Dache ich mir!
Wie war mein Plan. Durch mehrere Datenpunkte mit Zeiten(Minuten) wollte ich einen Ablauf auf Basis von Timeouts steuern. Das hat auch gut funktioniert. Jetzt mein Problem. Ich muss innerhalb einer Timeout-Abarbeitung eine Schleife einbinden. Da zwei meiner Schritte sich 4 oder 5 mal wiederholen müssen. Leider funktioniert meine Schleife nicht innerhalb der Timeout-Funktion? Hat jemand eine Idee? Wie man das anderes gelöst bekommt?
Danke für eure Hilfe
<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="R?HN~tve/crI~*alH=bB">cnt</variable> <variable id="tzCm+HTX_;U8Ac.UcYrW">cnt2</variable> <variable id="l`ZPnB,P_M%T0buA5qRd">cnt3</variable> <variable type="interval" id="Intervall13">Intervall13</variable> <variable type="interval" id="Intervall14">Intervall14</variable> <variable id="ZEf:6K{Tl`IfYTh7(M,l">counter</variable> <variable type="interval" id="Intervall15">Intervall15</variable> <variable id="1TJp(/z1FqL=qov_Cn}b">cnt4</variable> <variable type="interval" id="Intervall16">Intervall16</variable> <variable id="j_`1%k0?lTcFN!dX$m,}">cnt5</variable> </variables> <block type="on_ext" id="B-uN*SMDrRHETe-GU@%1" x="-187" y="38"> <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="xVJoSUG^)OU0D+2lC)z`"> <field name="oid">0_userdata.0.vis_Abwasser.Grubenpumpe_automatik_aktiv</field> </shadow> </value> <statement name="STATEMENT"> <block type="comment" id="A@q-,2Z;ohy}K[hQ+Qi}"> <field name="COMMENT">30 Sek.</field> <next> <block type="timeouts_clearinterval" id="r(n%Ad?SADm5ISNY/Sht"> <field name="NAME">Intervall14</field> <next> <block type="timeouts_clearinterval" id="KS]_aICG^P0P|hqa9alR"> <field name="NAME">Intervall13</field> <next> <block type="variables_set" id="m}$pV~~:hCW7%clL~_R`"> <field name="VAR" id="R?HN~tve/crI~*alH=bB">cnt</field> <value name="VALUE"> <block type="math_number" id="6Ie;Au4I8|;H~BN]n@C0"> <field name="NUM">30</field> </block> </value> <next> <block type="variables_set" id="_-^aWKyLI2nc(`z[=Of5"> <field name="VAR" id="tzCm+HTX_;U8Ac.UcYrW">cnt2</field> <value name="VALUE"> <block type="math_number" id="(.C:_o:6UE-W%e%@[zP`"> <field name="NUM">30</field> </block> </value> <next> <block type="variables_set" id="fG=$Y[+FsHeI*-5HOVGL"> <field name="VAR" id="l`ZPnB,P_M%T0buA5qRd">cnt3</field> <value name="VALUE"> <block type="math_number" id="yy90Wmm^Y}GSEzXLL-/f"> <field name="NUM">30</field> </block> </value> <next> <block type="debug" id="O#(9bRPC3~l%_3Zv((jL"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="U$Zi:9v9Sgr^u}z/):eL"> <field name="TEXT">start 1</field> </shadow> </value> <next> <block type="timeouts_setinterval" id="S,_:I|nO:g;+2c|i_Byw"> <field name="NAME">Intervall13</field> <field name="INTERVAL">10</field> <field name="UNIT">sec</field> <statement name="STATEMENT"> <block type="variables_set" id="rEWpD|##]FeY`qPC[o8V"> <field name="VAR" id="R?HN~tve/crI~*alH=bB">cnt</field> <value name="VALUE"> <block type="math_arithmetic" id="]PJmgo}o4$)jCn-_Fm)S"> <field name="OP">MINUS</field> <value name="A"> <shadow type="math_number"> <field name="NUM">1</field> </shadow> <block type="variables_get" id="R9a((V;~tv~$B;URnCm^"> <field name="VAR" id="R?HN~tve/crI~*alH=bB">cnt</field> </block> </value> <value name="B"> <shadow type="math_number" id="*%8_Er:MU|f:%*u|DFvZ"> <field name="NUM">10</field> </shadow> </value> </block> </value> <next> <block type="controls_if" id="jp#oj(^=9WN3x67VYK0)"> <value name="IF0"> <block type="logic_compare" id="B41M5p|%@FQ7l^C(t3]x"> <field name="OP">LTE</field> <value name="A"> <block type="variables_get" id="D89}N_Zi{DBcPa=LDk=C"> <field name="VAR" id="R?HN~tve/crI~*alH=bB">cnt</field> </block> </value> <value name="B"> <block type="math_number" id="rD_qr.Z6IPS+Jv,0m],*"> <field name="NUM">0</field> </block> </value> </block> </value> <statement name="DO0"> <block type="timeouts_clearinterval" id="`G8Ak-!UHf9K37Ek:G`p"> <field name="NAME">Intervall13</field> <next> <block type="debug" id=";:b|l=_)2_F?PzC2jMJ3"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="O1x$!Lt~j|%=F(!^}Q!7"> <field name="TEXT">ende 1</field> </shadow> </value> <next> <block type="timeouts_clearinterval" id="Tj0~}t/J~w}kgDe|*0G$"> <field name="NAME">Intervall14</field> <next> <block type="debug" id="/0k8^[0:;m(vY,EpiK/d"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="`BreO*s]6/~fgyeM5S9o"> <field name="TEXT">start 2</field> </shadow> </value> <next> <block type="timeouts_setinterval" id="+O)ls_{~e8?*[U88YPbT"> <field name="NAME">Intervall14</field> <field name="INTERVAL">10</field> <field name="UNIT">sec</field> <statement name="STATEMENT"> <block type="variables_set" id="5d-;_i*t4*2gjd9dIbvL"> <field name="VAR" id="tzCm+HTX_;U8Ac.UcYrW">cnt2</field> <value name="VALUE"> <block type="math_arithmetic" id="|{,1t*Vs/6lp/R{h-6#I"> <field name="OP">MINUS</field> <value name="A"> <shadow type="math_number"> <field name="NUM">1</field> </shadow> <block type="variables_get" id="TLs@0*YGMPi2v6X!ofwS"> <field name="VAR" id="tzCm+HTX_;U8Ac.UcYrW">cnt2</field> </block> </value> <value name="B"> <shadow type="math_number" id="3sp;=.Va-X~MYjRB(t{n"> <field name="NUM">10</field> </shadow> </value> </block> </value> <next> <block type="controls_if" id="FDwIwn9oLr{@LhLdL+$Z"> <value name="IF0"> <block type="logic_compare" id="om-#R%}ZPB^|K=%iD[Yi"> <field name="OP">LTE</field> <value name="A"> <block type="variables_get" id="Cj/S|16+Tn]?*mv4O28w"> <field name="VAR" id="tzCm+HTX_;U8Ac.UcYrW">cnt2</field> </block> </value> <value name="B"> <block type="math_number" id="%mrDC/bGMlDYgEHg/N80"> <field name="NUM">0</field> </block> </value> </block> </value> <statement name="DO0"> <block type="timeouts_clearinterval" id="4VP%4X;:T`?GNg^cX[3e"> <field name="NAME">Intervall14</field> <next> <block type="debug" id="4|J|WfNA-48!Co@9[iZ1"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="g:$HhyE.|tvRoB5}|Rih"> <field name="TEXT">ende 2</field> </shadow> </value> <next> <block type="debug" id="r7@0s#8KJuKX!yq`.G!r"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="99q8?96V4(Q?0rVOf;A@"> <field name="TEXT">beginn er schleife</field> </shadow> </value> <next> <block type="variables_set" id="o2@V4WKOWL2rM8wB;r^j"> <field name="VAR" id="ZEf:6K{Tl`IfYTh7(M,l">counter</field> <value name="VALUE"> <block type="math_number" id="YHo*$I^]dSGUrb^IK}2L"> <field name="NUM">0</field> </block> </value> <next> <block type="controls_repeat_ext" id="$O)KzT8O8%|J:]R$K$eV"> <value name="TIMES"> <shadow type="math_number" id="SP$Ts?2X?;dL;x5p]b5R"> <field name="NUM">4</field> </shadow> </value> <statement name="DO"> <block type="math_change" id="A[*~0Z392@bVDyJa%0H@"> <field name="VAR" id="ZEf:6K{Tl`IfYTh7(M,l">counter</field> <value name="DELTA"> <shadow type="math_number" id="riCL[?HcI[FOvpF#Wp?b"> <field name="NUM">1</field> </shadow> </value> <next> <block type="debug" id="rro;:w?~~Dbhm(h1()jT"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text"> <field name="TEXT">start 3</field> </shadow> <block type="text_join" id="GK}5L3GNyS^3~fqP4{u,"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="eFA;JTAtD)C`=hDJkb(D"> <field name="TEXT">Counter : </field> </block> </value> <value name="ADD1"> <block type="variables_get" id="r#W2(P!su80g|uc6i!f8"> <field name="VAR" id="ZEf:6K{Tl`IfYTh7(M,l">counter</field> </block> </value> </block> </value> <next> <block type="debug" id="G,W1||k$ii(]b?Kv8lO8"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="=yQi)L6;jH:aY%O7HvMh"> <field name="TEXT">start 4 (in der schleife)</field> </shadow> </value> <next> <block type="timeouts_clearinterval" id="p*k[~};Ix{K}35X!=4LL"> <field name="NAME">Intervall15</field> <next> <block type="timeouts_setinterval" id="#z7P.f7^(aEmj0L*^n^3"> <field name="NAME">Intervall15</field> <field name="INTERVAL">10</field> <field name="UNIT">sec</field> <statement name="STATEMENT"> <block type="variables_set" id="o;,Wq/7@%6V)-GVyfpp#"> <field name="VAR" id="1TJp(/z1FqL=qov_Cn}b">cnt4</field> <value name="VALUE"> <block type="math_arithmetic" id="XKQL=3wi=ZEj2eajYBL?"> <field name="OP">MINUS</field> <value name="A"> <shadow type="math_number"> <field name="NUM">1</field> </shadow> <block type="variables_get" id="Z!lAQty{JsZzA6`9?Ar-"> <field name="VAR" id="1TJp(/z1FqL=qov_Cn}b">cnt4</field> </block> </value> <value name="B"> <shadow type="math_number" id="Uvs]zpkWecOa-VWRIf~7"> <field name="NUM">10</field> </shadow> </value> </block> </value> <next> <block type="controls_if" id="P-VrzcrkT(U~45o0onq."> <value name="IF0"> <block type="logic_compare" id="q|#|QJSm,_4By7R.I8^V"> <field name="OP">LTE</field> <value name="A"> <block type="variables_get" id="R8tS+$99o#rH}|R42ljA"> <field name="VAR" id="1TJp(/z1FqL=qov_Cn}b">cnt4</field> </block> </value> <value name="B"> <block type="math_number" id="]EdhS1A-LBJCm66-sT{0"> <field name="NUM">0</field> </block> </value> </block> </value> <statement name="DO0"> <block type="timeouts_clearinterval" id="jN?Dpd5tkMVMI5`V:-pD"> <field name="NAME">Intervall15</field> <next> <block type="debug" id="n{p9Xnl7NNHlf_p9*T-*"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="j,(+wb5-zY66,el=ZNF$"> <field name="TEXT">ende 5</field> </shadow> </value> <next> <block type="debug" id=";+ib=I/w89uG}w3C,/AF"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="8tvX@bCg0nHHpV6^b2X4"> <field name="TEXT">start 5 (in der schleife)</field> </shadow> </value> <next> <block type="timeouts_clearinterval" id="Qi4Jza:w]dfY+n^+pjt3"> <field name="NAME">Intervall16</field> <next> <block type="timeouts_setinterval" id=")vzgF{)n=v])M#6g})^W"> <field name="NAME">Intervall16</field> <field name="INTERVAL">10</field> <field name="UNIT">sec</field> <statement name="STATEMENT"> <block type="variables_set" id="um|}u~9{$6:lrOQ@u=vB"> <field name="VAR" id="j_`1%k0?lTcFN!dX$m,}">cnt5</field> <value name="VALUE"> <block type="math_arithmetic" id="KG}hZ?Syx4lr~kkBku|p"> <field name="OP">MINUS</field> <value name="A"> <shadow type="math_number"> <field name="NUM">1</field> </shadow> <block type="variables_get" id="AMkY4aU()JSS-DC-2.;{"> <field name="VAR" id="j_`1%k0?lTcFN!dX$m,}">cnt5</field> </block> </value> <value name="B"> <shadow type="math_number" id="Y}Qy%*ug*]j0lSd#z+rp"> <field name="NUM">10</field> </shadow> </value> </block> </value> <next> <block type="controls_if" id="tz2RQ{)8T8`BrW;^(fr*"> <value name="IF0"> <block type="logic_compare" id="2Z*hYr,2_V;k,=gop1|R"> <field name="OP">LTE</field> <value name="A"> <block type="variables_get" id="#6@(EjZYWd]C%+k^dQ`}"> <field name="VAR" id="j_`1%k0?lTcFN!dX$m,}">cnt5</field> </block> </value> <value name="B"> <block type="math_number" id="_2k?^zW]wQ]CRrTx!`9="> <field name="NUM">0</field> </block> </value> </block> </value> <statement name="DO0"> <block type="timeouts_clearinterval" id=":`Kat$LTMj929[b;KZ8p"> <field name="NAME">Intervall16</field> <next> <block type="debug" id="}6X?J@[+O8S~7WBj3*o%"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="y;qFK7YkikE+~pjLO{`D"> <field name="TEXT">ende 5</field> </shadow> </value> </block> </next> </block> </statement> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </next> </block> </statement> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </next> </block> </statement> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </next> </block> </statement> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </statement> </block> </xml>
gehören zusammen!
-
@schroed99 sagte in Timeout in einer Schleife:
Hallo liebe Gemeinde, notgedrungen musste ich meine Klärgruben-Steuerung beerdigen. Darum habe ich mir gedacht, das kann doch genauso gut mein iobroker übernehmen. Daher habe ich ein Sonoff 4CH Relay genommen, Tasmota darauf gemacht und steuer damit meine 4 Magnetventile in meiner Klärgrube. Nun muss ich noch die Schaltzeiten einrichten und fertig...! Dache ich mir!
Wie war mein Plan. Durch mehrere Datenpunkte mit Zeiten(Minuten) wollte ich einen Ablauf auf Basis von Timeouts steuern. Das hat auch gut funktioniert. Jetzt mein Problem. Ich muss innerhalb einer Timeout-Abarbeitung eine Schleife einbinden. Da zwei meiner Schritte sich 4 oder 5 mal wiederholen müssen. Leider funktioniert meine Schleife nicht innerhalb der Timeout-Funktion? Hat jemand eine Idee? Wie man das anderes gelöst bekommt?
Danke für eure Hilfe
zeig mal deine Timeout funktion. (als screenshot, nicht als xml, den können nicht alle importieren)
Auch in einem Timeout kannst du mit schleifen arbeiten, wenn du es geschickt machst.
A.
-
@asgothian Hallo, vielen Dank für den Hinweis. Ich habe zwei Teile des Blockly oben in meinen Text eingefügt. Ich hoffe, man kann erkennen, worauf ich hinaus möchte. Der Ablauf ohne die Schleife funktioniert. Nur wurde mir heute gesagt das die Phase Belüftung und Pause jeweils 4-mal hintereinander durchgeführt werden soll. Daher dachte ich mir eine Schleife, um die beiden Blöcke zu bauen.
-
@schroed99 Der Aufbau mit den Intervallen macht in der Form eigentlich keinen Sinn.
Allerdings habe ich noch nicht verstanden wie das ganze laufen soll. Kannst du einen vollständigen Ablauf incl. der von Dir ansteuerbaren Datenpunkte mal beschreiben ?
A.
-
wenn ich das richtig verstanden habe, willst du den folgenden Ablauf haben:
Zyklus eins für Z1 Minuten (beschicken 1)
pause für P1 Minuten- 4 mal wiederholen:
Zyklus 2 für Z2 Minuten (belüften 1)
pause für P2 minuten
Zyklus 3 für Z3 Minuten (klären 1)
pause für P3 minutenZyklus 4 für Z4 Minuten (Abzug 1)
pause für P4 minutenWenn das soweit stimmt, würde ich das so lösen:
Du musst natürlich die korrekten Datenpunktnamen eintragen. Aktuell läuft das ganze automatisch los und wiederholt sich endlos.
Wenn du es explizit triggern und anhalten willst musst du den 1. DoAction with Baustein in einen Trigger packen. Davor noch ein stop timeout und stop timeout2 zur Sicherheit.
Um das dauerhaft weiterlaufen zu stoppen must du in dem falls idx > length of... umstellen auf <= length of und den doAction nur im "Falls" Zweig ausführen
A.
- 4 mal wiederholen:
-
@schroed99 sagte: Wie man das anderes gelöst bekommt?
Dafür kann man eine Funktion als Schleife verwenden. Vorschlag:
-
@paul53 @Asgothian Sorry für's Offtopic...
Jetzt weiß ich, warum ich mich nicht mit Blockly beschäftige... Bei so komplexen Abläufen blick ichs nicht mehr
Bin ich froh, dass ich als Softwareentwickler mich mit so schönen Dingen, wie JS beschäftigen kann
Mich würde tatsächlich mal interessieren was aus dem Blockly von Euch wird, wenn man das in JS umwandelt. Vielleicht mag mir das ja jemand als PM schicken?
-
In JS würde ich das etwas anders lösen - z.Bsp. nicht mit 4 getrennten arrays sondern mit einem Array von Objekten. Ansonsten halt so wie hinterm spoiler
-
@great-sun sagte: was aus dem Blockly von Euch wird, wenn man das in JS umwandelt.
Von Blockly generiert:
var zyklus, msg, aktiv, idAktor; // Beschreibe diese Funktion … async function schleife() { switch (zyklus) { case 1: msg = 'Beschicken'; aktiv = 9; idAktor = 'default'; break; case 6: msg = 'Klären'; aktiv = 1; idAktor = 'default'; break; case 7: msg = 'Abzug'; aktiv = 2; idAktor = 'default'; break; default: msg = 'Belüften'; aktiv = 12; idAktor = 'default'; break; } console.log(msg); setStateDelayed(idAktor, true, false, parseInt(((0) || "").toString(), 10), false); aktiv = parseFloat(60000) * aktiv; await wait(aktiv); console.log(('Pause nach Zyklus ' + String(zyklus))); setStateDelayed(idAktor, false, false, parseInt(((0) || "").toString(), 10), false); await wait(720000); zyklus = (typeof zyklus == 'number' ? zyklus : 0) + 1; if (zyklus <= 7) { await schleife(); } } // Start on({id: 'default', change: "gt"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; zyklus = 1; await schleife(); });
Hätte ich gewusst, dass JS besser für Dich ist, hätte ich mich nicht mit Blockly abgemüht.
-
@paul53 Für mich sicher, aber für den Thread-Owner schätze ich nicht
-
@great-sun sagte: aber für den Thread-Owner schätze ich nicht
Sorry, Verwechslung.
-
@asgothian Japp, da kann man schöne Ablaufroutinen bauen. Hab ich auch so gemacht, wenn ich z.B. meinen "Kinomodus" einschalte:
Parallel: Leinwand runter fahren, GeräteGruppe1 einschalten
Pause
IR Commandos senden um die Geräte richtig einzustellen (Eingangskanäle für Beamer, TVBox/PS, TOSLink-Verteiler)
Subwoofer Verstärker einschalten -
@asgothian Guten Morgen Asgothian, vielen Dank für die schnelle Antwort. Ich werde deinen Vorschlag direkt mal testen. Denke aber du hast es sehr gut verstanden worauf ich hinaus möchte. Ja, es ist schwer sich ordentlich auszudrücken Aber klasse! Anbei noch eine Grafik die es evt. besser darstellt. Für die anderen die eine Klärgrubensteuerung bauen möchten
Ich melde mich sobald ich deinen Vorschlag umgesetzt habe. Vielen Dank bis hier her...
-
@paul53 Hallo Paul53, auch an dich vielen lieben Dank! Dein Ansatz sieht auch sehr vielversprechend aus. Ich werde auch deinen Vorschlag testen. Mit der Funktion hatte ich auch anfangs gedacht. Da ich aber den Ablauf so statisch aufgebaut habe, wollte ich direkt darin meine Schleife um die zwei Zyklen bauen. Ich sehe gerade, das wäre immer Mist geworden...! Danke für eure Ideen.
-
@asgothian Hallo Asgothian, ich habe deinen Vorschlag übernommen. Leider wirft der Skript verschiedene Warnungen. Könntest du den Blockly Export bereitstellen. Ich hab mein iobroker auf deutsch eingestellt. Bin mir daher unsicher die richtigen Funktionen eingezogen zu haben.
-
@paul53 Hallo Paul, ich habe deinen Vorschlag ausprobiert, perfekt! Genau dieses Verhalten wollte ich erreichen. Jetzt stellt sich mir die Frage, ob ich die Zyklen um die Belüftung/Pause auch dynamisch aufbauen könnte? Bedeutet ich möchte per Datenpunkt einstellen, wie viele Kreise er um die beiden Zyklen drehen soll? Weißt du, was ich meine?
-
@schroed99 Den export kann ich nicht einstellen, Aber:
du hast an dieser stelle die Variable "idx" benutzt, die zu dem Zeitpunkt keinen Wert hat. Das dürfte einer der Fehler sein. Bitte statt IDX dort die Zahl 1 einsetzen.
A.
-
@asgothian Ich habe die Zahl eingetragen, die Warnungen kommen weiterhin.
-
@schroed99 sagte: Zyklen um die Belüftung/Pause auch dynamisch aufbauen könnte?
Meinst Du die Anzahl der Belüftungszyklen? Wenn ja, dann ersetze die Zahl 6 durch
anzahlBelueftung + 2
und die Zahl 7 (an 2 Stellen) durchanzahlBelueftung + 3
. -
@schroed99 Du hast da noch einen Elefanten im Raum:
Die Texte in dem Array Zyklusaktionen müssen auf Datenpunkte zeigen die du mit wahr oder falsch steuern kannst. Bisher hast du da nur Namen. Da muss das rein was bei dem Skript von @paul53 in die Variable idAktor geschrieben wird.
A.