Verbrauchs-Messwerte über die S0-Schnittstelle auslesen

Ein wichtiger Punkt in Sachen Hausautomatisierung ist die Messung von Verbrauchswerten. Die Verbrauchsmessung einfacher Verbraucher geht zum Beispiel sehr einfach mit einer PCA301-Messsteckdose von ELV. Oft möchte man jedoch viel vorher mit der Messung beginnen. Eine Möglichkeit ist dabei der Einsatz von Messgeräten, welche direkt den Haupt-Wechselstromzähler abfragen. Hat man jedoch noch einen älteren Zähler (mechanische Ferraris-Wechselstromzähler) verbaut, kann die Abfrage sich etwas schwierig erweisen. Oft ist dann eine optische Messmethode erforderlich, welche die drehende Metallscheibe entsprechend beobachtet.

Bei neueren Wechselstromzählern gibt es jedoch eine sogenannte S0-Schnittstelle. Dies erleichtert das Auslesen enorm. Hat man jedoch noch einen alten Zähler, kann man auf einfache Wechselstromzähler für die Hutschiene ausweichen. Diese sind für ca. 20-40€ zu bekommen und lassen sich zum Beispiel im Sicherungskasten unterbringen.

Letzte Aktualisierung am 15.10.2018 / Affiliate Links / Bilder von der Amazon Product Advertising API

Ein weiterer Vorteil ist, dass diese Zähler erst nach dem Haupt-Zähler eingebaut werden und somit keine Abnahme des Energieversorgers nötig ist. Ein Einbau eines neuen und modernen Haupt-Wechselstromzähler kann nämlich nur vom Energieversorger vorgenommen werden und ist dementsprechend auch etwas teurer, wenn der Einbau privat bezahlt werden muss. 

In diesem Beitrag möchte ich euch zeigen, wie ihr diese S0-Schnittstelle mit Hilfe eines ESP8266-Baustein und ESP Easy auslesen könnt und die Messwerte in FHEM einbindet. 

Die S0-Schnittstelle

Die S0-Schnittstelle ist im Grunde ein einfacher Schalter, welcher pulsartig geschlossen und geöffnet wird. Die so entstandenen Impulse lassen sich messen. Der Hersteller gibt dann die Impulswertigkeit an. Zum Beispiel 1000 Impulse / 1 kWh. Liegt also eine Last von 1 kW an, so werden innerhalb einer Stunde (3600 Sekunden) 1000 Impulse ausgegeben. Je nach Verbrauch ändert sich also die Frequenz der Impulse. Dies erlaubt ein Berechnen der aktuellen Leistung. 

Misst man zum Beispiel innerhalb von 10 Minuten (600 Sekunden) 50 Impulse. So erhält man eine Leistung von 300 Watt. 

Ich habe mach versucht die Berechnung etwas anschaulich darzustellen. Mit einem zusammengesetztem Dreisatz lässt sich dies relativ simpel berechnen. 

Die meisten Zähler führen diese Schnittstelle über zwei Kontakte nach Außen. Vereinzelt kann es vorkommen, dass die S0-Schnittstelle nur optisch über LED ausgegeben werden kann. Dieser Blogbeitrag wird das Auslesen über die Kontakte behandeln. 

Bevor ihr nun also weiter liest, solltet ihr euch zunächst mit eurem Zähler vertraut machen und herausfinden, an welchen Kontakten sich die S0-Schnittstelle befindet. Beim Zähler DRS115B von BG-etech (Affiliate-Link) sind es die Kontakte 21 und 20. 

ESP Easy mit Impuls Counter

Wie oben bereits erwähnt, verwende ich ESP Easy als Software für den ESP-Baustein. Als ESP-Baustein kommt ein WeMos D1 Mini Pro zum Einsatz. 

Letzte Aktualisierung am 15.10.2018 / Affiliate Links / Bilder von der Amazon Product Advertising API

Nachdem ihr euer ESP-Baustein mit der neusten Version von ESP Easy geflasht habt, könnt ihr mit der Konfiguration beginnen. Andernfalls liest ihr am besten auf meinem Blogbeitrag nach, wie ihr die neuste ESP Easy Version auf euer ESP-Baustein programmiert und konfiguriert. 

Für die folgenden Punkte, muss der ESP-Baustein bereits mit der neusten ESP Easy-Software geflasht und die Verbindung zu FHEM hergestellt sein. Wie dies geht, erfahrt ihr ebenfalls auf meinem Blogbeitrag.

ESP Easy bietet bereits ein entsprechendes Modul um die Impulse der S0-Schnittstelle auszulesen. Den sogenannten "Generic - Puls counter". Dieses Devices lässt über die ESP-Easy-Weboberfläche unter "Devices" einrichten.

Ich habe zu Beginn und zum Testen zunächst mit einem einfachen Button gearbeitet. Verwendet habe ich das Button-Shield von WeMos.

Letzte Aktualisierung am 15.10.2018 / Affiliate Links / Bilder von der Amazon Product Advertising API

Der Button ist am GPIO-0 (D3) angeschlossen. Den Puls Counter habe ich deswegen wie folgt definiert:

Den Delay könnt ihr beliebig festlegen. Es beschreibt die Zeit, nach der ESP Easy Daten an FHEM sendet. In diesem Fall also alle 60 Sekunden. Des Weiteren habe ich den Button als Device eingerichtet.

Nachdem beide Devices eingerichtet wurde, kann man durch Betätigen des Buttons testen, ob der Puls Counter funktioniert. 

In diesem Fall wurde der Button 15mal betätigt. Das Reading "Count" zeigt dieses an. Wartet man nun ein bisschen, geht das Reading "Count" wieder auf 0. Das Reading "Total" bleibt jedoch auf 15 und zeigt somit den gesamten Zählerstand an, wobei "Count" nur den aktuellen Stand anzeigt, bzw. die aktuelle Messung. Das Reading "Time" zeigt den Abstand der Impulse an. Somit ist später in FHEM möglich, den aktuellen Verbrauch in Watt zu berechnen. Dazu später mehr.

Die Konfiguration von ESP Easy ist nun abgeschlossen und es kann mit der Definition in FHEM begonnen werden.

Konfiguration innerhalb von FHEM

Das Anlegen der Devices geschieht in FHEM automatisch. Im Raum "ESPEasy" sollten sich nun zwei Devices befinden. Zum Einen der Button und zum Anderen der Puls Counter.

Für den Stromzähler ist nur das zweite Device von Bedeutung. Dieses kann nun umbenannt werden und in den gewünschten Raum verschoben werden.

rename ESPEasy_ESP_Easy_PulsCounter Stromzaehler; 
attr Stromzaehler room Zähler;

Als Reading erhält man nun die drei Readigns "Count", "Timer" und "Total". Das Reading "Count" erhält die Zahl an gemessenen Impulsen seit der letzen Übertragung vom ESP-Modul. "Time" gibt dabei die Zeit zwischen den letzten beiden Impulsen in ms an. Das Reading "Total" erhält die Anzahl an Impulsen seit dem letzten Neustart des ESP-Boards.

Die Verbindung zwischen dem ESP Easy-Board, dem S0-Wechselstromzähler und FHEM klappt nun also. Für die weitere Einrichtung in FHEM, kann man nun den Button vom ESP-Board entfernen und den S0-Wechselstromzähler anschließen.

Dazu einfach den "S-"-Anschluss vom Wechselstromzähler an GND des ESP-Boards anschließen. Der "S+"-Anschluss wird an einen freien GPIO-PIN angeschlossen. Um keine weiteren Konfigurationen auf der ESP-Easy-Weboberfläche vornehmen zu müssen, emfehle ich euch den GPIO0 (D3) zu verwenden. Des Weiteren kann optinal ein 10kOhm-Pull-Up-Widerstand an den GPIO0 (D3) zu Vcc (3,3V) vom ESP-Board angeschlossen werden, falls es zu Problemen beim Lesen der Impulse kommt.

Um nun die Readings entsprechend zu Verarbeiten werden noch vier userReadings hinzugefügt. 

attr Stromzaehler userReadings PulsZeit:Time.* {ReadingsVal("$name", "Time", 0)/1000 },StromverbauchAktuell:Time.* { my $zeit = ReadingsVal("$name", "Time", 0); if($zeit > 0){sprintf("%.2f",3600/ReadingsVal("$name", "PulsZeit", 0));} else {sprintf("0");}},TagesVerbrauch:Time.* { ReadingsVal("$name", "Total", 0)/1000 },ZaehlerStand:Time.* monotonic { ReadingsVal("$name", "Total", 0)/1000}

Das Reading "PulsZeit" enthält den Abstand der Impulse in Sekunden. Das Reading "StromverbrauchAktuell" gibt den aktuellen Stromverbrauch an, welcher mit dem Pulsabstand berechnet wurde. Das Reading "TagesVerbrauch" enthält den Tagesverbrauch in "kWh". Das Reading "ZaehlerStand" gibt den gesamten Zählerstand an. 

Readings im Detail

Das Reading "Time" (Zeit) wird vom ESP Easy Modul erzeugt und enthält den Impulsabstand in ms. Teilt man dieses Reading durch 1000 erhält man den Abstand in Sekunden. Dieser wird im Reading "PulsZeit" gespeichert.

... PulsZeit:Time.* {ReadingsVal("$name", "Time", 0)/1000 } ...

Um nun die Rechnung des aktuellen Stromverbrauches zu verstehen, schauen wir uns nochmal die Tabelle an. Teilt man nun nämlich 3600 (Sekunden) durch die PulsZeit erhält man den aktuellen Stromverbrauch in W (StromverbrauchAktuell). Die if-Abfrage dient dazu, dass keine Fehlermeldung bezüglich Division durch Null erscheint.

... StromverbauchAktuell:Time.* { my $zeit = ReadingsVal("$name", "Time", 0); 
if($zeit > 0){sprintf("%.2f",3600/ReadingsVal("$name", "PulsZeit", 0));}
else {sprintf("0");}} ...

Da das Reading "PulsZeit" die Zeit zwischen zwei Impulsen beinhaltet, ist es sozusagen eine Multiplikation mit 1 und kann deswegen in der Berechnung weggelassen werden.

3600 / (Zeit in der die Impulse gemessen wurden) * Anzahl der Impulse

3600 / PulsZeit * 1 Impuls = 3600 / PulsZeit

Der Tagesverbrauch (TagesVerbrauch) erhält man indem man das automatisch erstellte Reading "Total" durch 1000 teilt. Also die total gezählten Impulse durch die Wertigkeit (1000 Impulse / 1 kWh).

... TagesVerbrauch:Time.* { ReadingsVal("$name", "Total", 0)/1000 } ...

Den Zählerstand (ZaehlerStand) erhält man durch das Reading "Total". Dieses Reading beinhaltet die aktuelle Gesamtanzahl an Impulsen. Geteilt durch die Impulswertigkeit erhält man den Verbrauch. Diese werden jedoch um 0 Uhr zurück gesetzt (siehe weiter unten). Durch das Monotonic wird der Verbrauch jedoch aufaddiert und man erhält den Gesamtzählerstand.

... ZaehlerStand:Time.* monotonic { ReadingsVal("$name", "Total", 0)/1000) ...

In der Tabelle wird 3600 durch die Zeit in der die Impulse gemessen wurde (600 Sekunden) geteilt und danach noch mit der Anzahl der Impulse (50 Impulse) multipliziert. 

INFO: Je nach angelegter Last, kann es etwas dauern, bis die Leistung korrekt angezeigt wird. Der Grund ist der, dass das ESP-Board mindestens zwei Impulse gemessen haben muss, damit die Zeit zwischen diesen Impulsen gemessen werden kann.

Damit nun auch das Reading "TagesVerbrauch" richtig berechnet wird, ist noch eine weitere Anpassung notwendig. Aktuell beinhalten die Readings "TagesVerbrauch" und "ZahlerStand" den gleichen Wert, welcher vom Reading "Total" berechnet wird. 

Um 00:00 Uhr muss also das Reading "Total" zurückgesetzt werden. Das Reading "Total" wird automatisch bei einem Neustart vom ESP-Board auf Null gesetzt. 

Für den Reset wird ein einfaches at-Device eingerichtet.

define atStromzaehler at *00:00:00 set Stromzaehler reboot

Durch den Reset vom Reading "Total", wird nun der TagesVerbrauch jeweils um Mitternacht auf Null gesetzt. Dadurch, dass bei der userReading-Definition dem Reading "ZaehlerStand" der Zusatz "monotonic" hinzugefügt wurde, wird der "ZaehlerStand" nun automatisch immer aufaddiert. 

Um einen eventuellen Vorwert, welcher bereits vom Zähler, vor der Einrichtung in FHEM gemessen, wurde in FHEM zu übernehmen. Könnt ihr ein einfachen setreading-Befehl absetzen.

setreading Stromzaehler Total 390

Dadurch, dass "Total" nun kurzzeitig (bis zum nächsten Datenempfang) auf 390 gesetzt wird, werden zum Reading "ZaehlerTotal" 0.39 kWh hinzuaddiert. 

Nachdem man die userReadings definiert hat, erhält man alle wichtigen Readings vom Stromzähler. Den aktuellen Stromverbrauch in Watt (StromverbrauchAktuell), den Tagesverbrauch in kWh (TagesVerbrauch) und den aktuellen Gesamtzählerstand in kWh (ZaehlerStand). 

Ich hoffe ich konnte euch verständlich erklären, wie ihr euer S0-Stromzähler wireless in FHEM einbinden könnt.

Anpassung bei anderer Impulswertigkeit

Es gibt natürlich auch Messgeräte mit einer anderen Impulswertigkeit. Dies erfordert eine Anpassung der userReadings. Für eine Impulswertigkeit von 2000 Impulsen / kWh lautet die Definition zum Beispiel wie folgt. Die fett-gedruckten Parameter wurden angepasst.

attr Stromzaehler userReadings PulsZeit:Time.* {ReadingsVal("$name", "Time", 0)/1000 },StromverbauchAktuell:Time.* { my $zeit = ReadingsVal("$name", "Time", 0); if($zeit > 0){sprintf("%.2f",3600/ReadingsVal("$name", "PulsZeit", 0));} else {sprintf("0");}},TagesVerbrauch:Time.* { ReadingsVal("$name", "Total", 0)/2000 },ZaehlerStand:Time.* monotonic { ReadingsVal("$name", "Total", 0)/2000}

Die oberen Tausend müssen nicht angepasst werden, da sie für die Konvertierung von ms in s verantwortlich sind. 

Stromzähler-Device in meiner FHEM Live-Demo

Um einen besseren Einblick in das Stromzähler-Device zu bekommen, empfehle ich euch einen Besuch auf meiner FHEM Live-Demo. Im Raum "Stromzähler" befindet das hier definierte ESP-Easy-Device.

16
Hinterlasse einen Kommentar

avatar
Fotos und Bilder
 
 
 
sonstiges Dateiformat
 
 
 
10 Comment threads
6 Thread replies
1 Followers
 
Most reacted comment
Hottest comment thread
9 Comment authors
NorbertManfredStefanMarcAndré Kaschuba Recent comment authors
  Subscribe  
neuste älteste beste Bewertung
Benachrichtige mich zu:
Andreas
Gast
Andreas

Hallo,
schöne Anleitung, habe das mal nachgebaut, hänge aber jetzt an einem Punkt.
Mein Zähler macht 2000 Impulse/KHh, was muss ich wo im userReading ändern?
Einfach stumpf alles was 1000 ist in 2000 ändern macht ja keinen Sinn.

Dann noch zum GPIO-0 (D3), hat der nicht schon einen 10kOhm Widerstand?
Sieht für mich so aus –> https://wiki.wemos.cc/products:d1:d1_mini –> Abteilung PIN

Gruß
Andreas

gadget
Gast
gadget

Wenn man das Rad nicht neu erfinden will kann man auch einfach das ElectricityCalculator Modul von fhem verwenden. Dann reicht es, wenn man as ESPEasy Device die Pulse zählen lässt und mit einem monotonic reading summiert und in den Zählerstand umrechnet.

Matze
Gast
Matze

hallo,
du gehst mit dem 10k pullup von 5v auf den pin D3.?
dann liegen doch auch 5V am board das nur bis 3.3 V ausgelegt ist?

„All of the IO pins run at 3.3V.“

muss man nicht den 3.3V pin nehmen. oder irre ich mich da?
sorry bin kein elektroniker.

Matze
Gast
Matze

Hi, welche Art von Kabel benutz du?
Habe dünne einzelader 0,14 direkt aus dem sicherungskasten herausgeführt ca 25 cm , kein Problem.
Ein zweiter esp macht Probleme bei Kabellänge um 1 m . Er zählt Impulse wo keine Waren!
Habe dann ein abgeschirmtes Audiokabel mit Masse Ummantelung genommen und einen 100nf parallel zum wiederstand. Das ging einigermaßen.
Idee?

Matze
Gast
Matze

Danke, hab gerade den Fehler gefunden . Ich verwende mehrere xtm18sa Zähler und einen von b+g tech.
Bei den xtm18sa sind die Pins 20+ und 21– seitenverkehrt, autsch.

Jetzt zählt er endlich richtig.

Thx

André Kaschuba
Gast
André Kaschuba

Hallo Daniel
Es funktioniert soweit alles dir nur das ich den aktuellen Verbrauch nicht angezeigt bekomme, es wird immer 0.00w angezeigt obwohl es in meinen Reading richtig angezeigt wird.hat jemand eine Idee

Marc
Gast
Marc

Hallo Zusammen,
vielen Dank für die tolle Anleitung! Sowas habe ich gesucht!!! Ich bin der Meinung ich habe mich an selbige auch gehalten 😉 Und trotzdem klappt bei mir was nicht..
Ich habe den Zähler mit dem Wemos an einer Steckdose. Zum Testen habe ich einen Fön angeschlossen und recht kurz (5Sec) laufen lassen.
Die Daten wurden übermittelt und es wurde ein StromverbauchAktuell angezeigt. Jetzt allerdings – rund zwei Stunden später – wird immer noch ein StromverbauchAktuell angezeigt, der zwar niedriger ist und m.M nach im Zeitverlauf abnimmt, aber irgendwas passt da nicht…
Tipps was ich prüfen könnte sind willkommen 😉

Stefan
Gast
Stefan

Halli Hallo,

erstmal TausenDank für diese super Seite, bin nun seit ein paar Wochen am FHEM „bauen“.
Habe den Stromzähler auch realisiert.
Allerdings hängt der Stromzähler bei mir an einer elektrischen Fußbodenheizung, diese ist entweder an oder aus.
Und wenn Sie aus ist, ist dementsprechend auch der Zähler aus.
Damit bekommt der ESP keinen Impuls mehr und der „Count“ geht auf 0. Allerdings wird „Time“ noch immer übertragen. Daher bleibt der „StromverbrauchAktuell“ immer auf dem letzten Wert stehen.
Ich habe das ganze umgangen mit einem zusätzlichen UserReading:
StromverbrauchAktuell:Count.* {ReadingsVal(„$name“,“Count“,0)*60}
Ist zwar nicht so genau wie deine Rechnung, funktioniert aber. 😉

Viele Grüße
Stefan

Manfred
Gast
Manfred

Kann ich das auch für einen Wasserzähler gebrauchen. Der hat einen Impulsausgang 1 Impuls = 1 Liter
Was müßte ich da machen.
LG Büdi

Norbert
Gast
Norbert

Hallo,
ich habe einen viel zu hohen aktuellen Verbrauch. StromverbauchAktuell 257142.86
Was muss ich korregieren?
Danke
Gruß
Norbert

Verbrauch.jpg
Norbert
Gast
Norbert

Es lag an der Impulszeit des Drehstromzählers. der DSZ-80 hat 90 ms. Eingestellt hatte ich im esp8266 10 ms. jetzt klapp es.