Mal wieder: Steuerung Zirkulationspumpe mit Tasmota rule und DS18B20

  • Hallo,

    ich versuche, meine Zirkulationspumpe mit einr Tasmota rule temperaturgesteuert zu schalten. Pumpe steckt in einer Sonoff S20 Steckdose, ein DS18B20 ist angeschlossen, und misst die Temperatur vom Warmwasserausgang am Speicher. Beim aufdrehen vom Wasserhahn steigt die Temperatur nach ca. 5 Sekunden um 0,2 Grad.

    Somit soll die Steckdose schalten, wenn eine Temperaturerhöhung detektiert wird, und nach einer vorgegebenen Zeit wieder abschalten.

    Um die Ansprechzeit optimal einstellen zu können, sollen folgende Werte übergeben werden:

    mem1 -Zeit zwischen den Temperaturmessungen

    mem2. -Temperaturerhöhung, bei der geschaltet wird

    mem3. -Pumpenlaufzeit

    Bei der rule komme ich nit sehr weit, trotz langer Recherche:

    ON DS18B20-3#temperature DO event t1=%value% ENDON

    ON event#t1 DO RuleTimer1 5 ENDON

    ON Rules#Timer=1 DO BACKLOG var1=(%value%+0.2); endon

    ON event#t1 DO IF (%value%)>=(var1) BACKLOG POWER1 on; RuleTimer2 60 ENDIF ENDON

    Funktioniert so noch überhaupt nicht. Die mem1 - mem3 Abfrage in der rule hab ich auch noch nicht eingebaut.

    Kann mich jemand auf den richtigen Weg bringen?


    Thorsten

  • Zirkulationspumpe als Suchwort für ALLE eingeben- da kommen noch mehr Anregungen und Beispiele in diesem Forum

    Rest nochmals anfragen.

    mem1 - besser teleperiod nutzen zum Anfang


    Rule1 1

    Rule1

    ON tele-DS18B20-3#temperature>12 DO Power1 on ENDON

    ON tele-DS18B20-3#temperature<10 DO Power1 off ENDON

  • Naja, ein einfaches einschalten nach fest vorgegebener Temperatur habe ich auch schon hinbekommen. Der Witz ist ja, das permanent die Temperatur überwacht wird, und bei Erhöhung die Pumpe eingeschaltet wird (Wasserentnahme).

    Fest vorgegebene Temperaturen funktionieren nicht, da die Speichertemperatur variiert (Solarthermie).

    Gruß

  • dann mal zum Test mit der internen Temperatur der CPU

    'Hinweise müssen vor dem Laden entfernt werden !!!

    die nötige Hysterese um kein Dauereinschalten zu erzeugen hängt von der teleperiod ab

    rule1

    ' Laden aktuelle Tempratur in VAR1

    on tele-analog#Temperature do Backlog VAR1 %value% endon

    rule2

    'wenn sich VAR1 ändert wird VAR2 mit VAR1 geladen und dann um mem2-Inhalt erhöhen

    on VAR1#State do backlog VAR2 %VAR1%; SUB2 %mem2% endon

    'Vergleich führt zum Einschalten und setzt Ausschaltzielzeit 20 Sek.

    on VAR2#State>%VAR1% do backlog Power1 1; RuleTimer1 %mem3% endon

    on Rules#Timer=1 do Power1 0 endon

    Einmal editiert, zuletzt von karoCB (4. Juni 2023 um 12:14)

  • Soweit bin ich jetzt, aber leider funktioniert es noch nicht:

    rule2

    on VAR1#State do backlog VAR2 %VAR1%; ADD2 %mem2%; Delay 150 endon

    on VAR2#State>=%VAR1% do backlog Power1 1; RuleTimer1 %mem3% endon

    on VAR2#State<=%VAR1% do Power1 0; endon

    on Rules#Timer=1 do Power1 0


    rule1

    on tele-DS18B20-3#temperature do Backlog VAR1 %value% endon

    mem2=0.3

    mem3=20

    Teleperiod=10


    Ich denke, die beiden Werte werden noch nicht korrekt verglichen.

    Gruß

  • delay 150 - das wird nichts !

    der Trigger läuft über die Teleperiod

    Teleperiod 150 eingeben

    und mal den Consolenexport posten

    und auch mal die Rules posten - fehlt mindestens ein endon

    VAR2 wird nicht kleiner als Var1 - damit ist dieses Schalten nicht möglich und nicht in der Aufgabenstellung gewesen

    ( diese Erweiterung schaltet immer Aus)

    Aus - nur über die Teleperiodenzeit - wenn nach mem3-Zeit Aus - die Abkühlung in der teleperiodzeit kleiner ist als mem2- Delta dann bleibt es aus


    3 Mal editiert, zuletzt von karoCB (28. Mai 2023 um 10:09)

  • Ach so. Mein Ansatz war, dass die Pumpe für eine vorgegebene Zeit eingeschaltet wird, wenn eine Temp Erhöhung ekannt wird.

    Consolen Output kann ich im Moment nicht posten, bin nicht zu Hause.

    Gruß

  • Console

    heizung/Zirkulation/tele/SENSOR = {"Time":"2023-05-29T16:37:14","DS18B20-1":{"Id":"3C08F6489460","Temperature":59.1},"DS18B20-2":{"Id":"3CACF6484987","Temperature":74.0},"DS18B20-3":{"Id":"3CADF648550C","Temperature":60.6},"DS18B20-4":{"Id":"3CBAF6488C15","Temperature":63.4},"TempUnit":"C"}

    16:37:14.414 RUL: TELE-DS18B20-3#TEMPERATURE performs "Backlog VAR1 60.6"

    16:37:14.431 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"POWER":"ON"}

    16:37:14.436 MQT: /smarthome/heizung/Zirkulation/stat/POWER = ON

    16:37:14.635 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"T1":19,"T2":0,"T3":0,"T4":0,"T5":0,"T6":0,"T7":0,"T8":0}

    16:37:14.883 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"POWER":"ON"}

    16:37:14.888 MQT: /smarthome/heizung/Zirkulation/stat/POWER = ON

    16:37:15.086 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"T1":20,"T2":0,"T3":0,"T4":0,"T5":0,"T6":0,"T7":0,"T8":0}

    16:37:15.335 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"Var1":"60.6"}

    16:37:15.360 RUL: VAR1#STATE performs "backlog VAR2 60.6; ADD2 0.300; Delay 150"

    16:37:15.430 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"Var2":"60.6"}

    16:37:15.455 RUL: VAR2#STATE>=%VAR1% performs "backlog Power1 1; RuleTimer1 20"

    16:37:15.471 RUL: VAR2#STATE<=%VAR1% performs "Power1 0;"

    16:37:15.480 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"POWER":"OFF"}

    16:37:15.485 MQT: /smarthome/heizung/Zirkulation/stat/POWER = OFF

    16:37:15.700 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"Add2":"60.900"}

    16:37:15.724 RUL: VAR2#STATE>=%VAR1% performs "backlog Power1 1; RuleTimer1 20"

    16:37:15.749 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"Delay":150}

    16:37:24.394 MQT: /smarthome/heizung/Zirkulation/tele/STATE = {"Time":"2023-05-29T16:37:24","Uptime":"3T19:34:31","UptimeSec":329671,"Heap":25,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":1,"POWER":"OFF","Wifi":{"AP":1,"SSId":"FRITZ!Box Fon WLAN 73902","BSSId":"08:96:D7:49:BF:74","Channel":1,"Mode":"11n","RSSI":84,"Signal":-58,"LinkCount":1,"Downtime":"0T00:00:03"}}

    16:37:24.409 MQT: /smarthome/heizung/Zirkulation/tele/SENSOR = {"Time":"2023-05-29T16:37:24","DS18B20-1":{"Id":"3C08F6489460","Temperature":59.1},"DS18B20-2":{"Id":"3CACF6484987","Temperature":73.8},"DS18B20-3":{"Id":"3CADF648550C","Temperature":60.8},"DS18B20-4":{"Id":"3CBAF6488C15","Temperature":63.4},"TempUnit":"C"}

    16:37:24.426 RUL: TELE-DS18B20-3#TEMPERATURE performs "Backlog VAR1 60.8"

    16:37:24.444 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"POWER":"ON"}

    16:37:24.448 MQT: /smarthome/heizung/Zirkulation/stat/POWER = ON

    16:37:24.694 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"T1":20,"T2":0,"T3":0,"T4":0,"T5":0,"T6":0,"T7":0,"T8":0}

    16:37:24.945 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"POWER":"ON"}

    16:37:24.950 MQT: /smarthome/heizung/Zirkulation/stat/POWER = ON

    16:37:25.196 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"T1":19,"T2":0,"T3":0,"T4":0,"T5":0,"T6":0,"T7":0,"T8":0}

    16:37:25.446 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"Var1":"60.8"}

    16:37:25.473 RUL: VAR1#STATE performs "backlog VAR2 60.8; ADD2 0.300; Delay 150"

    16:37:25.495 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"Var2":"60.8"}

    16:37:25.523 RUL: VAR2#STATE>=%VAR1% performs "backlog Power1 1; RuleTimer1 20"

    16:37:25.536 RUL: VAR2#STATE<=%VAR1% performs "Power1 0;"

    16:37:25.543 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"POWER":"OFF"}

    16:37:25.548 MQT: /smarthome/heizung/Zirkulation/stat/POWER = OFF

    16:37:25.763 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"Add2":"61.100"}

    16:37:25.791 RUL: VAR2#STATE>=%VAR1% performs "backlog Power1 1; RuleTimer1 20"

    16:37:25.811 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"Delay":150}

    16:37:34.354 MQT: /smarthome/heizung/Zirkulation/tele/STATE = {"Time":"2023-05-29T16:37:34","Uptime":"3T19:34:41","UptimeSec":329681,"Heap":25,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":1,"POWER":"OFF","Wifi":{"AP":1,"SSId":"FRITZ!Box Fon WLAN 73902","BSSId":"08:96:D7:49:BF:74","Channel":1,"Mode":"11n","RSSI":84,"Signal":-58,"LinkCount":1,"Downtime":"0T00:00:03"}}

    16:37:34.365 MQT: /smarthome/heizung/Zirkulation/tele/SENSOR = {"Time":"2023-05-29T16:37:34","DS18B20-1":{"Id":"3C08F6489460","Temperature":59.0},"DS18B20-2":{"Id":"3CACF6484987","Temperature":73.6},"DS18B20-3":{"Id":"3CADF648550C","Temperature":60.9},"DS18B20-4":{"Id":"3CBAF6488C15","Temperature":63.4},"TempUnit":"C"}

    16:37:34.379 RUL: TELE-DS18B20-3#TEMPERATURE performs "Backlog VAR1 60.9"

    16:37:34.406 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"POWER":"ON"}

    16:37:34.411 MQT: /smarthome/heizung/Zirkulation/stat/POWER = ON

    16:37:34.609 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"T1":20,"T2":0,"T3":0,"T4":0,"T5":0,"T6":0,"T7":0,"T8":0}

    16:37:34.810 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"POWER":"ON"}

    16:37:34.813 MQT: /smarthome/heizung/Zirkulation/stat/POWER = ON

    16:37:35.063 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"T1":20,"T2":0,"T3":0,"T4":0,"T5":0,"T6":0,"T7":0,"T8":0}

    16:37:35.313 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"Var1":"60.9"}

    16:37:35.340 RUL: VAR1#STATE performs "backlog VAR2 60.9; ADD2 0.300; Delay 150"

    16:37:35.408 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"Var2":"60.9"}

    16:37:35.437 RUL: VAR2#STATE>=%VAR1% performs "backlog Power1 1; RuleTimer1 20"

    16:37:35.450 RUL: VAR2#STATE<=%VAR1% performs "Power1 0;"

    16:37:35.457 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"POWER":"OFF"}

    16:37:35.462 MQT: /smarthome/heizung/Zirkulation/stat/POWER = OFF

    16:37:35.678 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"Add2":"61.200"}

    16:37:35.705 RUL: VAR2#STATE>=%VAR1% performs "backlog Power1 1; RuleTimer1 20"

    16:37:35.727 MQT: /smarthome/heizung/Zirkulation/stat/RESULT = {"Delay":150}

  • Darum war die Grundidee ja eine andere: Sobald der Fühler eine Temperaturerhöhung detektiert, soll sich die Zirkulationspumpe für eine bestimmte Zeit einschalten. Dann eine vorgegebene Wartezeit, dann geht das Spiel von Neuem los.

    Die Pumpe muss ja nach aufdrehen vom Wasserhahn schnell in die Strümpfe kommen... Sonst kann ich auch warten, bis das Wasser von alleine vom WW-Boiler angekommen ist...

    Ursprünglich hatte ich eine Steuerung der Pumpe mit verbauten Bewegungsmeldern an den Zapfstellen. Allerdings wird dabei unnötig oft die Pumpe eingeschaltet.


    TRS

  • Hmm, wir fangen einfach nochmal an;-))

    Rule 1 ist klar:

    on tele-DS18B20-3#temperature do Backlog VAR1 %value% endon

    Wenn der Tempsonsor einen Wert liefert (im Abstand der TelePeriod) wird der Wert in Var1 geschrieben.

    Rule 2:

    on VAR1#State do backlog VAR2 %VAR1%; ADD2 %mem2%; Delay 150 endon

    on VAR2#State>=%VAR1% do backlog Power1 1; RuleTimer1 %mem3% endon

    on VAR2#State<=%VAR1% do Power1 0; endon

    on Rules#Timer=1 do Power1 0 endon

    Wenn Var1 sich ändert, wird Var1 in Var2 plus mem2 (Temperaturerhöhung, bei mir 0.2) gespeichert.

    Soweit klar. Jetzt soll eine Zeit gewartet werden (hab ich mit delay versucht), und dann sol der aktuelle Temperaturwert mit Var2 verglichen werden. Wenn Var2 höher ist soll die Pumpe für eine bestimmte Zeit eingeschaltet werden (mem3). Wenn der Wert nicht höher ist soll nichts passieren.

    Nach dem Durchgang soll eine Zeit nichts passieren (mem4) und dann soll es von vorn losgehen.


    So meine Denke...

    Gruss

  • wozu die Zeit 150 ? es soll zu jeder Teleperiode entschieden werden!!

    sofort - sonst wird var1 neu mit der nächsten neuen Starttemperatur geladen!

    Was ging an dem Skript von mir nicht - könnten wir ja noch mit dem Log rausfinden

    mem4 - ist eine neue Idee ?

  • "wozu die Zeit 150 ? es soll zu jeder Teleperiode entschieden werden!!"

    damit wollte ich erreichen, dass der Temp-Fühler auch einen Temperaturanstieg erkennen kann.

    "

    Was ging an dem Skript von mir nicht - könnten wir ja noch mit dem Log rausfinden

    mem4 - ist eine neue Idee ?"

    Ich lasse dein Script noch einmal unverändert laufen, und poste das Log. Meine Bedenken: Durch die lange Teleperiode dauert das Ansprechen zu lange, und das Wasser am Hahn wird nicht warm. Daher meine Idee, wie oben beschrieben:

    Temperaturanstieg am Boiler-Ausgang erkannt: Pumpe für vorgegebene Zeit an, dann Script ruhen lassen, und nach vorgegebener Zeit wieder starten.

    Gruss

    trs

  • ja deine 1. Idee war gut

    Teleperiod mit 150 trecken ist nicht zielführend

    Teleperiod 10 ist denkbar ( oder ganz auf Televerzögerung verzichten) - z. B. wenn die Temperaturanpassung auf VAR1 nur jede 5. Minute erfolgt ( kleine Änderung am Skript)

  • rule1

    ' Laden aktuelle Tempratur in VAR1 bei Teleperiod 300 ( alle 5 Min)

    on tele-DS18B20-3#Temperature do Backlog VAR1 %value% endon

    'Änderungen sofort in VAR2

    on DS18B20-3#Temperature do Backlog VAR2 %value% endon

    rule2

    'wenn VAR2 geändert dann um mem2-Inhalt erhöhen

    on VAR2#State do SUB2 %mem2% endon

    'Vergleich führt zum Einschalten und setzt Ausschaltzielzeit 20 Sek.

    on VAR2#State>%VAR1% do backlog Power1 1; RuleTimer1 %mem3% endon

    on Rules#Timer=1 do Power1 0 endon

    Einmal editiert, zuletzt von karoCB (4. Juni 2023 um 12:08)

  • So,

    beide rules aktiviert, Teleperiod auf 300. Im Moment geht die Pumpe an und aus, hier der log:

    16:44:23.481 RSL: RESULT = {"POWER":"ON"}

    16:44:23.483 RSL: POWER = ON

    16:44:23.496 RUL: VAR2#STATE performs "ADD2 0.300"

    16:44:23.502 RSL: RESULT = {"Add2":"420.500"}

    16:44:23.517 RUL: VAR2#STATE>VAR1 performs "backlog Power1 1; RuleTimer1 20"

    16:44:23.530 RSL: RESULT = {"POWER":"ON"}

    16:44:23.533 RSL: POWER = ON

    16:44:23.546 RUL: VAR2#STATE performs "ADD2 0.300"

    16:44:23.551 RSL: RESULT = {"Add2":"420.800"}

    16:44:23.566 RUL: VAR2#STATE>VAR1 performs "backlog Power1 1; RuleTimer1 20"

    16:44:23.578 RSL: RESULT = {"POWER":"ON"}

    16:44:23.581 RSL: POWER = ON

    16:44:23.594 RUL: VAR2#STATE performs "ADD2 0.300"

    16:44:23.599 RSL: RESULT = {"Add2":"421.100"}

    16:44:23.615 RUL: VAR2#STATE>VAR1 performs "backlog Power1 1; RuleTimer1 20"

    16:44:23.628 RSL: RESULT = {"POWER":"ON"}

    16:44:23.630 RSL: POWER = ON

    16:44:23.643 RUL: VAR2#STATE performs "ADD2 0.300"

    16:44:23.649 RSL: RESULT = {"Add2":"421.400"}

    16:44:23.664 RUL: VAR2#STATE>VAR1 performs "backlog Power1 1; RuleTimer1 20"

    16:44:23.679 RSL: RESULT = {"POWER":"ON"}

    16:44:23.681 RSL: POWER = ON

    16:44:23.695 RUL: VAR2#STATE performs "ADD2 0.300"

    16:44:23.701 RSL: RESULT = {"Add2":"421.700"}

    16:44:23.719 RUL: VAR2#STATE>VAR1 performs "backlog Power1 1; RuleTimer1 20"

  • Addiert ohne Ende:

    17:07:45.501 RUL: VAR2#STATE>VAR1 performs "backlog Power1 1; RuleTimer1 20"

    17:07:45.513 RSL: RESULT = {"POWER":"ON"}

    17:07:45.516 RSL: POWER = ON

    17:07:45.529 RUL: VAR2#STATE performs "ADD2 0.300"

    17:07:45.535 RSL: RESULT = {"Add2":"5744.000"}

    17:07:45.550 RUL: VAR2#STATE>VAR1 performs "backlog Power1 1; RuleTimer1 20"

    17:07:45.563 RSL: RESULT = {"T1":19,"T2":0,"T3":0,"T4":0,"T5":0,"T6":0,"T7":0,"T8":0}

    17:07:45.585 RUL: VAR2#STATE performs "ADD2 0.300"

    17:07:45.591 RSL: RESULT = {"Add2":"5744.300"}

    17:07:45.606 RUL: VAR2#STATE>VAR1 performs "backlog Power1 1; RuleTimer1 20"

    17:07:45.619 RSL: RESULT = {"POWER":"ON"}

    17:07:45.622 RSL: POWER = ON

    17:07:45.638 RUL: VAR2#STATE performs "ADD2 0.300"

    17:07:45.644 RSL: RESULT = {"Add2":"5744.600"}

    17:07:45.661 RUL: VAR2#STATE>VAR1 performs "backlog Power1 1; RuleTimer1 20"