NEWS
Frage zu Blockly - schalten
-
Hallo,
das Problem sitzt hier sicherlich vorm Monitor, aber ich finde den Ansatz nicht
Abhängig von der Außentemperatur möchte ich etwas schalten.
Da die Außentemperatur (z.Zt) an 4 Stellen zum Schalten notwendig ist, habe ich mit zuerst einen Datenpunkt erstellt, der abhängig von der Temperatur wahr oder unwahr wird.
Mein Gedanke war, damit das System zu entlasten.
Außerdem können die Werte so zentral geändert werden
Alle 5 Minuten wird die Temperatur abgefragt.
Der Code:
<xml xmlns="http://www.w3.org/1999/xhtml"><block type="timeouts_setinterval" id="F[o`Y/`qLp?ZCKJF6VX`" x="-537" y="-462"><field name="NAME">Intervall</field> <field name="INTERVAL">5</field> <field name="UNIT">min</field> <statement name="STATEMENT"><block type="controls_if" id="sYqd]`^5c;#i@Fxo3+4("><mutation else="1"></mutation> <value name="IF0"><block type="logic_compare" id=".Ld!1Y8BU/S/3YXeYW#N"><field name="OP">LTE</field> <value name="A"><block type="get_value" id="`mRT]HA=M9iN91c2@@wj"><field name="ATTR">val</field> <field name="OID">mqtt.0.ESP_3.GET.Temp.Temperature</field></block></value> <value name="B"><block type="math_number" id="=DzQJr)jUiBFL8H{5m1x"><field name="NUM">0.5</field></block></value></block></value> <statement name="DO0"><block type="control" id="?TFu5d#;2KYc%HW5}r@b"><mutation delay_input="false"></mutation> <field name="OID">Datenpunkte.0.Außen.Frost</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="logic_boolean" id=":Jo^GV87eKGT^~V.omyp"><field name="BOOL">TRUE</field></block></value></block></statement> <statement name="ELSE"><block type="control" id="!2NMX[/v^PcJwp!F(50F"><mutation delay_input="false"></mutation> <field name="OID">Datenpunkte.0.Außen.Frost</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="logic_boolean" id="K8t*|bkA1zFntT-{-U2E"><field name="BOOL">FALSE</field></block></value></block></statement> <next><block type="controls_if" id="io[*Km|pszG`;!9@l0*{"><mutation else="1"></mutation> <value name="IF0"><block type="logic_compare" id="0gA!:@ofqeG({AWaPAKh"><field name="OP">LTE</field> <value name="A"><block type="get_value" id="Kq(+V7Pl|vzee01RvjC3"><field name="ATTR">val</field> <field name="OID">mqtt.0.ESP_3.GET.Temp.Temperature</field></block></value> <value name="B"><block type="math_number" id="#5EZ+zUaFL#SjJ(dmn41"><field name="NUM">-1</field></block></value></block></value> <statement name="DO0"><block type="control" id="MCOsRA^K_?z;Wk}_/wnH"><mutation delay_input="false"></mutation> <field name="OID">Datenpunkte.0.Außen.Kalt</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="logic_boolean" id="+U^[51x*D%~i-2HTnvb0"><field name="BOOL">TRUE</field></block></value></block></statement> <statement name="ELSE"><block type="control" id="vdom8BPgD@/;~0U}OHa_"><mutation delay_input="false"></mutation> <field name="OID">Datenpunkte.0.Außen.Kalt</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="logic_boolean" id="/6rtG~m%{B/D%wMW@5@!"><field name="BOOL">FALSE</field></block></value></block></statement></block></next></block></statement></block></xml>
Dieses funktionierte heute auch soweit. (Zumindest so weit wie es zu erkennen war)
Ab (unter) 0,5°C soll es Frost sein, wenn kälter als -1°C soll es kalt sein.
Ob die Werte irgendwann auch mal wieder "zurück" gehen auf unwahr konnte ich noch nicht testen.
Damit möchte ich jetzt eine Heizung schalten.
Der Code:
`<xml xmlns="http://www.w3.org/1999/xhtml"><block type="on" id="%*ZDrL6/Z?ajIXp^k#6P" x="-612" y="-263"><field name="OID">Datenpunkte.0.Dummy</field> <field name="CONDITION">ne</field> <statement name="STATEMENT"><block type="debug" id="qMZ/uxJVn[p!zoJ(nzRq"><field name="Severity">error</field> <value name="TEXT"><shadow type="text" id="Hz4FJQv!j)g7k@o?|+2z"><field name="TEXT">Frost wurde geändert</field></shadow></value> <next><block type="controls_if" id="DAVuF1CH%)vXosmqjVKz"><value name="IF0"><block type="logic_operation" id=":Lm+dmPJL.sNa3pjG2Vh" inline="false"><field name="OP">AND</field> <value name="A"><block type="logic_compare" id=";pEMG5|7IS+n7VLO{9H^"><field name="OP">EQ</field> <value name="A"><block type="get_value" id="AX?{3[jwdf]iQI(JxCc)"><field name="ATTR">val</field> <field name="OID">Datenpunkte.0.Außen.Frost</field></block></value> <value name="B"><block type="logic_boolean" id="#y5ubp)X0iuE/b%`xRBc"><field name="BOOL">TRUE</field></block></value></block></value> <value name="B"><block type="logic_compare" id="b=Ndf2Px~fOpJe+:2t8n"><field name="OP">LT</field> <value name="A"><block type="get_value" id="OtHivsf]n(uu?f1JenI="><field name="ATTR">val</field> <field name="OID">mqtt.0.ESP_4.GET.Temperatur.Temperatur</field></block></value> <value name="B"><block type="math_number" id="oyG43(hnI!E8]n(A5Y+3"><field name="NUM">3.2</field></block></value></block></value></block></value> <statement name="DO0"><block type="control" id="nq4Hh7``0hp~yO-X=:dM"><mutation delay_input="false"></mutation> <field name="OID">mqtt.0.ESP_4.SET.GPIO.12</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="math_number" id="*LH7;zICzAceJ+`kq;_K"><field name="NUM">1</field></block></value></block></statement> <next><block type="controls_if" id="Y0?x~cJ#tacmNxq)q;}r"><value name="IF0"><block type="logic_operation" id="SDh^Ca~9P5-oIfMAr{+l" inline="false"><field name="OP">AND</field> <value name="A"><block type="logic_compare" id="[UJ5@ljA~GpXTU-}3?/_"><field name="OP">EQ</field> <value name="A"><block type="get_value" id="q@Z[C[ee%{@tt^tm.yU;"><field name="ATTR">val</field> <field name="OID">Datenpunkte.0.Außen.Frost</field></block></value> <value name="B"><block type="logic_boolean" id="Qd]9:6oTqbyS[X]5ssf-"><field name="BOOL">TRUE</field></block></value></block></value> <value name="B"><block type="logic_compare" id="P).On5c^WG}m@[hTsOLe"><field name="OP">GT</field> <value name="A"><block type="get_value" id="r%|9|Ma:4`mVl:ks-oO^"><field name="ATTR">val</field> <field name="OID">mqtt.0.ESP_4.GET.Temperatur.Temperatur</field></block></value> <value name="B"><block type="math_number" id="6FG^|+Gocs*vTzofh{_l"><field name="NUM">4</field></block></value></block></value></block></value> <statement name="DO0"><block type="control" id="}OfhNOM8EB]Xrf(8fTVy"><mutation delay_input="false"></mutation> <field name="OID">mqtt.0.ESP_4.SET.GPIO.12</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="math_number" id="gX;20:da);R3mcQ=!DV1"><field name="NUM">0</field></block></value></block></statement> <next><block type="controls_if" id="W~XmcVnOnQo@Xb_gPKF!"><value name="IF0"><block type="logic_compare" id="z7e(eB*T|(@3k.u+uUr%"><field name="OP">EQ</field> <value name="A"><block type="get_value" id="s_,pGzMI`q!MQ:PqNCn%"><field name="ATTR">val</field> <field name="OID">Datenpunkte.0.Außen.Frost</field></block></value> <value name="B"><block type="logic_boolean" id="bV[s]LK;0+vp:pNh8F1-"><field name="BOOL">FALSE</field></block></value></block></value> <statement name="DO0"><block type="control" id="zGq27;{O66kJQ?rT6Bql"><mutation delay_input="false"></mutation> <field name="OID">mqtt.0.ESP_4.SET.GPIO.12</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="math_number" id="gkXS!i@XLz7RPrR}[BED"><field name="NUM">0</field></block></value></block></statement></block></next></block></next></block></next></block></statement></block></xml>` Zum debuggen haben ich den Datenpunkt Frost per Hand geändert. Dadurch wurde das Skript Frost gestoppt. Das ist mein erstes Problem, welches ich nicht nachvollziehen kann?! Passiert das automatisch durch das Überschreiben oder ist das ein Fehler? Ist der Ansatz überhaupt richtig? Kann es mit der Logik überhaupt irgendwann wieder "warm" werden? (Also Kalt und Frost = unwahr) Oder muss ich da die Temperatur nach oben hin abfragen und den Wert setzen? Da das debuggen mit manuellem setzen des Wertes Frost nicht funktioniert, habe ich zum Testen den Dummy im Trigger eingesetzt. Ich habe keine Ahnung, ob das stoppen des Skriptes Frost nachher keinen Trigger mehr ausführen kann, aber die Debug-Meldung kam nicht im Log und somit gab es keinen Trigger. Nächstes Problem: Das einschalten ging zwar, aber die gemessene Temperatur, welche das Ausschalten bewirken soll, liegt jetzt schon bei 4,25 und GPIO12 ist immer noch an. Außerdem bezweifel ich beim Betrachten des Codes, das überhaupt mal etwas anderes als einschalten passiert, da das Trigger-Ereignis ja nur 1 X kommt und die anderen Blöcke mit falls ja nicht abgearbeitet werden können :o Welchen Ansatz muss ich hier verfolgen, damit es so klappt wie es soll? Und was kann ich ggf. als Anfänger noch besser lösen? Werden noch weitere Infos benötigt um das Problem nachvollziehen zu können? Ich danke euch für jeden Lösungsansatz!!![/s]
-
den trigger "dummy" gibt es nicht ….. ( für mich nicht ersichtlich)
-
Doch, gibt es. Habe ich selbst angelegt.
Da das debuggen mit manuellem setzen des Wertes Frost nicht funktioniert, habe ich zum Testen den Dummy im Trigger eingesetzt.
Ich habe keine Ahnung, ob das stoppen des Skriptes Frost nachher keinen Trigger mehr ausführen kann, aber die Debug-Meldung kam nicht im Log und somit gab es keinen Trigger. `
Haben den Datenpunkt momentan wieder auf Frost gestellt und den Code geändert.
Den Trigger Frost und Kalt habe ich mit Feuerzeug und Eis getestet. Funktioniert wie es auch soll.
Momentan ist Frost = true und die Einschalttemperatur erreicht. Aber die Schleife läuft nicht durch.
Außerdem hatten vorhin 2 von 8 CPU-Kerne 100%.
Meiner Ansicht nach würde die Schleife, wenn sie läuft, immer sehr schnell durchlaufen.
Und damit Last ohne Ende erzeugen.
Ich habe schon überlegt ein Timeout von 2 Minuten am Anfang der Schleife zu setzen.
Aber momentan läuft die Schleife nicht
Und die Außentemperatur wird jede Minute neu geschrieben. Auf diese zu triggern, dache ich zumindest, würde zu viel Systemlast erzeugen, da fast jede Minute auch ein neuer Wert geschrieben wird.
Ich hatte den Block auch schon mit sonst falls und sonst aufgebaut. Aber der Trigger kommt ja nur 1 X und damit läuft das nicht ständig durch.
EDIT: Weiter überlegt, ich trigger auf der Temperatur, dann gibt es ein Ereignis, aber sollte die Temperatur, warum auch immer, konstant bleiben, dann heizt die Heizung munter bis auf 28°C (da schaltet sich sich von alleine aus) und das wäre zu teuer (Stromkosten)!
Oder wäre es die Lösung, das Skript abhängig vom Zustand Frost ein und aus zu schalten und in einer Schleife, welche alle 2 Minuten durchläuft die Temperaturen abzufragen?
Im Sommer wird das Skript nicht benötigt. Und meine Frau wird ungnädig, wenn es Nachts überraschender Weise gefroren hat und das Wasser gefroren ist und sie welches aus dem Haus holen muss.
Dafür braucht man am Ende keine Automatisierung