NEWS
3-Wegeventil 3x hintereinander auf und zu machen mit Blockly
-
Hallo, ich komm mal wieder mit blockly nicht klar:
Ich will ein 3-Wegeventil am Warmwasserspeicher 1x pro Woche bewegen, damit es nicht (wie schon vorgekommen) einrostet. Es soll 3x hintereinander für 3 Min auf und für 3 Min zu gemacht werden. Dazu müssen WWSpeicher und WWPumpe und WWThermostat geschaltet werden.
Dazu habe ich folgendes Blockly erstellt.
Leider werden alle Kommandos innerhalb der Wiederholen-Schleife direkt hintereinander ausgeführt. Das timeout funktioniert nicht.
Was hab ich falsch gemacht? Hat jemand eine Idee?
Hier das Blockly:
Hier der Code:<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable type="timeout" id="timeout">timeout</variable> <variable type="timeout" id="timeout2">timeout2</variable> </variables> <block type="schedule" id="cXZ2I8FRwIsL1Uuo9qL:" x="88" y="-512"> <field name="SCHEDULE">{"time":{"exactTime":true,"start":"11:12"},"period":{"weeks":1,"dows":"[0]"}}</field> <statement name="STATEMENT"> <block type="controls_repeat_ext" id=".AGm^+cS|tM)^an_ckg8"> <value name="TIMES"> <shadow type="math_number" id="yEotLT10W)y514oe22@z"> <field name="NUM">3</field> </shadow> </value> <statement name="DO"> <block type="timeouts_cleartimeout" id="_v-Vwch5wth_LWUU:ko/"> <field name="NAME">timeout</field> <next> <block type="timeouts_settimeout" id="7gkzxX:8tw-4ps],SfBT"> <field name="NAME">timeout</field> <field name="DELAY">3</field> <field name="UNIT">min</field> <statement name="STATEMENT"> <block type="control" id="n+WrE78HA@4Xg=embMLc"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">sonoff.0.WWSpeicher.POWER</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="K2HYSR/Y2WZK}TQ(U.rR"> <field name="BOOL">TRUE</field> </block> </value> <next> <block type="control" id="@P`Mk6%eb_xhaC0HrYxN"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">sonoff.0.WWPumpe.POWER</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="ADi9{y|pw==]];efnKL9"> <field name="BOOL">TRUE</field> </block> </value> <next> <block type="control" id="7s=VH*ia3:QJNNRBFE0Y" disabled="true"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">sonoff.0.WWThermostat.POWER</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id=".H[G4a/Gt/RG_-avP_ut"> <field name="BOOL">TRUE</field> </block> </value> <next> <block type="debug" id="gV0Fl[BoG5OXVrWH#B-I"> <field name="Severity">info</field> <value name="TEXT"> <shadow type="text" id="Nf!`R3;ka^S2~e-mU9G)"> <field name="TEXT">Dreiwegeventil = EIN</field> </shadow> </value> </block> </next> </block> </next> </block> </next> </block> </statement> <next> <block type="timeouts_cleartimeout" id="_XPp}Ow}jRhmyrNcIyB?"> <field name="NAME">timeout2</field> <next> <block type="timeouts_settimeout" id="od~K/bvg:;:]~?LDL-7N"> <field name="NAME">timeout2</field> <field name="DELAY">3</field> <field name="UNIT">min</field> <statement name="STATEMENT"> <block type="control" id="$4$p]?#3?/KaYsh,Xu4{"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">sonoff.0.WWSpeicher.POWER</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="SMfo*vQ4EkBhOmro*E-+"> <field name="BOOL">FALSE</field> </block> </value> <next> <block type="control" id="}wGq{HYso//Qw~(*WNCn"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">sonoff.0.WWPumpe.POWER</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="Me;T`EW77OGL{l{I19x("> <field name="BOOL">FALSE</field> </block> </value> <next> <block type="control" id="ra|].]jT@H[yvlKoV8Sl"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">sonoff.0.WWThermostat.POWER</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="%Qa|C@=^wD,@?/=Cv[^V"> <field name="BOOL">FALSE</field> </block> </value> <next> <block type="debug" id="Z-xDa5T`U@+aK~51MN_L"> <field name="Severity">info</field> <value name="TEXT"> <shadow type="text" id="rySh#%]s]luxZ.8]kVbQ"> <field name="TEXT">Dreiwegeventil = AUS</field> </shadow> </value> </block> </next> </block> </next> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </statement> </block> </statement> </block> </xml>
Vielen Dank schon mal!
-
-
@andreas-9
Super! Danke!
Ich teste das gleich mal.
Noch ne Frage: Wozu ist dann das "wiederhole..."-Blockly? -
@andreas-9 Funktioniert hervorragend!!!
Ich frage mich aber doch warum das mit dem "wiederhole"-Blockly nicht funktioniert.
Viele Grüße ins Forum! -
@andreas-9 sagte in 3-Wegeventil 3x hintereinander auf und zu machen mit Blockly:
Ich frage mich aber doch warum das mit dem "wiederhole"-Blockly nicht funktioniert.
Das ist einfach erklärt:
der Ausführen Timeout Block macht 2 Dinge:
- er trägt in eine Liste ein was zur der angegebenen Zeit ausgeführt werden soll
- er gibt eine Referenz auf diesen Eintrag in der Liste zurück.
Der stop timeout Block macht genau eins: Er nimmt die Referenz und schaut in der Liste nach - ist da noch was, dann kommt es weg.
Was deine Schleife also gemacht hat ist
3 mal nacheinander (schnell) :- timeout aus der Liste entfernen
- timeout in die Liste eintragen, delay 3 minuten
- timeout2 aus der Liste entfernen
- timeout2 in die Liste eintragen, delay 3 minuten
An keiner der Stellen wartet er die 3 Minuten bevor er etwas an der Liste macht
Am Ende der Schleife hast du also in der Liste:
- einen Eintrag timeout, in 3 Minuten schalte die 3 Dinge ein
- einen Eintrag, timeout2, in 3 Minuten, schalte die 3 Dinge aus
Da das ganze sequentiell abgearbeitet wurde ist der Zeitpunkt des Ein und Ausschalten um wenige Millisekunden auseinander. Ich denke so 10 -50.
Sprich ca. 3 Minuten nach Zeitplan-Start werden die 3 Geräte für 10-50 ms eingeschaltet
A.
-
@asgothian
Na das hast du aber toll erklärt! Vielen Dank!
Das hab sogar ich kapiert.
Wie aber arbeitet man denn damit?
Mit "if timeout ..."? -
@andreas-9 sagte: Wie aber arbeitet man denn damit?
Mit Pause, wenn man die Abarbeitung der Schleife verzögern will.
-
@andreas-9 sagte in 3-Wegeventil 3x hintereinander auf und zu machen mit Blockly:
@asgothian
Na das hast du aber toll erklärt! Vielen Dank!
Das hab sogar ich kapiert.
Wie aber arbeitet man denn damit?
Mit "if timeout ..."?Was meinst du mit 'wie arbeitet man damit' ?
Wenn du mehrere Aktionen zeitlich nacheinander haben willst sind Intervalle dein Freund.
Wenn eine Aktion darauf warten soll das so ein Timeout abgearbeitet wurde, dann sind 'hilft-states' unter '0_userdata.0' dein Freund (setzen in dem Teil wo der Timeout abgearbeitet wird, Auswerten über Trigger.
Wenn du Ressourcen verschwenden willst machst du einen 'heartbeat', sprich ein Intervall das jede Sekunde oder so aktiv wird um irgendwelche Variable zu prüfenDie von @paul53 angesprochene 'pause' funktioniert in der Theorie auch, hat aber den Nachteil das sie nicht (ohne weiteres) abgebrochen werden kannn. Die Pause läuft immer bis zum Ende
Ein Skript wie dieses ist also eher ungünstig:
Sobald der Ablauf einmal gestartet wurde läuft der für 150 s ohne eine Chance das er abgebrochen wird - es sei denn jemand beendet das gesamte Skript. Wenn man das gleiche mit Intervallen und/oder timeouts macht kann man bei jeder Aktion das ganze abbrechen.
Natürlich kann man da mit extra-Konstruktionen auch einen Abbruch mit einbauen - das ist aber aufwändig und geht gegen das Prinzip einer 'event-basierten' Abarbeitung auf dem der ioBroker aufbaut.
A
-
@asgothian
Na da hab ich jetzt ja viel Stoff zum rumprobbieren!
Vielen Dank für die ausführlichen Erklärungen.
Sorry, aber mit der Kontext-Hilfe komme ich nicht wirklich zurecht...