Steuerung meiner Zirkulationspumpe

Begonnen von pnewman, 18 Februar 2016, 09:50:32

Vorheriges Thema - Nächstes Thema

pnewman

Hallo zusammen,

meine Zirkulationspumpe wurde bisher mit der internen Zeitschaltuhr von 06:00 - 22:00 an und abgeschaltet.
Da sie 25 Watt verbraucht, habe ich mir etwas anderes überlegt.

Nun habe ich 2 TX25IT verbaut, deren Aussensensoren am Vorlauf und Rücklauf angebracht sind.
Die interne Zeitschaltuhr habe ich auf ,,immer an" eingestellt und eine PCA301 zum Schalten vor die Pumpe gesteckt.

Die Pumpe soll nun bei einer Rücklauftemperatur <45°C für 180sec eingeschaltet werden.

Da aber meine PCA301 nicht immer abgeschaltet hat, es liegt vielleicht an der Reichweite vom EG bis unter das Dach durch eine Stahlbetondecke und mehrere Wände, habe ich noch einen Zusatz in mein DOIF eingefügt, damit die Pumpe bei >48°C und eingeschalteter Pumpe abgestellt wird.
Dies auch noch mit einem WAIT von 20sec.

Auszug aus meinem DOIF:
([06:00-22:00] and [OG.hz.WP.RL:temperature2] < 45)(set OG.hz.SD.WP on-for-timer 180)
DOELSEIF ([OG.hz.WP.RL:temperature2] > 48 and [OG.hz.SD.WP] eq "on")(set OG.hz.SD.WP off)
DOELSE (set OG.hz.SD.WP off)


Das WAIT:
set S_WWPumpe_DI wait 0:20:0

S_WWPumpe_DI = DOIF
OG.hz.WP.RL:temperature2 = TX25IT Aussensensor am Rücklauf angebracht
OG.hz.SD.WP = PCA301

Fazit:
Anstatt 16 Stunden Laufzeit, läuft die Zirkulationspumpe nun nur noch 20 bis 22 mal für jeweils 3-5 Minuten.
Meine Familie hat sich noch nicht beschwert, oder einen Unterschied bemängelt.

Verbesserungsvorschläge werden gerne angenommen.

Gruß
Ralf
Raspberry Pi3B+ / Nano-Cul 868 - MAX!=Heizung, HM-Lan - Rollo+Licht, JeeLink-Clone 868 - LaCrosse, JeeLink-Clone 868 - PCA301, CUL 434 - IT-Steckdosen+Fernbedienung

Bartimaus

Moin,

ich mache es ähnlich, über ein DOIF schalte ich das Threshold-Modul. Im DOIF werden aber auch Abwesenheiten berücksichtigt, weil zu diesem Zeitpunkt braucht keiner warmes Wasser.

Die RL-Temperatur erfasse ich über einen DS18B20.

([05:35-06:15|12]
and (!$we)
and [ZirkuMaster:state] eq "on"
and [Abwesend:state] eq "off")
(set TH_Zirkulation desired 38, set TH_Zirkulation hysteresis 2, set ZirkulationsTemp interval 60)
DOELSEIF (((([14:00-21:00|345]
or [14:00-21:00|12])
and (!($we)))
or [09:00-21:00|7])
and [ZirkuMaster:state] eq "on"
and [Abwesend:state] eq "off")
(set TH_Zirkulation desired 38, set TH_Zirkulation hysteresis 2, set ZirkulationsTemp interval 60)
DOELSEIF ([22:00-23:00]
and [ZirkuMaster:state] eq "on"
and [Abwesend:state] eq "off")
(set TH_Zirkulation desired 38, set TH_Zirkulation hysteresis 2, set ZirkulationsTemp interval 60)
DOELSE (set TH_Zirkulation desired 15, set ZirkulationsTemp interval 300)
LG
B.


FHEM@Intel-J4105@Debian-LXC, CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

justme1968

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

oviwan

Hallo,

ich habe es mit FS20 Schaltdose und Bewegungsmelder aus meinem Restbestand bei meinem älteren Nachbarn eingerichtet. Jetzt schaltet die Pumpe nur wenn jemand im Flur OG vorbei geht. Geht der dann ins Bad, ist das Wasser in ca. 1 sek. da (Keller->1.OG). Früher lief die Pumpe 24/365. Leider gibt es bei der Stand alone Installation keine Temperaturabhängigkeit, hier passt es aber im zwei Personen Haushalt vom Benutzerverhalten her. Die Küche ist direkt über dem Heizungsraum, dort steht auch ohne Zirkulation immer warmes Wasser an.

Ist mit Deiner Pumpe eine Schwerkraftbremse verbaut (Rückschlagklappe auf der Druckseite)? Hier driftet uns immer noch warmes Wasser nach oben weg, die Zirk. leitung bleibt bis in den Schacht Eintritt im Keller bei stehender Pumpe schön warm. Was über einige Stunden den Speicher unnötig auskühlen lässt. Falls man sowas überhaupt in Trinkwasserleitungen einbauen darf (?).

Harry

--------------------------------------------------------------------
- fhem & fhz1300 & hm lan an raspberry an fritzbox 5140 an whs2011
- 5 fht; 2 HM-TC-IT-WM-W-EU 3, 1 x fs20 funkdosen; 3 hm funkdosen
- heizungsteuerung mit c-control station & fht8w
- rolladensteuerung phc 950 jr (voll doof)

pnewman

Hallo zusammen,

ich dachte mir schon, dass es vielfältige Möglichkeiten/Lösungen gibt.

@Bartimaus
Die Lösung mit dem Threshold-Modul und Anwesenheit liest sich gut.
Bei uns ist z.Z. immer jemand zu Hause, daher benötige ich es nicht so kompliziert.


@Andre
Die Lösung mittels watchdog hatte ich auch überlegt.
Ist es besser/vorteilhafter es mittels watchdog zu regeln?
Bisher funktioniert meine Lösung, aber wenn ein watchdog besser ist ändere ich dies.

@Harry
Später wenn ich auch in der Küche einen Bewegungsmelder verbaut habe, dann wollte ich ebenfalls
darüber schalten. Da der Geschirrspüler ebenfalls mit Warmwasser gespeist wird werde ich dort noch eine PCA301 vorschalten und die Zirkulationspumpe komplett verbrauchsabhängig schalten.
Aber, benötigt man immer warmes Wasser wenn man die Küche oder die Bäder betritt?

Ich habe gerade mal eine Rückschlagklappe gesucht, wenn keine direkt in der Pumpe verbaut ist, besitze ich keine in der Leitung.
Und wenn ich mir meine Kurve ansehe, dann erhöhen sich Vor-und Rücklauf wenn die Pumpe nicht läuft und Wasser gezapft wird. Ergo=keine Rückschlagklappe!

Gruß
Ralf
Raspberry Pi3B+ / Nano-Cul 868 - MAX!=Heizung, HM-Lan - Rollo+Licht, JeeLink-Clone 868 - LaCrosse, JeeLink-Clone 868 - PCA301, CUL 434 - IT-Steckdosen+Fernbedienung

oviwan

Hier ist die Rückschlagklappe ganz gut dargestelltt. Ich nehme aber an das Deine Pumpe in der Zirkulationsleitung, vor der hier dargestellten Rückschlagklappe sitzt. Was ich auch für richtiger halte als diese in den Warmwasservorlauf zu setzen.

(http://www.energieverbraucher.de/files_db/schemawarmwasser.jpg)

Würde vielleicht noch mit dem Temperaturniveau spielen. Man wird Dich nicht teeren und federn wenn das WW in den ersten 2,5 sek. nur 35° hat. Dann kommst Du mit den Laufzeiten noch weiter runter. Witzig wäre es auch einfach mal ohne Pumpe die Temperaturen über die Woche zu loggen. Es kann gut sein dass sich das Temperaturniveau alleine durch die Schwerkraft und normale Benutzung über den Tag in einem Bereich hält der in der Praxis völlig ausreicht. Dann bräuchtest Du die Zirkulationspumpe nur morgens kurz laufen lassen. Mein Sanitärkumpel hat das sehr oft das defekte Pumpen von den Bewohnern garnicht bemerkt werden.  ;D

Harry
--------------------------------------------------------------------
- fhem & fhz1300 & hm lan an raspberry an fritzbox 5140 an whs2011
- 5 fht; 2 HM-TC-IT-WM-W-EU 3, 1 x fs20 funkdosen; 3 hm funkdosen
- heizungsteuerung mit c-control station & fht8w
- rolladensteuerung phc 950 jr (voll doof)

pnewman

Hallo Harry,

in meiner Zirkulationsleitung sind keine Rückschlagklappen verbaut.

Ebenfalls habe ich zwei verschiedene Rohre verbaut ein dünnes in der die Pumpe sitzt und ein Dickes im Rücklauf.

Ich habe eben die Rücklauftemperatur in meinem DOIF um 5 Kelvin gesengt.
Mal sehen was die Änderung bewirkt.

Gruß
Ralf
Raspberry Pi3B+ / Nano-Cul 868 - MAX!=Heizung, HM-Lan - Rollo+Licht, JeeLink-Clone 868 - LaCrosse, JeeLink-Clone 868 - PCA301, CUL 434 - IT-Steckdosen+Fernbedienung

pnewman

Hallo Harry,
vorgestern habe ich aus versehen das falsche Device gelöscht.
Die PCA301 für die Zirkulationspumpe.

Im angehängten Plot kann man sehen was passiert wenn Wasser gezogen wird und wenn nicht.

Es dauert sehr lange bis warmes wasser an den Zapfstellen kommt. Reine Verschwendung!

Kurz vor 22:00 Uhr habe ich die PCA301 wieder einbinden können.


Mein DOIF habe ich abgeändert:

([06:00-22:00] and [OG.hz.WP.RL:temperature2] < 45)(set OG.hz.SD.WP on-for-timer 180) DOELSE (set OG.hz.SD.WP off)


Und aus diesem POST das Script von SCHLIMBO in mein System eingebunden.
http://forum.fhem.de/index.php/topic,42080.msg342781.html#msg342781

Danke für eure Vorschläge.
Ich staune immer wieder was hier alles möglich ist und auch umgesetzt wird.

Gruß
Ralf
Raspberry Pi3B+ / Nano-Cul 868 - MAX!=Heizung, HM-Lan - Rollo+Licht, JeeLink-Clone 868 - LaCrosse, JeeLink-Clone 868 - PCA301, CUL 434 - IT-Steckdosen+Fernbedienung

Frini

Ich spiele einmal Totengräber.
Ich versuche gerade unsere Zirkulationspumpe zu automatisieren. Möchte unter anderem dazu das unten angenhängte DOIF nutzen. Leider stehe ich total auf dem Schlauch. Was ist mit set Zirkulationstemp intervall 60 gemeint? Das THreshold ist es nicht und die Pumpe nutze wird ja nicht über das DOIF sondern über das Threshold.
Wäre cool, wenn der Eigner des Codes mir einen Schups in die richtige Richtung geben könnte :-)

Zitat von: Bartimaus am 18 Februar 2016, 10:02:28
Moin,

ich mache es ähnlich, über ein DOIF schalte ich das Threshold-Modul. Im DOIF werden aber auch Abwesenheiten berücksichtigt, weil zu diesem Zeitpunkt braucht keiner warmes Wasser.

Die RL-Temperatur erfasse ich über einen DS18B20.

([05:35-06:15|12]
and (!$we)
and [ZirkuMaster:state] eq "on"
and [Abwesend:state] eq "off")
(set TH_Zirkulation desired 38, set TH_Zirkulation hysteresis 2, set ZirkulationsTemp interval 60)
DOELSEIF (((([14:00-21:00|345]
or [14:00-21:00|12])
and (!($we)))
or [09:00-21:00|7])
and [ZirkuMaster:state] eq "on"
and [Abwesend:state] eq "off")
(set TH_Zirkulation desired 38, set TH_Zirkulation hysteresis 2, set ZirkulationsTemp interval 60)
DOELSEIF ([22:00-23:00]
and [ZirkuMaster:state] eq "on"
and [Abwesend:state] eq "off")
(set TH_Zirkulation desired 38, set TH_Zirkulation hysteresis 2, set ZirkulationsTemp interval 60)
DOELSE (set TH_Zirkulation desired 15, set ZirkulationsTemp interval 300)


Bartimaus

Moin,

so heisst mein 1wire-Temperatursensor, der an der Zirkuleitung hängt.
Mit "set ZirkulationsTemp interval 60" setze ich während des Betriebs das Abfrageintervall des Sensors auf 60sekunden.
Das Default-Intervall von 300s ist hier für meine Zwecke zu gross.

LG
LG
B.


FHEM@Intel-J4105@Debian-LXC, CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

Frini

 ;D Super Danke für die Rückmeldung. 1wire steht noch auf meiner Liste. Habe ich mich noch nicht wirklich rangetraut. Wollte das erstmal über einen Homematic Temperaturfühler machen, und da habe ich ein event-on-change drin.

Vielleicht noch eine weitere Frage.
Die Hystere ist standardmäßig auf 0 gesetzt. In den Hauptzeiten setzt Du die auf 2. Aber im DOELSE wird die nicht wieder auf 0 gesetzt. Bleibt der Wert dann nicht immer auf 2 und ein wiederholtes setzen auf 2 in den Hauptzeite ist überflüssig?


Grüße

Bartimaus

Zitat von: Frini am 19 April 2018, 11:21:44
Vielleicht noch eine weitere Frage.
Die Hystere ist standardmäßig auf 0 gesetzt. In den Hauptzeiten setzt Du die auf 2. Aber im DOELSE wird die nicht wieder auf 0 gesetzt. Bleibt der Wert dann nicht immer auf 2 und ein wiederholtes setzen auf 2 in den Hauptzeite ist überflüssig?


Grüße

*Hust*, das ist der alte Codeschnipsel, der neue ist etwas angepasst..... aber hierauf bezogen hast Du Recht...
LG
B.


FHEM@Intel-J4105@Debian-LXC, CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

Damian

Zitat von: Frini am 19 April 2018, 11:21:44
;D Super Danke für die Rückmeldung. 1wire steht noch auf meiner Liste. Habe ich mich noch nicht wirklich rangetraut. Wollte das erstmal über einen Homematic Temperaturfühler machen, und da habe ich ein event-on-change drin.

Vielleicht noch eine weitere Frage.
Die Hystere ist standardmäßig auf 0 gesetzt. In den Hauptzeiten setzt Du die auf 2. Aber im DOELSE wird die nicht wieder auf 0 gesetzt. Bleibt der Wert dann nicht immer auf 2 und ein wiederholtes setzen auf 2 in den Hauptzeite ist überflüssig?


Grüße

Die Hysterese ist beim THRESHOLD-Modul default auf 1.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Frini

#13
Im Thread zum Modul hatte ich 0,5 gelesen. Aber egal.
Ich werde es mal soweit vorplanen. Die neue Heizung kommt erst im Juni. Bis dahin ist noch ein wenig hin.

EDIT: In der Commandref steht 1  :D Alles klar.


Bartimaus

Eine Zirkulationsleitung bringt einen schönen Komfort, aber sie ist auch in gewaltiger Energiefresser. Denn mann muss sich im klaren sein, das kostspielig aufgeheiztes Brauchwasser auf die Reise in einen Kühlkörper geschickt wird, wo es dann wieder abgekühlt wird.

Da schreitet FHEM ein, mit der Möglichkeit das an die eigenen Bedürfnisse anzupassen. Das schafft keine Heizungssteuerung.

Somit habe ich hier einen guten Kompromiss gefunden...
LG
B.


FHEM@Intel-J4105@Debian-LXC, CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

Damian

Bei uns sieht es so aus:

defmod di_Zirkulation DOIF (([05:30-23:00|8] or [06:30-23:00|7]) and [Anwesenheit] eq "on") \
  (set TH_Zirkulation desired 43)\
DOELSE\
  (set TH_Zirkulation desired 15)\


Die Zirkulation hängt vor allem davon ab, ob überhaupt jemand zuhause ist.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Bartimaus

Und das steuerst Du grundsätzlich über den Kalender?
Auch kurzfristige Abwesenheit ?
LG
B.


FHEM@Intel-J4105@Debian-LXC, CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

Damian

#17
Zitat von: Bartimaus am 20 April 2018, 19:05:47
Und das steuerst Du grundsätzlich über den Kalender?
Auch kurzfristige Abwesenheit ?

Abwesenheit bedeutet keiner zuhaus. Definiert über das elektronische Abschließen der Eingangstür von außen. Der letzte, der das Haus verlässt, schließt die Tür ab, damit wird Alarm aktiviert und der Zustand Anwesenheit auf off gesetzt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Bartimaus

Ah, ok, auf dem Handy hatte ich das Device <Anwesenheit> nicht gesehen.... ::)
LG
B.


FHEM@Intel-J4105@Debian-LXC, CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

pnewman

Hallo zusammen,

da ich die Bäder nun mit Bewegungsmelder ausgerüstet habe, aber immernoch den Geschirrspüler mit Warmwasser versorgen möchte, habe ich euch hier mein neues DOIF mitgebracht:


([OG.bz.BM] eq "motion" and [DG.hz.WP.RL:temperature2] < 40)(set SD_HeizungZirkulationspumpe on)
(set SD_HeizungZirkulationspumpe off)
DOELSEIF  ([EG.gwc.BM] eq "motion" and [DG.hz.WP.RL:temperature2] < 40) (set SD_HeizungZirkulationspumpe on)
(set SD_HeizungZirkulationspumpe off)
DOELSEIF ([SD_KuecheGeschirrspueler:power] > 2.5 and [SD_KuecheGeschirrspueler:power] < 65 and [DG.hz.WP.RL:temperature2] < 45)
(set SD_HeizungZirkulationspumpe on)(set SD_HeizungZirkulationspumpe off)


Dazu noch:
attr S_WWPumpe_DI wait 0,120:0,120:0,120
attr S_WWPumpe_DI do resetwait

Der DG.hz.WP.RL ist ein Technoline TX25IT.
Die SD_HeizungZirkulationspumpe ist eine PCA301.
Die SD_KuecheGeschirrspueler ist eine PCA301.


Gruß
Ralf
Raspberry Pi3B+ / Nano-Cul 868 - MAX!=Heizung, HM-Lan - Rollo+Licht, JeeLink-Clone 868 - LaCrosse, JeeLink-Clone 868 - PCA301, CUL 434 - IT-Steckdosen+Fernbedienung

Mitch

Hallo Zusammen,

muss das mal ausgraben.

Ich baue gerade (nachdem sie jetzt wieder geht) meine Steuerung der Zirkulation.
Mache das grundsätzlich wie Damian.

Hier hätte ich jetzt noch eine Frage zum Threshold: auf wieviel Grad steht denn die "hysteresis"?

Des weitern möchte ich gerne zusätzlich folgendes: wenn 8 Stunden kein Wasser entnommen, dann Pumpe für 15 Minuten einschalten.
Die Frage ist nur, wie? Fhem weiß nicht über die Entnahme.
Könnte mir nur vorstellen, das irgendwie über die Vor- und/oder Rücklauftemp zu steuern?
FHEM im Proxmox Container

Damian

#21
Zitat von: Mitch am 18 März 2020, 22:46:18
Hallo Zusammen,

muss das mal ausgraben.

Ich baue gerade (nachdem sie jetzt wieder geht) meine Steuerung der Zirkulation.
Mache das grundsätzlich wie Damian.

Hier hätte ich jetzt noch eine Frage zum Threshold: auf wieviel Grad steht denn die "hysteresis"?

Des weitern möchte ich gerne zusätzlich folgendes: wenn 8 Stunden kein Wasser entnommen, dann Pumpe für 15 Minuten einschalten.
Die Frage ist nur, wie? Fhem weiß nicht über die Entnahme.
Könnte mir nur vorstellen, das irgendwie über die Vor- und/oder Rücklauftemp zu steuern?

Warum möchtest du nach 8 Stunden zirkulieren lassen? Normalerweise ist der Temperaturabfall so hoch, dass die Pumpe sowieso vorher dran ist.

Ich habe es inzwischen bei mir ganz einfach gemacht:

defmod di_Zirkulation DOIF (([05:30-23:00|8] or [06:30-23:00|7]) and [Anwesenheit] eq "on" and [ESPEasy_ESP_Temp_Zirkulation:Temperature] < 39) (set Zirk on)(set Zirk off)
attr di_Zirkulation wait 0,360
attr di_Zirkulation do always


Nachdem ich festgestellt habe, dass nach 6 Minuten das Wasser einmal durch ist, lass ich jetzt einfach 6 Minuten die Pumpe laufen, wenn erforderlich.

Jede unnötige Zirkulation kostet nicht nur unnötig Strom, sondern vor allem Wärmeverlust des Warmwassers.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Mitch

Nachdem das mit dem Threshold nicht so wirklich funktioniert hat, die Pumpe wurde oft nicht geschalten, habe ich jetzt auch auf einen DOIF umgebaut.
Allerdings nicht so einfach wie du nach reiner Zeit, sondern auf Temperaturen.
Warum? Weil die Pumpe z.B: in der Früh länger laufen muss.

defmod ZirkulationWW.Aktor DOIF (([05:30-23:00|8] or [08:00-23:45|7]) and [Anwesenheit] eq "Zuhause" and [MQTT2_DVES_C5323A:WW_Diff] > 5)\
(set Zirkulationspumpe.Steckdose on)\
DOELSEIF ([MQTT2_DVES_C5323A:WW_Diff] < 3)\
(set Zirkulationspumpe.Steckdose off)\
DOELSE
FHEM im Proxmox Container

fiedel

Zitat von: Damian am 20 März 2020, 21:24:21

Nachdem ich festgestellt habe, dass nach 6 Minuten das Wasser einmal durch ist, lass ich jetzt einfach 6 Minuten die Pumpe laufen, wenn erforderlich.
Jede unnötige Zirkulation kostet nicht nur unnötig Strom, sondern vor allem Wärmeverlust des Warmwassers.

So ist es. Da die Zirkulationsleitung eine "Ringleitung" ist in deren ungefährer Mitte die Zapfstellen liegen,
ist es optimal die Pumpe zu stoppen, wenn das WW bis zum am weitesten entfernten Hahn gekommen ist.
Das sind im EFH meist 1- 2 Minuten. Wer sicherheitshalber die Rücklaufstrecke desinfizieren möchte,
kann 1 Mal am Tag länger pumpen lassen. Am besten wenn das Wasser gerade auf ca. 70 °C geheizt wurde.

Gruß
Frank
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

spi3845

Hallo zusammen,

ich habe die DOIFs aus dem Ausgangspost genommen und darauf aufbauend ein DOIF-Perl gemacht, um meine Zirkulationspumpe zu regeln.

Zwischen die Heizung und die Pumpe habe ich ein Schaltmodul (https://frank-schuetz.de/index.php/fhem/23-fhem-steuerung-der-warmwasser-zirkulationspumpe) eingesetzt, das ich über einen RPi per MQTT schalte. Ich habe von dem RPi per MQTT auch Zugriff auf die Heizung (Temperaturen Warmwasserspeicher, Vorlauf und Rücklauf per ebusd) und den Wasserstop in der Wasser-Hauszuleitung (warmes oder kaltes Wasser wird gezapft per serieller Schnittstelle) - damit bekomme ich auch weitere Meßgrößen für die Regelung und zur Visualisierung.

Zur Regelung selbst habe ich folgendes umgesetzt:

- werktags und am Wochenende habe ich unterschiedliche Zeitfenster, in denen die Pumpe laufen kann
- die Pumpe wird jeweils für max. 5 Minuten eingeshaltet
- sobald die Pumpe eingeschaltet ist, startet eine Sperrzeit von 17 Minuten, in der die Pumpe nicht wieder eingeschaltet wird
- die Pumpe wird nur eingeschaltet, wenn im Warmwasserspeicher (SpeicherTemp) eine bestimmte Temperatur vorhanden ist
- die Pumpe wird nicht abhängig der Rücklauftemperatur des Zirkulationskreislaufs geschaltet, sondern abhängig der Temperatur des Vorlaufs (VorlaufTemp, dazu später mehr)
- nur wenn eine bestimmte Differenz zwischen SpeicherTemp und VorlaufTemp gegeben ist, wird die Pumpe geschaltet
- wenn eine bestimmte VorlaufTemp erreicht ist, wird die Pumpe ausgeschaltet
- wenn eine bestimmte SpeicherTemp unterschritten wird, wird die Pumpe ausgeschaltet


Noch nicht umgesetzt:

- Anwesenheitserkennung (aktuell geht bei Abwesenheit die Warmwasserbereitung aus und damit nach gewisser Zeit dann auch die Pumpe)


Wie schon in einem Post zuvor erwähnt, liegt der am weitesten entfernt liegende Wasserhahn etwa in der Mitte der Zirkulationsleitung. Wenn am Wasserhahn Warmwasser gezapft wird, dann steigt die Temperatur im Rücklauf nicht, sehr wohl aber im Vorlauf - daher überwache ich den Vorlauf und nicht den Rücklauf.

Wenn länger kein Warmwasser gezapft worden ist, sinkt die Temperatur im Vorlauf - das messe ich und nutze das zum Schalten der Pumpe. Eine Temperaturerhöhung im Rücklauf erfolgt nur, wenn die Zirkulationspumpe läuft. Wenn die Temperatur im Rücklauf sinkt, heißt das damit nicht zwangsläufig, dass am Wasserhahn kein warmes Wasser anliegt. In dem Schaubild sieht man (z. B. zwischen  15:30 und 17:30), dass warmes Wasser im Vorlauf vorhanden ist, weil Wasser gezapft wurde, die Rücklauftemperatur dabei ist aber niedrig (und eignet sich damit nicht gut als Meßgröße - durch sie würde die Pumpe zu oft eingeschaltet werden). Die Pumpe läuft werktags insgesamt 30-40 Min. je Tag. Warmes Wasser ist schnell an den Wasserhähnen vorhanden - auch nach längerer Nichtnutzung - das einzige kalte Wasser, das dann abläuft, ist das zwischen Zirkulationsleitung und Wasserhahn erkaltete.

Mein Temperaturfühler im Vorlauf ist etwa 1,5m vom Warmwasserspeicherausgang entfernt. Wenn jemand nicht die Temperatur des Warmwasserspeichers direkt auslesen kann, könnte er sich auch damit behelfen, dass er zwei Fühler im Vorlauf anbringt - einen so nah wie möglich am Warmwasserspeicher und den anderen etwa 1,5 bis 2m entfernt (ausprobieren). Wird kein Warmwasser gezapft, sinkt die Temperatur im Vorlauf - an dem vom Warmwasserspeicher weiter entfernten Temperaturfühler stärker als an dem Fühler direkt am Speicher. Diese Meßgrößen sind direkter und schneller als ein Fühler im Rücklauf.

Eine Messung des Temperaturanstiegs im Rücklauf ist für die Kalibrierung der Reglerparameter interessant. Und die bei mir eingestellte Maximallaufzeit von 5 Minuten ist die Zeit, bis der Rücklauf max. erwärmt ist. Damit bin ich dann auf der sicheren Seite. Die Hälfte der Zeit bis zum Erreichen des Maximums ist dann etwa die Zeit die es braucht, bis warmes Wasser am am weitest entfernten Wasserhahn anliegt.

DOIF (die vielen Logs sind zum Testen drin...)

subs {
sub pumpe_aus {
my ($dev)=@_;;
my $pumpStat=ReadingsVal($dev,"Status","");;
Log 1, "di_$dev sub 1 - Pumpe verzoegert ausschalten - Pumpe: $pumpStat";;
if ($pumpStat eq 1) {
Log 1, "di_$dev sub 2 - Pumpe verzoegert ausschalten weil an";;
fhem_set("$dev aus");;
fhem("setreading $dev AusGrund Schaltzeit");;
}
}
}

{
# Einschaltdauer in Sekunden
my $Schaltzeit=5*60;;
# Sperrzeit in Sekunden
my $Sperrzeit=17*60;;
# nur Schalten, wenn TempDiff Speicher-Vorlauf > x Grad ist
my $TempDiff=8;;
# Ausschalten, wenn im Vorlauf $higherTemp erreicht ist, default=42
my $higherTemp=40;;
# Hystere, Ausschalten bei $higherTemp, Einschalten erst bei $higherTemp-$Hystere, also Ein/Aus bei $higherTemp - VorlaufTemp
my $Hystere=40-36;;
# nur Schalten, wenn SpeicherTemp > $higherSpeicherTemp
my $higherSpeicherTemp=44;;
# Ausschalten, wenn SpeicherTemp unter $lowerSpeicherTemp faellt
my $lowerSpeicherTemp=40;;
# Pumpen-Device, muss leider in den [] manuell und nicht als Variable gesetzt werden
my $pumpe="WWPumpe";;
# Uhrzeit, wann Pumpe geschaltet werden koennte: $PumpenTime=1
my $PumpenTime=0;;
# Timer-Name Pumpe an/aus
my $timerPumpe=$pumpe . "_off_timer";;
# Timer-Name Sperrzeit
my $timerSperrzeit=$pumpe . "_SZ_timer";;

Log 1, "di_$pumpe - DI-Start";;

if ([06:00-23:00|AT] or [07:00-23:30|WE]) {
$PumpenTime=1;;
Log 1, "di_$pumpe - PumpenTime ja $PumpenTime";;
}
else {
$PumpenTime=0;;
fhem("setreading $pumpe gesperrt 0");;
Log 1, "di_$pumpe - PumpenTime nein $PumpenTime";;
}

my $SpeicherTemp=[Heizung_bai:WWSpeicherTemp,0];;
my $VorlaufTemp=[Heizung_vr70:WWZirkVorlauf,0];;
my $PumpSperre=[?WWPumpe:gesperrt,0];;
Log 1, "di_$pumpe - SpeicherT $SpeicherTemp";;
Log 1, "di_$pumpe - VorlaufT $VorlaufTemp";;
Log 1, "di_$pumpe - Sperre $PumpSperre";;

if (!get_Exec($timerSperrzeit)) {
Log 1, "di_$pumpe - kein Timer zum Aufheben der Sperre";;
if ($PumpSperre eq 1) {
fhem("setreading $pumpe gesperrt 0");;
Log 1, "di_$pumpe - Sperre zurücksetzen";;
}
} else {
Log 1, "di_$pumpe - Laufzeit Timer " . get_Exec($timerSperrzeit);;
}

if ($PumpenTime and ($PumpSperre eq 0) and ($VorlaufTemp < ($higherTemp-$Hystere))) {
if (($SpeicherTemp > $higherSpeicherTemp) and ($SpeicherTemp-$VorlaufTemp > $TempDiff)) {
if (Value($pumpe) ne "an") {
fhem_set "$pumpe an";;
set_Exec($timerPumpe, $Schaltzeit, "pumpe_aus('$pumpe')");;
set_Exec($timerSperrzeit, $Sperrzeit, "fhem('setreading $pumpe gesperrt 0')");;
fhem("setreading $pumpe gesperrt 1");;
}
Log 1, "di_$pumpe - Pumpe an";;
}
}

Log 1, "di_$pumpe - Pumpe Status: " . [?WWPumpe:Status,0];;
if ([?WWPumpe:Status] eq 1) {
Log 1, "di_$pumpe - Pumpe Status an";;
if ($VorlaufTemp > $higherTemp) {
Log 1, "di_$pumpe - Pumpe aus wg. VorlaufT erreicht";;
fhem_set "$pumpe aus";;
fhem("setreading $pumpe AusGrund VorlaufTemp");;
}
elsif ($SpeicherTemp < $lowerSpeicherTemp) {
Log 1, "di_$pumpe - Pumpe aus wg. SpeicherT zu niedrig";;
fhem_set "$pumpe aus";;
fhem("setreading $pumpe AusGrund SpeicherTemp");;
}
elsif (!$PumpenTime) {
Log 1, "di_$pumpe - Pumpe aus wg. Zeitfenster";;
fhem_set "$pumpe aus";;
fhem("setreading $pumpe AusGrund Zeitfenster");;
}
}
Log 1, "di_$pumpe - DI-Ende";;

}


WWPumpe

defmod WWPumpe MQTT2_DEVICE
attr WWPumpe IODev mqtt_broker
attr WWPumpe comment {(ReadingsVal($name,"Status","0") =~ /1/)?"on":"off"}
attr WWPumpe devStateIcon Status.on:rc_GREEN:aus Status.off:rc_RED:an Sperre.0:10px-kreis-gruen Sperre.1:10px-kreis-rot
attr WWPumpe event-min-interval .*:300
attr WWPumpe event-on-change-reading .*
attr WWPumpe group Haustechnik
attr WWPumpe icon sani_pump
attr WWPumpe readingList wpump/input/input:.* Input\
wpump/output/fhem:.* Start\
wpump/output/stop:.* Stop
attr WWPumpe room Status,Vaillant
attr WWPumpe setList Start:on,off wpump/output/fhem/set $EVTPART1\
Stop:on,off wpump/output/stop/set $EVTPART1\
an wpump/user/set user_on\
aus wpump/user/set user_off
attr WWPumpe stateFormat {sprintf("Status %s\nSperre %d", (ReadingsVal($name,"Status","0") =~ /1/)?"on":"off", ReadingsVal($name,"gesperrt",0))}
attr WWPumpe userReadings Status:.* {if(ReadingsVal($name,"Stop","0") =~ /on/) {return "0"} elsif(ReadingsVal($name,"Input","0") =~ /on/ and ReadingsVal($name,"Stop","0") =~ /off/) {return "1"} elsif(ReadingsVal($name,"Start","0") =~ /off/ and ReadingsVal($name,"Stop","0") =~ /off/) {return "0"} elsif(ReadingsVal($name,"Start","0") =~ /on/ and ReadingsVal($name,"Stop","0") =~ /off/) {return "1"}}
attr WWPumpe webCmd an:aus

Damian

#25
Hier mal ein weiterer Ansatz den "Energiefresser" Zirkulation einzudämmen ohne Wasser zu verschwenden und ohne auf den Komfort zu verzichten.

Das Zirkulieren des Wassers kostet bekanntlich relativ viel Wärmeenergie. Mit diesem Ansatz soll die Pumpe nur noch für 5 Minuten zirkulieren, wenn es erforderlich ist. Das bedeutet bei uns z. B. an Werktagen um 5:55 Uhr, wenn jemand da ist, sonst nur wenn man es wünscht: "Alexa Warmwasser an".

Voraussetzung sind Echos im Bad und Küche.

defmod di_zirk DOIF {if ([05:55|AT] and [Anwesenheit] eq "on") {fhem_set("$SELF on")}}\
on {fhem_set("Zirk on");;set_State("on");;set_Exec("zirk_off", 300,'fhem_set("$SELF off")')}\
off {fhem_set("Zirk off");;set_State("off")}
attr di_zirk alexaName warmwasser
attr di_zirk genericDeviceType switch
attr di_zirk room Amazon,Heizung

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Aurel_B

#26
Ich habe auch eine ganz einfache DOIF Schaltung: Falls Temp am Beginn der Zirkulationsleitung < 30° (also quasi Rücklauf) -> für 35s Zirkulationspumpe laufen lassen.

Was ich damit sagen will: schaut mal, ob die Pumpe wirklich mehrere Minuten laufen muss. Bei mir reichen 35s und die Leitungen sind warm.

defmod Zirkulationspumpe_Warmwasser_Intervall DOIF ([Temp_Zirkulationsleitung:temperature] < 30 and [05:30-22:00,+0:05:00]) (set Zirkulationspumpe_Warmwasser on-for-timer 35)

Edit: wir konnten alle Leitungen dämmen (da alles Aufputz), das bringt viel! Bei uns läuft die Pumpe nur alle 2-3h kurz für 35s.

Damian

Zitat von: ansgru am 26 Mai 2023, 10:21:29Ich habe auch eine ganz einfache DOIF Schaltung: Falls Temp am Beginn der Zirkulationsleitung < 30° (also quasi Rücklauf) -> für 35s Zirkulationspumpe laufen lassen.

Was ich damit sagen will: schaut mal, ob die Pumpe wirklich mehrere Minuten laufen muss. Bei mir reichen 35s und die Leitungen sind warm.

defmod Zirkulationspumpe_Warmwasser_Intervall DOIF ([Temp_Zirkulationsleitung:temperature] < 30 and [05:30-22:00,+0:05:00]) (set Zirkulationspumpe_Warmwasser on-for-timer 35)

Edit: wir konnten alle Leitungen dämmen (da alles Aufputz), das bringt viel! Bei uns läuft die Pumpe nur alle 2-3h kurz für 35s.


ja, so eine Steuerung hatte ich bis gestern auch, allerdings musste der Warmwasserspeicher (90 l) mindestens alle 2 Stunden nachgeladen werden. Heute Abend weiß ich mehr, ich gehe von einem halben Kubikmeter Gas-Ersparnis pro Tag aus. Das wären bei den heutigen Preisen ca. 0,5*11*0,12=0,66 € pro Tag. Auch wenn es nur die Hälfte wäre, lohnt es sich auf den Luxus zu verzichten.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Meine Prognose scheint sich zu bestätigen.

Seit der Umstellung der Zirkulation Ende Mai hat sich der Warmwasserverbrauch um ca. 30-40 Prozent reduziert, siehe Anhang.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF