Skip to content

FHEM: Heizung (und weitere Geräte) durch Anwesenheit steuern

Eine kleine Übung, die mir viel Spaß und ein wenig Kopfzerbrechen bereitet hat, war die Anwesenheitskontrolle. Was mit "define Variablenname presence lan-ping 123.123.123.123" flott niedergeschrieben ist, hat die ein oder andere Tücke. Aber dazu später mehr.

Die anfängliche Überlegung war, meine Heizung (in Ermangelung weiterer Aktoren) durch Anwesenheit zu schalten. FHEM liefert dabei eingebaut unter anderem die Anwesenheitskontrolle via ICMP. Praktisch, dachte ich mir, da sowohl ich als auch meine Frau nicht ohne Handy aus dem Hause gehen. Leider hat Apple im Iphone den kleinen Fallstrick eingebaut, dass das dumme Gerät keinen ordentlichen Schlafmodus mit reduzierter Sendeleistung hat, sondern sich einfach komplett aus dem WLAN verabschiedet, sobald das Display mal wenige Sekunden nicht aktiv ist. Mein Nexus ist da etwas weniger schwachsinnig gebaut, und reduziert einfach die Leistung.
Mein erster Versuch bestand darin, notifies für die beiden Presence-Definitionen einzurichten. Problem: Um das Iphone mit viel Glück zu erreichen, muss mehr als ein Ping abgesetzt werden. Ich erhöhe also den ICMP-Counter auf 4, und erhalte bei einem notify vier Benachrichtigungen, die auch vier mal die Heizung verstellen. Macht natürlich wenig Sinn, und belastet den COC zu stark. Zudem generiert in meinem Setup jede Heizoperation eine Mail an mich...

Die Wahl fiel daher auf den watchdog, einen eventbasierten Timer, mit dem sich nach Eintreten eines Ereignisses Dinge tun lassen. Der Vorteil: Tritt ein weiteres, definiertes Ereignis ein, kann der Watchdog-Timer vor Ablauf unterbrochen werden. Zusätzlich lässt sich festlegen, dass der watchdog nur einmal während seines Intervalls aufgerufen werden kann, und nicht von weiteren eintretenden Ereignissen ausgelöst wird.

In der fhem.cfg sieht das in etwa so aus:

define JHP PRESENCE lan-ping 192.168.2.17 200
attr JHP ping_count 4
attr JHP event-on-change-reading state

define JHP_absent watchdog JHP:Absent 00:05:00 JHP:Present { AbsenceSub() }
attr JHP_absent regexp1WontReactivate 1

define JHP_present watchdog JHP:Present 00:05:00 JHP:Absent { PresenceSub() }
attr JHP_present regexp1WontReactivate 1


Alle 200 Sekunden werden vier ICMP-Echo-Requests abgesetzt, und wenn sich der Wert meiner Presence ändert, wird ein Event gefeuert. Auf dieses Event reagiert der Watchdog, je nach Status. Ich habe einen Presence- und einen Absence-Watchdog eingerichtet, welche die jeweiligen Perl-Funktionen ausführen. Wie alle Benutzer-Funktionen habe ich auch diese in die 99_myUtils.pm gesteckt.


AbsenceSub
{
if (Value("JHP") eq "absent")
{
if(Value("jemandDa") eq "true")
{
fhem("set jemandDa false");
fhem("set HeizungWohnzimmer_Clima controlMode night");
}
}
}


Auf Anwesenheit wird zwischen 05:00 und 23:00 geprüft. In dieser Zeit wird der Heizplan überschrieben, sobald eine Person anwesend ist.

PresenceSub
{
if ((Value("JHP") eq "present"))
{
if(Value("jemandDa") eq "false")
{
fhem("set jemandDa true");
}
if((ReadingsVal("HeizungWohnzimmer_Clima","desired-temp","0") < 21) && (Value("jemandDa") eq "true"))
{
if(ReadingsVal("HeizungWohnzimmer_Clima","mode","night") ne "auto")
{
if(Value("CUL_HM_HM_CC_RT_DN") eq "CMDs_done")
{
fhem("set HeizungWohnzimmer_Clima controlMode auto");
}
}

my $dt = DateTime->now;
my $hour = $dt->hour;
if($hour > 5 && $hour < 23)
{
if(Value("CUL_HM_HM_CC_RT_DN") eq "CMDs_done")
{
fhem("set HeizungWohnzimmer_Clima desired-temp 21.0");
Log 1,("Temperatur unter 21 Grad, Heizung hochgeregelt");
}
}

}
}
}

Trackbacks

Keine Trackbacks

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

Anatoli am :

Hallo Jan,

Super Artikel! Habe ich schon länger nach so einer Lösung gesucht...

Wird bei dir Bedingung immer noch gegen nur deinen Telefon geprüft? Oder hast du es schon geschafft beide Handys mit einzubeziehen?

MfG

Anatoli

Die Kommentarfunktion wurde vom Besitzer dieses Blogs in diesem Eintrag deaktiviert.

Kommentar schreiben

Umschließende Sterne heben ein Wort hervor (*wort*), per _wort_ kann ein Wort unterstrichen werden.
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Formular-Optionen

Kommentare werden erst nach redaktioneller Prüfung freigeschaltet!