Stromzähler und 1-Wire, OWServer, OWDevice

Aus FHEMWiki

Dieser Artikel beschreibt eine Anbindung zweier Leistungsmesser (aka Stromzähler) mit S0 Ausgang über einen 1-wire-S0-Zähler an FHEM.

Das Ziel ist anstatt des monatlichen manuellen Ablesens des Einspeisezählers, eine granulare und automatisierte Aufzeichnung der Leistung einer Photovoltaikanlage zu erhalten.

Fhemwiki-grafik-s0counter-und-onewire.gif

Zwischen die beiden Wechselrichter und dem Einspeisezähler sind je ein digitaler Stromzähler mit S0-Ausgang geschaltet. Einer dieser Stromzähler liefert 2000 Impulse pro kWh, der andere 1000 Impulse pro kWh.

Diese beiden Stromzähler sind mit einem auf dem 1-Wire Baustein DS2423 basierenden Dual S0 Counter verbunden, der hier über einen USB-Busmaster als serielles Interface mit einer Instanz eines OWServers verbunden ist.

In FHEM ist dieser OWServer wie folgt definiert:

define myOWServer OWServer 192.168.1.12:4304

Es wird hier ein OWServer definiert, der über die IP-Adresse 192.168.1.12 erreichbar ist und dort auf dem Port 4304 auf Anfragen lauscht.

Ist in FHEM das "autocreate" Flag gesetzt, dann findet FHEM den S0-Counter und erzeugt beispielsweise die folgenden Einträge:

define DS2423_58E50F000000 OWDevice 1D.58E50F000000 60
attr DS2423_58E50F000000 model DS2423
attr DS2423_58E50F000000 room OWDevice 

Unter "DS2423_58E50F000000" kann man sich nicht direkt etwas vorstellen und anstatt alle 60 Sekunden ein Update zu holen, sollten auch 5 Minuten (=300 Sekunden) reichen. Daher wird das abgeändert zu:

define PVZaehler OWDevice 1D.58E50F000000 300
attr PVZaehler model DS2423
attr PVZaehler room OWDevice 

Dann definiert man noch ein Logfile dazu:

define FileLog_PVZaehler FileLog ./log/PVZaehler-%Y.log PVZaehler:.*
attr FileLog_PVZaehler logtype text

und findet dort Einträge der Form

...
2014-01-20_16:09:55 PVZaehler counters.A: 282478
2014-01-20_16:09:55 PVZaehler counters.B: 139840
2014-01-20_16:14:58 PVZaehler counters.A: 282478
2014-01-20_16:14:58 PVZaehler counters.B: 139841
...

Wie man sieht, erscheinen für jeden der beiden Counter in diesem 1-Wire Device eine eigene Zeile mit dem aktuellen Wert des Zählers. Da der erste S0-Zähler 2000 Impulse pro kWh liefert, ist der Wert für "counters.A" auch etwa das Doppelte von "counters.B", dessen zugehöriger S0-Zähler ja nur 1000 Impulse pro kWh liefert.

Eigentlich wäre es wünschenswert, nur eine Zeile mit beiden Werten zu loggen, diese mit der passenden Einheit Watt-Stunden (Wh) zu bezeichnen und auch noch die Summe der beiden Werte aufzuzeichnen.

Die "state" Zeile im Reading des Devices

Owdevice-pvzaehler-reading.png

beinhaltet die Werte beider Counter, aber das "state" Reading verursacht laut CommandRef keinen Event, den man in einer FileLog Definition einfach verwenden könnte.


Es muss also etwas mehr getan werden. Die Idee ist, ein Dummy-Device zu definieren und dazu ein passendes Notify, das auf die "PVZaehler" Events reagiert und den Wert an dieses Dummy-Device weitergibt, in dessen Filelog die Daten dann aufgezeichnet werden.

Im Einzelnen:

define PVErtrag dummy 

definiert das Dummy-Device, das die Erträge der Anlage erhalten soll.

Mit

1:  define notify_PVErtrag notify PVZaehler:counters\.A.*  { \
2:      my $a = ReadingsVal("PVZaehler","counters.A",0)/2 ;; \
3:      my $b = ReadingsVal("PVZaehler","counters.B",0) ;; \
4:      my $c = $a+$b ;; \
5:      my $text = "WR1: $a Wh, WR2: $b Wh, Gesamt: $c Wh" ;; \
6:      fhem ("set PVErtrag $text") ;; \
7:     } 

werden die Daten erzeugt und an das PVErtrag Device geschickt.

In Zeile 1 wird das Notify definiert: "PVZaehler" ist das Device, auf dessen Events reagiert werden soll und "counters\.A.*" der reguläre Ausdruck, auf den das Notify reagieren soll. Der Punkt in "counters.A" ist mit einem Backslash maskiert, da er sonst als Metazeichen für den regulären Ausdruck interpretiert werden würde. Das ".*" bezeichnet x-beliebigen Text.

Wenn nun also das PVZaehler-Device einen Event verursacht, der die Zeichenkette "counters.A" enthält, dann wird der in geschweiften Klammern stehende Perl-Code ausgeführt. Dabei dienen die Backslashes jeweils am Zeilenende als Hinweis für FHEM, dass der Perl-Code noch nicht zu Ende ist, sondern in der nächsten Zeile fortgeführt wird. Ebenso sind entsprechend der CommandRef die Semikolons in der fhem.cfg verdoppelt. Zeile 2 definiert eine Variable $a und weist ihr den Wert des "counters.A" geteilt durch 2 zu; in Zeile 3 erhält die Variable $b den Wert des "counters.B". In Zeile 4 werden die beiden Werte addiert und in Zeile 5 schliesslich zu einem Ausgabetext zusammengesetzt. Zeile 6 sendet dann diesen Ausgabetext an das PVErtrag Device.

Schliesslich wird mit

define FileLog_PVErtrag FileLog ./log/FileLog_PVErtrag-%Y-%m.log PVErtrag
attr FileLog_PVErtrag logtype text 

das Filelog erzeugt, in dem die Daten abgelegt werden. Hier ein Auszug aus diesem FileLog:

...
2014-01-21_13:15:22 PVErtrag WR1: 141666 Wh, WR2: 140271 Wh, Gesamt: 281937 Wh
2014-01-21_13:20:22 PVErtrag WR1: 141677 Wh, WR2: 140282 Wh, Gesamt: 281959 Wh
2014-01-21_13:25:22 PVErtrag WR1: 141687.5 Wh, WR2: 140293 Wh, Gesamt: 281980.5 Wh
2014-01-21_13:30:22 PVErtrag WR1: 141697 Wh, WR2: 140302 Wh, Gesamt: 281999 Wh
2014-01-21_13:35:22 PVErtrag WR1: 141705.5 Wh, WR2: 140311 Wh, Gesamt: 282016.5 Wh
...