Blog Obsolet

HomeMatic – Stromzähler auswerten

Letzte Aktualisierung am 1. Juli 2023

Dieser Beitrag ist obsolet, da es zwischenzeitlich einfachere Lösungen gibt. Er wird nicht mehr aktualisiert. Die Kommentare wurden geschlossen.

Für die Auswertung eines Stromzählers gibt es sehr unterschiedliche Möglichkeiten. Am einfachsten ist die Verwendung eines intelligenten Zählers (Smart-Meter). Besitzt man noch eine älteren Ferraris-Zähler, kann man die Umdrehungen der Zählerscheibe abgreifen. Der folgende Artikel erklärt eine Möglichkeit, diese Daten in die HomeMatic-Zentrale (CCU) zu bekommen und dort auszuwerten.


Features:
Aktueller Zählerstand, Stromverbrauch seit letzter Ablesung, Tages-, Wochen-, Monats- und Jahreszähler, aktuelle Leistungsaufnahme, Statusinformationen


Eine etwas einfachere Variante mit Hilfe des HomeMatic Strom-/Gassensors HM-ES-TX-WM ist in einem neueren Tutorial beschrieben.

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

Zum Abgriff der roten Markierung auf der Zählerscheibe gibt es verschiedene kommerzielle Lösungen. Die hier beschriebene Lösung verwendet einen Funk-Sensor für Wechselstromzähler „EM 1000 WZ“ von ELV, da dieser einen +5 V Impulsausgang besitzt, dessen Signale man unmittelbar weiter verarbeiten kann. Sofern man keine wired HomeMatic-Komponeneten verwenden kann, bietet sich z.B. ein „HomeMatic Schließerkontakt-Interface für Öffner und Schließerkontakte“ (HM-SCI-3-FM) oder eine „Funk-Tasterschnittstelle“ (HM-PBI-4-FM) an, um die Impulse in die CCU zu bekommen.

Die dieser Anleitung zu Grunde liegende Zählerscheibe benötigt für 1kWh 96 Umdrehungen (U). Bei einer hohen Last (z.B. wenn ein Saunaofen an ist) kommen die Impulse so schnell hintereinander, dass die Verarbeitung für die CCU zum Problem wird. Ein Frequenzteiler schafft hier Abhilfe. In der hier beschriebenen Lösung wird ein Teiler im Verhältnis 16:1 verwendet, sodass an der CCU pro kWh statt 96 nur noch 6 Impulse ankommen. Im Schnitt muss die CCU das Auswertescript so nur alle 8 bis 14 Minuten einmal ausrechnen. Für andere Zähler sind möglicherweise andere Teiler-Verhältnisse sinnvoller.

Zur Realisierung eines solchen Teilers, gibt es unterschiedliche Methoden. Man kann ihn aus integrierten Logikschaltungen oder fertigen Zähler-ICs aufbauen oder einen Microcontroller (z.B. einen Arduino) entsprechend programmieren. Sehr gut geeignet sind fertig aufgebaute, programmierbare Vorwahlzähler aus der Industrie, z.B. konkret der hier verwendete Omron H7CX-AWD1-N. Solche Zähler kann man mit etwas Glück sehr günstig auf dem Gebrauchtmarkt erstehen. Der Omron H7CX-AWD1-N benötigt eine Betriebsspannung von 12 V und kann daher aus dem gleichen Netzteil versorgt werden, wie der EM 1000 WZ. Außerdem kann man die Eingänge auf „PNP-Voltage“ einstellen, wodurch der Zähler die +5 V Impulse aus dem EM 1000 WZ direkt (ohne vorgeschalteten Optokoppler/Relais) verarbeiten kann. Selbstverständlich eignen sich auch andere Vorwahlzähler.

Aufgebaut sieht das Ganze dann z.B. so aus…

Bild 1
Bild 2

Der Taster ganz links dient dem Reset nach dem Ablesen des Stromzählers (s.u.) und auf der Lochrasterplatine befindet sich ein 3 V Spannungsregler zur Versorgung des HM-SCI-3-FM. Der Zähler wurde so eingestellt, dass er nach dem 16. Impuls das HM-SCI-3-FM („UE Flur Stromzähler Taktung“) für 10 Sekunden einschaltet und sich wieder auf NULL zurücksetzt.

2. Zählerauswertung

Die Auswertung wurde in Anlehnung an einen Beitrag im HomeMatic-Forum realisiert.

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

Zur Auswertung ermittelt das nachfolgende Script den IST-Wert der jeweiligen Systemvariable und rechnet den zwischenzeitlich verbrauchten Wert nach der folgenden Formel hinzu:


"neuer Wert" = "alter Wert" + \frac{"Teiler"}{"Zaehler"}

Hierbei ist „Teiler“ das Teilerverhältnis des Vorwahlzählers (im vorliegenden Beispiel 16) und „Zähler“ die Anzahl der Scheibenrotationen pro kWh (hier 96):


"neuer Wert" = "alter Wert" + \frac{16.0}{96}

und gekürzt…


"neuer Wert" = "alter Wert" + \frac{1.0}{6}

Im Script sieht das wie folgt aus…

var zA = dom.GetObject('Strom Zaehlerstand');
var aA = dom.GetObject('Strom Leistungsaufnahme aktuell');
var vLg = dom.GetObject('Strom Verbrauch seit letzter Ablesung');
var vTg = dom.GetObject('Strom Verbrauch heute');
var vWg = dom.GetObject('Strom Verbrauch laufende Woche');
var vMg = dom.GetObject('Strom Verbrauch laufender Monat');
var vJg = dom.GetObject('Strom Verbrauch laufendes Kalenderjahr');
zA.State(zA.State()+(1.0/6));
vLg.State(vLg.State()+(1.0/6));
vTg.State(vTg.State()+(1.0/6));
vWg.State(vWg.State()+(1.0/6));
vMg.State(vMg.State()+(1.0/6));
vJg.State(vJg.State()+(1.0/6));
var ts1 = zA.Timestamp();
var ts2 = aA.Timestamp();
var tz = aA.State(600000/(ts1.ToInteger()-ts2.ToInteger()));

Neben dem Verbrauch je Zeiteinheit ermittelt das Script auch die aktuelle Leistungsaufnahme im Zeitraum zwischen den Ausgangsimpulsen des Vorwahlzählers auf folgender Grundlage:


1 Impuls = 1 kWh * \frac{"Teiler"}{"Zaehler"} = 1000 * 3600 Ws * \frac{"Teiler"}{"Zaehler"}

bei den Werten hier ergibt sich also…


1 Impuls = 1000 * 3600 Ws * \frac{"Teiler"}{"Zaehler"} = 600000 Ws

Die aktuelle Leistungsaufnahme (P ) in W im Zeitraum zwischen den Ausgangsimpulsen des Vorwahlzählers wird dann wie folgt errechnet…


P = 1000 * 3600 Ws * \frac{600000 Ws}{"Zeitraum \quad zwischen \quad den \quad Impulsen \quad (s)"}

Aufgerufen wird das Script mit folgendem Programm…

Auto SV Stromzähler Auswertung

Da man mit dem HM-SCI-3-FM sowohl Ein- als auch Ausschaltimpulse auswerten kann, bietet es sich am. den um 10 Sekunden verzögerten (s.o.) Ausschaltimpuls des Vorwahlzählers als Korrekturmöglichkeit zu nutzen, falls mal ein Einschaltimpuls verloren geht. Hierzu dient die zusätzliche Systemvariable „Strom Zaehler Trigger“ als Prüfmedium. Die „oder-Verknüpfung“ in der „wenn-Bedingung“ und die letzten beiden Zeilen in der „dann-Bedingung“ können aber auch weggelassen werden, z.B. bei Verwendung eines HM-PBI-4-FM an Stelle des HM-SCI-3-FM oder wenn der genutzte Teiler / Vorwahlzähler den Ausgang nur kurz schalten kann.

Die Anfangswerte für die jeweiligen CCU-Zähler setzt man manuell, am Besten über WebMatic.

Wer möchte, kann ergänzend den Verbrauch der letzten Stunde, der letzten 24 Stunden und der letzten 7 Tage über das „Universal Wrapper Device“ des CuxD auswerten. Hierzu ist wie folgt vorzugehen:

Hinweis: Die Screenshots zeigen hier im Beispiel (Punkte 1 bis 3) eine Heizungsauswertung. Als Namen für das CUxD-Gerät kann man statt dessen z.B. „Stromzaehler_Taktung“ nehmen.

1. In CuxD ein neues Gerät anlegen (Details zum „Wrapper Device“ stehen im CuxD Handbuch)…

cux1

2. Das neue CuxD-Gerät im Posteingang des CCU-WebUI wie folgt konfigurieren und übernehmen…

gerät_cux

Unter dem Parameter „HMSERIAL“ sind die Seriennummer und der Kanal des HM-SCI-3-FM aufzunehmen (z.B. JE12345678:1). In CuxD sollte das Gerät nun korrekt angezeigt werden…

cux2

3. Im Web-UI der CCU stellt der CuxD nun bereits folgende Werte bereit (was diese bedeuten, steht ebenfalls im CuxD-Handbuch)…

anzeige1

4. Folgende Systemvariablen werden zusätzlich benötigt…

„Strom Verbrauch letzte 7 Tage“, Zahl

„Strom Verbrauch letzte 24 Std“, Zahl

„Strom Verbrauch letzte Stunde“, Zahl

Dieses Script schreibt die Daten aus CuxD in die Variablen…
[code]
object oZSCux1 = dom.GetObject(Energiemonitor:1);
object o001ZSwT = oZSCux1.DPByHssDP(SWITCH_1H).Value();
object oZSCux2 = dom.GetObject(Energiemonitor:2);
object o024ZSwT = oZSCux2.DPByHssDP(SWITCH_24H).Value();
object o168ZSwT = oZSCux2.DPByHssDP(SWITCH_168).Value();
var SV001h = dom.GetObject(Strom Verbrauch letzte Stunde);
var SV024h = dom.GetObject(Strom Verbrauch letzte 24 Std);
var SV168h = dom.GetObject(Strom Verbrauch letzte 7 Tage);
real x = SV001h.State(o001ZSwT/6);
x = SV024h.State(o024ZSwT/6);
x = SV168h.State(o168ZSwT/6);
[/code]
…und wird so aufgerufen…

Auto SV Zaehler Auswertung CUxD

Das Ergebnis der Auswertung sieht z.B. so aus…

wm1
wm2
Leistungsaufnahme

Nach einem Reboot der CCU kann man die fehlenden Impulse einfach durch manuelles Ausführen des Auswerteprogramms nachholen (allerdings stimmt für diesen Zeitbereich dann die Leitungsaufnahmeberechnung natürlich nicht).

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 Programms 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 Scripte müssen dann entsprechend angepasst werden.

string zA = dom.GetObject("Strom Zaehlerstand").Value();
string vJg = dom.GetObject("Strom Verbrauch laufendes Kalenderjahr").Value();
var zeitraum;
! 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 am Tag " # sDate # " vor dem Reset: ";
MailText = MailText # "Zaehlerstand: " # zA # "kWh, Strom Verbrauch laufendes Kalenderjahr: " # vJg # "kWh.  ";
string teilstr;
string sendmail = "";
! Mailtext erstellen (Wörter 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 vMg = dom.GetObject("Strom Verbrauch laufender Monat").Value();
var zeitraum;
! 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 am Tag " # sDate # " vor dem Reset: ";
MailText = MailText # "Zaehlerstand: " # zA # "kWh, Verbrauch laufender Monat: " # vMg # "kWh.  ";
string teilstr;
string sendmail = "";
! Mailtext erstellen (Wörter 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 vWg = dom.GetObject("Strom Verbrauch laufende Woche").Value();
var zeitraum;
! 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 am Tag " # sDate # " vor dem Reset: ";
MailText = MailText # "Zaehlerstand: " # zA # "kWh, Verbrauch laufende Woche: " # vWg # "kWh.  ";
string teilstr;
string sendmail = "";
! Mailtext erstellen (Wörter 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 vTg = dom.GetObject("Strom Verbrauch heute").Value();
var zeitraum;
! 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: " # vTg # "kWh.  ";
string teilstr;
string sendmail = "";
! Mailtext erstellen (Wörter 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");

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.

Der Reset des Ablesezählers erfolgt manuell mit dem Taster an der Seite des Gerätes, der über einen freien Kanal des HM-SCI-3-FM das Reset-Programm triggert. Alternativ kann das Reset-Programm natürlich auch über andere Wege gestartet werden…

Auto SV Reset Ablseszähler Pushover CuXD

Analog kann man sich auch hier die Daten vor dem Reset schicken lassen…

string zA = dom.GetObject("Strom Zaehlerstand").Value();
string vLg = dom.GetObject("Strom Verbrauch seit letzter Ablesung").Value();
! 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: " # vLg # "kWh.  ";
string teilstr;
string sendmail = "";
! Mailtext erstellen (Wörter 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");

3. Statusinformation

Über ein mittels Zeitmodul getriggertes Programm können in regelmäßigen Abständen Informationen zum Zählerstand verschickt werden…

string zA = dom.GetObject("Strom Zaehlerstand").Value();
string aA = dom.GetObject("Strom Leistungsaufnahme aktuell").Value();
string vLg = dom.GetObject("Strom Verbrauch seit letzter Ablesung").Value();
string vTg = dom.GetObject("Strom Verbrauch heute").Value();
string vWg = dom.GetObject("Strom Verbrauch laufende Woche").Value();
string vMg = dom.GetObject("Strom Verbrauch laufender Monat").Value();
string vJg = dom.GetObject("Strom Verbrauch laufendes Kalenderjahr").Value();
string MailText;
string sDate = system.Date("%d.%m.%Y, %T");
MailText = "Stromzahlerstatus vom " # sDate # ", ZaeStdAkt: " # zA # "kWh ";
MailText = MailText # "LstAfnAkt: " # aA # "W, VbrAbl: " # vLg # "kWh, VbrT: " # vTg # "kWh, VbrW: " # vWg # "kWh, VbrM: " # vMg # "kWh, VbrJ: " # vJg # "kWh.  ";
string teilstr;
string sendmail = "";
foreach(teilstr, MailText.Split(" "))
{
sendmail = sendmail # "+" # teilstr;
}
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=bike http://api.pushover.net/1/messages.json");

Hier wurden bewusst nur Abkürzungen für die Bezeichnungen der Werte verwendet, damit die Pushnachrichten nicht zu lang werden. Auch das kann natürlich individuell angepasst werden.

HomeMatic-Forum

Zum korrespondierenden Beitrag im…

Bitte beachten…

SMART WOHNEN in Stern’s Haus ist ein rein privates, nicht kommerzielles Projekt. Meine Hinweise, Anleitungen, Schaltungen und Software werden so angeboten, „wie sie sind“, Support kann ich nur im Rahmen meiner begrenzten Freizeit leisten, hierfür bitte ich um Verständnis.
Die Verwendung meiner Hinweise, Anleitungen, Schaltungen und Software erfolgt auf eigenes Risiko. Ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung! Für die Einhaltung der einschlägigen technischen Vorschriften ist jeder Anwender selbst verantwortlich!
Creative Commons Lizenzvertrag
Copyright © Jens-Peter Stern | SMART WOHNEN in Stern’s Haus | sternshaus.de
  1. Kelthizar

    Hi, danke für deine tolle Beschreibung. Genau wie du beschrieben hast, möchte ich auch die Werte für den Verbrauch der letzten Stunde, der letzten 24 Stunden, der letzten 7 Tage und der letzten Monate mit aufnehmen. Ich habe allerdings einen smappee Energiemonitor und mir die Messwerte in meinen iobroker getrieben. Das sieht dann so aus: https://homematic-forum.de/forum/viewtopic.php?f=43&t=25266&p=482092&hilit=Smappee#p482092
    Jetzt habe ich aber keine Ahnung, wie ich diese Werte in die Ccu3 bekomme und umrechne. Kannst du mir da vielleicht helfen?
    Vielen Dank.

    • Hallo Kelthizar,
      ich habe den ioBroker bei mir zwar seit kurzem testweise laufen aber mein diesbezügliches Know-How reicht momentan nicht, dir da einen seriösen Tipp zu geben. Soweit ich weiß, musst du das im ioBroker über Javascript machen, siehe auch hier.
      Liebe Grüße Jens

      • Ich habe das gerade mal nach der verlinkten Mehode mit einem Temperaturwert aus dem YR-Adapter probiert. Funktioniert einwandfrei, wenn man das Skript in „common“ anlegt und den „steuere“-Baustein verwendet…

  2. Kann man den EM1000-WZ nicht auch direkt über einen günstigen Nano-CUL empfangen…?!

    • Hallo Jörg,
      welches Gerät man als Trigger nimmt, ist grundsätzlich egal. Ggf. ist die Berechnung entsprechend anzupassen.
      Ich würde aber heutzutage die ganz oben im Artikel verlinkte Variante mit dem HM-ES-TX-WM vorziehen.
      Liebe Grüße Jens

Kommentare sind geschlossen.

WordPress Cookie Plugin von Real Cookie Banner