HomeMatic Tutorial

HomeMatic – Stromzähler auswerten Version 2 mit HM-ES-TX-WM

Der drahtlose HomeMatic Strom-/Gassensor HM-ES-TX-WM vereinfacht die Auswertung eines Stromzählers und stellt eine vergleichsweise unaufwändige Alternative zu meiner ersten Variante der Stromzählerauswertung dar.


Features:
Aktueller Zählerstand, Stromverbrauch seit letzter Ablesung, Tages-, Wochen-, Monats- und Jahreszähler, aktuelle Leistungsaufnahme, Korrektur Überlauf des HM-ES-TX-WM

1. Abgriff des Stromzählerstandes und Übertragung in die HomeMatic

Mit dem drahtlosen HomeMatic Strom-/Gassensor HM-ES-TX-WM werden – in Verbindung mit der Ferrariszähler-Sensoreinheit ES-Fer – die nachfolgenden Daten zyklisch alle paar Minuten an die CCU übertragen…

zaehlerdaten

…und können direkt für die Verarbeitung in der CCU genutzt werden. So steht z.B. die aktuelle Leistungsaufnahme des Hauses unmittelbar als Datenpunkt zu Verfügung und muss nicht erst berechnet werden.

Im Folgenden werden ausschließlich die beiden Datenpunkte…


Energie-Zähler Gerät [ENERGY_COUNTER]
Leistung [POWER]

…des HM-ES-TX-WM verwendet, der „Energie-Zähler CCU“ wird nicht genutzt und kann für andere Zwecke individuell zurückgesetzt werden.

2. Zählerauswertung

Zunächst sind folgende Systemvariablen in der CCU anzulegen…


„Strom Zaehlerstand“, Zahl
„Strom Verbrauch seit letzter Ablesung“, Zahl
„Strom Verbrauch laufendes Kalenderjahr“, Zahl
„Strom Verbrauch laufender Monat“, Zahl
„Strom Verbrauch laufende Woche“, Zahl
„Strom Verbrauch heute“, Zahl
„Strom Leistungsaufnahme aktuell“, Zahl


Für die interne Berechnung werden zusätzlich folgende Systemvariablen benötigt…

Für die Korrektur bei Überlauf des HM-ES-TX-WM Datenpunktes ENERGY_COUNTER bei Erreichen von 838860,7 Wh…

„Strom ENERGY_COUNTER“, Zahl

Für den Zählerstand beim Einlegen der Batterien des HM-ES-TX-WM…

„Strom Referenz Zaehlerstand“, Zahl

Für den aufsummierten Ablesezählerstand bis letzte Ablesung…

„Strom Referenz Verbrauch seit letzter Ablesung“, Zahl

Für den aufsummierten Jahreszählerstand bis letztes Jahr…

„Strom Referenz Verbrauch laufendes Kalenderjahr“, Zahl

Für den aufsummierten Monatszählerstand bis letzten Monat…

„Strom Referenz Verbrauch laufender Monat“, Zahl

Für den aufsummierten Wochenzählerstand bis letzte Woche…

„Strom Referenz Verbrauch laufende Woche“, Zahl

Für den aufsummierten Tageszählerstand bis gestern…

„Strom Referenz Verbrauch heute“, Zahl

Hierbei ist zu beachten, dass der in der CCU voreingestellte Wertebereich für Systemvariablen vom Typ Zahl von 0 bis 65000 reicht, was bei vielen Bestandszählern nicht ausreichen dürfte. Daher ist zumindest für die Systemvariablen „Strom Zaehlerstand“, „Strom ENERGY_COUNTER“ und für alle Referenz-Systemvariablen als Maximalwert 999999.99 einzugeben…

Anpassung Referenz SysVar

Zur Auswertung werden zunächst bei Aktualisierung des Leistungswertes die beiden Datenpunkte des HM-ES-TX-WM und die relevanten Systemvariablen ausgelesen. Während die aktuelle Leistungsaufnahme des Hauses ohne Umwege in die zugehörige Systemvariable gespeichert werden kann, wird der aktuelle Zählerstand nach folgendem Prinzip ermittelt…


"aktueller \quad Stand" \quad (kWh) = "Stand \quad beim \quad Einlegen \quad der \quad Batterien" \quad + \frac{ENERGY \quad COUNTER}{1000}

Der Divisor „1000“ ist erforderlich, da der Datenpunkt „ENERGY_COUNTER“ die Werte in Wh liefert, die Systemvariablen aber alle in kWh angelegt sind.

Die Zeitraum-Zähler werden nach folgender Systematik berechnet…


"neuer \quad Stand" \quad (kWh) = "aktueller \quad Stand" - "Stand \quad bis \quad zum \quad letzten \quad Reset"

Das zugehörige Skript…

object oP = dom.GetObject("BidCos-RF.MEXXXXXXXX:1.POWER");
object oE = dom.GetObject("BidCos-RF.MEXXXXXXXX:1.ENERGY_COUNTER");
var aC = dom.GetObject("Strom ENERGY_COUNTER");
var zR = dom.GetObject("Strom Referenz Zaehlerstand");
var zA = dom.GetObject("Strom Zaehlerstand");
var aA = dom.GetObject("Strom Leistungsaufnahme aktuell");
var vLz = dom.GetObject("Strom Referenz Verbrauch seit letzter Ablesung");
var vLg = dom.GetObject("Strom Verbrauch seit letzter Ablesung");
var vTz = dom.GetObject("Strom Referenz Verbrauch heute");
var vTg = dom.GetObject("Strom Verbrauch heute");
var vWz = dom.GetObject("Strom Referenz Verbrauch laufende Woche");
var vWg = dom.GetObject("Strom Verbrauch laufende Woche");
var vMz = dom.GetObject("Strom Referenz Verbrauch laufender Monat");
var vMg = dom.GetObject("Strom Verbrauch laufender Monat");
var vJz = dom.GetObject("Strom Referenz Verbrauch laufendes Kalenderjahr");
var vJg = dom.GetObject("Strom Verbrauch laufendes Kalenderjahr");
	if ((oE.State() + 0.001) < aC.State()) {
	zR.State(zR.State() + 838.8607);
	}
aC.State(oE.State());
zA.State(zR.State() + (oE.State()/1000));
aA.State(oP.State());
vLg.State(zA.State() - vLz.State());
vTg.State(zA.State() - vTz.State());
vWg.State(zA.State() - vWz.State());
vMg.State(zA.State() - vMz.State());
vJg.State(zA.State() - vJz.State());

…wird mit jeder Aktualisierung des Leistungs-Datenpunktes [POWER] ausgeführt…

Auto SV Zaehler Auswertung 2015

Aufgrund der technischen Eigenschaften des HM-ES-TX-WM (es wird intern nur ein 23 Bit-Zähler verwendet) läuft dessen Datenpunkt…


Energie-Zähler Gerät [ENERGY_COUNTER]

…bei Erreichen von 838860,7 Wh über und beginnt wieder bei NULL. Dies führt dazu, dass nach diesem Überlauf falsche negative Werte in den einzelnen Zählern angezeigt werden (siehe auch hier).

Zur Korrektur dieses Verhaltens wird in dem o.a. Skript mit dem Kodeschnipsel…

if ((oE.State() + 0.001) < aC.State()) {
zR.State(zR.State() + 838.8607);
}
aC.State(oE.State());

…der Datenpunkt „ENERGY_COUNTER“ des des HM-ES-TX-WM in der Systemvariablen…


„Strom ENERGY_COUNTER“, Zahl

…zwischengespeichert und mit dem aktuell ausgelesenen Wert verglichen. Sobald erkannt wird, dass der aktuelle Wert kleiner als der zwischengespeicherte Wert ist, werden zu der Referenz-Systemvariable…


„Strom Referenz Zaehlerstand“, Zahl

838,8607 kWh addiert, wodurch die Zähler trotz Überlauf korrekt weitergeführt werden.

Durch die Addition von 0.001 Wh auf den vom Datenpunkt „ENERGY_COUNTER“ ausgelesenen Wert wird vermieden, dass der Korrekturwert auch aufsummiert wird, wenn der übermittelte Wert in zwei Zyklen hintereinander gleich geblieben ist, was hin und wieder einmal vorkommt (siehe Zeilen 23 und 24)…

Fehler 3

Das Ergebnis der Auswertung sieht in WebMatic / HighCharts / a.i.o. mit ccu-historian z.B. so aus…

wm1

Auto SV Zaehler Auswertung 2015 chart 2

Auto SV Zaehler Auswertung 2015 chart 1

HomeMatic Tablet


Update August 2017

Es wurde von Nutzern des Zählers immer mal wieder der Wunsch geäußert, die Zählervariablen runden zu können. Aufgrund der Einschränkungen in HomeMatic-Skript war das bisher nur über Umwege möglich.

Mit der CCU2 Firmware 2.29.18 wurde neben anderen mathematischen Funktionen die Funktion „Round(p)“ eingeführt, die den momentanen Wert zur nächstliegenden Zahl mit der Genauigkeit p rundet. Damit ist es sehr einfach möglich, die Ausgaben des Zählers auf beliebige Stellen nach dem Komma zu runden.

Hier das Auswerteskript mit Rundung auf zwei Stellen hinter dem Komma, wer mehr oder weniger Stellen möchte, verändert einfach die Zahl p in der Funktion „Round(p)“…

object oP = dom.GetObject("BidCos-RF.MEXXXXXXXX:1.POWER");
object oE = dom.GetObject("BidCos-RF.MEXXXXXXXX:1.ENERGY_COUNTER");
var aC = dom.GetObject("Strom ENERGY_COUNTER");
var zR = dom.GetObject("Strom Referenz Zaehlerstand");
var zA = dom.GetObject("Strom Zaehlerstand");
var aA = dom.GetObject("Strom Leistungsaufnahme aktuell");
var vLz = dom.GetObject("Strom Referenz Verbrauch seit letzter Ablesung");
var vLg = dom.GetObject("Strom Verbrauch seit letzter Ablesung");
var vTz = dom.GetObject("Strom Referenz Verbrauch heute");
var vTg = dom.GetObject("Strom Verbrauch heute");
var vWz = dom.GetObject("Strom Referenz Verbrauch laufende Woche");
var vWg = dom.GetObject("Strom Verbrauch laufende Woche");
var vMz = dom.GetObject("Strom Referenz Verbrauch laufender Monat");
var vMg = dom.GetObject("Strom Verbrauch laufender Monat");
var vJz = dom.GetObject("Strom Referenz Verbrauch laufendes Kalenderjahr");
var vJg = dom.GetObject("Strom Verbrauch laufendes Kalenderjahr");
	if ((oE.State() + 0.001) < aC.State()) {
	zR.State(zR.State() + 838.8607);
	}
aC.State(oE.State());
zA.State((zR.State() + (oE.State()/1000)).Round(2));
aA.State(oP.State());
vLg.State((zA.State() - vLz.State()).Round(2));
vTg.State((zA.State() - vTz.State()).Round(2));
vWg.State((zA.State() - vWz.State()).Round(2));
vMg.State((zA.State() - vMz.State()).Round(2));
vJg.State((zA.State() - vJz.State()).Round(2));

 

Stromzähler


Bitte beachten…

Diese Skriptvariante funktioniert nur mit der CCU2 ab Firmware 2.29.18 (und wohl nicht in deren Logikschicht Version“Legacy“).


Zum Reset der Jahres-, Monats-, Wochen und Tageszähler auf „NULL“ bieten sich CCU-Programme an, die über das Zeitmodul der CCU kurz nach Mitternacht ausgeführt werden. Hier ein Beispiel für den Tageszähler…

Auto SV Reset Tageszähler Pushover CuXD

Über die erste Zeile des Programmes wird eine Pushnachricht verschickt, mit der die Werte vor dem Reset übermittelt werden. Hierzu wird Pushover genutzt, das in einem anderen Beitrag schon im Detail beschrieben wurde. Bei Bedarf kann man die Daten aber natürlich auch per Mail oder über einen anderen Dienst verschicken. Die folgenden Skripte müssen dann entsprechend angepasst werden.

Mit dem Kode in Zeile 7 wird der Referenzwert (Stand bis zum letzten Reset) vor dem Zurücksetzen des Zählers mit dem aktuell aufsummierten Wert überschrieben und bildet sodann die Referenz für den nächsten Zeitraum.

string zA = dom.GetObject("Strom Zaehlerstand").Value();
string sTg = dom.GetObject("Strom Verbrauch heute").Value();
var vTg = dom.GetObject("Strom Verbrauch heute");
var vTz = dom.GetObject("Strom Referenz Verbrauch heute");
var zeitraum;
! Zwischenwert in Variable speichern
vTz.State(vTg.State() + vTz.State());
! Zeitwert um 1 subtrahieren
time t = system.Date("%j").ToInteger();
if (t == 1) {zeitraum = "Letzter Tag im Vorjahr";}
else {zeitraum = t - 1;}
! Push-Text zusammensetzen
string MailText;
string sDate = zeitraum.ToString();
MailText = "Achtung, der Stromverbrauch-Tageszaehler wird zurueckgesetzt. Verbrauchswerte am Tag " # sDate # " vor dem Reset: ";
MailText = MailText # "Zaehlerstand: " # zA # "kWh, Verbrauch heute: " # sTg # "kWh.  ";
string teilstr;
string sendmail = "";
! Mailtext erstellen (Woerter am Leerzeichen trennen)
foreach(teilstr, MailText.Split(" "))
{
sendmail = sendmail # "+" # teilstr;
}
! Eigentliche Mail absenden
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -s -d token=TOKEN -d user=USER -d message='"#sendmail#"' -d sound=pushover http://api.pushover.net/1/messages.json");

Entsprechend sehen die Rücksetz-Skripte für die Zähler der anderen Zeiträume aus…

string zA = dom.GetObject("Strom Zaehlerstand").Value();
string sWg = dom.GetObject("Strom Verbrauch laufende Woche").Value();
var vWg = dom.GetObject("Strom Verbrauch laufende Woche");
var vWz = dom.GetObject("Strom Referenz Verbrauch laufende Woche");
var zeitraum;
! Zwischenwert in Variable speichern
vWz.State(vWg.State() + vWz.State());
! Zeitwert um 1 subtrahieren
time t = system.Date("%V").ToInteger();
if (t == 1) {zeitraum = "Letzte KW im Vorjahr";}
else {zeitraum = t - 1;}
! Push-Text zusammensetzen
string MailText;
string sDate = zeitraum.ToString();
MailText = "Achtung, der Stromverbrauch-Wochenzaehler wird zurueckgesetzt. Verbrauchswerte in Woche " # sDate # " vor dem Reset: ";
MailText = MailText # "Zaehlerstand: " # zA # "kWh, Verbrauch laufende Woche: " # sWg # "kWh.  ";
string teilstr;
string sendmail = "";
! Mailtext erstellen (Woerter am Leerzeichen trennen)
foreach(teilstr, MailText.Split(" "))
{
sendmail = sendmail # "+" # teilstr;
}
! Eigentliche Mail absenden
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -s -d token=TOKEN -d user=USER -d message='"#sendmail#"' -d sound=pushover http://api.pushover.net/1/messages.json");
string zA = dom.GetObject("Strom Zaehlerstand").Value();
string sMg = dom.GetObject("Strom Verbrauch laufender Monat").Value();
var vMg = dom.GetObject("Strom Verbrauch laufender Monat");
var vMz = dom.GetObject("Strom Referenz Verbrauch laufender Monat");
var zeitraum;
! Zwischenwert in Variable speichern
vMz.State(vMg.State() + vMz.State());
! Zeitwert um 1 subtrahieren
time t = system.Date("%m").ToInteger();
if (t == 1) {zeitraum = 12;}
else {zeitraum = t - 1;}
! Push-Text zusammensetzen
string MailText;
string sDate = zeitraum.ToString();
MailText = "Achtung, der Stromverbrauch-Monatszaehler wird zurueckgesetzt. Verbrauchswerte im Monat " # sDate # " vor dem Reset: ";
MailText = MailText # "Zaehlerstand: " # zA # "kWh, Verbrauch laufender Monat: " # sMg # "kWh.  ";
string teilstr;
string sendmail = "";
! Mailtext erstellen (Woerter am Leerzeichen trennen)
foreach(teilstr, MailText.Split(" "))
{
sendmail = sendmail # "+" # teilstr;
}
! Eigentliche Mail absenden
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -s -d token=TOKEN -d user=USER -d message='"#sendmail#"' -d sound=pushover http://api.pushover.net/1/messages.json");
string zA = dom.GetObject("Strom Zaehlerstand").Value();
string sJg = dom.GetObject("Strom Verbrauch laufendes Kalenderjahr").Value();
var vJg = dom.GetObject("Strom Verbrauch laufendes Kalenderjahr");
var vJz = dom.GetObject("Strom Referenz Verbrauch laufendes Kalenderjahr");
var zeitraum;
! Zwischenwert in Variable speichern
vJz.State(vJg.State() + vJz.State());
! Zeitwert um 1 subtrahieren
time t = system.Date("%Y").ToInteger();
var zeitraum = t - 1;
! Push-Text zusammensetzen
string MailText;
string sDate = zeitraum.ToString();
MailText = "Achtung, der Stromverbrauch-Jahreszaehler wird zurueckgesetzt. Verbrauchswerte im Jahr " # sDate # " vor dem Reset: ";
MailText = MailText # "Zaehlerstand: " # zA # "kWh, Strom Verbrauch laufendes Kalenderjahr: " # sJg # "kWh.  ";
string teilstr;
string sendmail = "";
! Mailtext erstellen (Woerter am Leerzeichen trennen)
foreach(teilstr, MailText.Split(" "))
{
sendmail = sendmail # "+" # teilstr;
}
! Eigentliche Mail absenden
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -s -d token=TOKEN -d user=USER -d message='"#sendmail#"' -d sound=pushover http://api.pushover.net/1/messages.json");

Wer keine Benachrichtigungen braucht, verwendet die folgenden Varianten der Rücksetzskripte…
var vTg = dom.GetObject("Strom Verbrauch heute");
var vTz = dom.GetObject("Strom Referenz Verbrauch heute");
! Zwischenwert in Variable speichern
vTz.State(vTg.State() + vTz.State());
var vWg = dom.GetObject("Strom Verbrauch laufende Woche");
var vWz = dom.GetObject("Strom Referenz Verbrauch laufende Woche");
! Zwischenwert in Variable speichern
vWz.State(vWg.State() + vWz.State());
var vMg = dom.GetObject("Strom Verbrauch laufender Monat");
var vMz = dom.GetObject("Strom Referenz Verbrauch laufender Monat");
! Zwischenwert in Variable speichern
vMz.State(vMg.State() + vMz.State());
var vJg = dom.GetObject("Strom Verbrauch laufendes Kalenderjahr");
var vJz = dom.GetObject("Strom Referenz Verbrauch laufendes Kalenderjahr");
! Zwischenwert in Variable speichern
vJz.State(vJg.State() + vJz.State());

Hinweis:
Alternativ zu der hier beschriebenen Lösung kann man die Zeitraumzähler auch gemeinsam mit nur einem Programm/Skript zurücksetzen. Wie das geht, habe ich in dem verlinkten Tutorial gesondert beschrieben.

Zum Reset des Ablesezählers empfiehlt es sich, das Programm manuell (z.B. im WebUI) zu starten, wenn die Stromzählerablesung erfolgt ist…

reset ablesezaehler

string zA = dom.GetObject("Strom Zaehlerstand").Value();
string sLg = dom.GetObject("Strom Verbrauch seit letzter Ablesung").Value();
var vLg = dom.GetObject("Strom Verbrauch seit letzter Ablesung");
var vLz = dom.GetObject("Strom Referenz Verbrauch seit letzter Ablesung");
var zeitraum;
! Zwischenwert in Variable speichern
vLz.State(vLg.State() + vLz.State());
! Zeitwert um 1 subtrahieren
time t = system.Date("%Y").ToInteger();
var zeitraum = t - 1;
! Push-Text zusammensetzen
string MailText;
string sDate = system.Date("Tag %j/%Y, %A, %d.%m.%Y, %T Uhr");
MailText = "Achtung, der Stromverbrauch-Ablesezaehler wird zurueckgesetzt. Verbrauchswerte am Tag " # sDate # " vor dem Reset: ";
MailText = MailText # "Zaehlerstand: " # zA # "kWh, Verbrauch seit letzter Ablesung: " # sLg # "kWh.  ";
string teilstr;
string sendmail = "";
! Mailtext erstellen (Woerter am Leerzeichen trennen)
foreach(teilstr, MailText.Split(" "))
{
sendmail = sendmail # "+" # teilstr;
}
! Eigentliche Mail absenden
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -s -d token=TOKEN -d user=USER -d message='"#sendmail#"' -d sound=pushover http://api.pushover.net/1/messages.json");

…bzw. ohne Pushnachricht…
var vLg = dom.GetObject("Strom Verbrauch seit letzter Ablesung");
var vLz = dom.GetObject("Strom Referenz Verbrauch seit letzter Ablesung");
! Zwischenwert in Variable speichern
vLz.State(vLg.State() + vLz.State());

3. Batteriewechsel

Bei einem Batteriewechsel des HM-ES-TX-WM werden die Datenpunkte…


Energie-Zähler Gerät [ENERGY_COUNTER]
Leistung [POWER]

…auf NULL zurück gesetzt.

Damit die Zeitraumzähler auch nach einem Batteriewechsel wieder korrekte Werte zeigen, genügt es im Grunde, unmittelbar nach dem Batteriewechsel den aktuellen Zählerstand auf dem (Ferraris-)Zähler abzulesen und manuell (z.B. mittels WebMatic) in die Referenz-Systemvariable…


„Strom Referenz Zaehlerstand“, Zahl

…zu schreiben.

Da die Zeitraumzähler um 00:00 Uhr zurückgesetzt werden, sollte ein Batteriewechsel nicht in diesem Zeitfenster erfolgen.

Außerdem sollte das Eintragen des aktuellen Zählerstandes von dem (Ferraris-)Zähler in die Referenz-Systemvariable…


„Strom Referenz Zaehlerstand“, Zahl

…erst nach der ersten Aktualisierung des HM-ES-TX-WM erfolgen, da durch die Überlauf-Korrektur ansonsten möglicherweise unbeabsichtigt gleich zu Beginn die 838,8607 kWh aufaddiert werden.

Zur Sicherheit sollten vor dem Batteriewechsel grundsätzlich alle aktuellen Werte der o.a. Systemvariablen notiert und die aktuellen Werte der folgenden Referenz-Systemvariablen…


„Strom Referenz Verbrauch seit letzter Ablesung“, Zahl
„Strom Referenz Verbrauch laufendes Kalenderjahr“, Zahl
„Strom Referenz Verbrauch laufender Monat“, Zahl
„Strom Referenz Verbrauch laufende Woche“, Zahl
„Strom Referenz Verbrauch heute“, Zahl

nach dem Batteriewechsel überprüft und ggf. manuell wieder auf die notierten Werte gesetzt werden.

Falls doch etwas schief geht, bitte gemäß dem nachfolgenden Abschnitt „4. Korrektur“ verfahren.

4. Korrektur

Die Auswertung des HM-ES-TX-WM funktioniert normalerweise sehr genau. Dennoch empfiehlt es sich, hin und wieder den aktuellen Zählerstand des (Ferraris-)Zähler mit dem Wert in der Systemvariablen „Strom Zaehlerstand“ zu vergleichen.

Falls inakzeptable Abweichungen aufgetreten sind, sollten die Batterien des HM-ES-TX-WM entnommen und nach einigen Sekunden wieder eingesetzt werden, damit der Datenpunkt…


Energie-Zähler Gerät [ENERGY_COUNTER]

…auf NULL zurück gesetzt wird.

Anschließend ist der aktuelle Zählerstand des (Ferraris-)Zählers manuell in die Referenz-Systemvariable…


„Strom Referenz Zaehlerstand“, Zahl

…zu schreiben.

Da die Zeitraumzähler um 00:00 Uhr zurückgesetzt werden, sollte – wie bei einem Batteriewechsel – die Korrekur nicht in diesem Zeitfenster erfolgen.

Auch sollte das Eintragen des aktuellen Zählerstandes erst nach der ersten Aktualisierung des HM-ES-TX-WM erfolgen, da durch die Überlauf-Korrektur ansonsten möglicherweise unbeabsichtigt gleich zu Beginn die 838,8607 kWh aufaddiert werden.

Durch Abstürze der CCU oder z.B. Stromausfälle können mehr oder weniger große Abweichungen auch bei den Zeitraumzählern entstehen, wenn die letzte Speicherung der REGADOM (DOM-Save) zu lange zurück liegt.

Solche Abweichungen lassen sich durch manuelle Anpassung der Referenz-Systemvariablen…


„Strom Referenz Zaehlerstand“, Zahl

…nach Entnahme der Batterien (wie eben beschrieben) und zusätzlich der Referenz-Systemvariablen der Zeitraumzähler…


„Strom Referenz Verbrauch seit letzter Ablesung“, Zahl
„Strom Referenz Verbrauch laufendes Kalenderjahr“, Zahl
„Strom Referenz Verbrauch laufender Monat“, Zahl
„Strom Referenz Verbrauch laufende Woche“, Zahl
„Strom Referenz Verbrauch heute“, Zahl

…nach dem folgdenen Schema korrigieren…


"Strom \quad Referenz \quad Verbrauch \quad Zeitraum" = "Strom \quad Zaehlerstand" - "Strom \quad Verbrauch \quad Zeitraum"

also z.B. bezogen auf den Tageszähler…


"Strom \quad Referenz \quad Verbrauch \quad heute" = "Strom \quad Zaehlerstand" - "Strom \quad Verbrauch \quad heute"

Für den Tageszähler („Strom Referenz Verbrauch laufender Monat“) ist das der aktuelle Zählerstand minus den am Eintragetag bereits aufgelaufenen Verbrauch (ggf. geschätzt). Dies entspricht dem Zählerstand vom Vortag 23:59 Uhr.

Für den Wochenzähler „Strom Referenz Verbrauch laufende Woche“) der aktuelle Zählerstand minus den bis zum Eintragezeitpunkt bereits aufgelaufenen Wochenverbrauch (ggf. geschätzt). Dies entspricht dem Zählerstand von letztem Sonntag 23:59 Uhr.

Für des Monatszähler („Strom Referenz Verbrauch laufender Monat“) der aktuelle Zählerstand minus den bis zum Eintragezeitpunkt bereits aufgelaufenen Monatsverbrauch (ggf. geschätzt). Dies entspricht dem Zählerstand vom letzten Tag des Vormonats 23:59 Uhr.

Für den Jahreszähler („Strom Referenz Verbrauch laufendes Jahr“) der aktuelle Zählerstand minus den bis zum Eintragezeitpunkt bereits aufgelaufenen Jahresverbrauch (ggf. geschätzt). Dies entspricht dem Zählerstand vom 31.12. des Vorjahres 23:59 Uhr.

Für den Ablesezähler („Strom Referenz Verbrauch seit letzter Ablesung“) der aktuelle Zählerstand minus den bis zum Eintragezeitpunkt bereits aufgelaufenen Verbrauch seit der letzten Stromablesung (ggf. geschätzt). Am besten übernimmt man hierfür den Zählerstand von der letzten Stromrechnung.

Zur einfachen Berechnung der erforderlichen Werte für die Referenz-Systemvariablen aus den aktuell abgelesenen Ständen des (Ferraris-)Zählers, des Datenpunktes „ENERGIE_COUNTER“ sowie aus den seit dem letzten Reset aufgelaufenen Werten der Zeitraumzähler, kann der folgende Korrekturrechner genutzt werden:



5. Weiterentwicklungsideen


Ich bekomme immer mal wieder Nachfragen zu gewünschten Erweiterungen des Zählers, die ich häufig für meine eigene Anwendung nicht benötige. In diesem Abschnitt stelle ich zu einigen Wünschen mögliche Lösungsansätze vor, die Impulse für die individuelle Weiterentwicklung bieten sollen und keinen Anspruch auf Vollständigkeit haben. Auch habe ich die Ansätze nicht wirklich umfassend getestet. Falls etwas nicht wie erwartet funktioniert, meldet euch.

Zusätzlich den Stromverbrauch von gestern abspeichern

Dies lässt sich recht einfach bewerkstelligen, indem zunächst eine weitere Systemvariable…


„Strom Verbrauch gestern“, Zahl

…angelegt wird.

Anschließend wird das obige Rücksetzskript für den Tageszähler wie folgt geändert…

var vTg = dom.GetObject("Strom Verbrauch heute");
var vTz = dom.GetObject("Strom Referenz Verbrauch heute");
var vGg = dom.GetObject("Strom Verbrauch gestern");
! Zwischenwert in Variable speichern
vGg.State(vTg.State());
vTz.State(vTg.State() + vTz.State());

Falls das Rücksetzskript in der Version mit Pushover verwendet wird, muss es natürlich entsprechend angepasst werden.

Mit der Ergänzung im Skript wird zu jedem Tagesbeginn vor dem Reset des Tageszählers der letzte Tageszählerstand „vTg/Strom Verbrauch heute“ in die neu angelegte Variable für gestern „vGg/Strom Verbrauch gestern“ geschrieben.

Gleichermaßen kann man bei Bedarf für die anderen Zeiträume vorgehen.


Hinweis:
Alternativ zu der hier beschriebenen Lösung kann man die Zeitraumzähler auch gemeinsam mit nur einem Programm/Skript zurücksetzen. Wie das geht, habe ich in dem verlinkten Tutorial gesondert beschrieben.

Zusätzlich die Kosten hinzufügen

Hierzu gibt es sicher mehrere geeignete Wege, um zum Ziel zu kommen. Man kann z.B. eine weitere Systemvariable für den Strompreis in Euro/kwh hinzufügen…


„Strompreis“, Zahl

…in die manuell (Webmatic o. ä.) der eigene kwh-Preis in Euro eingetragen wird.

Weiterhin legt man je eine Systemvariable für jede gewünschte Kostenfunktionalität an. Nachfolgend exemplarisch für die Kosten im laufenden Kalenderjahr…


„Strom Kosten laufendes Kalenderjahr“, Zahl

Das Auswerteskript wird wie folgt ergänzt (Zeilen 17, 18 und 30)…

object oP = dom.GetObject("BidCos-RF.MEXXXXXXXX:1.POWER");
object oE = dom.GetObject("BidCos-RF.MEXXXXXXXX:1.ENERGY_COUNTER");
var aC = dom.GetObject("Strom ENERGY_COUNTER");
var zR = dom.GetObject("Strom Referenz Zaehlerstand");
var zA = dom.GetObject("Strom Zaehlerstand");
var aA = dom.GetObject("Strom Leistungsaufnahme aktuell");
var vLz = dom.GetObject("Strom Referenz Verbrauch seit letzter Ablesung");
var vLg = dom.GetObject("Strom Verbrauch seit letzter Ablesung");
var vTz = dom.GetObject("Strom Referenz Verbrauch heute");
var vTg = dom.GetObject("Strom Verbrauch heute");
var vWz = dom.GetObject("Strom Referenz Verbrauch laufende Woche");
var vWg = dom.GetObject("Strom Verbrauch laufende Woche");
var vMz = dom.GetObject("Strom Referenz Verbrauch laufender Monat");
var vMg = dom.GetObject("Strom Verbrauch laufender Monat");
var vJz = dom.GetObject("Strom Referenz Verbrauch laufendes Kalenderjahr");
var vJg = dom.GetObject("Strom Verbrauch laufendes Kalenderjahr");
var vJk = dom.GetObject("Strom Kosten laufendes Kalenderjahr");
var vPk = dom.GetObject("Strompreis");
	if ((oE.State() + 0.001) < aC.State()) {
	zR.State(zR.State() + 838.8607);
	}
aC.State(oE.State());
zA.State(zR.State() + (oE.State()/1000));
aA.State(oP.State());
vLg.State(zA.State() - vLz.State());
vTg.State(zA.State() - vTz.State());
vWg.State(zA.State() - vWz.State());
vMg.State(zA.State() - vMz.State());
vJg.State(zA.State() - vJz.State());
vJk.State(vJg.State() * vPk.State());

Entsprechend können bei Bedarf die anderen Zähler ergänzt werden.

Den Stromzähler für Hoch- und Niedertarif (HT/NT) umbauen

Werner Keller aus der Schweiz hat auf Basis dieses Tutorials eine sehr interessante Lösung für einen Stromzähler mit unterschiedlichem Hoch (HT)- und Niedertarif (NT) für seine Wärmepumpe entwickelt, die in dem verlinkten Artikel vorgestellt wird.


Den Stromzähler zu einem Gaszähler umbauen

Es ist sehr einfach, den Zähler zu einem Gaszähler umzubauen, wenn man ein paar Kleinigkeiten beachtet.
Grundsätzlich ist die Vorgehensweise die Gleiche wie bei dem Stromzähler, jedoch sollten die Systemvariablen natürlich anders bezeichnet werden:


„Gas Zaehlerstand“, Zahl
„Gas Verbrauch seit letzter Ablesung“, Zahl
„Gas Verbrauch laufendes Kalenderjahr“, Zahl
„Gas Verbrauch laufender Monat“, Zahl
„Gas Verbrauch laufende Woche“, Zahl
„Gas Verbrauch heute“, Zahl
„Gas Leistungsaufnahme aktuell“, Zahl
„Gas GAS_ENERGY_COUNTER“, Zahl
„Gas Referenz Zaehlerstand“, Zahl
„Gas Referenz Verbrauch seit letzter Ablesung“, Zahl
„Gas Referenz Verbrauch laufendes Kalenderjahr“, Zahl
„Gas Referenz Verbrauch laufender Monat“, Zahl
„Gas Referenz Verbrauch laufende Woche“, Zahl
„Gas Referenz Verbrauch heute“, Zahl

Im Skript müssen die Datenpunkte des HM-ES-TX-WM auf diejenigen für Gas geändert werden, also statt…


ENERGY_COUNTER
POWER

wird eingetragen…


GAS_ENERGY_COUNTER
GAS_POWER

Da die beiden Datenpunkte in m^3 ausgegeben werden, muss außerdem im Skript der Divisor 1000 weggelassen werden, damit der Gaszähler alle Werte in m^3 zählt.

Hier das zum Gaszählen angepasste Auswerteskript…

object oP = dom.GetObject("BidCos-RF.MEXXXXXXXX:1.GAS_POWER");
object oE = dom.GetObject("BidCos-RF.MEXXXXXXXX:1.GAS_ENERGY_COUNTER");
var aC = dom.GetObject("Gas GAS_ENERGY_COUNTER");
var zR = dom.GetObject("Gas Referenz Zaehlerstand");
var zA = dom.GetObject("Gas Zaehlerstand");
var aA = dom.GetObject("Gas Leistungsaufnahme aktuell");
var vLz = dom.GetObject("Gas Referenz Verbrauch seit letzter Ablesung");
var vLg = dom.GetObject("Gas Verbrauch seit letzter Ablesung");
var vTz = dom.GetObject("Gas Referenz Verbrauch heute");
var vTg = dom.GetObject("Gas Verbrauch heute");
var vWz = dom.GetObject("Gas Referenz Verbrauch laufende Woche");
var vWg = dom.GetObject("Gas Verbrauch laufende Woche");
var vMz = dom.GetObject("Gas Referenz Verbrauch laufender Monat");
var vMg = dom.GetObject("Gas Verbrauch laufender Monat");
var vJz = dom.GetObject("Gas Referenz Verbrauch laufendes Kalenderjahr");
var vJg = dom.GetObject("Gas Verbrauch laufendes Kalenderjahr");
	if ((oE.State() + 0.001) < aC.State()) {
	zR.State(zR.State() + 838.8607);
	}
aC.State(oE.State());
zA.State(zR.State() + oE.State());
aA.State(oP.State());
vLg.State(zA.State() - vLz.State());
vTg.State(zA.State() - vTz.State());
vWg.State(zA.State() - vWz.State());
vMg.State(zA.State() - vMz.State());
vJg.State(zA.State() - vJz.State());

Natürlich muss das Skript im zugehörigen CCU-Programm auf den Leistungs-Datenpunkt für Gas [GAS_POWER] getriggert und in den jeweils genutzten Rücksetzskripten müssen noch die Systemvariablen von…


Strom XYZ

…in…


Gas XYZ

geändert werden.


Eine Alternative, die an Stelle des HM-ES-TX-WM auf eine FAST EnergyCam als Sensor setzt, ist in dem Tutorial HomeMatic – Zähler mit Hilfe der FAST EnergyCam auswerten beschrieben.

Zu guter letzt

Mittlerweile sollten sich die beiden Workarounds für alle Nutzer erübrigt haben, wer sie doch noch braucht…

Aufgrund eines Fehlers im Skript (Version vor dem 15.10.2015) stimmten nach einem Batteriewechsel die Zählerstände nicht mehr. Der Fehler wirkte sich erst nach einem Batteriewechsel aus und wurde in dem obigen Tutorial korrigiert. Nutzer, die dieses Tutorial schon vor dem 15.10.2015 angewendet haben, finden unter dem folgenden Link einen Workaround zur Anpassung des Skriptes und Übernahme der Bestandsdaten, der möglichst vor einem anstehenden Batteriewechsel beachtet werden sollte.

Aufgrund der technischen Eigenschaften des HM-ES-TX-WM läuft dessen Datenpunkt ENERGY_COUNTER bei Erreichen von 838860,7 Wh über und beginnt wieder bei NULL. Dies führt dazu, dass nach diesem Überlauf falsche negative Werte in den einzelnen Zählern angezeigt werden. Ein Fix für dieses Problem ist in dem obigen Tutorial bereits enthalten. Nutzer, die dieses Tutorial schon vor dem 31.01.2016 angewendet haben, finden unter dem folgenden Link einen Workaround zur Anpassung des Zählers.

Zum korrespondierenden Beitrag im…
HomeMatic-Forum

 

Bitte beachten...

SMART WOHNEN by sTeRn AV ist ein rein privates Projekt. Support kann ich daher nur im Rahmen meiner begrenzten Freizeit leisten, hierfür bitte ich um Verständnis. Meine Hinweise, Anleitungen, Schaltungen und Software werden so angeboten, „wie sie sind“. Die Verwendung erfolgt auf eigenes Risiko, ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung.
Creative Commons Lizenzvertrag
Copyright © Jens-Peter Stern | SMART WOHNEN by sTeRn AV | smart-wohnen.org
  1. Hallo

    Ich habe die Script ausprobiert und mit dem Gaszähler funktioniert es nicht es kommen keine Daten gib es da ein Idee oder Lösung

    • Ich selbst nutze die Gaszähler Funktion nicht aber hast du im Auswerteskript die Datenpunkte auf die Werte des Gaszählers geändert?

  2. Hallo besteht auch die möglichkeit das ich mein aktuellen zählerstandt in der homematic ablesen kann.

    Danke im voraus.

    MFG

    • Hi,
      wenn du das o.a. Auswerteskript einsetzt, wird der aktuelle Stromzählerstand in die Systemvariable „Strom Zaehlerstand“ geschrieben, die du im HomeMatic System weiter verwenden und anzeigen lassen kannst.

      Die Idee dahinter ist, den realen Zählerstand beim Einlegen der Batterien in eine Referenz-Systemvariable „Strom Referenz Zaehlerstand“ zu schreiben. Das Skript addiert dann diese Referenz mit dem aufsummierten Zählerstand des Sensors und schreibt sie in die Systemvariable „Strom Zaehlerstand“.

      Im Forum werden auch alternative Möglichkeiten diskutiert, den aktellen Zählerstand direkt in die Variable des Sensors zu schreiben.

      Ein kleines Problem beider Lösungen ist allerdings eine bereits erkannte Abweichung zwischen der Aufzeichung des Sensors und dem realen Zählerstand. Da ist es – zumindest derzeit noch – hin und wieder erforderlich, den Stand manuell zu korrigieren.

      Weitere Infos findest du auch im Forum, z.B. unter diesem Link.

  3. Kann es sein, dass die Referenzzahlen als Negativzahlen eingegeben werden müssen?
    PS. Ich verwende die Scripte ohne Pushover.

    Gruss

    • Eingereicht am 21.02.2015 um 18:07 | Als Antwort auf Denni.

      Eigentlich nicht, für “Strom Referenz Zaehlerstand” nimmst du den abgelesenen Wert des Zählers beim Batterieeinlegen und für die anderen deinen Verbrauch in dem jeweiligen Zeitraum minus den Wert, den der Zähler seit dem Batterieeinlegen weitergezählt hat. Mit dem Rücksetzskript werden die aktuellen Werte jeweils auf 0 zurüchgesetzt und die Referenzwerte vorher mit dem Stand vor dem Rücksetzen beschrieben, ab dann werden die aktuellen Werte wieder aufsummiert.

      • Hallo,

        ich habe gerade wie beschrieben einen Batteriewechsel durchgeführt. Nun stimmt nix mehr. 🙁

        Wenn ich mir die Scripte so anschaue, versteh ich auch nicht, warum man z.B.„Strom Referenz Verbrauch heute“ aufschreiben soll? Der wird doch nach Batteriewechsel gar nicht genullt, sondern der COUNTER.

        Beispiel: Tageszähler „Strom Referenz Verbrauch heute“ = 1000 COUNTER begint bei NULL bzw. im Laufe des Tages z.B. 300 oder 1500

        Was ist in underem Beispiel mit Jahr? „Strom Referenz Verbrauch Jahr“ war 0 weil da angefangen. Nun Ende des Jahres oE auf 300 oder 1500, wenn wir annehmen heute abend kommt neues Jahr.
        Macht:
        var vJz = dom.GetObject(„Strom Referenz Verbrauch laufendes Kalenderjahr“);
        var vJg = dom.GetObject(„Strom Verbrauch laufendes Kalenderjahr“);
        vJg.State((oE.State()/1000) – vJz.State());

        300 = 300 – 0 oder 1500 = 1500 – 0

        vTz.State(vTg.State() + vTz.State());
        300 = 300 + 0 oder 1500 = 1500 + 0

        Jahresverbrauch 300 bzw. 1500? Nett.

        Hätte ich nicht eher „Strom Verbrauch laufendes Kalenderjahr“ statt „Strom Referenz Verbrauch laufendes Kalenderjahr“ sichern sollen?

        Bin verwirrt. 🙂

        Danke und Gruß
        Tino

        • Danke für den hilfreichen Hinweis. In der Tat war in dem ursprünglichen Skript ein Fehler enthalten, der nach einem – z.B. durch den Batteriewechsel verursachten – Reset des Datenpunktes „Energie-Zähler Gerät [ENERGY_COUNTER]“ die Werte der Zeitraumzähler falsch berechnete.

          Der Fehler wurde im Tutorial oben bereits korrigiert, die Änderungen jedoch noch nicht vollumfänglich getestet. Diesbezüglich bin ich für Hinweise dankbar.

          Im Vergleich zu der vorherigen Version werden die Zeitraumzähler nicht mehr über den Datenpunkt „Energie-Zähler Gerät [ENERGY_COUNTER]“, z.B. …

          vTg.State((oE.State()/1000) - vTz.State());
          

          …sondern über den „aktuellen Zählerstand“…

          vTg.State(zA.State() - vTz.State());
          

          … berechnet. Zu beachten ist dabei, dass vor Verwendung des neuen Auswerteskriptes eingerichtete Zeitraumzähler bis zu dem nächsten Reset falsche Werte anzeigen werden. Dies muss bei Bedarf über die Referenz-Systemvariablen manuell angepasst werden.

          Ansonsten ist lediglich das neue Auswerteskript zu verwenden. Die Rücksetz-Skripte können unverändert weiter genutzt werden.

          Vor einem Batteriewechsel sollten zudem die Hinweise im Abschnitt 3. beachtet werden.

          • Danke Jens. Das hört sich logischer an.

            Gruß
            Tino

          • Heute stand auch bei mir ein Batteriewechsel an (eigentlich sollten die Batterien nach Herstellerangabe doch viel länger halten), eine gute Gelegenheit, meinen ersten „Hot-Fix“ im Skript mal zu testen. Die gute Nachricht ist, dass er einwandfrei funktioniert, allerdings muss bei großen Zählerständen vorher der Wertebereich einiger Systemvariablen nach oben angepasst werden.

            Ich habe das Tutorial jetzt überarbeitet und für alle „Bestandsnutzer“ (vor dem 15.10.2015) ein Workaround zur Anpassung des Skriptes und Übernahme der Bestandsdaten beigefügt, das möglichst vor einem anstehenden Batteriewechsel beachtet werden sollte.

            Darüber hinaus wurde der Abschnitt „Batteriewechsel“ überarbeitet und ein zusätzliches Kapitel „Korrektur“ aufgenommen, da sich bei mir nach nunmehr mehrmonatigem Einsatz des HM-EM-TX-WM gezeigt hat, dass in der Praxis Abweichungen zwischen dem tatsächlichen Zählerstand des Ferraris-Zählers und den vom HM-EM-TX-WM ermittelten Werten auftreten, die im HM-EM-TX-WM selbst und nicht in der Skriptauswertung begründet sind. Diese und auch in Systemausfällen begründete „Fehler“ können bei Bedarf nach den Hinweisen in diesem Abschnitt korrigiert werden.

            @ Tino, nochmals danke für deinen Hinweis auf den Bug.

  4. Hi Jens,

    Super Tutorial für die Auslosung und funktioniert einwandfrei. Meinst du das in naher Zukunft evtl. eine Funktion dazu kommt das man sich auch die Auswertung der Kosten anschauen kann? Evtl. sogar mit einer Jahresprognose errechnet aus einem Durchschnittsverbrauch? Weiter so 😉

    Danke und Grüße

    • Danke für dein nettes Feedback.
      Ich selbst benötige eine Kostenfunktion momentan eigentlich nicht. Das lässt sich mit ein paar zusätzlichen Systemvariablen und einer Anpassung des Auswerteskiptes aber leicht selbst ergänzen. Komplizierter wird es aber, wenn sich der Strompreis zwischendrin ändert. Mal sehen – man hat einfach zu wenig Zeit 😉 .

    • Schau mal oben in den neu angelegten Absatz „5. Weiterentwicklungsideen“, dort habe ich einen möglichen Lösungsansatz hierzu aufgenommen.

  5. Hi Jens,

    klasse Anleitung. Habe alles soweit nach deinem Tutorial gemacht,
    habe aber das Problem, dass bei jeder Leistungsaktualisierung,
    zu jeder laufenden Variable (heute, Woche, Monat, Jahr) der tatsächliche Zählerstand hinzugefügt wird. Per Webmatic habe ich nur die Referenzwerte (heute, Woche, Monat, Jahr, Zählerstand) entsprechend eingetragen.

    Wo liegt der Fehler?

  6. Hallo Jens,
    auch von mir gleich mehrere Daumen hoch. Ich habe deine Anleitung wie ich hoffe, genau so umgesetzt einschließlich der Pushover Nachrichten. Diese kommen auch täglich, sogar war auch schon eine Wochenmeldung dabei. Leider werden nur die KAlendertage bzw. die Kalenderwoche angezeigt, nicht aber der Energiewert. Nun meine erste Frage. Wo genau muss ich denn den „Startwert“, also den Zählerstand am Stromzähler, eintragen als Ausgangswert? Und gleich noch die zweite Frage: Kann ich den Strompreis nur bei einer CCU2 eintragen oder gibt es bei der CCU1 auch so eine Möglichkeit? Zumindest habe ich keine gefunden. Vielleicht – nein – ganz bestimmt kannst du mir helfen. Vielleicht habe ich es ja auch nur überlesen. Jedenfalls stehe ich irgend wie auf dem Schlauch.
    Beste Grüße
    Reinhard

    • Hallo Reinhard,
      ich hoffe, ich konnte dir „hinter den Kulissen“ soweit weiterhelfen, dass es nun bei dir auf der CCU1 funktioniert.
      Falls noch etwas offen ist, melde dich bitte.
      Infos zu der Einrichtung und Nutzung von Webmatic findest du auch im HomeMatic-Forum
      Grüße Jens

  7. Hallo Jens,
    tolle Sache mit der Auswertung und das Du Deine Progammierungen jedem bereitstellst.
    Ich habe die Variante ohne Pushover Nachrichten gewählt.
    Leider habe ich das Problem, dass ich es nicht zum laufen bekomme. Wie kann ich in einzelnen Schritten einzelne Teile auf Funktionalität überprüfen?

    Ich habe von Programmierungen noch keine Ahnung
    Vielen Dank für Deine Hilfe
    Fritz

    • Hallo Fritz,
      kannst du bitte etwas genauer beschreiben, was genau nicht läuft und welche Teile der Anleitung bei dir funktionieren, um dein Problem etwas einzugrenzen.
      Grüße Jens

      • Hallo Fritz,
        schön dass es jetzt bei dir funktioniert. Wenn du noch Fragen hast, melde dich einfach noch einmal.
        Liebe Grüße Jens

  8. Hallo,
    ich bin über Deinen Betrag gestolpert und habe mir aufgrund dessen das Gerät zugelegt. (als fertig zusammengebauten Bausatz).
    Habe jetzt das Gerät mit der CCU2 verbunden und das Auge über die LED meines Stromzählers geklebt.
    Als Impulswerte habe ich mal 100 (RA) und mal 10.000 (RL) eingegeben. Beide settings führen leider zum gleichen Ergebnis. Das Gerät zeigt permanent nur 0 Watt an.
    Kannst Du mir noch einen Tipp geben, was ich ggf. falsch mache?
    Vielen Dank schon einmal für Deine Hilfe

    • Hallo Alex,
      ich nehme an, du hast dir den Bausatz des „HM-EM-TX-WM“ von jemanden zusammenbauen lassen, da es das Teil ja nicht als Fertiggerät gibt und so wie du schreibst, betreibst du das Gerät mit einem Zählersensor LED „ES-LED“. Ich verstehe dich so, dass schon auf dem Display des „HM-EM-TX-WM“ permanent „0 Watt“ angezeigt werden.

      Wenn der „HM-EM-TX-WM“ nicht defekt ist (was auch nicht auszuschließen ist), könnte dein Problem in der Positionierung des „ES-LED“ oder im Zusammenwirken zwischen „ES-LED“ und „HM-EM-TX-WM“ begründet sein (Steckverbindung?).

      Ich habe leider überhaupt keine Erfahrung mit dem Zählersensor LED „ES-LED“, da ich hier ausschließlich die Ferraris-Variante „ES-Fer“ einsetze. Daher schlage ich vor, dein Problem mal im HomaMatic-Forum zu schildern, am besten hier. Dort werden dir Nutzer, die genau deine Gerätekombination einsetzen, sicher besser helfen können.
      Liebe Grüße Jens

  9. Hi,
    ja ich habe den Bausatz komplett zusammengebaut von einer Firma erworben. Ich habe da gestern mal angerufen – sehr nett. Sie schicken mir noch mal einen neuen Sensor zur.
    Dennoch glaube ich dass die LED in meinem Stromkasten ggf. nicht lichtstark genug ist, um das Gerät zu aktivieren 🙁
    (Im HM Forum habe ich auch schon gepostet.)

    vielen Dank schon mal

  10. Hallo, vielen Dank für die Bereitstellung deiner Skripte! Funktioniert bei mir super. Jetzt stört mich nur noch die Anzeige der Wert, zB: Zaehlerstand: 10900.753300kWh jeden Wert sehe ich mit 6 Nachkommastellen…. Kann ich mit WriteLine(x.ToString(2)); die Werte einfach kürzen?
    Freue mich über eine kurze Info.
    Grüße…

    • Hallo Michael, schön dass dir mein Tutorial hilfreich ist.

      Ohne, dass ich es jetzt selbst ausprobiert hätte, müssten die Nachkommastellen mit…

      x.Value().ToString(2)
      

      …auf zwei Stellen zu reduzieren sein. Hier hat es jemand auf diese Art gelöst.

      Probiere es einfach mal aus.
      Liebe Grüße Jens

    • Update August 2017:

      Mit der CCU2 Firmware 2.29.18 wurde neben anderen mathematischen Funktionen die Funktion „Round(p)“ eingeführt, die den momentanen Wert zur nächstliegenden Zahl mit der Genauigkeit p rundet. Damit ist es sehr einfach möglich, die Ausgaben des Zählers auf beliebige Stellen nach dem Komma zu runden.

      Im Tutorial oben ist eine exemplarische Variante des Auswerteskripts mit Rundung auf zwei Stellen hinter dem Komma hinterlegt.

  11. Hallo Jens,

    nutze deine Arbeit seit einigen Wochen erfolgreich, danke dafür. Letzte Woche habe ich jedoch beobachtet, dass der Stromzähler sich aufgrung eines Überlaufs bei 838860,7 Wh zurück auf null stellt (http://www.elv.de/topic/zaehler-setzt-sich-bei-838000-wh-von-selbst-auf-0.html). Da dein Skript ja auf diesen Wert (oE) zurückgreift hatte ich plötzlich negative Verbrauchswerte, da der neue zA viel zu klein war. Hattest du das Problem noch nicht? Ich würde vor Zeile 16 eine Abfrage einbauen, wenn zR.State() + (oE.State()/1000) < als zA.State() dann erhöhe zR um 838,8607 kWh.

    Gruß

    Stefan

    • Hallo Stefan,

      danke für die Info. In der Tat war mir dieses Phänomen bisher unbekannt. Aber jetzt weiß ich auch, weswegen Nutzer hier schon von negativen Werten berichtet haben. Mein Zähler steht im Moment auf 148201.799805 Wh. Wahrscheinlich ist es bei mir noch nie aufgetreten, weil ich zwischenzeitlich immer mal wieder zum Ausprobieren die Batterien draußen hatte.

      Eine schnelle Lösung für Leute, bei denen es schon aufgetreten ist wäre es, nach dem Abschnitt „4. Korrektur“ vorzugehen. Allen, bei denen der Überlauf kurz bevorsteht würde ich raten, einmal kurz die Batterien zu entnehmen, wieder einzulegen und nach Abschnitt „3. Batteriewechsel“ vorzugehen, dann ist wieder für 883 kWh Ruhe.

      Beide Ansätze sind natürlich nichts für eine dauerhafte Lösung. Ich werde mir da mal eine Korrektur überlegen und in das Tutorial einbauen. Der Weg über eine Prüfung, ob „ENERGY_COUNTER“ kleiner geworden ist und in diesem Fall den Referenzwert um 838860,7 Wh erhöhen, geht da in die richtige Richtung.

      Danke dir nochmal und schöne Weihnachten
      Jens

    • Ein Fix für dieses Problem ist unter dem folgenden Link beschrieben: HomeMatic – Stromzähler auswerten Version 2 mit HM-EM-TX-WM – Bugfix 2 „Zählerüberlauf“.

      Dieser ist derzeit noch „BETA“. Eine Übergangslösung kann auch sein, vor Erreichen des Überlaufs einmal kurz die Batterien zu entnehmen, wieder einzulegen und nach Abschnitt „3. Batteriewechsel“ vorzugehen, dann ist wieder für 883 kWh Ruhe und eventuelle Zählerabweicheungen sind gleich mit korrigiert.

      • Erst mal vielen Dank für das Skript. Ich arbeite noch daran es umzusetzen^^
        Ich kann programmieren, habe aber von der CCU gar keine Ahnung 🙂

        Würde es nicht Sinn machen, bei einem drohenden Variablenüberlauf einfach auf die nächstgrößere Einheit zu wechseln?

        Watt -> Kilowatt -> Megawatt

        Dadurch kann man historische Werte länger speichern.

        Und die Abweichung zwischen Stromzähler und CCU würde ich jetzt einfach mal auf Rundungsfehler zurückführen. Diese könnte man entweder regelmäßig korrigieren oder halt vorher genauer rechnen (mehr Nachkommastellen).

        Grüße
        Marcus

        • Hallo Marcus,

          das Problem mit dem Überlauf ist im Design des M-EM-TX-WM begründet und lässt sich leider nicht ändern (es sei denn, der Hersteller macht da irgendwas). Immer wenn dort die 883 kWh erreicht werden setzt er sich wieder auf NULL zurück und beginnt von vorne zu zählen. Mit dem beschriebenen Bugfix sollte es aber funktionieren. Dieser ist noch Beta, weil ich hier damit noch keinen Überlauf hatte, mein Zähler hat derzeit erst 282472 Wh.

          Die Abweichungen im laufenden Betrieb sind übrigens nicht dramatisch groß (außer man hatte vielleicht einen größeren Systemabsturz), man sollte sie aber im Auge behalten, solange man „seinen Zähler“ und dessen Verhalten noch nicht so gut kennt 😉 .

          Liebe Grüße Jens

  12. Hallo Zusammen,
    irgendwie läuft das Script bei mir nicht!
    Kenne mich mit Programmierung leider nicht aus aber vielleicht hat jemand
    einen Tipp. Unten dei Fehlermeldung !

    Danke

    Error 1 at row 16 col 6 near ^.State(oE.State());
    zA.State(zR.State() + (oE.State()/1000));
    aA.State(oP.State(
    Parse following code failed:
    object oP = dom.GetObject(„BidCos-RF.MEQ0705195:1.POWER“);
    object oE = dom.GetObject(„BidCos-RF.MEQ0705195:1.ENERGY_COUNTER“);
    var zR = dom.GetObject(„Strom Referenz Zaehlerstand“);
    var zA = dom.GetObject(„Strom Zaehlerstand“);
    var aA = dom.GetObject(„Strom Leistungsaufnahme aktuell“);
    var vLz = dom.GetObject(„Strom Referenz Verbrauch seit letzter Ablesung“);
    var vLg = dom.GetObject(„Strom Verbrauch seit letzter Ablesung“);
    var vTz = dom.GetObject(„Strom Referenz Verbrauch heute“);
    var vTg = dom.GetObject(„Strom Verbrauch heute“);
    var vWz = dom.GetObject(„Strom Referenz Verbrauch laufende Woche“);
    var vWg = dom.GetObject(„Strom Verbrauch laufende Woche“);
    var vMz = dom.GetObject(„Strom Referenz Verbrauch laufender Monat“);
    var vMg = dom.GetObject(„Strom Verbrauch laufender Monat“);
    var vJz = dom.GetObject(„Strom Referenz Verbrauch laufendes Kalenderjahr“);
    var vJg = dom.GetObject(„Strom Verbrauch laufendes Kalenderjahr“);
    aC.State(oE.State());
    zA.State(zR.State() + (oE.State()/1000));
    aA.State(oP.State());
    vLg.State(zA.State() – vLz.State());
    vTg.State(zA.State() – vTz.State());
    vWg.State(zA.State() – vWz.State());
    vMg.State(zA.State() – vMz.State());
    vJg.State(zA.State() – vJz.State());

    • Hallo Josef,

      mein Fehler, die Zeile 16 gehört in dieser Skriptversion raus. Bitte lösche sie einfach oder kopier dir das Skript von oben noch einmal.

      Du kannst alternativ aber auch vorgehen, wie hier beschrieben.

      Liebe Grüße und einen guten Rutsch, Jens

  13. Reinhard

    Hallo Jens,
    ersteinmal ein gesundes neues Jahr. Ich habe vor kurzem einen Gas- und einen Strom Sensor mit den zugehörigen Übertragungsmodulen installiert. Nach deiner Anleitung habe ich den Stromzähler in der WebUI mit allen hier beschriebenen Variablen und Skribten angelegt. Nun wollte ich das gleiche auch für Gas machen, jedoch bekomme ich bei den Pushmeldungen immer nur Nullen übermittelt als Werte. Um das ganze vom Strom auch zu unterscheiden, habe ich vor die VAriablen usw immer ein „G“ gesetzt. bei der Einheit „cbm“ genommen und den Teiler 1000 weggelassen. Aber es funktioniert leider nicht.

    [Skripte gelöscht von sTeRn-AV]

    Leider habe ich keine Ahnung wo der Fehler liegt.
    Vielleicht hast du ja mal einen Blick übrig oder einen zündenden Gedanken.

    Besten Dank im Voraus!

    Gruß
    Reinhard

    • Hallo Reinhard, zu deinem recht speziellen Problem antworte ich dir gleich per Mail.
      Bis dann, Jens

      • Als eine allgemeingültige Erkenntnis aus dem von Reinhard beschriebenen Problem sollten alle, die das Stromzählerskript für einen Gaszähler umbauen wollen, beachten, dass die Datenpunkte für den Gaszählersensor das Präfix „GAS_“ erfordern.

        In Abhängigkeit davon, wie die Daten ausgewertet sollen, ist ggf. zusätzlich der Divisor 1000 im Skript anzupassen.

        • Hallo Jens,

          jetzt komm ich glatt mit meinen nächsten Problem ….
          Habe heut die ganze Geschichte für Gas bekommen. Ich habe das Script abgeändert anstatt Strom „Gas“ genommen. Den Divisor 1000 habe ich auch weg gelassen. Leider bleiben die Variablen bei 0 stehen . Ich weiß das du das mit Gas noch nicht ausprobiert hast weil du wahrscheinlich kein Gasanschluss hast aber vielleicht siehst du ja mein Fehler im Script…..

          object oP = dom.GetObject(„BidCos-RF.MEQ070XXXX:1.POWER“);
          object oE = dom.GetObject(„BidCos-RF.MEQ070XXXX:1.ENERGY_COUNTER“);
          var aC = dom.GetObject(„Gas ENERGY_COUNTER“);
          var zR = dom.GetObject(„Gas Referenz Zaehlerstand“);
          var zA = dom.GetObject(„Gas Zaehlerstand“);
          var aA = dom.GetObject(„Gas Leistungsaufnahme aktuell“);
          var vLz = dom.GetObject(„Gas Referenz Verbrauch seit letzter Ablesung“);
          var vLg = dom.GetObject(„Gas Verbrauch seit letzter Ablesung“);
          var vTz = dom.GetObject(„Gas Referenz Verbrauch heute“);
          var vTg = dom.GetObject(„Gas Verbrauch heute“);
          var vWz = dom.GetObject(„Gas Referenz Verbrauch laufende Woche“);
          var vWg = dom.GetObject(„Gas Verbrauch laufende Woche“);
          var vMz = dom.GetObject(„Gas Referenz Verbrauch laufender Monat“);
          var vMg = dom.GetObject(„Gas Verbrauch laufender Monat“);
          var vJz = dom.GetObject(„Gas Referenz Verbrauch laufendes Kalenderjahr“);
          var vJg = dom.GetObject(„Gas Verbrauch laufendes Kalenderjahr“);
          if ((oE.State() + 0.001) < aC.State()) {
          zR.State(zR.State() + 838.8607);
          }
          aC.State(oE.State());
          zA.State(zR.State() + oE.State());
          aA.State(oP.State());
          vLg.State(zA.State() – vLz.State());
          vTg.State(zA.State() – vTz.State());
          vWg.State(zA.State() – vWz.State());
          vMg.State(zA.State() – vMz.State());
          vJg.State(zA.State() – vJz.State());

          Lg. Bernd

          • Hat sich erledigt…. Ich habe im Script oben einmal das „GAS_“ vergessen 🙂
            Jetzt muß es laufen.

            Nochmals Danke für das Script

  14. Frohes Neues Jahr und vielen Dank für die tolle Arbeit.

    Ich habe glaube ich ein Verständnisproblem. Der Tagesverbrauch wird doch laut deiner Anleitung täglich nachts um 0:00 Uhr auf 0 gesetzt. Dieses habe ich auch so eingebaut. Muss nun folglich der Wochenzähler wöchentlich, der Monatszähler monatlich und der Jahreszähler jährlich zurück gesetzt werden?

    Und nach dem Eintragen der Referenzwerte stimmen alle Zahlerstände, allerdings nach der Rückstellung Nachts werden wieder der Zählerstand aus dem Referenzwert übernommen. Warum?

    In meinen Referenz Systemvariablen, sind nach wie vor noch die Referenzwerte eingetragen, die ich gestern eingetragen habe. Müssen diese von Hand wieder auf 0 gesetzt werden?

    Danke schon mal für deine Mühe

    Gruß Sven

    • Hallo Sven,

      Muss nun folglich der Wochenzähler wöchentlich, der Monatszähler monatlich und der Jahreszähler jährlich zurück gesetzt werden?

      Genau, so z.B. für den Jahreszähler am 31.12. kurz vor oder am 01.01. kurz nach Mitternacht. Für den Wochenzähler Sonntags 23:5X oder Montags 00:0X und so weiter. Nur der Ablesezähler wird manuell zurück gesetzt, wenn die Ablesung durch den Energieversorger erfolgt ist.

      Und nach dem Eintragen der Referenzwerte stimmen alle Zahlerstände, allerdings nach der Rückstellung Nachts werden wieder der Zählerstand aus dem Referenzwert übernommen. Warum?

      Ich erläutere das Rücksetzen nochmal anhand des Tageszählers. Mit dem Rücksetzprogramm wird zunächst auf den Referenzwert vom Vortag (vTz) der Verbrauch vom aktuellen Tag (vTg) addiert und die Summe als neuer Referenzwert (vTz) gespeichert. Die geschieht mit der Zeile…

      vTz.State(vTg.State() + vTz.State());

      Anschließend wird der Tageszähler auf NULL gesetzt. Mit dem nächsten Abarbeiten des Auswerteskripts wird mit der Zeile…

      vTg.State(zA.State() - vTz.State());

      …der Tagesverbrauch (vTg) aus dem aktuellen Zählerstand (zA) minus dem Referenzwert für den Tageszähler (vTz) berechnet und gespeichert.

      Der jeweilige Zeitraumzählerstand ist also immer der aktuellen Zählerstand (zA) minus dem Zählerstand kurz vor dem letzten Reset des jeweiligen Zeitraumzählers.

      In meinen Referenz Systemvariablen, sind nach wie vor noch die Referenzwerte eingetragen, die ich gestern eingetragen habe. Müssen diese von Hand wieder auf 0 gesetzt werden?

      Das müsste nun mit der Antwort auf deine zweite Frage beantwortet sein. Die Referenzwerte bleiben immer gleich, solange der Zähler nicht zurück gesetzt wurde. Kurz vor dem Reset werden sie mit dem zwischenzeitlich aufgelaufenen Verbrauch addiert.
      Auf NULL müssen die Referenzwerte nie gesetzt werden (es sei denn du hast einen neuen Zähler).
      Als Referenz-Systemvariable für den jeweiligen Zeitraumzähler ist immer der auf dem Ferrariszähler abgelesene Stand zum Ende des letzten betreffenden Zeitraumes (vor dem letzten Reset) einzugeben. Also z.B. für „Strom Referenz Verbrauch laufende Woche“ der Zählerstand vom letzten Sonntag, 23:59 Uhr. Oder für „Strom Referenz Verbrauch seit letzter Ablesung“ der Zählerstand bei der letzten Ablesung des Stromanbieters.

      Liebe Grüße Jens

      • Hallo Jens,

        vielen Dank für deine ausführliche Antwort.
        Ich denke ich habe die vorgehensweise des Skriptes nun verstanden.

        deshalb verstehe ich auch nicht, warum nun nach der Nacht wieder falsche Werte in den Variablen stehen.

        Die folgenden Variablen enthalten:
        In der Variablen „Strom Referenz Verbrauch Heute“ stehen nun 0,0
        In der Variablen „Strom referenz Verbrauch laufende Woche“ stehen nun 25061
        In der Variablen “ Strom Referenz Verbrauch seit letzter Ablesung“ stehen 0,0

        In der Variablen „Strom Verbrauch heute“ stehen 25104,347
        In der Variablen “ Strom Verbrauch laufende Woche“ 43,347
        In der Variablen “ Strom Verbrauch seit letzter Ablesung“ 25104,37

        Die Variable Zählerstand / Jahrsverbrauch hingegen stimmen.

        Wie man an den Zahlen schon sehen kann, sind Tagesverbrauch Wochenverbrauch und seit Abesung nicht korrekt. Die Woche müsste ja nun heute neu begonnen haben.

        Kannst du mir einen Tipp geben wo der Fehler liegen kann? Ich habe die Skripte alle so wie sie oben beschrieben sind übernommen.

        Gruß Sven

  15. Hallo Jens,

    danke für diese klasse Arbeit. Ich nutze den Stromzähler seit Mitte Dezember und die Sache läuft.

    Natürlich gab es Startschwierigkeiten aber mit etwas Geduld und guten Willen bekommt man das hin.

    Einfach mal DANKE!!

    Viele Grüße
    Thomas

    • Hallo Thomas,
      danke für deinen netten Eintrag und schön, dass dir meine Anleitung nützlich war.
      Liebe Grüße Jens

  16. Heute ist der Datenpunkt ENERGY_COUNTER des HM-EM-TX-WM bei mir übergelaufen und die Zähler sind durch die eingebaute Korrektur alle korrekt weitergeführt worden. Damit hat das Skript auch im Praxistest seine Funktionalität bewiesen:

    Vor dem Überlauf…

    Nach dem Überlauf…

    Das Tutorial ist bereits so umgeschrieben, dass die Überlauf-Korrektur enthalten ist.

    „Bestandsnutzer“ finden einen Link zu einem Workaround zur Anpassung des Zählers..

  17. Hi Jens!
    Erst mal danke für Deine Super Anleitung. Jetzt hätte ich da aber noch die ein oder andere Frage.
    Bis jetzt hab ich meinen Gaszähler mit einen Arduino geloggt.
    Habe mir jetzt aber auch einen HM-EM-TX-WM gekauft und möchte diesen für das Aufzeichnen des Gasverbrauches verwenden.
    Hab jetzt alle Variablen angelegt und anstelle Strom hab ich Gas genommen.
    Das hab ich auch in den Scripten so abgeändert.
    Des weiteren hab ich im 1. Script folgende Zeile abgeändert
    zA.State(zR.State() + (oE.State()/1000));
    in
    zA.State(zR.State() + oE.State());

    Richtig so,oder?
    Jetzt würde ich gerne wissen wie ich meine alten Daten eingebe bevor ich den Gaszähler in betrieb nehme.
    Ich habe folgende Daten zur Verfügung:
    Zählerstand 01.01.2016 00:00 Uhr
    Zählerstand 01.02.2016 00:00 Uhr
    und logischerweise den aktuellen Zählerstand.
    Kann man da auch Dein Tool verwenden (Ist ja eigentlich für Stromzähler?!?!?)?

    Kannst Du mir vielleicht da weiterhelfen?

    Gruß
    Johnny

    • Hallo Johnny,

      ich nutze die Gaszählerfunktion selbst zwar nicht aber wenn du den Wert in m3 anzeigen lassen willst, ist es richtig, den Divisor 1000 wegzulassen.

      Um deinen Gaszähler in Betrieb zu nehmen, gehst du am besten nach dem Kapitel 4. KORREKTUR vor.

      Zuerst die Batterien entnehmen, um das Gerät zurück zu setzen.

      Dann trägst du als „…Referenz Zählerstand“ den aktuellen Stand deines Gaszählers ein.

      Für „…Referenz Jahr“ nimmst du deinen Stand vom 1.1., für „…Referenz Monat“ den vom 1.2. jeweils 00:00 Uhr.

      Für „…Referenz Woche“ kannst du auch den Stand vom 1.2. nehmen, weil der 1.2. ja ein Montag war. Wochenzähler und Monatszähler haben daher in der ersten Februar Woche den gleichen Stand.

      Für „…Referenz heute“ nimmst du den Stand vom 1.2. und addierst den bisherigen Verbrauch vom 1., 2. und 3. Februar, ggf. geschätzt. Die Summe muss natürlich kleiner sein als der aktuelle Zählerstand.

      Für „..Ableszähler“ trägst du den Wert von der letzten Ablesung (Rechnung) ein.

      Viel Erfolg und liebe Grüße
      Jens

  18. Hi Jens!
    Tausend Dank! Hat perfekt geklappt!
    Echt klasse!

    Danke nochmal
    Johnny

  19. Hallo und erstmal herzlichen Dank für die super Anleitung. Habe das Script jetzt ca. eine Woche laufen und es funktioniert (eigentlich) sehr gut. Bekomme auch täglich die Push mit dem Tageswert 🙂
    Leider musste ich aber feststellen das der Zähler pro Tag um ca. 1 kWh ungenau ist mit dem Vergleichswert am Zähler selber. Hast du vielleicht eine Idee woran das liegen könnte?

    Gruß Bernd

    • Hallo Bernd,

      am Skript kann es eigentlich nicht liegen und wenn du im HM-EM-TX-WM alles richtig auf deinen Zähler eingestellt hast, sollte es zuverlässig funktionieren.

      Wenn du die Werte aus dem Datenpunkt „ENERGY_COUNTER“ mit dem Ferrariszählerstand über eine Weile vergleichst und du dann auch Abweichungen feststellst, liegt es wohl irgendwo am Sensor oder dem HM-EM-TX-WM.

      Dann solltest du den Sitz des Sensors und die Einstellungen des HM-EM-TX-WM nochmal überprüfen.

      Anfangs hatte ich auch mal Abweichungen, aber nach einer Weile Betrieb lief der HM-EM-TX-WM sehr zuverlässig. Ich hatte schon die Vermutung, dass das Teil irgendwie „selbstlernfähig“ ist aber das wäre wohl eher eine Wunschvorstellung 😉 .

      Bei mir läuft der Zähler seit Monaten auf eine Zehntel-kWh genau.

      Grüße Jens

  20. Hallo Jens,

    stimmt… das Problem war das ich mit 100 Umdrehungen pro kWh gerechnet habe anstatt wie auf meinen Zähler angegeben mit 75 🙂
    Eine Frage hätte ich noch… Was genau muss ich tun damit ich nur 2 Nachkommastellen angezeigt bekomme anstatt 4 ?

    Vielen Dank schonmal….

    • Hallo Bernd,

      schön, dass du den Fehler gefunden hast.

      Zu dem Runden auf zwei Nachkommastellen schau mal bitte weiter oben in den Kommentaren am 13.12.2015.

      Liebe Grüße Jens

    • Update August 2017:

      Mit der CCU2 Firmware 2.29.18 wurde neben anderen mathematischen Funktionen die Funktion „Round(p)“ eingeführt, die den momentanen Wert zur nächstliegenden Zahl mit der Genauigkeit p rundet. Damit ist es sehr einfach möglich, die Ausgaben des Zählers auf beliebige Stellen nach dem Komma zu runden.

      Im Tutorial oben ist eine exemplarische Variante des Auswerteskripts mit Rundung auf zwei Stellen hinter dem Komma hinterlegt.

  21. Hallo Jens,

    den Beitrag habe ich gelesen doch leider kenne ich mich mit Scripten nicht so gut aus und weiß leider nicht wo genau ich die Zeile einsetzen muss. 🙁

    Lg. Bernd

  22. Hallo Bernd,

    das ist auch nicht ganz unaufwändig und funktioniert im Prinzip so, dass die Systemvariablen, die gerundet werden sollen, in Systemvariablen vom Typ „Zeichenkette“ umwandelt werden und die Zeichenketten dann über „ToString(2)“ entsprechend gekürzt werden.
    Da die Systemvariablen aber zum Rechnen im Typ „Zahl“ vorliegen müssen, wird es wohl am einfachsten sein, jeweils zusätzliche Systemvariablen vom Typ „Zeichenkette“ anzulegen, die zugehörigen Systemvariablen vom Typ „Zahl“ dorthin zu kopieren, zu kürzen und dann die Zeichenkette an Stelle der Zahl auszugeben.

    Im Forum findest du dazu viele Hinweise. Wenn ich mal viel Zeit habe, passe ich das Skript vielleicht mal an, weil schon mehrere Nutzer des Zählers danach gefragt haben.

  23. Ok vielen Dank…. Ich werd mich mal da einlesen !

  24. Hallo Jens,

    tausend Dank für deine ausführliche und gute Anleitung und die viele Mühe. Ich habe eine Fehlermeldung wo ich einfach den Fehler nicht finden kann. Es geht um den Teil, in dem du die Zähler zurücksetzt und z. B. beim Tageszähler den Vortageswert in eine Variable speicherst.

    ! Stromverbrauch heute und gestern eintragen
    var vTg = dom.GetObject(„Strom Verbrauch heute“);
    var vTz = dom.GetObject(„Strom Referenz Verbrauch heute“);
    var vGg = dom.GetObject(„Strom Verbrauch gestern“);
    ! Zwischenwert in Variable speichern
    vGg.State(vTg.State());
    vTz.State(vTg.State() + vTz.State());

    Ich bekomme dann folgende Meldung:
    Error 1 at row 6 col 8 near ^.State(vTg.State());
    vTz.State(vTg.State() + vTz.State());

    Wenn ich die Zeile
    vGg.State(vTg.State());
    mit ! auskommentiere kommt keine Fehlermeldung.

    Die Variable „Strom Verbrauch gestern“ habe ich aber richtig angelegt und genau so benannt. Hast du irgendeine Idee, was ich da falsch mache?

    Liebe Grüße
    David

    • Hallo David,

      in dieser Zeile wird eigentlich nichts anderes gemacht als den Wert des Tageszählers vor dem Reset zu speichern.
      Wenn die Systemvariable für „gestern“ richtig angelegt wurde, sollte das funktionieren. Analog ist das ja auch im Auswerteskript gelöst.

      Verstehe ich dich richtig, dass die Zähler ohne die „gestern- Variante“ laufen?

      Dann solltest du das Skript mal in einem guten Editior (z.B. Notepad++) auf versehentlich hinein gekommene Sonderzeichen prüfen.

      Falls auch das nichts bringt wäre der nächste Schritt, das Skript mal sukzessive im „Erweiterten Skript Parser“ zu untersuchen.

      Liebe Grüße Jens

  25. rUmtifUsel

    Auch von mir ein riesen Lob und Dank für dieses tolle Tut.

    Im Moment versuche ich mich daran die Tages, Wochen, Monats und Jahreswerte zu „konservieren“. Oder anders ausgedrückt, in ein für Excel taugliches Format zu überführen.

    Bislang habe ich noch keinen brauchbaren Weg gefunden die Systemvariablen, die Du erstellt hast direkt in Highcharts o.ä. einzubinden.
    Daher kam ich auf die Idee, mit einem Umweg zu arbeiten. Die Benachrichtigung mittels Pushover enthält alle benötigten Infos. Man muss sie nur extrahieren und in eine Datei Schreiben. Hierbei kommt dann Tasker zum Einsatz. Bislang steht nur ein erster Rohentwurf des Scripts und es noch weit vom produktiven Einsatz entfernt.

    Vielleicht hast Du auch eine bessere / einfachere Idee

    Gruß

    Carsten

    • Hallo Carsten,

      ich logge das Ganze über den CCU-Historian, von dort aus kannst du alle aufgezeichneten Daten, also auch die Werte aus den Systemvariablen, direkt aus dem Web-Interface in ein Excel-taugliches csv-Format exportieren.

      Über eine speziell formatierte Web-Adresse können Zeitreihen sogar in einem selbst definierten Zeitraum direkt aus der Datenbank im csv-Format auf dem lokalen Rechner abgespeichert werden.

      Mehr dazu findest du im Kapitel 7.3 des CCU-Historian- Handbuchs.

      Liebe Grüße Jens

  26. rUmtifUsel

    Hallo Jens,

    wenn ich das korrekt verstanden habe, muss der Historian 24/7 laufen, damit alle Daten vorhanden sind. Ist das so? Falls dem so ist, kann ich den Historian nicht verwenden, da ich keinen PC daheim im Einsatz habe, der 24/ läuft und einen RasPi wollte ich mir deshalb nicht zulegen. Kennst Du vielleicht noch andere Lösungsmöglichkeiten?

    Gruß

    Carsten

    • Hallo Carsten,

      stimmt, der Server, auf dem der CCU-Historian läuft, muss natürlich permanent online sein. Das ist bei den meisten alternativen Lösungen auch so.

      Du könntest im Forum mal nach „CUXD-Highcharts“ suchen, der läuft auf der CCU. Ob du damit allerdings Daten in das Excel-Format exportieren kannst, kann ich nicht sagen.

      Liebe Grüße Jens

  27. rUmtifUsel

    Highcahrts kommt leider nicht (ohne Weiteres) an Systemvariablen heran, was bei dem von Dir entwickelten Programm, für die Auswertung des Stromzählers, von Vorteil wäre.
    Highcahrts braucht dafür wieder ein Programm in der CCU, dass bei Aktualisierung startet und dann ein CUXD Gerät triggert.
    Da hätte mir der Historian schon besser gefallen. Na dann mache ich mich mal auf die Suche 😉

    • Ein 24/7 RasPi ist ja auch nicht ein so großer Stromfresser. Und der Mehrwert, zum Beispiel bei einer Fehlersuche, auf ALLE Daten zurück greifen zu können, ist nicht zu verachten. Du kannst dir das ja nochmal überlegen.
      Liebe Grüße Jens

  28. Müssen die ganzen Systemvariablen z. B. Strom Zaehlerstand usw. die den Wert „Zahl haben“ bei Minium und Maximum ausgefüllt werden (mit 0 und 65000) oder bleiben diese leer?

    • Hallo Andreas,
      Wie im Tutorial steht, reicht der in der CCU voreingestellte Wertebereich für Systemvariablen vom Typ Zahl von 0 bis 65000. Wenn dieser nicht verändert werden soll, braucht nichts eingegeben zu werden. Bei vielen Bestandszählern dürfte der Wert von 65000 für einige Stromzähler-Systemvariablen jedoch nicht ausreichen. Daher solltest du zumindest für die Systemvariablen „Strom Zaehlerstand“, „Strom ENERGY_COUNTER“ und für alle Referenz-Systemvariablen als Maximalwert 999999.99 eingeben.
      Liebe Grüße Jens

  29. OK, der Zähler ist installiert und soweit sieht es eigentlich – meiner Meinung nach – gut aus.

    Ich habe meinen aktuellen Zählerstand unter „Strom Referenz Verbrauch heute“ hinterlegt. Die Variablen „Strom Verbrauch heute“, laufende Woche und laufender Monat wurden mit dem aktuellen Zählerstand ebenfalls „gefüllt“. Dürfte aber bis zum ersten rücksetzen heute Nacht bzw. Sonntag auf Montag Nacht und Ende des Monats so in Ordnung sein, denn da noch kein kompletter Tag usw. wird davon ausgegangen, dass mein aktuell eingegebener Zählerstand tatsächlich mein Verbrauch ist. Das sehe ich richtig oder?
    Wo nichts drin steht ist „Strom Verbrauch laufendes Jahr“ ist das korrekt so?

    • Hallo Andreas,
      den aktuellen Zählerstand vom Ferrariszähler musst du in die Systemvariable „Strom Referenz Zaehlerstand“ eintragen.

      Als Referenz-Systemvariable für den jeweiligen Zeitraumzähler musst du den auf dem Ferrariszähler abgelesenen Stand zum Ende des letzten betreffenden Zeitraumes (vor dem letzten Reset) eingeben.
      Also z.B. für „Strom Referenz Verbrauch laufende Woche“ der Zählerstand vom letzten Sonntag, 23:59 Uhr. Oder für „Strom Referenz Verbrauch seit letzter Ablesung“ der Zählerstand bei der letzten Ablesung des Stromanbieters.

      Falls diese Werte nicht vorliegen, können sie mit dem Korrekturechner über die seit dem letzten Reset aufgelaufenen (ggf. geschätzten) Verbräuche und dem bereits oben eingetragenen aktuellen Zählerstand auf dem Ferrariszähler berechnet werden.

      Die „Nicht-Referenz“ Systemvariablen werden durch das Skript mit jeder Aktualisierung neu berechnet (da brauchts du nichts einzutragen) und über die zugehörigen Programme zum Ende des jeweiligen Zeitraumes zurück gesetzt.
      Liebe Grüße Jens

  30. Kann es sein, dass da auch negative Zahlen errechnet werden?

    Ich habe jetzt einen Zählerstand von 5981,3. Energy Counter 360.00 Wh. Die letzte Jahresablesung war Donnerstag (14.04.), da wir seit gestern 15.04. einen neuen Anbieter haben.
    Stromreferenz heute wären lt. Rechner 5981.27
    Referenz Tag/Woche/Monat 5959.0
    Referenz seit letzter Abrechnung 5959.0

    Kann das so stimmen?

    • Ich glaube ich habe es soweit selbst hinbekommen. 🙂

      • Guten Morgen Andreas,
        prima, lass den Zähler mal eine Weile laufen und wenn es noch weitere Fragen gibt, melde dich einfach noch einmal.
        Liebe Grüße Jens

        • Hab jetzt vorhin mal Zählerstand verglichen und bemerkt, dass der tatsächliche Zählerstand um 0,28 kWh niedriger ist als die ccu2 anzeigt. Reicht es dann wenn ich vom bereits eingetragenen Wert beim Referenz Zählerstand diesen Wert abziehe?

          • Bei Anweichungen solltest du nach dem Kapitel „4. Korrektur“ vorgehen.

            Falls die Abweichung bleibt, stimmt wahrscheinlich die Anpassung auf deinen Zähler in den Einstellungen des HM-EM-TX-WM nicht. Zur Kontrolle kannst du die Werte aus dem Datenpunkt „ENERGY_COUNTER“ mit dem Ferrariszählerstand über eine Weile vergleichen.

  31. Hallo Jens,

    die CCU2 musste ich soeben neu starten und jetzt sind meine ganzen gezählten Werte von heute, gestern usw. auf 0 gesetzt. Die Referenzvariablen stehen zwar noch drin, aber bei den normalen Variablen wo sich alles automatisch berechnet stimmt nichts mehr…

    Irgendwas läuft da grad gründlich schief. Bitte um Hilfe!

  32. Hallo Jens,
    Problem gefunden. Die Programme für den täglichen und wöchentlichen Reset laufen bei mir über einen CUxD-Timer. Die Timer haben wohl direkt nach dem Neustart der CCU2 den Status=TRUE und lösen somit die Reset-Programme aus. Hab es jetzt auf das interne Zeitmodul gesetzt, jedoch wird hier viel von Problemen mit dem Zeitmodul berichtet. Nutzt du für die Resetprogramme das Zeitmodul ohne Probleme??

    • Interessant, das beschriebene Verhalten des CUxD-Timers war mir bisher noch nicht aufgefallen. Ich nutze die CUxD-Timer in vielen Programmen. Zum Reset der Strom- und Ölzähler nutze ich aber seit Jahren das CCU-Zeitmodul ohne Probleme.

      Übrigens, falls ein Programm mal nicht mehr von dem Zeitmodul getriggert wird, hilft es oft, es neu anzulegen.

      Du kannst aber auch bei Verwendung des CUxD-Timers verhindern, dass die Zähler bei einem Neustart der Zentrale zurück gesetzt werden. Lies hierzu mal den Artikel HomeMatic – Ausführen von Programmen bei einem Neustart der CCU unterbinden.

      Liebe Grüße Jens

  33. Ich habe jetzt nochmal getestet. Die Reset-Programme werden nur ausgelöst, wenn auf State=TRUE getriggert wird. Scheinbar melden die Timer nach dem Neustart kurz diesen Start… hab jetzt auf Timer_Get kleiner/gleich 2 Sek „bei Änderung auslösen“ gestellt. Da kann ich Neustart machen so viel ich will. Da passt es.

  34. Übrigens: Den Trick mit der Variable kenne ich schon und nutze ich auch. Das ich ihn bei den Timer eigentlich auch verwenden könnte, daran habe ich jetzt garnicht gedacht. Aber solange es mit Timer_Get funktioniert ändere ich jetzt nicht alles wieder um. 🙂

  35. Hallo Jens, vielen Dank für die ausführliche Dokumentation nach lange tüfteln habe ich es auch soweit zum laufen gebracht. Ich hatte nur den Fehler das ich alle Werte auf täglich löschen gesetzt hatte, bis auf die Zähler referenz. Jetzt hAbe ich verstanden das die Werte wöchentlich jährlich täglich und monatlich zurücksetzen muß.
    Jetzt habe ich aber das Problem das ich nicht weiß wie die Einstellungen für das monatliche Rücksetzen eingestellt wird. Ich habe jetzt am 1. Tag jedes 1. Monats um 00:01 Stromverbrauch verzögert 5sec auf 0.00
    Wie muß der korrekte Eintrag lauten?
    Danke Peter

    • Hallo Peter,
      den Monatszähler kannst du z.B. so zurück setzen…

      …und für den Wochenzähler so…

      Liebe Grüße Jens

  36. Hallo Jens, wunderbar vielen Dank für die super schnelle Reaktion. Genau so hatte ich es gemacht.

    Vielen vielen Dank.

    Findet man bei Dir auch so eine tolle Doku zu den HighCharts bzw. Zu CCU historian? Ich vermute das die Super Grafik mit dem schwarzen Hintergrund mit CCu-Historian darstellt ist? Der Nachteil dabei ist, wie ich finde das der PC ständig laufen muss wenn ich richtig informiert bin. Gibt es eine ähnliche Anwendung auch für den Raspberry?

    Nochmals Danke das du dein Wissen hier für uns weiter gibst.

    LG Peter

  37. Hallo Jens, Vielen lieben Dank

    LG Peter

  38. Montgomery B.

    Hallo Jens,
    zunächst einmal danke für das erstklassige Tutorial. SEHR, SEHR gut!
    Natürlich habe ich bei der Umsetzung etliche Fehler gemacht, aber nach weniger als zwei Wochen Tüftelei läuft es einigermaßen 😉

    Aber – beim Stromverbrauch Heute zeigt er mir den Referenz-Zählerstand an und ich weiß nicht warum 🙁

    Bin sicher, dass ich auch dieses Problem beseitigen werde – in ein paar Wochen 😉

    lg
    Monti

    • Hallo Monti,
      wenn du dein Problem weiter eingrenzen kannst und es nicht alleine hinbekommst, kann du dich auch gerne mal per Kontaktformular bei mir melden.
      Liebe Grüße Jens

  39. Montgomery B.

    Hi Jens,
    danke für deinen Privat-Support. Die Auswertung läuft jetzt perfekt und ich habe mir dann gleich auch noch die Gasvariante installiert 🙂
    Nachdem ich deine Scripts nun endlich verstanden habe, frage ich mich jedoch, weshalb du die Referenzwerte manipulierst.
    Aus meiner Sicht ist ein „Referenzwert“ eine unveränderliche Größe, auf dessen Basis alle anderen Werte berechnet werden.
    Mir ist klar, dass, um das zu erreichen, zusätzliche Variablen genutzt werden müssten, allerdings würde m.E. auch die Stabilität damit erheblich gesteigert.
    Fixe bzw. nur manuell veränderbare Werte für (Abrechnungs)Jahr, letzter Monat, letzte Woche und Ablesezähler hätten da sicher einen gewissen Charme 😉

    Ist nur eine Anregung… (es funktioniert ja auch so:)

    Beste Grüße
    Monti

    • Hallo Monti,

      schön, dass es bei dir funktioniert. Sicher, es lässt sich immer etwas anders lösen und noch optimieren. Wenn du eine Anpassung in der von dir beschrieben Richtung fertig gestellt hast, kannst du sie hier ja mal vorstellen. Das ist bestimmt auch für andere Nutzer von Interesse.

      Liebe Grüße Jens

  40. Hallo Jens,

    erstmal danke für dein Tutorial, werde ich sicher die tage gleich mal alles Testen. Ich habe nur mal eine Frage, wie bekomme ich den Geräte-Zähler wieder auf Null? Muss man da nur die Batterien rausnehmen oder geht das auch anders? Bei mir war Heute die Ablesung und da sollte er ja wieder auf null sein. Vielen dank schonmal für deine Hilfe.

    LG Micha

    • Hallo Micha,

      das Konzept meiner Lösung sieht vor, dass der HM-EM-TX-WM nur dann (zwangsweise) zurück gesetzt wird, wenn dort die Batterien zu wechseln sind. Ansonsten zählt er brav weiter, auch wenn Stromzählerablesung war.
      Für die Stromzählerablesung dient der „Ablesezähler“, also die Systemvariable „Strom Verbrauch seit letzter Ablesung“. Diese wird zurück gesetzt, nachdem die Stromzählerablesung erfolgt ist. Wie das geht, steht am Ende von Abschnitt 2. im Tutorial.

      Liebe Grüße Jens

  41. Tolles Skript, danke dafür.

    Das Zurücksetzen des Monats hat heute nicht geklappt. Zeitmodul der CCU2 wohl -.-. Werd das Programm mal löschen und neu anlegen. Vielleicht mach ich auch Zurücksetz-Skript und lass es 0:00 von CuxD auslösen, mal schauen.

    Dennoch eine Frage:
    Ich musste die CCU2 heute neustarten. Ich lasse die Werte über iobroker in eine SQL-Datenbank schreiben. Die Werte haben nun durch den Neustart eine Delle. Hiermal die Werte vom Tagesverbrauch (handliche Werte, alle Stromdaten habe diese Delle):
    19:57: 5.85 kWh
    20:03: 5.44 kWh -> Sprung
    20:05: 5.89 kWh -> Wert wieder OK

    Hättest du dafür eine Erklärung?

    • Hallo Daniel,

      dass das Zeitmodul der CCU nicht immer 100% zuverlässig funktioniert ist ein leider häufiger vorkommendes Phänomen. Das Programm neu anzulegen kann helfen. Ansonsten ist der CUxD-Timer immer eine gute und zuverlässige Alternative.

      Das mit deiner „Delle“ ist interessant, eigentlich werden die in den Systemvariablen gespeicherten Wert ja beim CCU-Neustart nicht verändert. Vielleicht liegt es irgendewie am iobroker, der im Zeitfenster des Neustarts keine Daten empfängt aber das ist eher aus der Glaskugel.
      Ich selbst logge mit dem CCU-Historian und habe ein vergleichbares Verhalten bisher nicht beobachtet, muss ich mal explizit drauf achten.

      Liebe Grüße Jens

      • Danke für die schnelle Antwort.

        Ich habe noch meine aufgezeichneten Temperaturwerte und den POWER-Wert den Stromzählersensors geprüft. Diese weisen keine Delle auf. Nur die Stromverbrauchswerte, die durch das Programm ermittelt werden. Vielleicht hab ich die CCU genau dann stromlos geschalten, als eine Berechnung lief?

        Wenn iobroker keine Daten empfängt, ändert es die Datenpunkte eigentlich nicht selbst; dann wäre das ja auch mit den Temperaturen passiert!? Aber auch das ist Glaskugel. Bevor ich im iobroker-Forum nachfrage, wollte ich hier fragen.

        Schönes Wochenende
        Daniel

  42. Hallo Jens!

    Vorab meinen herzlichen Dank für die wirklich tolle Anleitung.

    Ich stolpere grad über ein Problem, wenn man ZWEI Zähler einsetzen will…
    Mein Hausstrom funktioniert einwandfrei mit den von dir zur Verfügung gestellten Skripten. Nun habe ich mir einen zweiten Zähler für meinen Wärmepumpenstrom zusammengelötet, dieser funktioniert auch tadellos, nur bekomme ich die Variablen nicht mit Daten gefüllt.

    Ich habe alle Systemvariablen mit dem Zusatz WP versehen und die Skripte auch entsprechend angepasst – nichts… Dann habe ich in den Skripten auch die Hilfsvariablen jeweils um ein vorgestelltes W (WaC, WzR, etc.) ergänzt, da ich mir nicht sicher war, ob sich sonst die Skripte irgendwie untereinander stören.
    Auch da kommt nichts in die Variablen, ausser meine „Strom WP ENERGY_COUNTER“ zählt hoch.

    Hast du da Erfahrungen mit zwei Messstellen?

    Herzlichen Dank für hilfreiche Tipps…

    object WoP = dom.GetObject(&quot;BidCos-RF.MEQXXXXXX:1.POWER&quot;);
    object WoE = dom.GetObject(&quot;BidCos-RF.MEQXXXXXX:1.ENERGY_COUNTER&quot;);
    var WaC = dom.GetObject(&quot;Strom WP ENERGY_COUNTER&quot;);
    var WzR = dom.GetObject(&quot;Strom WP Referenz Zaehlerstand&quot;);
    var WzA = dom.GetObject(&quot;Strom WP Zaehlerstand&quot;);
    var WaA = dom.GetObject(&quot;Strom WP Leistungsaufnahme aktuell&quot;);
    var WvLz = dom.GetObject(&quot;Strom WP Referenz Verbrauch seit letzter Ablesung&quot;);
    var WvLg = dom.GetObject(&quot;Strom WP Verbrauch seit letzter Ablesung&quot;);
    var WvTz = dom.GetObject(&quot;Strom WP Referenz Verbrauch heute&quot;);
    var WvTg = dom.GetObject(&quot;Strom WP Verbrauch heute&quot;);
    var WvWz = dom.GetObject(&quot;Strom WP Referenz Verbrauch laufende Woche&quot;);
    var WvWg = dom.GetObject(&quot;Strom WP Verbrauch laufende Woche&quot;);
    var WvMz = dom.GetObject(&quot;Strom WP Referenz Verbrauch laufender Monat&quot;);
    var WvMg = dom.GetObject(&quot;Strom WP Verbrauch laufender Monat&quot;);
    var WvJz = dom.GetObject(&quot;Strom WP Referenz Verbrauch laufendes Kalenderjahr&quot;);
    var WvJg = dom.GetObject(&quot;Strom WP Verbrauch laufendes Kalenderjahr&quot;);
        if ((WoE.State() + 0.001) &lt; WaC.State()) {
        WzR.State(WzR.State() + 838.8607);
        }
    WaC.State(WoE.State());
    WzA.State(WzR.State() + (WoE.State()/1000));
    WaA.State(WoP.State());
    WvLg.State(WzA.State() - WvLz.State());
    WvTg.State(WzA.State() - WvTz.State());
    WvWg.State(WzA.State() - WvWz.State());
    WvMg.State(WzA.State() - WvMz.State());
    WvJg.State(WzA.State() - WvJz.State());
    
  43. Hallo Holger,

    das von dir beschriebene Phänomen ist ungewöhnlich. Eigentlich reicht es, in den Zeilen 1 und 2 die Seriennummer des zweiten HM-EM-TX-WM einzugeben und in den Zeilen 1 bis 16 die für den neuen Zähler angelegten Systemvariablen einzutragen. Die Skripvariablen sollten vor dem Hintergrund der max. 200-Grenze für Skriptvariablen ohnehin möglichst gleich sein. Da die CCU die Skripte nacheinander abarbeitet, beeinflussen sich Skripe normalerweise nicht.

    In deinem Skript erkenne ich nichts, was falsch wäre. Wenn die Systemvariable „Strom WP ENERGY_COUNTER“ aktualisiert wird, dann scheint das Skript ja auch zu laufen.

    Der Fehler muss woanders liegen, was ich aber anhand deiner Ausführungen aus der Ferne nicht näher eingrenzen kann.

    Ich selbst setze nur einen Zähler ein aber ich weiß von Nutzern, die zumindest je einen für Strom und Gas verwenden, dass es grundsätzlich funktionieren sollte.
    Vielleicht kann ja jemand, der mehrere Zähler einsetzt und hier mitliest, etwas zur Lösung beitragen.

    Liebe Grüße Jens

    • Hallo Jens!

      Vielen Dank für deine Antwort.

      Ich denke, dass ich einfach zu ungeduldig war, bzw. der Verbrauch in den ersten 12 Stunden zu gering war. Meine WP verbraucht derzeit ganze 7W im Standby und da bei uns tagsüber auch die WW-Zirkulation nicht läuft und auch der WW-Speicher meist nur 1x pro Tag nachgeladen werden muss, war der Stromverbrauch zu gering, um die entsprechenden Zähler „sichtbar“ steigen zu lassen.
      Heute morgen hat die WP „nachgeladen“ und jetzt habe ich auch Werte in den Variablen – zu meiner Freude „kleine“ Zahlen 😉

      Nochmal ein ganz großes Dankeschön an Leute wie dich, die ihr Wissen mit anderen teilen und den „nicht-so-bewanderten“-Usern die Realisierung ihrer Projekte erleichtern.

      Das nächste Projekt sollte jetzt sein, die ganzen Batterieaktoren/Sensoren im Haustechnikraum irgendwie direkt mit Strom zu versorgen – wo Strom gemessen wird liegt ja auch welcher an…

  44. Holger Goth

    Hallo zusammen,
    ich bin blutiger Anfänger aber jezt schon total begeistert.
    Vielleicht könnt ihr mir kurz einen Tipp geben .
    Ich komme bei der Systemvariable „CCU2 im Reboot“ nicht weiter wo finde ich die ?
    Grüße Holger

    • Hallo Holger,

      die Systemvariable „CCU im Reboot“ musst du – sofern du sie verwenden willst – selbst anlegen, mehr dazu findest du im Tutorial „HomeMatic – Ausführen von Programmen bei einem Neustart der CCU unterbinden„.
      Liebe Grüße Jens

    • Holger Goth

      Mittlerweile habe ich die Systemvariable gefunden hab gestern noch alles soweit eingepflegt.
      Sorry aber wenn ich jeyt den Zählerstand eintrage über mein Webmatic dann sollte doch das System automatisch loslegen ?
      Ich hab überall Null.
      Hab ich was vergessen ?
      Alle Scirpte habe ich geprüft und kommt keine Fehlermeldung …

      • Hallo Holger,

        wenn du genau nach der Anleitung vorgegangen bist und dabei keine Fehler passiert sind, sollte der Zähler in der Tat automatisch mit dem Zählen beginnen. Wenn die Zählerstände auf NULL bleiben kann das viele verschiedene Ursachen haben.

        Bei der Ursachenforschung würde ich zunächst nochmal alles nachprüfen (korrekte Bezeichnung der Systemvariablen etc., da werden Fehler nicht unbedingt in der Syntaxprüfung des WebUI bemerkt) und schauen, ob das Auswerteskript überhaupt getriggert wird und falls ja, ob bzw. bis zu welcher Stelle es durchläuft. Hierzu ist es hilfreich den erweiterten Skript Parser zu verwenden.

        Viel Erfolg, liebe Grüße Jens

        • Holger Goth

          Hallo Jens danke für deine Zeit das du das hier aufmerksam mit liest, ich habe jetzt alles perfekt laufen sogar auch den Gaszähler. Ich habe einen kleinen Fehler gemacht und die XXXXXX meinens Strom bzw. Gaszählers nicht ersetzt ((„BidCos-RF.MEXXXXXXXX:1.POWER“)) *g*…
          Jedoch noch eine Frage wie komme ich am besten zu einer Auswertung mittles CSV Datei .
          Wo finde ich die Werte hinterlegt ?

          Vielen Dank Gruß Holger

          • Hallo Holger,

            schön, dass du es hinbekommen hast und es jetzt funktioniert.

            Um die Daten in einer Langzeitspeicherung abzulegen, gibt es mehrere Möglichkeiten. Ich nutze und empfehle gerne den CCU-Historian. Damit lassen sich die Daten visualisieren und auch bequem in CSV exportieren. Den Historian kannst du z.B. auf einem Raspberry Pi betreiben oder auch auf einem NAS.

            Nur eine mögliche Alternative zum Historian wäre z.B. CUxD-Highcharts.

            Liebe Grüße Jens

  45. Hallo Jens,

    vielen Dank für deine ausführlichen Tutorials. Bin durch Zufall auf deine Seite gekommen und habe jetzt erforlgreich den Stromzähler in Betrieb genommen und gleich deine Anleitung hier umgesetzt. Ich muss sagen du hast das escht super verständlich und Anfänger geeignet beschrieben, Danke!

    Kannst du vielleicht nochmal kurz deine Abkürzungen für die Variablen darstellen? Bin mir nicht ganz klar darüber was deine Abkürzungen bedeuten.

    Beispiel:
    aA = Strom Leistungsaufnahme aktuell
    vLg = Strom Verbrauch seit letzter Ablesung
    usw.

    Frage deshalb weil ich noch einige Kostenvariablen einbauen will und da will ich natürlich ähnliche Abkürzungen verwenden damit es dem gleich Muster folgt.

    Danke 🙂

    • Hallo Maik,

      schön, dass dir das Tutorial hilfreich war und es auch auf Anhieb funktioniert hat. Die Abkürzungen sind mehr oder weniger willkürlich gewählt. Sie bedeuten…

      oP = (O)bject (P)OWER
      oE = (O)bject (E)NERGY_COUNTER
      aC = (a)ktueller Stand ENERGY_(C)OUNTER
      zR = (Z)aehlerstand (R)eferenz
      zA = (Z)aehlerstand (a)ktuell
      aA = (a)ktuelle Leistungs(a)ufnahme
      vLz = (V)erbrauch Ab(l)esung Referen(z)
      vLg = (V)erbrauch Ab(l)esung (G)esamt
      vTz = (V)erbrauch (T)ag Referen(z)
      vTg = (V)erbrauch (T)ag (G)esamt
      vWz = (V)erbrauch (W)oche Referen(z)
      vWg = (V)erbrauch (W)oche (G)esamt
      vMz = (V)erbrauch (M)onat Referen(z)
      vMg = (V)erbrauch (M)onat (G)esamt
      vJz = (V)erbrauch (J)ahr Referen(z)
      vJg = (V)erbrauch (J)ahr (G)esamt

      Bezüglich der Vergabe von Skriptvariablen empfehle ich dir, auch mal den Artikel HomeMatic – CCU Abstürze durch zu viele Skriptvariablen verhindern zu lesen, damit du keine Probleme mit der 200er-Grenze bekommst.

      Liebe Grüße Jens

  46. Andreas Weidenbacher

    Hallo Jens,

    auch ich bin dabei, dein Script umzusetzen, habe aber ein kleines Problem (die Variablen werden nicht upgedatet) als Newbie und hoffe, du kannst mir hier einen Tipp geben:

    In deinem Script habe ich die beiden Zeilen
    object oP = dom.GetObject(„BidCos-RF.MEXXXXXXXX:1.POWER“);
    object oE = dom.GetObject(„BidCos-RF.MEXXXXXXXX:1.ENERGY_COUNTER“);

    durch folgende Einträge ersetzt:
    object oP = dom.GetObject(„BidCos-RF.HM-ES-TX-WM NEQ08XXXXX:1.POWER“);
    object oE = dom.GetObject(„BidCos-RF.HM-ES-TX-WM NEQ08XXXXX:1.ENERGY_COUNTER“);

    Da bei mir ein Leerzeichen vor dem NEQ… Bereich steht, denke ich, dass die fehlende Aktualisierung daher kommt. Hatte auch schon versucht, das Leerzeichen durch Punkt oder Bindestrich zu ersetzen – leider ohne Erfolg 🙁

    Kannst du mir sagen, wie der korrekte Gerätename lauten muss?
    Den Namen oben habe ich aus CCU-Historian genommen…

    Danke im vorab
    Andreas

    • Hallo Andreas,

      du musst „HM-ES-TX-WM“ weglassen und nach dem Punkt direkt mit der Geräte ID fortfahren, also…

      object oP = dom.GetObject(&quot;BidCos-RF.NEQ08XXXXX:1.POWER&quot;);
      object oE = dom.GetObject(&quot;BidCos-RF.NEQ08XXXXX:1.ENERGY_COUNTER&quot;);

      Liebe Grüße Jens

  47. Andreas Weidenbacher

    Hallo Jens,

    hat geklappt – vielen Dank für deine Hilfe!

    Ich nutze auch dein 2. Script, welches um 23:59 Uhr läuft, um die Variablen fortzuschreiben. In dem Programm habe ich noch einen 2. Step eingebaut, um mir per EMail den Tages-, Wochen-, Monats- und Jahresverbrauch zu schicken. EMail kommt an, aber die Werte sind nicht gefüllt, sondern es steht immer der Text drin 🙁

    Ist:
    Stromverbrauch 19.01.2017.

    Tagesverbrauch:
    Strom Verbrauch heute.

    So sollte es ausschauen:
    Stromverbrauch 19.01.2017.

    Tagesverbrauch:
    8.23.

    Kannst du mir ggf. einen Tip geben, was ich in meinem Script anpassen muss, damit der Wert und nicht der Text in die Mailnachricht aufgenommen wird?

    Vielen Dank im vorab!
    Gruß
    AWeiden

    Mailnachricht mit Stromverbrauch:

    ! Mail-Text zusammensetzen

    ! Variable heute mit Stromverbrauch füllen
    var vTg = dom.GetObject(„Strom Verbrauch heute“);
    var vWo = dom.GetObject(„Strom Verbrauch laufende Woche“);
    var vMn = dom.GetObject(„Strom Verbrauch laufender Monat“);
    var vJr = dom.GetObject(„Strom Verbrauch laufendes Kalenderjahr“);

    string Nachricht;
    string sDate = system.Date(„%d.%m.%Y“);
    Nachricht = “ rn Stromverbrauch “ # sDate # „. rn“;

    Nachricht = Nachricht # „rn Tagesverbrauch: “ # vTg;
    Nachricht = Nachricht # „rn Wochenverbrauch: “ # vWo;
    Nachricht = Nachricht # „rn Monatsverbrauch: “ # vMn;
    Nachricht = Nachricht # „rn Jahresverbrauch: “ # vJr;
    Nachricht = Nachricht # „rn“;

    ! Nachricht in Variable füllen und E-Mail absenden
    !————————————————–
    dom.GetObject(„S_Mailtext“).State(Nachricht);

    dom.GetObject(„CUxD.CUX2801001:1.CMD_EXEC“).State(„/etc/config/addons/email/email 05“);

    • Hallo Andreas, auf die Schnelle:

      Versuche mal an Stelle von…

      var vTg = dom.GetObject(&quot;Strom Verbrauch heute&quot;);
      

      …dies hier…

      string vTg = dom.GetObject(&quot;Strom Verbrauch heute&quot;).Value();
      

      etc.

  48. Andreas Weidenbacher

    Hallo Jens,

    klasse – hat funktioniert!!! Vielen Dank für die Tipps, war jetzt nochmals ein schöner Erfolg zum Tagesabschluss 🙂

    Gruß
    Andreas

    • Hallo Andreas,
      schön, dass jetzt bei dir alles funktioniert. Viel Spaß und Erfolg noch.
      Liebe Grüße Jens

  49. Hallo Jens,

    erst einmal herzlichen Dank für die vielen TOLLEN Tutorials. Ich habe schon mehrere erfolgreich Umgesetzt und erfreue mich täglich daran.
    Heute wollte ich dieses hier Umsetzten und komme einfach nicht auf den Fehler. Alle Zählerstände bis auf ENERGY_COUNTER bleiben auf „0.00“ Der ENERGY_COUNTER aktualisiert sich wie gewünscht ca. aller drei Minuten korrekt.
    Ich habe alle SysVar´s nochmals auf korrekte Schreibweise kontrolliert und kann leider den Fehler nicht finden.
    Als Script nutze ich dein temp-Skript. In der „Skript testen“ Funktion läuft es nicht durch.
    Ich hoffe Du hast eine Idee wo der Fehler liegen könnte.

    Vorab schon mal vielen Dank für Deine Bemühungen!
    Beste Grüße Rico

    • Hallo Rico,
      ich habe dir hierzu eine Mail geschickt.
      Liebe Grüße Jens

      • Falls das Auswerteskript – wie bei Rico – nicht durchläuft, was man z.B. mit Markern, die man an verschiedenen Stellen im Skipt einbaut, im erweiterten Skript Parser herausfinden kann, kann es helfen, die betroffenen Systemvariablen zu löschen und nach einem Neustart der CCU erneut anzulegen. Bei Rico war es die Systemvariable „Strom Zaehlerstand“.

        Das mal so als Hinweis für alle.

        Liebe Grüße Jens

      • Hallo Jens,

        nochmal auf diesem Wege vielen Dank für Deine intensiven Bemühungen.

        Beste Grüße Rico

  50. Hallo Jens,
    heute habe ich Jerome um Hilfe gebeten, weil mein Duty Cycle nach deinem Script nicht mehr unter 90% geht. Er hat dann alle State() abfrage durch Value() ersetzt. Seitdem ist wieder alles super. Vielleicht kannst du das ja oben ändern, falls noch andere Probleme damit haben.

    • Hallo Michael,
      danke für dein Feedback. Das von dir beschriebene Verhalten kann ich hier (CCU2 Firmware 2.29.22, Community) nicht nachvollziehen/repoduzieren. Auch habe ich bisher dazu noch keine weiteren Hinweise erhalten. Ich lasse deinen Kommentar mal so stehen, vielleicht hat jemand ja ähnliches beobachtet.
      Liebe Grüße Jens

  51. Jörg Brune

    Hallo Jens,

    Danke für deine Arbeit hier, macht Spass hier mit zu lesen!

    Habe ein Problem, das Skript läuft nicht. Bein testen kommt folgende Fehlermeldung, kann das leider nicht nachvollziehen… Kannst du mir helfen?
    Die Werte Systemvariablen zählen nicht hoch, zum Start habe ich die „Strom Referenz Zaehlerstand“ mit dem aktuellen Wert meines Stromzählers gefüttert….

    Danke im voraus.

    Gruss Jörg

    Error 1 at row 19 col 1 near ^    if ((oE.State() + 0.001) &lt; aC.State()) {
        zR.State(zR.State() + 8
    Parse following code failed:
    object oP = dom.GetObject(&quot;BidCos-RF.MEQxxx:1.POWER&quot;);
    object oE = dom.GetObject(&quot;BidCos-RF.MEQxxx:1.ENERGY_COUNTER&quot;);
    var aC = dom.GetObject(&quot;Strom ENERGY_COUNTER&quot;);
    var zR = dom.GetObject(&quot;Strom Referenz Zaehlerstand&quot;);
    var zA = dom.GetObject(&quot;Strom Zaehlerstand&quot;);
    var aA = dom.GetObject(&quot;Strom Leistungsaufnahme aktuell&quot;);
    var vLz = dom.GetObject(&quot;Strom Referenz Verbrauch seit letzter Ablesung&quot;);
    var vLg = dom.GetObject(&quot;Strom Verbrauch seit letzter Ablesung&quot;);
    var vTz = dom.GetObject(&quot;Strom Referenz Verbrauch heute&quot;);
    var vTg = dom.GetObject(&quot;Strom Verbrauch heute&quot;);
    var vWz = dom.GetObject(&quot;Strom Referenz Verbrauch laufende Woche&quot;);
    var vWg = dom.GetObject(&quot;Strom Verbrauch laufende Woche&quot;);
    var vMz = dom.GetObject(&quot;Strom Referenz Verbrauch laufender Monat&quot;);
    var vMg = dom.GetObject(&quot;Strom Verbrauch laufender Monat&quot;);
    var vJz = dom.GetObject(&quot;Strom Referenz Verbrauch laufendes Kalenderjahr&quot;);
    var vJg = dom.GetObject(&quot;Strom Verbrauch laufendes Kalenderjahr&quot;);
    var vJk = dom.GetObject(&quot;Strom Kosten laufendes Kalenderjahr&quot;);
    var vPk = dom.GetObject(&quot;Strompreis&quot;);
        if ((oE.State() + 0.001) &lt; aC.State()) {
        zR.State(zR.State() + 838.8607);
        }
    aC.State(oE.State());
    zA.State((zR.State() + (oE.State()/1000)).Round(2));
    aA.State(oP.State());
    vLg.State((zA.State() - vLz.State()).Round(2));
    vTg.State((zA.State() - vTz.State()).Round(2));
    vWg.State((zA.State() - vWz.State()).Round(2));
    vMg.State((zA.State() - vMz.State()).Round(2));
    vJg.State((zA.State() - vJz.State()).Round(2));
    
    • Hallo Jörg,

      danke für dein nettes Feedback. Das sieht so aus, als hättest du beim Kopieren des Skriptes einige unsichtbare Sonderzeichen reinbekommen, die zum Abbruch des Skriptes führen. Ich empfehle, den Editor Notepad++ mit der Kodierung UTF-8, da treten solche Effekte normalerweise nicht auf.

      Du bekommst gleich eine „saubere“ Skript-Datei per Mail.

      Liebe Grüße Jens

      • Jörg Brune

        Hallo Jens,

        jetzt wo du es schreibst, hätte ich auch sehen können 😉

        Jetzt werden Werte angezeigt, vielen Dank!

        Gruß Jörg

  52. Mathias Rother

    Moin, wäre es möglich die Zustandszahl und den Brennwert mit einzurechnen um die kWh zu bekommen. Dann stimmen die Daten mit der Schlussrechnung des Energieversorgers.

    Gruß
    Mathias

    • Hallo Mathias,
      sicher ist das möglich, die Formeln sind ja im Netz verfügbar und gut erläutert. Da ich selbst keinen Gaszähler einsetze, sollte das vielleicht mal jemand angehen, der Bedarf dafür hat.
      Liebe Grüße Jens

  53. Markus Tanke

    Moin Jens,
    Vielen Dank für das Tutorial, leider bin ich nich fähig, dieses zum laufen zu bekommen.
    Das script habe ich direkt von der Seite kopiert, im Script Parser gibt er mir folgendes raus:

    {
    "vTg": "Strom Verbrauch heute",
    "sessionId": "",
    "vMg": "Strom Verbrauch laufender Monat",
    "STDOUT": "",
    "vTz": "Strom Referenz Verbrauch heute",
    "vMz": "Strom Referenz Verbrauch laufender Monat",
    "vJg": "Strom Verbrauch laufendes Kalenderjahr",
    "oP": "BidCos-RF.MEQ0703482:1.IEC_POWER",
    "vLg": "null",
    "vJz": "Strom Referenz Verbrauch laufendes Kalenderjahr",
    "aA": "Strom Leistungsaufnahme aktuell",
    "zA": "Strom Zaehlerstand",
    "vWg": "Strom Verbrauch laufende Woche",
    "oE": "BidCos-RF.MEQ0703482:1.IEC_ENERGY_COUNTER",
    "aC": "Strom ENERGY_COUNTER",
    "zR": "Strom Referenz Zaehlerstand",
    "vLz": "Strom Referenz Verbrauch seit letzter Ablesung",
    "httpUserAgent": "",
    "vWz": "Strom Referenz Verbrauch laufende Woche"
    }

    Var Strom „ENERGY_COUNTER“, „Strom Leistungsaufnahme aktuell“ und „Strom Zaehlerstand“ werden korrekt angezeigt, die anderen werden nicht aktualisiert.
    Ich hoffe du kannst mir helfen.

    Vielen Dank
    Markus

  54. Hallo Markus,

    schön, dass du es – wie du mir per Mail mitgeteilt hast – durch ein „sauberes Skript“ und das erneute Anlegen der Systemvariablen selbst hinbekommen hast,

    Liebe Grüße Jens

  55. Martin Cichon

    Hallo Jens,

    dank deiner Anleitung habe ich es eigentlich auch problemlos hinbekommen (halleluja)
    Was ich nicht verstehe, wo genau muss ich meinen aktuellen Zählerstand eingeben?
    Irgendwo im Script oder wo gebe ich diesen wert an?

    Danke und Gruß Martin

    • Hallo Martin,
      Den aktuellen Zählerstand musst du in die Systemvariable „Strom Referenz Zaehlerstand“ schreiben. Siehe dazu auch die Abschnitte „3. Batteriewechsel“ und „4. Korrektur“,
      Liebe Grüße Jens

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

* Die Checkbox für die Zustimmung zur Speicherung ist nach DSGVO zwingend.

Ich akzeptiere