HomeMatic Tutorial

HomeMatic – Stromzähler auswerten

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…

    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_168H").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);

…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.

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

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 stimme zu.