Homematic Wochenprogramm mittels openHAB setzen

Mittels des Homematic Wochenprogramms in den HM-TC-IT-WM-W-EU Wandthermostaten kann man z.B. zwischen normalen Heizen und Feiertagen unterscheiden. Da openHAB dies bisher nicht ansteuern kann, habe ich einen kleinen Workaround gebaut.

Die Homematic Wandthermostate HM-TC-IT-WM-W-EU erlauben es, insgesamt 3 verschiedene Wochenprogramme zu definieren. Dies ist ganz nützlich, wenn man im Normal-Betrieb an Wochentagen nur morgens und abends heizen möchte, aber an Feiertagen, bei Krankheit oder Urlaub zuhause auch tagsüber heizen möchte.

Man könnte das dritte Wochenprogramm noch für Reisen oder Abwesenheit nutzen, das habe ich aber bislang noch nicht umgesetzt.

Das aktuell zu verwendende Wochenprogramm kann man direkt in der CCU definieren, ich möchte es aber natürlich nicht für jeden Heizkörper einzeln in den Einstellungen anwählen und außerdem via openHAB ansteuern.

Da es hierzu im Homematic Binding keine Möglichkeit zu geben scheint, habe ich nach einiger Suche im Netz selbst ein kleines Perl-Skript (hm-weekprogram.pl) gebaut:

#!/usr/bin/perl
#
# Little helper to get/set the WEEK_PROGRAM_POINTER of a Homematic
# HM-TC-IT-WM-W-EU or heating group.
#
# (c) 2018  Roland Rosenfeld <roland@spinnaker.de>

use strict;
use warnings;
use XMLRPC::Lite;

my $ccu = 'homematic.sail.spinnaker.de';

if ($#ARGV <0 || $#ARGV > 1) {
   print STDERR "usage set: $0 HMSerial WeekProgram\n";
   print STDERR "   or get: $0 HMSerial\n";
   exit 1;
}

my $serial = $ARGV[0];
my $url = "http://$ccu:2001/";
if ($serial =~ /^INT/) {
   # virtual device group => uses different Port and URL!
   $url = "http://$ccu:9292/groups";
}

if ($#ARGV == 0) {
   # get
   my $xmlrpc = XMLRPC::Lite
     -> proxy($url)
     -> call('getParamset', $serial, 'MASTER');

   if (defined($xmlrpc->fault)) {
      print STDERR "XMLRPC failure: ".$xmlrpc->fault->{faultString}."\n";
      exit 1;
   }
   print $xmlrpc->result->{WEEK_PROGRAM_POINTER}."\n";
} else {
   # set
   my $val = $ARGV[1];
   if ($val !~ /^[012]$/) {
      print STDERR "Only 0, 1, 2 are allowed as WeekProgram number\n";
      exit 1;
   }
   my $xmlrpc = XMLRPC::Lite
     -> proxy($url)
     -> call('putParamset', $serial, 'MASTER', {WEEK_PROGRAM_POINTER => $val});
   if (defined($xmlrpc->fault)) {
      print STDERR "XMLRPC failure: ".$xmlrpc->fault->{faultString}."\n";
      exit 1;
   }
}

Damit kann ich jetzt mittels

/etc/openhab2/hm-weekprogram.pl INT0000008

das aktuelle Wochenprogramm der Heizungsgruppe INT0000008 auslesen oder es mittels

/etc/openhab2/hm-weekprogram.pl INT0000008 1

neu setzen.

Man beachte dabei die inkonsistente Nummerierung der Wochenprogramme zwischen der CCU WebGUI (1, 2, 3) und dem auch von meinem Skript verwendeten WEEK_PROGRAM_POINTER (0, 1, 2).

Ich habe in jedem Raum ein Wandthermostat HM-TC-IT-WM-W-EU mit einem (oder mehreren) Heizkörperthermostat HM-CC-RT-DN als Heizungsgruppe zusammen geschaltet. Auch wenn der Heizkörperthermostat allein keine unterschiedlichen Wochenprogramme unterstützt, schaltet er im Rahmen der Heizungsgruppe wie gewünscht zu den Zeiten des ausgewählten Programms um.

Mein Skript kann sowohl mit dem Wandthermostat selbst als auch mit der virtuellen Heizungsgruppe reden (hierzu werden verschiedene Ports und URLs in der CCU angesprochen), der Schreibzugriff sollte im Zweifel aber immer auf die virtuelle Heizungsgruppe erfolgen, das ändert dann auch den Status des Wandthermostats, während bei einem Schreibzugriff auf den Wandthermostat die Heizungsgruppe unverändert bleibt.

In der items-Datei habe ich das ganze (bisher noch mit exec1-Binding) wie folgt abgebildet:

Switch Gr_Roland_Feiertag "Feiertag Roland" (Persist) { exec=">[ON:/etc/openhab2/bin/hm-weekprogram.pl INT0000008 1] >[OFF:/etc/openhab2/bin/hm-weekprogram.pl INT0000008 0]" }

Hier habe ich einen einfachen Ein/Aus-Schalter (Switch) verwendet und “1” für Feiertag und “0” für normalen Tag in denn WEEK_PROGRAM_POINTER geschrieben. Natürlich kann man das analog auch mit einer Number implementieren und ein kleines Menü aus “Normal”, “Feiertag” und “Abwesend” o.ä. bauen.

Im Moment lese ich auch den Wert nicht aus der CCU aus, dies könnte man mit

exec="<[/etc/openhab2/bin/hm-weekprogram.pl INT0000008:60000:REGEX((.*?))]"

noch dazu bauen.


Quellen: