Meine Heizungssteuerung

Begonnen von Gunther, 23 Oktober 2017, 21:12:01

Vorheriges Thema - Nächstes Thema

Gunther

Ich liege gerade leider gehandicapt zuhause und habe die Zeit mal nutzen können. 2 Tage habe ich nun an meiner Heizungssteuerung gebastelt und seeeehr viel dabei gelernt.
Da ich hier soviel Hilfe bekommen habe, möchte ich stolz mein erstes größeres Projekt präsentieren und hoffe, dass sich der ein oder andere hier Inspirationen holen kann.
Danke nachmal an alle, die meine Fragen ertragen haben. (Das wird leider weiter gehen...  ::))
Im Anhang befinden sich Screenshots von der FHEM Oberfläche. Ich plane die Heizungssteuerung noch per Tablet UI auf unsere Wandtablets zu bringen.

Schaut Euch zuerst die Screenshots an. Dann wird der Text verständlicher.

Features:

  • Für jeden Raum kann flexibel über einen Dummy festgelegt werden, ob dieser geheizt werden soll oder nicht. Für den Fall, dass nicht, kann eine Temperatur eingestellt werden, die dann verwendet werden soll (Schimmelvermeidung)
  • Für jeden Wochentag (Mo.-Fr.) und Wochenenden inkl. Feiertage (Voraussetzung, Feiertage sind im global Device zugewiesen) kann flexibel festgelegt werden, wann der Heizkörper in den Tagbetrieb bzw. in den Nachtbetrieb (Absenkung) gehen soll. Diese Festlegung (Zeiten) setzt den Anwesenheitsstatus automatisch um.
  • Die Tag- und Nachttemperaturen können flexibel für jeden Raum eingestellt werden.
  • Die Temperaturen lassen sich in Abhängigkeit vom Anwesenheitsstatus steuern:
  • Wenn anwesend: Die Räume, die beheizt werden sollen, bekommen die Tagtemperatur, die anderen die Nottemperatur
  • Wenn schlafend und abwesend: Die Räume die beheizt werden sollen, bekommen die Nachttemperatur, die anderen die Nottemperatur
  • Wenn im Urlaub: alle Räume bekommen die Nottemperatur

Im unten stehenden Beispiel steuere ich meine Homematic Wandthermostate an.
Wichtig: Wer über den HomeStatus andere Dinge schaltet, sollte sich einen eigenen Heizungsstatus bauen, damit dieser unabhängig vom Licht o.ä. genutzt werden kann.
Diesen kann man dann in den HomeStatus z. B. per notifys integrieren.

Zuerst wird ein Dummy für den Heimstatus erstellt:
define haus_Status dummy
attr haus_Status alias Zuhausestatus
attr haus_Status comment 1 = Tag / Anwesend\
2 = Nacht /Schlafen\
3 = Abwesend\
4 = Urlaub
attr haus_Status group Zuhausestatus
attr haus_Status room Logik_Heizung,Haus
attr haus_Status setList 1 2 3 4
attr haus_Status sortby 01
attr haus_Status webCmd 1:2:3:4


Wie im Kommentarattribut zu lesen sind die Statuswerte:
•   1 = Tag / Anwesend
•   2 = Nacht /Schlafen
•   3 = Abwesend
•   4 = Urlaub

Nun werden die Dummys angelegt, die später die Solltemperaturen für die unterschiedlichen Räume darstellen. In meinem Beispiel lege ich zuerst die Temperatur für mein Arbeitszimmer im Erdgeschoss an. Dasselbe muss natürlich jeweils für alle weiteren Räume gemacht werden.

Die Nachttemperatur:
define eg_az_temperatur_nacht dummy
attr eg_az_temperatur_nacht alias Nachttemperatur EG Arbeitszimmer
attr eg_az_temperatur_nacht group Temperaturen Nacht / Schlafen
attr eg_az_temperatur_nacht readingList state
attr eg_az_temperatur_nacht room G_Dummydevices,Logik_Heizung
attr eg_az_temperatur_nacht setList state:slider,5,1,30
attr eg_az_temperatur_nacht webCmd state


Analog dazu die Temperatur für den Tag:
define eg_az_temperatur_tag dummy
attr eg_az_temperatur_tag alias Tagtemperatur EG Arbeitszimmer
attr eg_az_temperatur_tag group Temperaturen Tag / Anwesenheit
attr eg_az_temperatur_tag readingList state
attr eg_az_temperatur_tag room G_Dummydevices,Logik_Heizung
attr eg_az_temperatur_tag setList state:slider,5,1,30
attr eg_az_temperatur_tag webCmd state


Und zuletzt die Temperatur für ,,Nichtheizen" bzw. Urlaube:
define eg_az_temperatur_kalt dummy
attr eg_az_temperatur_kalt alias Urlaubstemperatur EG Arbeitszimmer
attr eg_az_temperatur_kalt group Temperaturen Urlaub / ungenutzte Räume
attr eg_az_temperatur_kalt readingList state
attr eg_az_temperatur_kalt room G_Dummydevices,Logik_Heizung
attr eg_az_temperatur_kalt setList state:slider,5,1,30
attr eg_az_temperatur_kalt webCmd state


Als nächstes definiere ich für die Wochentage die Dummys, die die Uhrzeiten für Tag- und Nachtbetrieb darstellen.

Für die Umschaltung auf den Tagbetrieb am Montag:
define uhrzeit_nachtabsenkung_aufheben_mo dummy
attr uhrzeit_nachtabsenkung_aufheben_mo alias 01 Uhrzeit Ende Nachtabsenkung Montag
attr uhrzeit_nachtabsenkung_aufheben_mo comment Variable Zeit für Wechsel von Nacht auf Tag
attr uhrzeit_nachtabsenkung_aufheben_mo group Tag / Nacht Zeiten für Automatik
attr uhrzeit_nachtabsenkung_aufheben_mo readingList state
attr uhrzeit_nachtabsenkung_aufheben_mo room G_Dummydevices,Logik_Heizung
attr uhrzeit_nachtabsenkung_aufheben_mo setList state:time
attr uhrzeit_nachtabsenkung_aufheben_mo webCmd state


Die anderen Wochentage (Di.-Fr.) werden analog erstellt.

Für das Wochenende sieht es dann so aus:
define uhrzeit_nachtabsenkung_aufheben_we dummy
attr uhrzeit_nachtabsenkung_aufheben_we alias 08 Uhrzeit Ende Nachtabsenkung Wochenende/ Feiertage
attr uhrzeit_nachtabsenkung_aufheben_we comment Variable Zeit für Wechsel von Nacht auf Tag\
z. B. für Heizungssteuerung\
Wird gepflegt über Tablet UI
attr uhrzeit_nachtabsenkung_aufheben_we group Tag / Nacht Zeiten für Automatik
attr uhrzeit_nachtabsenkung_aufheben_we readingList state
attr uhrzeit_nachtabsenkung_aufheben_we room G_Dummydevices,Logik_Heizung
attr uhrzeit_nachtabsenkung_aufheben_we setList state:time
attr uhrzeit_nachtabsenkung_aufheben_we webCmd state


Für die Umschaltung auf den Nachtbetrieb am Montag:
define uhrzeit_nachtabsenkung_mo dummy
attr uhrzeit_nachtabsenkung_mo alias 01 Uhrzeit Nachtabsenkung Montag
attr uhrzeit_nachtabsenkung_mo comment Variable Zeit für Wechsel von Tag auf Nacht\
z. B. für Heizungssteuerung\
Wird gepflegt über Tablet UI
attr uhrzeit_nachtabsenkung_mo group Tag / Nacht Zeiten für Automatik
attr uhrzeit_nachtabsenkung_mo readingList state
attr uhrzeit_nachtabsenkung_mo room G_Dummydevices,Logik_Heizung
attr uhrzeit_nachtabsenkung_mo setList state:time
attr uhrzeit_nachtabsenkung_mo webCmd state


Di.-Fr. wieder analog dazu.

Für die Umschaltung auf den Nachtbetrieb am Wochenende:
define uhrzeit_nachtabsenkung_we dummy
attr uhrzeit_nachtabsenkung_we alias 08 Uhrzeit Nachtabsenkung Wochenende/ Feiertage
attr uhrzeit_nachtabsenkung_we comment Variable Zeit für Wechsel von Tag auf Nacht\
z. B. für Heizungssteuerung\
Wird gepflegt über Tablet UI
attr uhrzeit_nachtabsenkung_we group Tag / Nacht Zeiten für Automatik
attr uhrzeit_nachtabsenkung_we readingList state
attr uhrzeit_nachtabsenkung_we room G_Dummydevices,Logik_Heizung
attr uhrzeit_nachtabsenkung_we setList state:time
attr uhrzeit_nachtabsenkung_we webCmd state


Jetzt habe ich noch für jeden Raum einen Dummy angelegt, in dem später gepflegt werden kann, ob dieser Raum in die normale Logik aufgenommen werden soll. Ungenutzte Räume lassen sich so herausnehmen, obwohl für den Regelbetrieb trotzdem reguläre Tag- und Nachttemperaturen gepflegt werden.

Im Beispiel seht Ihr, wie ich den Dummy für mein Büro angelegt habe. Für alle weiteren Räume muss das natürlich analog gemacht werden:
define eg_az_heizen dummy
attr eg_az_heizen alias EG Büro heizen?
attr eg_az_heizen group Festlegung welche Räume Tags geheizt werden sollen
attr eg_az_heizen readingList state
attr eg_az_heizen room G_Dummydevices,Logik,Logik_Heizung
attr eg_az_heizen setList nein ja
attr eg_az_heizen webCmd ja:nein


So, nun sind die Dummys erstellt. Was nun fehlt ist die Logik dahinter.

Als erstes bauen wir ein Konstrukt, welches anhand des oben definierten Zeitdummys uhrzeit_nachtabsenkung_aufheben_mo den Zuhause Status (haus_Status) auf 1 (anwesend) setzt. Wenn dort z. B. 05:00:00 Uhr gepflegt ist, setzt das DOIF morgens um 5 Uhr den Status um. Das soll aber nur passieren, wenn man nicht abwesend oder im Urlaub ist (haus_Status < 3).
Ich habe hier das DOIF gewählt, da ich weder mit einem at, noch mit einem weekdaytimer es hinbekommen habe, dass Änderungen an der Zeit im Dummy automatisch übernommen werden. Das DOIF bekommt eine Änderung mit.
define doif_heizung_nachtabsenkung_aufheben_1mo DOIF ([[uhrzeit_nachtabsenkung_aufheben_mo]|Mo] and [haus_Status:state] <3) (set haus_Status 1)
attr doif_heizung_nachtabsenkung_aufheben_1mo room Logik,Logik_Heizung


Für jeden Wochentag von Mo.-Fr. ist jeweils ein DOIF anzulegen.
Für Wochenenden schaut das so bei mir aus:
define doif_heizung_nachtabsenkung_aufheben_8we DOIF ([[uhrzeit_nachtabsenkung_aufheben_we]|WE] and [haus_Status:state] <3) (set haus_Status 1)
attr doif_heizung_nachtabsenkung_aufheben_8we room Logik,Logik_Heizung


Als Pendent dazu benötigen wir noch ein DOIF, das abends den Hausstatus umsetzt auf 2 = Schlafen. Dieser wird nachher dazu benutzt die entsprechenden Nachttemperaturen einzustellen. Ich habe für jeden Wochentag ein DOIF angelegt.
define doif_heizung_nachtabsenkung_1mo DOIF ([[uhrzeit_nachtabsenkung_mo]|MO] and [haus_Status:state] <3) (set haus_Status 2)
attr doif_heizung_nachtabsenkung_1mo room Logik,Logik_Heizung


Für jeden Wochentag von Mo.-Fr. ist jeweils ein DOIF anzulegen.

Für Wochenenden habe ich das wie folgt aufgebaut:
defmod doif_heizung_nachtabsenkung_8we DOIF ([[uhrzeit_nachtabsenkung_we]|WE] and [haus_Status:state] <3) (set haus_Status 2)
attr doif_heizung_nachtabsenkung_8we room Logik,Logik_Heizung


So, nun schaltet FHEM in Abhängigkeit von den individuell von Mo.-Fr. und für Wochenenden festgelegten Temperaturabsenk- und Temperaturanhebezeiten den Hausstatus auf Anwesenheit oder Schlafen.
Die Heizkörper bekommen davon noch nichts mit.

Dies habe ich nun in 4 notifys gelöst. Für jeden der Hausstatuswerte eins:


  • Anwesenheit/ Tag: Räume mit ,,ja" (eg_az_heizen) werden auf Tagtemperatur, Räume mit ,,nein" auf ,,Nichtheizen"-Temperatur gestellt.
  • Nacht: Räume mit ,,ja" (eg_az_heizen) werden auf Nachttemperatur, Räume mit ,,nein" auf ,,Nichtheizen"-Temperatur gestellt.
  • Abwesenheit: Räume mit ,,ja" (eg_az_heizen) werden auf Nachttemperatur, Räume mit ,,nein" auf ,,Nichtheizen"-Temperatur gestellt.
  • Urlaub: alle Räume werden auf ,,Nichtheizen"-Temperatur gestellt

Hier die notifys:

1. Anwesenheit
define notify_haus_Status_1Tag_heizung notify haus_Status:1 \
{if (Value("eg_az_heizen") eq 'ja') { fhem "set eg_az_Wandthermostat_Climate controlManu " . Value('eg_az_temperatur_tag')}};;;;\
{if (Value("eg_az_heizen") eq 'nein') { fhem "set eg_az_Wandthermostat_Climate controlManu " . Value('eg_az_temperatur_kalt')}}

attr notify_haus_Status_2Nacht_heizung comment Hausstatus auf 2 (Nacht) wird mit notify abgefangen und steuert Geräte.\\
Dabei setze ich jedes Thermostat manuell auf die gewünschte Nacht-Temperatur.\\
\\
Wird automatisch durch Wechsel von Tag auf Nacht durchgeführt.\\
Alternativ durch manuellen Wechsel auf Nacht.
attr notify_haus_Status_2Nacht_heizung room Logik,Logik_Heizung


2. Nacht
define notify_haus_Status_2Nacht_heizung notify haus_Status:2 \
{if (Value("eg_az_heizen") eq 'ja') { fhem "set eg_az_Wandthermostat_Climate controlManu " . Value('eg_az_temperatur_nacht')}};;;;\
{if (Value("eg_az_heizen") eq 'nein') { fhem "set eg_az_Wandthermostat_Climate controlManu " . Value('eg_az_temperatur_kalt')}}
attr notify_haus_Status_2Nacht_heizung comment Hausstatus auf 2 (Nacht) wird mit notify abgefangen und steuert Geräte.\\
Dabei setze ich jedes Thermostat manuell auf die gewünschte Nacht-Temperatur.\\
\\
Wird automatisch durch Wechsel von Tag auf Nacht durchgeführt.\\
Alternativ durch manuellen Wechsel auf Nacht.
attr notify_haus_Status_2Nacht_heizung room Logik,Logik_Heizung


3. Abwesenheit
defmod notify_haus_Status_3Abwesend_heizung notify haus_Status:3 \
{if (Value("eg_az_heizen") eq 'ja') { fhem "set eg_az_Wandthermostat_Climate controlManu " . Value('eg_az_temperatur_nacht')}};;;;\
{if (Value("eg_az_heizen") eq 'nein') { fhem "set eg_az_Wandthermostat_Climate controlManu " . Value('eg_az_temperatur_kalt')}}
attr notify_haus_Status_3Abwesend_heizung room Log,Logik_Heizung


4. Urlaub
defmod notify_haus_Status_4Urlaub_heizung notify haus_Status:4 \
{ fhem "set eg_az_Wandthermostat_Climate controlManu " . Value('eg_az_temperatur_kalt')}
attr notify_haus_Status_4Urlaub_heizung room Logik,Logik_Heizung


Ich hoffe die Screenshots für die Bedienung sind selbsterklärend.

Jetzt kann man natürlich erweitern:

  • Anwesenheit/ Abwesenheit automatisieren
  • Partyschalter einbauen, der den Nachtmodus einmalig auslässt
  • ...

Ich freue mich über Anmerkungen, Kritik, Anregungen.
Viel Spaß damit
FHEM@Proxmox@Nuc: TabletUI als User-Interface (4 Wandtablets) / IOs per ser2net gekapselt
Homematic: Heizung, Fenster, Bewegung | Jeelink: Temperatur | Z-Wave: Bewegung, Temperatur | FS20: Temperatur, Fenster | Viessmann-Heizung eingebunden

Gunther

ich hatte noch einen Fehler, den ich festgestellt habe. Am WE hat das Ding nur Samstags gearbeitet.

Daher muss für das WE-DOIF, aber am besten gleich für alle DOIFs noch folgendes ergänzt werden:
attr doif_heizung_... do always
FHEM@Proxmox@Nuc: TabletUI als User-Interface (4 Wandtablets) / IOs per ser2net gekapselt
Homematic: Heizung, Fenster, Bewegung | Jeelink: Temperatur | Z-Wave: Bewegung, Temperatur | FS20: Temperatur, Fenster | Viessmann-Heizung eingebunden

Gunther

Hier hat sich noch ein Minifehler eingeschlichen:
ZitatAls Pendent dazu benötigen wir noch ein DOIF, das abends den Hausstatus umsetzt auf 2 = Schlafen. Dieser wird nachher dazu benutzt die entsprechenden Nachttemperaturen einzustellen. Ich habe für jeden Wochentag ein DOIF angelegt.
Code: [Auswählen]
define doif_heizung_nachtabsenkung_1mo DOIF ([[uhrzeit_nachtabsenkung_mo]|MO] and [haus_Status:state] <3) (set haus_Status 2)
attr doif_heizung_nachtabsenkung_1mo room Logik,Logik_Heizung

das MO muss Mo heißen

define doif_heizung_nachtabsenkung_1mo DOIF ([[uhrzeit_nachtabsenkung_mo]|Mo] and [haus_Status:state] <3) (set haus_Status 2)
attr doif_heizung_nachtabsenkung_1mo room Logik,Logik_Heizung
FHEM@Proxmox@Nuc: TabletUI als User-Interface (4 Wandtablets) / IOs per ser2net gekapselt
Homematic: Heizung, Fenster, Bewegung | Jeelink: Temperatur | Z-Wave: Bewegung, Temperatur | FS20: Temperatur, Fenster | Viessmann-Heizung eingebunden

Duncan

#3
Hi Gunther,

das ist doch mal ein Beitrag der mich sofort zum Nachbau anregt  ;D TOP!
Vielen Dank dafür, Gruß Duncan
PS: Gute Besserung.