Homematic-Wetterstation
Weihnachten hat mir die Homematic IP Smart Home Funk-Wettersensor plus beschert. Auf die Pro-Version mit der zusätzlichen Anzeige der Windrichtung habe ich verzichtet, der Wind kommt hier sowieso meist aus dem Westen und wird zwischen den Häusern sicher auch verwirbelt.
Das Anlernen in die Homematic CCU3 stellte kein Problem dar. Endgültig befestigen will ich die Station mit Rohrschellen an einem vorhandenen Holzpfosten.
Darstellung in der Oberfläche
Die Homematic-Oberfläche zeigt eine Reihe von Werten an:
Irritiert hat mich anfangs, dass von diesen Werten nur wenige als Channels bei OpenHAB auftauchen. Das hängt damit zusammen, dass viele der angezeigten Werte berechnete Werte, also Inhalte von Systemvariablen sind. Dazu kommt, dass diese Variablen als Intern gekennzeichnet sind und in der Oberfläche nicht angezeigt werden.
Daten im Hintergrund
Mit dem folgenden kleinen Script habe ich mir alle Daten von Kanal 1 der Wetterstation ausgeben lassen:
! Namen des Kanals definieren, hier den eigenen eintragen
string KanalName = "Wetterstation:1";
! Kanal holen
var AktorKanal = dom.GetObject(KanalName);
string id;
! Alle Datenpunkte durchlaufen
foreach(id, AktorKanal.DPs()) {
! Einzelnen Datenpunkt holen
var dp = dom.GetObject(id);
! Namen und Wert des DPs ausgeben
WriteLine(dp.Name() # ": " # dp.Value());
}
Hier wird jeweils der Name und der aktuelle Wert angezeigt:
HmIP-RF.00181F29B9D82F:1.ACTUAL_TEMPERATURE: 10.800000
HmIP-RF.00181F29B9D82F:1.ACTUAL_TEMPERATURE_STATUS: 0
HmIP-RF.00181F29B9D82F:1.HUMIDITY: 76
HmIP-RF.00181F29B9D82F:1.HUMIDITY_STATUS: 0
HmIP-RF.00181F29B9D82F:1.ILLUMINATION: 553.200000
HmIP-RF.00181F29B9D82F:1.ILLUMINATION_STATUS: 0
HmIP-RF.00181F29B9D82F:1.RAINING: false
HmIP-RF.00181F29B9D82F:1.RAIN_COUNTER: 6.800000
HmIP-RF.00181F29B9D82F:1.RAIN_COUNTER_OVERFLOW: false
HmIP-RF.00181F29B9D82F:1.RAIN_COUNTER_STATUS: 0
HmIP-RF.00181F29B9D82F:1.SUNSHINEDURATION: 307
HmIP-RF.00181F29B9D82F:1.SUNSHINEDURATION_OVERFLOW: false
HmIP-RF.00181F29B9D82F:1.SUNSHINE_THRESHOLD_OVERRUN: true
HmIP-RF.00181F29B9D82F:1.WIND_SPEED: 14.300000
HmIP-RF.00181F29B9D82F:1.WIND_SPEED_STATUS: 0
HmIP-RF.00181F29B9D82F:1.WIND_THRESHOLD_OVERRUN: true
svHmIPSunshineCounterYesterday_11198: 238.000000
svHmIPSunshineCounterToday_11198: 39.000000
svHmIPRainCounterToday_11198: 0.000000
svHmIPRainCounterYesterday_11198: 1.500000
Hinweis: In den meinen Beispielen taucht immer wieder die Zeichenkette 11198 auf. Das ist eine bei der Einrichtung des Gerätes erzeugte ID, die bei anderen Nutzern abweichen dürfte.
Nur damit es nicht verloren geht: die Variablen verfügen u.a. über folgende Methoden:
- obj.Name()
- obj.Value()
- obj.ValueMax()
- obj.ValueMin()
- obj.Internal()
- obj.Visible()
- obj.ValueType()
- obj.ValueUnit()
- ???
Mehr dazu unter Technikkram.de und Esche's IT-Blog
Am Ende der Liste tauchen vier Systemvariable auf, die Zähler für die heutigen und gestrigen Werte von Sonnenschein und Regen. Es gibt aber noch vier weitere interne Variable, die aber anscheinend nicht an das Gerät gebunden sind und daher auch nicht mit dem obigen Script angezeigt werden.
svHmIPRainCounter_11198_00181F29B9D82F:1
svHmIPRainCounterOldVal_11198
svHmIPSunshineCounter_11198_00181F29B9D82F:1
svHmIPSunshineCounterOldVal_11198
Mit dem folgenden Script werden alle Variablen der CCU angezeigt
string name;
foreach(name, dom.GetObject(ID_SYSTEM_VARIABLES).EnumNames()) {
WriteLine(name);
}
Die interessanten Eigenschaften einer Variablen kann man sich dann anschauen mittels:
object svObj = dom.GetObject("svHmIPRainCounterToday_11198");
WriteLine(svObj.Internal());
WriteLine(svObj.Visible());
WriteLine(svObj.Value());
WriteLine(svObj.ID());
Zu Variablen siehe auch Programmierung bei Homematic.
Scripten im Hintergrund
Die internen Variablen werden von einigen Scripten verwaltet, die man aber nur sieht, wenn man den Button "Systeminterne Programme einblenden" gedrückt hat.
Die Programme sind:
- prgRainCounter_11198_00181F29B9D82F:1 für die Zusammenstellung der Regenmengen
- prgSunshineCounter_11198_00181F29B9D82F:1 für die Zusammenstellung der Sonnenscheindauer
- prgDailySunshineRainCounter_11198 für den Tageswechsel (Heute -> Gestern)
Die Scripten finde ich etwas nachlässig programmiert, da immer wieder auch Variablen-Definitionen auftauchen, die überhaupt nicht benutzt werden.
Das dritte Programm wird standardmäßig um 7 Uhr gestartet, was ich nicht sinnvoll finde. Ich habe die Zeit aktuell auf 1 Uhr verstellt:
XML-API
Unter PHP und XML-Api ist eine Beschreibung der Funktionen der gleichnamigen Standard-Erweiterung zu finden. Auch für die Wetterstation finden sich darüber Informationen.
Hier einmal die (verkürzte) Ausgabe von
http://192.168.1.38/addons/xmlapi/devicelist.cgi?sid=@2c4s3d3cw7@
Export zu OpenHAB
Schaut man sich an, welche Channels die Wetterstation für Sonne und Regen in OpenHAB zur Verfügung stellt, so ist das schon enttäuschen.
Was auf alle Fälle fehlt, sind die oben berechneten Daten für den aktuellen Tag.
Homematic-Erweiterung
Ich habe mir also im Homematic zwei Systemvariable angelegt:
RegenHeute SonneHeute
Und mir deren Befüllung relativ einfach mit einem kleinen Script gemacht:
var aktuell = dom.GetObject('svHmIPRainCounterToday_11198').Value();
! Systemvariable holen
var systemv = dom.GetObject("RegenHeute");
! Wert setzen
systemv.State(aktuell);
Dieses Script wird immer dann aufgerufen, wenn der Regenzähler aktualisiert wird.
Eine entsprechende Konstruktion gibt es dann auch für die Sonnenstunden.
Das Befüllen der Variablen hätte man natürlich auch am Ende der systeminternen Programme anhängen können, dann müsste man aber bei Aktualisierungen der Software sehr aufpassen. So ist der Aufwand ja auch nicht besonders hoch.
OpenHAB-Erweiterung
Auf die beiden Variablen kann ich dann innerhalb von OpenHAB zugreifen. Damit OpenHAB aber neue Variable auf der Homematic erkennt, muss man das Geräte EXTRA-GATEWAY einmal entfernen und wieder neu einrichten.
Danach stehen auch die beiden Variablen zur Verfügung.
Bei mir wurden die Variablen aber in OpenHAB nicht zuverlässig aktualisiert, da habe ich mich dann an der Beschreibung aus der OpenHAB-Community orientiert und eine kleine Rule namens Refresh erzeugt:
und dem zugehörigen Blockly-Script:
Die Daten vom Vortag muss ich von der Homematic nicht extra importieren, die habe ich ja in OpenHAB sowieso gern den Action-Typ Analyzer nutze.