Skip to content

FHEM: HomeMatic-Thermostate mit Heizplan versorgen

Kurz vor Weihnachten habe ich mir ein CUL-Board für meinen Raspberry Pi gekauft, und zum Spielen noch drei Thermostate HM-CC-RT-DN von HomeMatic. Der Hersteller führt sonst eher die teuersten Produkte für den Heimautomatisierungsbereich, hat aber günstige und gute Thermostate. Meine haben eine stabile Überwurfmutter aus Metall, drei Adapter, damit sie auch auf jede Heizung passen, und generell eine gute Haptik.
Über die Einrichtung von FHEM werde ich nicht viele Worte verlieren, hier ist das FHEMWiki (FHEMWiki) eine wirklich großartige Informationsquelle. Was ich dort leider nicht finden konnte, war die Übertragung eines Heizplanes aus einer Konfigurationsdatei an beliebige Thermostate.

Um anderen an Hausautomatisierung interessierten Menschen die Arbeit zu erleichtern, erläutere ich gerne, was ich im ersten Schritt gemacht habe. Das Pairing der Geräte erfolgt laut Anleitung und FHEMWiki - also ziemlich simpel. Die automatisch erzeugten Einträge lassen sich schnell umbenennen, so dass sich die Thermostate auch gut lesbar ansprechen lassen. Wir nehmen den Clima-Kanal der Thermostate, um unsere Befehle abzusetzen. Dankenswerterweise hat HomeMatic die Übertragung ganzer Heizpläne über je einen Parameter pro Wochentag sehr einfach gestaltet.

Zunächst wenden wir uns dem Heizplan selbst zu. Ich habe auf meinem N40L eine Freigabe, die ich für meine Medienbibliothek nutze, so dass ich hier auch gut zugänglich meinen Heizplan abgelegt habe. Dieser wird mit dem SMB-Modul für Perl zur Laufzeit geladen, so dass Änderungen auch für normale Menschen möglich sind. Andere Ablagemöglichkeiten sind natürlich auch denkbar, solange man die Daten irgendwie aus einer Datei einliest und in ein Array pumpt.

Neben erläuternden Kommentaren für meine Frau sind die Zeilen meines Heizplanes ziemlich simpel. Hier sind der Kreativität sicher keine Grenzen gesetzt - schön wäre auch irgendeine schicke App, die Eingaben in einen Heizplan umwandelt o.ä.. Das Format der Zeilen ist: <ddd>;<Heizungsname_ohne_Channel>;<Heizzeiten laut HomeMatic>. ddd steht hier für den dreistelligen englischen Tag, also Mon, Tue, Wed, ..., der Heizungsname entspricht dem Namen, den ihr eurem Gerät gebt. Die Heizzeiten für HomeMatic-Geräte gehen von 0:00 Uhr aus, also würde "05:30 17.0 09:00 21.0 16:00 17.0" beispielsweise bedeuten: "Heize von 0:00 bis 5:30 auf 17.0°, anschließend bis 09:00 auf 21.0°, und danach bis 16:00 auf 17.0°". Die Heizzeiten sind durch einfache Leerstellen getrennt, und werden in meinem Skript als kompletter String eingespeist.

Die Funktion selbst ist recht einfach, und wird in einem Modul eurer Wahl eingetragen. Wenn ihr euch wie im FHEMWiki angegeben eine "99_myUtils.pm" eingerichtet habt, fügt sie dort ein. Unter Debian sollte diese Datei unter "/opt/fhem/FHEM/" zu finden sein. Im Folgenden gehe ich auf einzelne Teile des Codes ein, die komplette Funktion und Heiztabelle könnt ihr euch gerne ebenfalls herunterladen.

Zunächst einmal wird eine wichtige use-Anweisung eingetragen, für den Fall, dass ihr eure Config-Datei ebenfalls auf einem SMB-Share ablegt: use Filesys::SmbClient;. Das entsprechende Perl-Modul kann über aptitude nachinstalliert werden. Auf anderen Systemen muss unter Umständen direkt über CPAN gearbeitet werden. Ist aber auch nahezu selbsterklärend.

Im ersten Teil der Funktion wird die Heizdatei geladen und in einen String geschrieben.

my $smb = new Filesys::SmbClient(username => "EuerSMBUser",
password => "Passwort, wenn kein Gast-Zugriff",
workgroup => "Workgroup-Name",
debug => 10);

# read file from share
my @fstat = $smb->stat("smb:///Heizplan.cfg");
my $Heizdat = $smb->open("smb:///Heizplan.cfg", '0666');
# read complete file, length coming from file stats
my $fcopy = $smb->read($Heizdat, $fstat[7]);
# close file
$smb->close($Heizdat);


Wie zu sehen ist, werden die Dateieigenschaften sowie die Datei selbst vom SMB-Share gezogen. Die Datei wird im Lese-Modus geöffnet, schreiben ist nicht nötig. Anschließend wird die Datei über die komplette Länge in die Variable $fcopy geschrieben. Dazu machen wir uns unser Array mit Eigenschaften der Datei zu nutze, in der sich auch die Länge finden lässt. Anschließend sollte die Verbindung des SMB-Clients beendet werden.

Nun, da wir unsere Rohdaten haben, müssen diese noch in ein Array, damit wir etwas schöner damit arbeiten können.

my @Zeilen = ("");
for(split(/^/,$fcopy))
{
if(!($_ =~ /^#/) && (!($_ =~ /^\s+$/)))
{
push(@Zeilen,$_);
}
}


Das Pattern /^/ trennt den String bei jeder Zeile, so dass unsere For-Schleife ein Array erhält, über welches iteriert werden kann. Die anschließende If-Bedingung wertet aus, ob eine Zeile ein Kommentar ist, also mit # beginnt, oder ob es sich um eine leere Zeile handelt, und hängt alle anderen Zeilen an das zuvor initialisierte Array an. So weit, so gut.

Im letzten, wichtigsten Schritt werden die Heizdaten vorbereitet und im Bündel verschickt.


my $maxCount = scalar (@Zeilen);
for(my $count = 0; $count < $maxCount-1;$count++)
{
my @currentLine = split(/;/,$Zeilen[$count]);
my $Day = $currentLine[0];
my $Radiator = $currentLine[1];
my $TimeSet = $currentLine[2];
if(defined $Radiator)
{
{ fhem("set " . $Radiator . "_Clima tempList" . $Day . " prep " . $TimeSet)};
}
}
my @currentLine = split(/;/,$Zeilen[$maxCount-1]);
my $Day = $currentLine[0];
my $Radiator = $currentLine[1];
my $TimeSet = $currentLine[2];
{ fhem("set " . $Radiator . "_Clima tempList" . $Day . " exec " . $TimeSet)};

Zunächst lese ich die Array-Länge in die Variable maxCount. Anschließend wird bis zum vorletzten Element des Arrays iteriert. Dieser Schritt ist notwendig, um den Heizplan mit "prep" vorzubereiten, und nach der Schleife das letzte Element mit "exec" anzuhängen, so dass alle Befehle im Bündel verschickt werden. In der Schleife werden Tag, Heizungsname und Zeitplan anhand des Trennzeichens ";" eingelesen, und in den Set-Befehl gesteckt. Das gleiche geschieht nach der Schleife mit dem letzten Element im Array.

Als nächstes sind noch ein paar Punkte dran:

  • Anwesenheitskontrolle mit Anwesenheitsmodul - Ich denke da an die Auswertung der FritzBox, oder einen Ping-Test

  • Prüfung, ob der Heizplan bereits korrekt eingestellt ist, um die Anzahl der Funknachrichten zu minimieren

  • Einfügen zusätzlicher Buttons in FHEM, um den Boost oder die Abwesenheit zu aktivieren



Viel Spaß beim selber basteln!

Dateien:
99_myUtils.pm
Heizplan.cfg

Trackbacks

Keine Trackbacks

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

Noch keine Kommentare

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!