NEWS
Intervall stoppt nicht - Kontakte schalten
-
Hallo!
Ich beschäftige mich gerade mit den Timeouts und den Intervall-Funktionen und habe gestern mit Hilfe von @paul53 auch schon eine erste Logik erstellt.
Wo mache ich hier aber den Denkfehler, dass die Intervalle kälter/wärmer zwar deaktiviert weren, wenn die Limits erreicht sind aber dann trotzdem weiterlaufen?
Hier auch noch der Export
<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="$bI:Qyw!.FUcwH}4I-bu">Temperaturschwelle</variable> <variable type="interval" id="Intervall_kaelter">Intervall_kaelter</variable> <variable type="interval" id="Intervall_waermer">Intervall_waermer</variable> </variables> <block type="on_ext" id="}+;*l[!Z|r06sM/=bPYp" x="-387" y="-2588"> <mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation> <field name="CONDITION">any</field> <field name="ACK_CONDITION"></field> <value name="OID0"> <shadow type="field_oid" id="Rz/a4W=#rIMKWt.S9C.v"> <field name="oid">shelly.0.SHHT-1#B88AEE#1.tmp.temperatureC</field> </shadow> </value> <statement name="STATEMENT"> <block type="controls_if" id="_XoZn[7q|1L+/sVOde9)"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_operation" id="lU-wa]~?P}.{n@@;egI0"> <field name="OP">AND</field> <value name="A"> <block type="logic_compare" id="2cz23j3pVY4]0$,3(zVo"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="*:^L$2,Z#dardpSq@~n@"> <field name="ATTR">val</field> <field name="OID">shelly.0.SHPLG-S#1638EE#1.Relay0.Switch</field> </block> </value> <value name="B"> <block type="logic_boolean" id="%!3Y|5|MIsXMv:zE;@2k"> <field name="BOOL">TRUE</field> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="H2i?{)rBGzNQjYd~{{9M"> <field name="OP">GT</field> <value name="A"> <block type="convert_tonumber" id="k|(YotaWT]0#6l-5#|_r"> <value name="VALUE"> <block type="get_value" id="%j[::W3;L+GglXhW[DHP"> <field name="ATTR">val</field> <field name="OID">shelly.0.SHPLG-S#1638EE#1.Relay0.Power</field> </block> </value> </block> </value> <value name="B"> <block type="math_number" id="QlsPB[g(X8oLQD0/;f5W"> <field name="NUM">15</field> </block> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="variables_set" id="Qf5MKSmT5DBmtN+82;)C"> <field name="VAR" id="$bI:Qyw!.FUcwH}4I-bu">Temperaturschwelle</field> <value name="VALUE"> <block type="math_number" id="J;G(zWizZaWm}H*b!yz`"> <field name="NUM">22</field> </block> </value> <next> <block type="debug" id="*b{,1Tx1Ywu;c]0Al4KL"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="i~LqIvHsx:^`fi_*5Tzs"> <field name="TEXT">Heizung ist an!</field> </shadow> </value> <next> <block type="controls_if" id="4E8F]{zAs,kat=s2E:$R"> <mutation elseif="1"></mutation> <value name="IF0"> <block type="logic_compare" id="?NTfB%GksbJH3LlyPcni"> <field name="OP">GT</field> <value name="A"> <block type="convert_tonumber" id="/2CPAt6nRj!rbI|iovP`"> <value name="VALUE"> <block type="on_source" id="YQIM:/3MS{+po0fHLk2^"> <field name="ATTR">state.val</field> </block> </value> </block> </value> <value name="B"> <block type="math_arithmetic" id="CY5i,wjmZg0Pk,OV|kT+"> <field name="OP">ADD</field> <value name="A"> <shadow type="math_number" id="w(Yo?!oN]87S%Z@OvTNK"> <field name="NUM">1</field> </shadow> <block type="variables_get" id=";w@B4b)t#p9NE7Vs?nvR"> <field name="VAR" id="$bI:Qyw!.FUcwH}4I-bu">Temperaturschwelle</field> </block> </value> <value name="B"> <shadow type="math_number" id="Ws@Zd8tB!!SrAa,apV)L"> <field name="NUM">2</field> </shadow> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="timeouts_clearinterval" id="OE6Hp+WK+DYZ~~bSL?6["> <field name="NAME">Intervall_waermer</field> <next> <block type="debug" id="Bt@M;/H9|`+E3]Dawf95"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="8,$(!f.WjmGoU7hEzOdA"> <field name="TEXT">schalte waermer - deaktiviert</field> </shadow> </value> <next> <block type="timeouts_setinterval" id="f!obR;!~-HKoKm98=WP["> <field name="NAME">Intervall_kaelter</field> <field name="INTERVAL">60</field> <field name="UNIT">sec</field> <statement name="STATEMENT"> <block type="control" id="GDz2le/EDI9%sAldXe=V"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">sonoff.0.Sonoff4CH_Pro_Client1 .POWER3</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="XyJ/]d5m]drNh.M-uY]x"> <field name="BOOL">TRUE</field> </block> </value> <next> <block type="control" id="I/SLoH3Zc6o!fPS]0Nw;"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="true"></mutation> <field name="OID">sonoff.0.Sonoff4CH_Pro_Client1 .POWER3</field> <field name="WITH_DELAY">TRUE</field> <field name="DELAY_MS">500</field> <field name="UNIT">ms</field> <field name="CLEAR_RUNNING">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="dJL%B$~:ElRuZhXR}QO="> <field name="BOOL">FALSE</field> </block> </value> <next> <block type="debug" id=")9_!,%[thf(+Fmdo6DTm"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="pT;;Uol/e67Y@699yCX3"> <field name="TEXT">schalte kaelter</field> </shadow> </value> </block> </next> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </statement> <value name="IF1"> <block type="logic_compare" id="GFlyWC#^Wiw}.-iGbtN0"> <field name="OP">GT</field> <value name="A"> <block type="convert_tonumber" id="25)xvH}C*;H!Hqc8bT6h"> <value name="VALUE"> <block type="on_source" id="_dq%%)9z:1!ED{z2%{;J"> <field name="ATTR">oldState.val</field> </block> </value> </block> </value> <value name="B"> <block type="math_arithmetic" id="]O5Hyji$U9NWj%BmIvwg"> <field name="OP">ADD</field> <value name="A"> <shadow type="math_number"> <field name="NUM">1</field> </shadow> <block type="variables_get" id="@=wuo;6P??V~JA]9$p])"> <field name="VAR" id="$bI:Qyw!.FUcwH}4I-bu">Temperaturschwelle</field> </block> </value> <value name="B"> <shadow type="math_number" id="DWLvf~,cbf-C~WT-31Xm"> <field name="NUM">2</field> </shadow> </value> </block> </value> </block> </value> <statement name="DO1"> <block type="timeouts_clearinterval" id="-`;y*ODDvClxsAOUdqGj"> <field name="NAME">Intervall_kaelter</field> <next> <block type="debug" id="|Wes}tdL!T6i7TqVUzAg"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="pIzV/`bA~BD5RC5YP};B"> <field name="TEXT">schalte kaelter - deaktiviert</field> </shadow> </value> </block> </next> </block> </statement> <next> <block type="controls_if" id="N7H::r2!l3*j*yy$3Eb+"> <mutation elseif="1"></mutation> <value name="IF0"> <block type="logic_compare" id="ed,y8tqXomuRZe@cekL2"> <field name="OP">LT</field> <value name="A"> <block type="convert_tonumber" id="XHuX)!?^Z^`(dWj1p9Xw"> <value name="VALUE"> <block type="on_source" id="ONwAqR!h-RG#P-)W_;U,"> <field name="ATTR">state.val</field> </block> </value> </block> </value> <value name="B"> <block type="variables_get" id="]~KsL:(1%9D(CK@X5RUW"> <field name="VAR" id="$bI:Qyw!.FUcwH}4I-bu">Temperaturschwelle</field> </block> </value> </block> </value> <statement name="DO0"> <block type="timeouts_clearinterval" id="#nvvT[URGIW6Ak^X?o{V"> <field name="NAME">Intervall_kaelter</field> <next> <block type="debug" id="tAHgyV[8BxpfFSoOt%i?"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="$(Qk$t?/m$F,!qbCj)=G"> <field name="TEXT">schalte kaelter - deaktiviert</field> </shadow> </value> <next> <block type="timeouts_setinterval" id="/t*n9iz|?+`Ntst$56X-"> <field name="NAME">Intervall_waermer</field> <field name="INTERVAL">60</field> <field name="UNIT">sec</field> <statement name="STATEMENT"> <block type="control" id="/J#kb!]_U,ISlFYt_Cd7"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">sonoff.0.Sonoff4CH_Pro_Client1 .POWER2</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="`;r1Yx}.aBWc6MI:X~#p"> <field name="BOOL">TRUE</field> </block> </value> <next> <block type="control" id="BbC}!!_PSt4-{Cy)aW]j"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="true"></mutation> <field name="OID">sonoff.0.Sonoff4CH_Pro_Client1 .POWER2</field> <field name="WITH_DELAY">TRUE</field> <field name="DELAY_MS">500</field> <field name="UNIT">ms</field> <field name="CLEAR_RUNNING">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="Rb6?#x~jk%{QR_iG)byn"> <field name="BOOL">FALSE</field> </block> </value> <next> <block type="debug" id="`fQeONQC#h*4m_a~Ix^`"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="Z*ZyWTX:sY0gM4(BQ!AA"> <field name="TEXT">schalte waermer</field> </shadow> </value> </block> </next> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </statement> <value name="IF1"> <block type="logic_compare" id="_Oi~19+H1X,n|9R3Wxzc"> <field name="OP">LT</field> <value name="A"> <block type="convert_tonumber" id="h+AbeOIHSULP)zK_Ha|e"> <value name="VALUE"> <block type="on_source" id=".$76L.V@Pt.+L=z050{E"> <field name="ATTR">oldState.val</field> </block> </value> </block> </value> <value name="B"> <block type="variables_get" id="YbX0RG,R90d4ymHO:cMX"> <field name="VAR" id="$bI:Qyw!.FUcwH}4I-bu">Temperaturschwelle</field> </block> </value> </block> </value> <statement name="DO1"> <block type="timeouts_clearinterval" id="0Tj!d01pE[xOCRI8QCFo"> <field name="NAME">Intervall_kaelter</field> <next> <block type="debug" id="u8YpbzfHYTxqH1h5DKlY"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="=jNqQoK4(1.bAjAE$/#["> <field name="TEXT">schalte waermer - deaktiviert</field> </shadow> </value> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </statement> <statement name="ELSE"> <block type="debug" id="::dD/h{5pCQ[*kR)+0UT"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="G)ZJLe`uLVd(Ita$(1t?"> <field name="TEXT">Heizung ist aus!</field> </shadow> </value> </block> </statement> </block> </statement> </block> </xml>
-
EDIT: Damit die Bedingung für den vorherigen Wert auch bei Skriptstart erfüllt ist, würde ich den Datenpunktwert bei Start entsprechend setzen.
-
@paul53 oh wow - genial Bei dem Schema wird der Intervall auf alle Fälle immer vorher beendet. Irgendwo habe ich einen Knoten im Kopf, weshalb ich nicht erkenne, in welchem Fall der Intervall in meinem Code nicht abbrechen würde. Kannst du noch mal mit dem Finger drauf zeigen?
Würde es im Prinzip nicht aufs Gleiche rauskommen, wenn ich in meinem Code jeweils kaelter und waermer vor jedem erneuten Start stoppe? Ich habe allerdings das Gefühl, dass es hier auch wieder zu Problemen kommen könnte:
Interessant finde ich als erstes auf alle Fälle dein EDIT, da ich mir gerade vorhin auch Gedanken zu dem Problem mit der Steckdose und der Inaktivität gemacht habe.
Wenn kein oder nur ein geringer Verbraucher angeschlossen ist und die Steckdose (warum auch immer) an, wären "WERT" und "VORHERIGER WERT" immer annährend gleich aber immer unter dem Limit. So auch hier bei der Temperatur. Mit der Aktualisierung müsste das tatsächlich umgangen werden. Vielleicht sollte man den Wert nur in einer Variable speichern, damit die Temperatur-Logs o.ä. nicht beeinflusst werden.
Ich denke die Tage auf alle Fälle noch einmal drauf rum. Vielen Dank für die erneute und schnelle Hilfe. Ich werde Rückmeldung geben, ob es so funktioniert!
-
@IckZ sagte:
Vielleicht sollte man den Wert nur in einer Variable speichern,
Dann kann man "vorheriger Wert" nicht verwenden, denn den gibt es nur im Datenpunkt. Stattdessen müsste man sich den Wert in dieser Variablen merken.
Anmerkung: Ein Intervall von 60 s ist für thermische Prozesse sicher zu kurz. 10 Minuten würden besser passen.
-
@paul53 Guten Abend!
Verstehe. So wie ich das sehe, aktualisiert "aktualisiere Wert" auch nicht den Wert im Gerät sondern nur im Code. Zumindest tauchen keine Ausreißer in meinen Testlogs auf die ich für Grafana erstellen lasse. Kann das sein?
Zu deiner Anmerkung: Ja stimmt :). Ich habe die 60Sek aktuell auch nur testweise reingesetzt, damit ich schneller sehen kann, was passiert. Schneller geht leider nicht, da das Modul (welches schaltet) sonst ggf. Probleme bekommt.
Trotzdem brüte ich noch über deinem und meinem Skript und würde mich über eine Erklärung freuen:
Ausgangslage:
Heizung geht an: 18 Grad (Wert). 23 Grad (vorheriger Wert bei Start gesetzt).- In deinem Skript läuft er bis in das letzte "sonst falls" und schaltet intervall wärmer an
- Bei meinem in das letzte "falls" und schaltet intervall wärmer
Werte ändern sich:
Jetzt 24 Grad und 18 (vorheriger)-
In deinem Skript würde ich vermute, dass er in das erste "sonst falls" geht und den eigentlich unteren "falls" ignoriert und damit fälschlicherweise kälter schaltet bevor er dann auch noch in das 2. falls geht und den Intervall für wärmer aktiviert? Fehlt da nicht ein und Wert > Temperaturschwelle im ersten "sonst falls"?
-
In meinem Skript würde ich denken, dass er in das letzte sonst falls geht und den Intervall für wärmer stoppt.
Werte ändern sich wieder:
Jetzt 21 Grad und 24 (vorheriger)- In deinem Skript (angenommen alles ist planmäßig aus) -> kälter geht aus (läuft aber nicht) -> wärmer geht an = top!
- In meinem Skript -> wärmer geht an.
Werte ändern sich wider
Jetzt 25 vorheriger 21- In deinem Skript -> kälter geht an -> wärmer geht aus
- In meinem Skript ->wärmer geht aus -> kälter geht an.
So interpretiere ich beide Skripte. Bei meinem weiß ich schon, dass er irgendwo mehrere Instanzen anwirft. Deins konnte ich "live" noch nicht testen. Irgendwo muss ich einen grundlegenden Denkfehler machen.
-
@IckZ
Zum Verständnis meines Vorschlags (erster Teil "Kühlen"):- falls Wert < Schwelle + 2
wird bei allen Temperaturen < 24 ausgeführt - sonst falls vorheriger Wert < Schwelle + 2
wird ausgeführt, wenn Wert >= 24 UND der Wert davor < 24 war, also nur bei Änderung von < 24 auf >= 24, womit zusammen mit dem Stop Intervall im falls-Zweig verhindert wird, dass mehrere Intervalle gestartet werden
Ein mehrfaches (auch unnötiges) Stoppen von Intervallen hat keine (negativen) Auswirkungen. Insofern ist eine Debug-Ausgabe "schalte kälter deaktiviert" eher irreführend. Will man die Debug-Ausgabe nur machen, wenn tatsächlich deaktiviert wird, muss man eine zusätzliche Abfrage machen:
- falls Wert < Schwelle + 2
-
@paul53 Oh Mann. Ich hatte echt Tomaten auf den Augen. Meine Fantasie-Werte hatte ich zufällig gewählt und bei den 24 Grad liegt ja auch genau die Grenze zum Kühlen im Skript. Ich hatte die ganze Zeit noch alles größer als 24 im Sinn..
Mein anderes Beispiel mit 20 ist und 18 vorherigem Wert ging auch nicht auf wenn man nicht berücksichtigt das der Intervall wärmer initial ja schon läuft und genau deshalb kein neuer Intervall starten soll. --> und hier dürfte auch mein Fehler im Ursprungsskript liegen. Muss ich die Tage noch einmal drauf rumdenken.
Nochmals vielen Dank! Mir ist Programmierung zwar kein Fremdwort aber wenn man nicht richtig liest kann es auch nichts werden ;). Eine gute Nacht und vielleicht bis zum nächsten Mal.