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.
"FHEM: Heizung (und weitere Geräte) durch Anwesenheit steuern" vollständig lesen

FHEM: Heizplan mit Feiertagen

Perl in wenigen Tagen zu lernen ist glücklicherweise keine große Herausforderung, wenn man bereits programmieren kann.

Daher habe ich mein Heizungsskript noch um eine Feiertagskontrolle erweitert. Hierzu sind noch einige Verrenkungen nötig gewesen. Ich habe mir, wie im FHEMWiki beschrieben, eine holiday-Definition in der fhem.cfg angelegt, und verwende diese nun, um zu schauen, ob der aktuelle Tag und die folgenden sechs Tage Feiertage sind.


my %dayHash = ();
for(my $i=0; $i <= 6; $i++)
{
my $dur = DateTime::Duration->new(
years => 0,
months => 0,
weeks => 0,
days => $i,
hours => 0,
minutes => 0,
seconds => 0,
nanoseconds => 0
);
my $dt = DateTime->now; # same as ( epoch => time() )
$dt = $dt->add_duration($dur);
my $month = $dt->month; # 1-12
if($month < 10){$month ="0$month";}
my $day = $dt->day; # 1-31
if($day < 10){$day ="0$day";}
my $dow = $dt->day_of_week_0; # 0-6 (Monday is 0)
my %days = (0 => "Mon",
1 => "Tue",
2 => "Wed",
3 => "Thu",
4 => "Fri",
5 => "Sat",
6 => "Sun"
);
if(fhem("get NRW_Feiertag $month-$day") eq "none")
{
$dayHash{$days{$dow}} = "false";
}
else
{
$dayHash{$days{$dow}} = "true";
}
}


Dieser Code-Schnippsel liefert mir eine Hashtable, aus der ich pro Tag den Status true/false holen kann, also beispielsweise Wed: true.

Um zu prüfen, ob mein Heizplan verändert wurde, lese ich den Timestamp, und vergleiche mit einem angelegten Dummy.

my $lastChanged = $fstat[11];
my $fhemLastChanged = Value("HeizplanLastChanged");


Schließlich werden noch die TimeSets verglichen, so dass nur die veränderten Zeilen geschickt werden.


my $currentTimeSet = ReadingsVal("HeizungWohnzimmer_235134_Clima","tempList$Day","nil");
if($TimeSet ne $currentTimeSet)
{
if($dayHash{"$Day"} eq "true")
{
{ fhem("set " . $Radiator . "_Clima tempList" . $Day . " prep 08:00 17.0 23:00 21.0 24:00 17.0")};
}
else
{
{ fhem("set " . $Radiator . "_Clima tempList" . $Day . " prep " . $TimeSet)};
}
}


Zuguterletzt wird der Dummy HeizplanLastChanged mit dem aktuellen Änderungsdatum versehen:
fhem("set HeizplanLastChanged " . $fstat[11]);