Vorstellung einer umfangreichen Heizungssteuerung

Begonnen von Carsten1981, 22 Dezember 2017, 19:05:57

Vorheriges Thema - Nächstes Thema

Carsten1981

Hallo,

Nachdem ich seid über einem Jahr immer wieder viel Hilfe hier im Forum bekommen habe, möchte ich jetzt mal was zurück geben.
Als erstes möchte ich kurz meine Heizungsanlage vorstellen:
- 1.000l Speicher, davon 200l Trinkwasserblase
- Solarthermieanlage mit Solarpumpe
- Kaminofen mit Wärmetauscher und Kaminpumpe
- Fußbodenheizung mit Heizkreispumpe und Dreiwegemischer
- Gas Brennwerttherme (läuft nur immer Warmwasserbetrieb unabhängig von FHEM)

Die Steuerung die ich vorstellen möchte läuft in Teilen seid ca. fünf Monaten (Solarpumpe) und seid ca. zwei Monat die Steuerung der Fußbodenheizung ohne Probleme

Als erstes die Solarsteuerung (Pumpe / THRESHOLD / DOIF) inkl. zwei Temperatursensoren (VL_Solar und Puffer_unten):
Solarpumpe:
define Solarpumpe RPI_GPIO 20
attr Solarpumpe devStateIcon off:sani_pump@lightgrey:on on:sani_pump@red:off
attr Solarpumpe direction output
attr Solarpumpe group Pumpen
attr Solarpumpe icon icoTemp
attr Solarpumpe room Heizung

Threshold (nach dem Motto Solaranlage xK wärmer als Puffer_unten dann Pumpe an):
define Solarsteuerung THRESHOLD VL_Solar:temperature:1:Puffer_unten:temperature:7 Solarpumpe |set @ on|set @ off|1
attr Solarsteuerung number_format %.1f
attr Solarsteuerung room Heizung
attr Solarsteuerung state_format _m _dv
attr Solarsteuerung webCmd on:off

DOIF zur Reduzierung der Datenlast (wenn Dunkel und oder Anlage kalt dann größeres Polling Interval)
define DOIF_pollingIntervall_Solar DOIF
([Helligkeit:state] < 6) (attr VL_Solar pollingInterval 1800)

DOELSEIF
([Helligkeit:state] > 6) (attr VL_Solar pollingInterval 1800)

DOELSEIF
([Helligkeit:state] > 5 and [Helligkeit:state] < 7 and [VL_Solar:temperature] < 30 ) (attr VL_Solar pollingInterval 300)

DOELSEIF
([Helligkeit:state] > 5 and [Helligkeit:state] < 7 and [VL_Solar:temperature] > 30 ) (attr VL_Solar pollingInterval 60)


Als nächstes kommt die Kaminpumpe mit einem Temperatursensor VL_Kamin
Kaminpumpe:
define Kaminpumpe RPI_GPIO 21
attr Solarpumpe devStateIcon off:sani_pump@lightgrey:on on:sani_pump@red:off
attr Solarpumpe direction output
attr Solarpumpe group Pumpen
attr Solarpumpe icon icoTemp
attr Solarpumpe room Heizung


Steuerung der Kaminpumpe
define Kaminsteuerung THRESHOLD VL_Kamin Kaminpumpe|set @ on|set @ off|1
attr Kaminsteuerung number_format %.1f
attr Kaminsteuerung room Heizung
attr Kaminsteuerung state_cmd1_gt off
attr Kaminsteuerung state_cmd2_lt on
attr Kaminsteuerung state_format _m _dv

Als Desired habe ich 74°C mit Hysterese von 3K

DOIF zur Reduzierung der Datenlast (Wenn Kamin kalt größeres Polling Interval)
define DOIF_pollingIntervall_Kamin DOIF ([VL_Kamin:temperature] < 55 ) (attr VL_Kamin pollingInterval 300)

DOELSEIF
([VL_Kamin:temperature] > 55 ) (attr VL_Kamin pollingInterval 60)


attr DOIF_pollingIntervall_Kamin room Thermometer

Da ich es vermeiden möchte den Kamin beim Ausfall des Temperatursensors über die thermische Ablaufsicherung mit Frischwasser zu kühlen, habe ich an einem zweiten PI einen zweiten Temperatursensor installiert der in einen Dummy schreibt, der auf der Hauptinstanz läuft.
define Steuerung_Kamin_Notfall DOIF ([VL_Kamin_Rueckfall:temperature] > 77 and [Kaminpumpe] eq "off")
(set Kaminpumpe on-for-timer 600)
    {fhem "set XXX msg Notkühlung Kamin
\nVL-Kamin:...........[VL_Kamin]
\nVL-Kamin-Rückfall:...[VL_Kamin_Rueckfall]
"}\
DOELSE
attr Steuerung_Kamin_Notfall do always
attr Steuerung_Kamin_Notfall repeatcmd 601
attr Steuerung_Kamin_Notfall room Heizung


Berechnung der Vorlauf-soll Temperatur nach der Außentemperatur (Außentemperatursensor vorausgesetzt). Die berechnete Temperatur wird in einen Dummy geschrieben.

([Heizungspumpe] eq "on" and [Betriebsart] eq "Automatik")
{fhem("set Vorlauf_soll ".((([Dummy_Fusspunkt_Aussentemperatur]-1*[Aussentemperatur:temperature])*[Dummy_Steigung])+[Dummy_Fusspunkt_Vorlauftemperatur])) }
DOELSEIF
([Heizungspumpe] eq "on" and [Betriebsart] eq "Heizen")
{fhem("set Vorlauf_soll ".((([Dummy_Fusspunkt_Aussentemperatur]-1*[Aussentemperatur:temperature])*[Dummy_Steigung])+[Dummy_Fusspunkt_Vorlauftemperatur])) }
DOELSEIF
([Heizungspumpe] eq "on" and [Betriebsart] eq "Komfort")
{fhem("set Vorlauf_soll ".((([Dummy_Fusspunkt_Aussentemperatur]-1*[Aussentemperatur:temperature])*[Dummy_Steigung])+[Dummy_Fusspunkt_Vorlauftemperatur]+2)) }
DOELSEIF
([Heizungspumpe] eq "on" and [Betriebsart] eq "Aus")
{fhem("set Vorlauf_soll ".((([Dummy_Fusspunkt_Aussentemperatur]-1*[Aussentemperatur:temperature])*[Dummy_Steigung])+[Dummy_Fusspunkt_Vorlauftemperatur]-6)) }
DOELSE
  (set Vorlauf_soll 0)


Die Devices Betriebsart, Dummy_Fusspunkt_Aussentemperatur, Dummy_Steigung und Dummy_Fusspunkt_Vorlauftemperatur sind Dummy's die ich mit Slidern versehen habe um die Heizung (Heizleistung) leicht anpassen zu können

define Dummy_Fusspunkt_Vorlauftemperatur dummy
attr Dummy_Fusspunkt_Vorlauftemperatur group Einstellungen
attr Dummy_Fusspunkt_Vorlauftemperatur room Heizung
attr Dummy_Fusspunkt_Vorlauftemperatur setList state:slider,20,0.5,30,1
attr Dummy_Fusspunkt_Vorlauftemperatur webCmd state


Jetzt folgt noch die Steuerung des 3-Wege Mischers inkl. Temperatursensor Vorlauf-ist

(([Vorlauf_soll]-[Vorlauf_ist:temperature]) > 1.5 and [Heizungspumpe:state] eq "on")
(set Mischer_zu off)
    (set Mischer_auf on-for-timer 7)
DOELSEIF
(([Vorlauf_soll]-[Vorlauf_ist:temperature]) > 0.4 and [Heizungspumpe:state] eq "on")
(set Mischer_zu off)
(set Mischer_auf on-for-timer 2)
DOELSEIF
(([Vorlauf_soll]-[Vorlauf_ist:temperature]) >= 0 and [Heizungspumpe:state] eq "on")
(set Mischer_zu off)
(set Mischer_auf off)
DOELSEIF
(([Vorlauf_soll]-[Vorlauf_ist:temperature]) < -1.5 and [Heizungspumpe:state] eq "on")
(set Mischer_auf off)
(set Mischer_zu on-for-timer 7)
DOELSEIF
(([Vorlauf_soll]-[Vorlauf_ist:temperature]) < -0.4 and [Heizungspumpe:state] eq "on")
(set Mischer_auf off)
(set Mischer_zu on-for-timer 2)
DOELSEIF
(([Vorlauf_soll]-[Vorlauf_ist:temperature]) < 0 and [Heizungspumpe:state] eq "on")
(set Mischer_auf off)
(set Mischer_zu off)
DOELSE
(set Mischer_auf off)
    (set Mischer_zu on-for-timer 5)


Vielleicht kann ja der ein oder andere mit Teilen davon was anfangen und ich hoffe ich kann so auch mal was an das Forum hier zurück geben.

Und für Kritik oder Verbesserungsvorschläge bin ich natürlich auch gerne zu haben
fhem 5.8 CUL 433, 8x DS18B20, 8fach 230V Relais
benachrichtigungen über Telegram, Steuerung Solar- und Kaminpumpe, Steuerung Somfy Rollos, Lichtsteuerung über Intertechno, Steuerung Heizungspumpe und Mischer Fußbodenheizung