Homematic-HmIP-ESI-IEC
Die Lieferzeit war mit sechs Wochen recht lang, aber heute ist die Schnittstelle für digitale Stromzähler bei mir eingetroffen. Die Installation des Gerätes war relativ aufwändig, da zuerst eine Aktualisierung der CCU3 Software notwendig war. Die anschließende Installation des Gerätes verlief für mich nicht ganz nachvollziehbar. Die Weboberfläche der CCU blieb immer hängen, wenn ich die Funkton Geräte anlernen aufgerufen habe. Zum Teil erschien das entsprechende Fenster unvollständig, nur die obere Hälfte. Wenn alles Elemente vorhanden waren, konnte ich nichts mehr wirklich machen, das System hing eine ganze Weile. Aber irgendwann war das Gerät im Posteingang. Auch dort dauerte es eine ganze Weile, bevor ich den Fertig Button aktivieren konnte. Aber aktuell ist alles in Ordnung.
Installation
Leider war nicht alles in Ordnung, das Gerät lieferte nur die aktuelle Leistung. Das ist aber der Wert, der mich am wenigsten interessiert, weil er auch gut über den Wechselrichter bezogen wird. Mich interessieren am meisten die Tages-Energiemengen und genau die fehlen, auch noch nach einem Tag Wartezeit. Bei der Suche nach neuen Systemvariablen und Systemprogrammen ist mir auch aufgefallen, dass diese fehlen. Bei der Installation muss also etwas schiefgelaufen sein.
Ich habe also das Gerät abgelernt und neu eingebunden, danach tauchten auch die gesuchten Werte auf, hoffentlich folgen auch noch die historischen Daten.
Einstellungen
Die notwendigen Einstellungen soll das Gerät selbstständig erkennen, also den angeschlossenen Sensor und das genutzte Protokoll. Für die Kommunikation werden die notwendigen Obis-Werte eingetragen.
Im Screenshot tauchen auf:
- 16.7.0: momentane Leistung alle Phasen
- 1.8.1: Bezug HT
- 1.8.2: Bezug NT
- 2.8.0: Einspeisung
Darstellung in der Oberfläche
Die Oberfläche zeigt eine Reihe von Werten an:
Hier sind auch die ersten zusätzlichen Werte für den heutigen Tag aufgetaucht. Später werde ich testen, ob man den unbenutzten Kanal 3 noch für andere Informationen nutzen kann.
An der Darstellung nach einem Tag kann man gut erkennen, dass die historischen Werte so etwas wie ein Fake sind. Ich hatte ursprünglich den Eindruck, dass sie direkt vom Zähler gelesen werden. Wie man hier sieht, kann das nicht so sein:
Die Werte werden nachts aus den Werten des vergangenen Tages berechnet bzw. aufsummiert.
Wirklich vom Zähler geholt werden nur die Leistung (alle 2,5 bzw. 5 Minuten) und drei Energiewerte (seltener)
- Energie Bezug HT
- Energie Bezug NT
- Energie Lieferung
Daten im Hintergrund
Mit dem folgenden kleinen Script habe ich mir alle Daten von Kanal 1 des SmartMeter ausgeben lassen:
! Namen des Kanals definieren, hier den eigenen eintragen
string KanalName = "HmIP-ESI: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.003FA0C9B1C6BC:1.CHANNEL_OPERATION_MODE: 4
HmIP-RF.003FA0C9B1C6BC:1.GAS_FLOW: 0.000000
HmIP-RF.003FA0C9B1C6BC:1.GAS_FLOW_STATUS: 0
HmIP-RF.003FA0C9B1C6BC:1.POWER: 1063.000000
HmIP-RF.003FA0C9B1C6BC:1.POWER_STATUS: 0
HmIP-RF.003FA0C9B1C6BC:1.SELF_CALIBRATION:
HmIP-RF.003FA0C9B1C6BC:1.SELF_CALIBRATION_RESULT: 4
Mit dem folgenden Script werden alle Variablen der CCU angezeigt
string name;
foreach(name, dom.GetObject(ID_SYSTEM_VARIABLES).EnumNames()) {
WriteLine(name);
}
Am Ende der Liste tauchen acht neue Systemvariable auf, die Zähler für die heutigen und gestrigen Werte. 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.
svEnergyCounter_11975_003FA0C9B1C6BC:1
svEnergyCounterOldVal_11975
svEnergyCounter_11983_003FA0C9B1C6BC:2
svEnergyCounterOldVal_11983
svEnergyCounter_11988_003FA0C9B1C6BC:3
svEnergyCounterOldVal_11988
svEnergyCounter_11991_003FA0C9B1C6BC:4
svEnergyCounterOldVal_11991
Jeweils eine Variable für den laufenden Wert des aktuellen Kanals und eine Variable für den alten Wert, der um Mitternacht ermittelt wird. Aus der Differenz der beiden Werte wird der aktuelle Tagesverbrauch ermittelt.
Die weiteren Eigenschaften einer Variablen kann man sich dann anschauen mittels:
object svObj = dom.GetObject("svEnergyCounterOldVal_11975");
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.
Es tauchen hier insgesamt sieben Scripten auf:
- das mittlere Script ist für den optionalen Gassensor gedacht, der kennt natürlich nur einen Tarif und keine Einspeisung
- die unteren drei Scripten werden jeweils um Mitternacht gestartet, addieren den Tagesverbrauch zu den historischen Werten und setzen jeweils den Tageszähler auf Null
- die oberen drei Scripten aktualisieren jeweils die Tageswerte
Export zu OpenHAB
Für den Sensor werden keine zusätzlichen Variablen angelegt, insofern fällt auch der Export zu OpenHAB recht mager aus.
Es werden nur die vier kontinuierlich laufenden Zählerwerte geliefert:
- 16.7.0: momentane Leistung alle Phasen
- 1.8.1: Bezug HT
- 1.8.2: Bezug NT
- 2.8.0: Einspeisung
Die Tageswerte werden von den oben erstellten Scripten berechnet und dann in Metainformationen des jeweiligen Kanals gespeichert. Von dort kann man sie aber mit eigenen Scripten holen und in eigene Systemvariable schreiben.
Homematic-Erweiterung
Ich habe mir also zwei Systemvariable (der Bezug NT spielt bei mir bisher keine Rolle) erstellt:
NetzBezugHeute NetzEinspeisHeute
Dazu dann zwei Programme
NetzBezugHeute NetzEinspeisHeute
die die jeweilige Variable füllen:
Wichtig ist hier eine kleine Verzögerung (hier 5 Sekunden) vor dem Start des Scriptes, damit das Homematiceigene Programm Zeit hat die eigenen Daten zu aktualisieren. Die Programme selber sind dann recht klein.
object chn = dom.GetObject('11983');
real energy0 = chn.MetaData('energy0').ToFloat();
energy0 = (energy0 / 1000).ToFloat();
! Systemvariable holen
var systemv = dom.GetObject("NetzBezugHeute");
! Wert setzen
systemv.State(energy0);
Die Kanal-ID hier 11983 kann man den Scripten der Homematic-Installation entnehmen. Sie sind schon in der Programmübersicht zu erkennen, wie man an dem Screenshot oben sehen kann.
Der Vollständigkeit halber auch das zweite Script
object chn = dom.GetObject('11991');
real energy0 = chn.MetaData('energy0').ToFloat();
energy0 = (energy0 / 1000).ToFloat();
! Systemvariable holen
var systemv = dom.GetObject("NetzEinspeisHeute");
! Wert setzen
systemv.State(energy0);
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 diese beiden Variablen zur Verfügung. Die bisherigen Zuordnungen gehen hierbei nicht verloren.
Bei mir wurden die Variablen aber in OpenHAB nicht zuverlässig aktualisiert, da habe ich meine Rule Refresh vom Wettersensor entsprechend erweitert.