Steuerung Zirkulationspumpe optimieren

Begonnen von FHEM_newbie, 02 Januar 2021, 15:03:23

Vorheriges Thema - Nächstes Thema

FHEM_newbie

Meine Zirkulationspumpe steckt in einer WLAN Steckdose um sie über FHEM (mittels MQTT2) ansprechen zu können. Einen Temperatursensor in der Rücklaufleitung gibt es nicht. Jetzt habe ich folgede Logik umgesetzt, so dass die Pumpe morgens auf einen Bewegungsmelder im Flur reagieren soll, aber nur wenn sie schon 30 min nicht mehr lief. Außerdem noch ein paar normale Einschaltzeiten am Tag über einen Timer, um alles nut wenn auch jemand zuhause ist.
Das ganze scheint mit so recht aufwendig, hat jemand eine Idee wie man die Logik schöner und schlanker machen könnte?


DOIF für die bewegungsabhängige Steuerung morgens:
defmod di_ZirkuPump DOIF ([lighttempmotion_sensor_Diele:motion] eq "on" and [ZirkuPumpReleaseMotion] eq "on" and ReadingsVal("Bewohner","presence","0") eq "present" and $data{lastOffTime}+30*60 < time())(set WlanSteckdose1 on)(set WlanSteckdose1 off)
attr di_ZirkuPump do resetwait
attr di_ZirkuPump room System
attr di_ZirkuPump wait 0,240

DOIF für die sonstige Steuerung:
defmod di_ZirkuPump2 DOIF ([ZirkuPumpRelease] eq "on" and ReadingsVal("Bewohner","presence","0") eq "present")(set WlanSteckdose1 on)(set WlanSteckdose1 off)
attr di_ZirkuPump2 do resetwait
attr di_ZirkuPump2 room System
attr di_ZirkuPump2 wait 0,240

timer für die Freigabe morgens und allgemein:
defmod timer_ZirkuPump Timer
attr timer_ZirkuPump room System,Timer

setstate timer_ZirkuPump Timer_02 set ZirkuPumpRelease off accomplished
setstate timer_ZirkuPump 2021-01-01 22:41:21 .associatedWith ZirkuPumpReleaseMotion
setstate timer_ZirkuPump 2021-01-01 22:41:27 Timer_01 alle,alle,alle,11,30,00,ZirkuPumpRelease,on,1,1,1,1,1,1,1,1
setstate timer_ZirkuPump 2021-01-01 22:41:27 Timer_02 alle,alle,alle,11,34,00,ZirkuPumpRelease,off,1,1,1,1,1,1,1,1
setstate timer_ZirkuPump 2021-01-01 22:41:27 Timer_03 alle,alle,alle,17,30,00,ZirkuPumpRelease,on,1,1,1,1,1,1,1,1
setstate timer_ZirkuPump 2021-01-01 22:41:27 Timer_04 alle,alle,alle,17,34,00,ZirkuPumpRelease,off,1,1,1,1,1,1,1,1
setstate timer_ZirkuPump 2021-01-01 22:41:27 Timer_05 alle,alle,alle,04,00,00,ZirkuPumpReleaseMotion,on,1,1,1,1,1,1,1,1
setstate timer_ZirkuPump 2021-01-01 22:41:27 Timer_06 alle,alle,alle,09,00,00,ZirkuPumpReleaseMotion,off,1,1,1,1,1,1,1,1
setstate timer_ZirkuPump 2021-01-02 14:59:00 internalTimer 59.996918
setstate timer_ZirkuPump 2021-01-02 11:34:00 state Timer_02 set ZirkuPumpRelease off accomplished

und dann noch die 2 dummys (ZirkuPumpReleaseMotion und ZirkuPumpRelease) für die Freigabe definiert und den letzten Ausschaltzeitpunkt:
defmod storeLastOff notify WlanSteckdose1:.* { $data{lastOffTime} = time() }



Danke schon mal für die Mühe!

Der_Tom

#1
Zitat von: FHEM_newbie am 02 Januar 2021, 15:03:23
.....um alles nut wenn auch jemand zuhause ist.......


die "schaltung" der pumpe ist wohl eine frage der philosophie, und auf solche diskussionen lasse ich mich hier nicht mehr ein.

Worauf ich aber unbedingt achten würde, ist das die Pumpe auch bei längerer Abwesenheit regelmässig mal läuft. Zirkulationspumpen neigen zum "festgehen" bei längerem Stillstand !

Meine lasse ich jeden morgen ( zur normal benötigten zeit ) eine weile laufen , egal ob abwesend oder nicht.

gruss Thomas

Damian

#2
So sieht meine aktuelle Definition aus:

defmod di_Zirkulation DOIF (([05:55-23:00]) and [Anwesenheit] eq "on" and [ESPEasy_ESP_Temp_Zirkulation:Temperature] < 38) (set Zirk on)(set Zirk off)
attr di_Zirkulation cmdState on,off
attr di_Zirkulation cmdpause 2700
attr di_Zirkulation do always
attr di_Zirkulation initialize init
attr di_Zirkulation startup set Zirk off
attr di_Zirkulation wait 0,480


Edit: Statt der Temperaturabfragen kann man zyklisch den Vorgang initiieren.

z. B. DOIF (([05:55-23:00,+00:45]) and [Anwesenheit] eq "on") (set Zirk on)(set Zirk off)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FHEM_newbie

@Der_Tom: Danke für den guten Tipp, werde ich berücksichtigen!
@Damian: Danke für deine Definítion, werde ich mir mal genauer anschauen, sieht jedenfalls deutlich einfacher aus als meine Lösung. Soweit alles klar, aber den Sinn von do always verstehe ich nicht so ganz, das widerspricht sich do mit cmdpause, oder nicht?

Damian

Zitat von: FHEM_newbie am 02 Januar 2021, 20:43:54
@Damian: Danke für deine Definítion, werde ich mir mal genauer anschauen, sieht jedenfalls deutlich einfacher aus als meine Lösung. Soweit alles klar, aber den Sinn von do always verstehe ich nicht so ganz, das widerspricht sich do mit cmdpause, oder nicht?

do always bräuchte man bei meiner ersten Definition nicht, allerdings hatte ich bei mir das Problem, dass das on-Signal manchmal bei der Pumpe nicht ankam und die Pumpe nicht anlief, die Temperatur ist unten geblieben, das Modul hat den Befehl aber nicht wiederholt, weil es ja schon bereits im cmd1 war. do always in Kombination mit cmdpause hat das Problem behoben.

Bei der rein zeitgesteuerten Variante ist do always wichtig, weil sich der Zustand des Moduls innerhalb der Zeitspanne nicht ändert, es bleibt immer im cmd1-Zweig. cmdpause ist hier überflüssig.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FHEM_newbie

Danke nochmals für die Erklärung! Habe es jetzt so gelöst:


Ein DOIF für morgens, das bewegungsabhängig ist:

defmod di_ZirkuPump_Motion DOIF (([04:30-9:00]) and [lighttempmotion_sensor_Diele:motion] eq "on" [Bewohner] eq "zuhause")(set WlanSteckdose1 on)(set WlanSteckdose1 off)
attr di_ZirkuPump_Motion cmdState on,off
attr di_ZirkuPump_Motion cmdpause 2700
attr di_ZirkuPump_Motion do always
attr di_ZirkuPump_Motion initialize init
attr di_ZirkuPump_Motion room System
attr di_ZirkuPump_Motion startup set Zirk off
attr di_ZirkuPump_Motion wait 0,240

ein zweites DOIF für den Rest des Tages:

defmod di_ZirkuPump_Tag DOIF (([09:30-23:00,+00:45]) and [Bewohner] eq "zuhause")(set WlanSteckdose1 on)(set WlanSteckdose1 off)
attr di_ZirkuPump_Tag cmdState on,off
attr di_ZirkuPump_Tag cmdpause 2700
attr di_ZirkuPump_Tag do always
attr di_ZirkuPump_Tag initialize init
attr di_ZirkuPump_Tag room System
attr di_ZirkuPump_Tag startup set WlanSteckdose1 off
attr di_ZirkuPump_Tag wait 0,240

Und noch ein drittes, das jeden Tag zumindest einmal die Pumpe kurz laufen lässt:

defmod di_ZirkuPump_Forced DOIF ([12:00])(set WlanSteckdose1 on)(set WlanSteckdose1 off)
attr di_ZirkuPump_Forced cmdState on,off
attr di_ZirkuPump_Forced initialize init
attr di_ZirkuPump_Forced room System
attr di_ZirkuPump_Forced startup set WlanSteckdose1 off
attr di_ZirkuPump_Forced wait 0,120



Klar, im zweiten sind jetzt die cmdpause und die +00:45 doppelt gemoppelt, hier könnte ich das cmdpause eigentlich weglassen...

Damian

Das machst du natürlich alles in einem ;)

(([04:30-9:00] and [lighttempmotion_sensor_Diele:motion] eq "on" or [09:30-23:00,+00:45]) and [Bewohner] eq "zuhause" or [12:00])(set WlanSteckdose1 on)(set WlanSteckdose1 off)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FHEM_newbie

Natürlich! Dankeschön, manchmal sieht man den Wald for lauter DOIFs nicht mehr...  ;)

FHEM_newbie

Jetzt habe ich doch nochmal eine Frage: wenn ich den Code so eintrage, wie @Damian zusammengefasst hat, also:

(([04:30-9:00] and [lighttempmotion_sensor_Diele:motion] eq "on" or [09:30-23:00,+00:45]) and [Bewohner] eq "zuhause" or [12:00])(set WlanSteckdose1 on)(set WlanSteckdose1 off)

und gleichzeitig noch das Attribut cmdpause den Wert 2700 hat, sind die beiden Zeiten ja gleich und es passt. Was aber wenn ich im Doif den Wert auf +01:30 setze? Es scheint dann immer noch alle 45 Minuten geschalten zu werden, obwohl der Timer doch nur alle 90 Minuten aktiviert wird. Wo liegt mein Denkfehler oder was hat Priorität?