Steuerung meiner Zirkulationspumpe

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

Vorheriges Thema - Nächstes Thema

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@AMD-Ryzen7-5700U@Debian-LXC (ProxmoxHOST), 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@AMD-Ryzen7-5700U@Debian-LXC (ProxmoxHOST), 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