FHEM – Heizungssteuerung mit Anwesenheitserkennung

By | 21. Januar 2017

Heute zeige ich Euch meine Umsetzung der Heizungssteuerung mittels FHEM. Dabei wird die Anwesenheit der Bewohner mittels Handy berücksichtigt. Dafür habe ich alle relevanten Heizkörperthermostate durch HomeMatic 105155 (HM-CC-RT-DN) ersetzt. Diese Thermostate können zwar mit einem Wochenprogramm betrieben werden, aber dafür gibt es preiswertere Geräte. Die Homatic’s lassen sich über eine Zentrale viel zielgenauer steuern.

In meinen ersten Versuchen habe ich die Thermostate zu einer Structure zusammen gefasst. Jedoch hat sich das in der der Praxis als wenig hilfreich gezeigt. Zu unterschiedlich sind die Temperatur-Anforderungen der einzelnen Räume. Daher setze ich die Temepraturen jetzt lieber separat, auch wenn die Befehle dadurch ziemlich lang werden.
Wer trotzdem damit arbeiten möchte:

define Heizung structure thermostat HM_50159A_Clima HM_5029B4_Clima \
HM_5016F3_Clima 

HomeStatus

Ein wichtiger Zustand zum steuern ist der Home-Status. Dieser wird in meinem Fall durch folgende Status-Matrix dargestellt:
1 = Tag
2 = Nacht
3 = Abwesend
4 = Urlaub

diesen Indikator erstellen Wir als erstes mit einem Dummy:

define HomeStatus dummy
attr HomeStatus setList HomeStatus 1 2 3 4

Dieser Dummy wird später durch die Anwesenheit (ping auf Handy) oder zeitgesteuert mittels AT gesetzt.

Wir starten am Morgen und stellen zur gewünschten Zeit die Zieltemperatur der Räume ein. Dafür setzen Wir einfach den HomeStatus mittels AT entsprechend auf 1 (Tag/Day). Jedoch nur, wenn der jetzige Status nicht Abwesend oder Urlaub ist.

define HeizungNachtabsenkung_aufheben at *05:00:00 \
{if (Value("HomeStatus")<3) {fhem("set HomeStatus 1")}}

Diesen Statuswechsel können wir jetzt mit einer Noti abfangen. Dabei setze ich jedes Thermostat manuell auf die gewünschte Tag-Temperatur:

define HomeStatusDay notify HomeStatus:1 \
{fhem( "set HM_50159A_Clima controlManu 21.0;;set HM_5029B4_Clima controlManu 21.0")}

Einzelne Räume können natürlich unabhängig vom Status auch mittels AT gesteuert werden.
Hier zum Beispiel die vorzeitige Nachtabsenkung für das Kinderzimmer:

define HeizungNachtabsenkung_Kinder at *20:00:00 \
{if (Value("HomeStatus")<3) {fhem("set HM_5015F0_Clima controlManu 17")} }

Der Nachtmodus wird wieder durch einfaches setzten des HomeStatus eingeleitet:

define HeizungNachtabsenkung at *22:30:00 {if (Value("HomeStatus")<3) \
{fhem("set HomeStatus 2")}}

Auch hier beachten wir wieder den alten Status und wechseln nur in den Nacht-Modus wenn dieser vorher Tag oder Nacht war.

Damit haben Wir jetzt grob das Konzept unsere Zeitsteuerung fertig. Die AT Befehle lassen sich natürlich auch nach Wochentag aufsplitten!

Anwesenheits-Erkennung oder Presence

Nun kommen Wir zur Anwesenheitserkennung oder Presence. Das Erkennen der Anwesenheit einer Person ist leider immer noch eine Herausforderung. Auch spielen die häuslichen Gegebenheiten ein Rolle. Wer Hunde oder Katzen zu Hause hat, wird die Erkennung nicht mittels Bewegungsmelder realisieren können.

So grob fallen mir folgende Methoden zur Erkennung der Anwesenheit ein:

- manuell mittels Taster oder Schaltfläche auf dem Tablett
- Bewegungsmelder
- WLAN / Bluetooth des Handy /Smartphone /Bluetooth-Tag
- mittels GPS und einer APP auf dem Smartphone

Welche Erkennung für Euch in Frage kommt, hängt auch von den häuslichen Gegebenheiten ab. Wer Hunde oder Katzen zu Hause hat, wird die Erkennung nicht mittels Bewegungsmelder realisieren können.

Ich habe mich für die in FHEM integrierte Variante entschieden. Hierbei wird in regelmäßigen Abständen ein Ping an das Handy gesendet. Wenn das Handy, zu Hause im WLAN eingebucht ist, wird es den Ping beantworten und FHEM weiß jetzt, dass der Besitzer zu Hause ist. So einfach und elegant diese Lösung auch ist, so hat sie jedoch auch ihre Tücken.
Zum Beispiel schalten einige Smartphones das WLAN aus, wenn es längere Zeit nicht genutzt wird.

Handy anlegen:

define Handy_Max_LAN PRESENCE lan-ping ZTE-Max.fritz.box 30 300
attr Handy_Max_LAN event-on-change-reading state
attr Handy_Max_LAN ping_count 4

In meinem Beispiel wird alle 30 Sekunden geprüft, ob das Gerät "ZTE-Max.fritz.box" erreichbar ist. Ist das Gerät present, wird nur noch alle 300 Sekunden geprüft. Der Ping_Count erhöht etwas die Zuverlässigkeit, falls das Gerät nicht auf den ersten oder zweiten Ping antwortet. Mittels "event-on-change-reading" stellen wir sicher, dass wirklich nur ein Notify ausgelöst wird, wenn sich der Status ändert.

Diesen Presens-Status nutzen wir jetzt und setzen die Temperatur seiner Heizung auf 21 Grad, wenn Max nach hause kommt. Gleichzeitig lasse ich dieses Event in das Log schreiben. Das macht die Fehlersuche später etwas einfacher:

define Max_ist_present notify Handy_Max_LAN:present \
{if (Value("HomeStatus")<2) {fhem("set HM_5015F0_Clima controlManu 21")};;\
{Log 1, "Max ist nach Hause gekommen"} }

Wie Ihr seht, wird auch hier wieder der HomeStatus berücksichtigt. Damit wird z.B. verhindert, dass mitten in der Nacht die Heizung angeht wenn es mal etwas später geworden ist.

Wenn Max jetzt das Haus verlässt (oder sein Handy gerade nicht erreichbar ist) gibt es auch wieder eine Noti. Auf diese möchte ich jetzt aber zeitlich verzögert reagieren. Daher kommt wieder mein geliebter Watchdog zum Einsatz:

define watchdog_Max_ist_absent watchdog Handy_Max_LAN:absent 00:30:00 \
Handy_Max_LAN:present set HM_5015F0_Clima controlManu 17
attr watchdog_Max_ist_absent autoRestart 1

Hier kann ich jetzt mit einer Verzögerung von 30 Minuten die Heizung drosseln. Der Watchdog wird abgebrochen wenn Handy_Max_LAN doch wieder present wird. Wichtig ist wie (fast) immer das Attribut autoRestart, damit der Watchdog nach dem auslösen wieder Bereit ist.

Diese Erkennung können wir jetzt mit allen Handys der Bewohner machen.

Structure - Zusammenfassen

Wir können auch die Presence der Handys zu einer Structure zusammen fassen. Zum Beispiel die Handys der Eltern. Damit können Wir jetzt zum Beispiel das Wohnzimmer einschalten, sobald ein Elternteil zu Hause ist.

define HANDY_Eltern structure dummy Handy_MAMA_LAN Handy_PAPA_LAN
attr HANDY_Eltern clientstate_behavior relative
attr HANDY_Eltern clientstate_priority present absent
attr HANDY_Eltern event-on-change-reading state

Ich habe bei mir zusätzlich alle Handys zusammengefasst und setze darüber auch den Abwesenheits-Status (3).

define watchdog_Anwesenheit_Alle watchdog Handy_ALLE:absent 00:30 Handy_ALLE:present \
set Heizung_Fern off;;;;set HomeStatus 3
attr watchdog_Anwesenheit_Alle autoRestart 1

Über ein Relais setze ich die Gas-Heizung bei Abwesenheit in den Nacht-Modus. Sie wird nicht aus geschaltet! Sie geht lediglich in den Abschaltbetrieb (Frostschutz bleibt aktive, Kessel-Temperatur wird abgesenkt und die Umwälz-Pumpen gehen aus).
Ich hoffe die Beispiele helfen Euch bei Euer eigenen Umsetzung der Heizungssteuerung.

2 thoughts on “FHEM – Heizungssteuerung mit Anwesenheitserkennung

  1. Peter

    hallo sysmek, sehr schöne anleitung. hat mich meiner „perfekten“ heizungssteuerung einen schritt näher gebracht. ich würde noch gerne wissen, wie du den status 4 (urlaub) setzt? da ich eher unregelmäßig und meistens kurzfristig weg bin, möchte ich das nicht über einen kalender sondern eher wie eine art dummy-schalter steuern, den ich auch für eine anwesenheitssimulation (zufälliges licht ein- ausschalten) nützen kann. ich hab aber noch keine brauchbare lösung gefunden. vielleicht klappt das mit deiner lösung. lg peter

    Reply
    1. sysmek Post author

      Hallo Peter,
      ich benutze zum steuern Tablet_UI auf einem Tablett oder einfach via Webbrowser
      Tablett_UI
      damit setze ich einfach den Status auf 4

      mfg sysmek

      Reply

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.