Ich habe das Skript noch einmal überarbeitet und um "alter_Wert" ergänzt. So wird der Datenpunkt nicht mit "dummy-Daten" befüllt und mein Logging ist genauer.
NEWS
Latest posts made by IckZ
-
RE: [gelöst] Steckdose nach Inaktivität abschalten
-
RE: Blockly, für mich nicht verständlich
@PatrickFro Alternativ gibt es in dem Thread dazu auch mehr Infos: https://forum.iobroker.net/topic/38363/gelöst-steckdose-nach-inaktivität-abschalten
-
RE: Ausführung wen State für x zeit nicht verändert
@B4unty Moin Moin,
ich habe kürzlich mit der Hilfe vom Forum ein ähnliches Skript für das Schalten einer Steckdose erstellt. Die Steckdose schaltet sich ab sofern 5min nichts passiert ist. Mit ein paar Anpassungen müsste es so auch für dein Tor funktionieren:Dann brauchst du keine Datenpunkte schreiben.
-
RE: Intervall stoppt nicht - Kontakte schalten
@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.
-
RE: Intervall stoppt nicht - Kontakte schalten
@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.
-
RE: Intervall stoppt nicht - Kontakte schalten
@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!
-
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>
-
RE: [gelöst] Steckdose nach Inaktivität abschalten
@paul53 said in Steckdose nach Inaktivität abschalten:
Das glaube ich nicht.
Du hast natürlich recht. Meine anfänglichen Tests waren zu kurz um das Vorkommen meherer Instanzen zu loggen. Nachdem ich die Inaktivität hochgesetzt hatte, wurde dies aber ersichtlich.
-
RE: [gelöst] Steckdose nach Inaktivität abschalten
@paul53 Vielen Dank für die Hilfe. Das funktioniert offenbar sehr gut. Das Skript sieht jetzt, für die, die es interessiert, so aus:
Viel kompakter als das, was ich vorher hatte. Und durh den Einsatz von "vorheriger" Wert wird anscheinend verhindert, dass mehrere Timer gestartet werden. Das hat zwar während meinen Tests auch schon ganz gut geklappt aber so ist es erheblich besser. TOP!
-
[gelöst] Steckdose nach Inaktivität abschalten
Hallo zusammen,
ich versuche mich an meinem ersten Skript zum Schalten einer Steckdose. Die Steckdose soll sich nach 60Sek. abschalten, sofern die Leistungaufnahme innerhalb dieser Zeit unter konstant unter 8Watt lag. Sollte innerhalb der Minute die Leistungsaufnahme noch einmal über 8Watt ansteigen, sollen die 60Sek von vorne beginnen, sobald die Leistungsaufnahme wieder unter 8Watt fällt. Im Prinzip will ich damit ein Gerät im Standby vom Strom trennen.- arbeitet Blockly so, dass er nach dem Timeout den aktuellen Wert ausliest, oder nimmt er den Wert, den er zum Start des Skriptes anliegen hatte?
- spielt es in dem Fall eine Rolle ob ich den Wert nach "geändert" oder nach "aktualisiert" abrufe? Im Fall von "aktualisiert" könnte es wahrscheinlich zu vielen paralleleln Abläufen kommen die sich u.U. gegenseitig behindern, oder?
Was meint ihr dazu?
Vielen Dank im Voraus!