MQTT Stromzähler / Verbrauchsmessung eines Ferraris-Stromzählers

Beschreibung

Ein Ferraris-Zähler erfasst die verbrauchte Energie bei mehrpahsiger Wechselspannung über eine kreisförmige Aluminiumscheibe (Drehscheibe) und zeigt den Verbrauch in Verbindung mit einem mechanischen Zählwerk an.
Der MQTT-Stromzähler erfasst per Infrarot-Messeinheit die umlaufende Aluminiumscheibe und erkennt anhand der roten Markierung die Anzahl der durchgeführten Umläufe.
Mittels der Zählerkonstante des Stromzählers, wird die aktuelle Leistung und der Zählerstand berechnet und im TASMOTA Webinterface angezeigt. Diese Werte können dann per MQTT Protokoll in der Hausautomation weiterverwendet werden.


WLAN

Die Einbindung in das lokale Netzwerk wird folgendermaßen durchgeführt.
Nach dem Einstecken der Stromversorgung meldet sich das Gerät mit der SSID Stromzahler-XXXXXX-XXXX, wobei XXXXXX-XXXX für eine alphanumerische Zahlenfolge steht.
Nach dem Verbinden wird man automatisch auf eine Webseite mit der IP: 192.168.4.1 weitergeleitet. Dort bitte das lokale WLAN wählen und das Passwort eingeben (am besten mit dem Haken sichtbar machen beim Eingeben).



Kurz nach dem Speichern meldet sich das Webinterface mit der über DHCP erworbenen IP-Adresse.
Ist dies nicht der Fall, bitte im lokalen Router nach dem Gerät suchen und die IP-Adresse ausfindig machen.

Der MQTT-Stromzähler ist nun über diese Adresse mittels Browser errereichbar.


Messeinheit

Zur Kontrolle der Zählungen wird die linke, grüne LED verwendet. Diese erlischt bei erkannter, roter Markierung auf der Drehscheibe, ansonsten leuchtet sie dauerhaft.
Über das Potentiometer wird der Sensor justiert .




Montage

Ganz entscheidend ist der Abstand zwischen dem Sensor und der Gehäuseglasscheibe des Stromzählers.
Je näher der Sensor an der Glasscheibe sitzt, desto genauer sind die Zählungen und desto geringer sind die Falschmeldungen.
Dementsprechend ist ein relativ dünnes, doppelseitiges Klebeband zu verwenden.



Mithilfe der Gehäuseausrichtung (Rechtecke links/rechts), wird die Messeinheit auf die Glasscheibe des Stromzählers geklebt.
Mit einem kleinen Schraubendreher wird den IR-Sensor so fein eingestellt, dass die linke, grüne LED bei laufender Drehscheibe gerade noch leuchtet.
Es muss so fein eingestellt sein, dass bei geringster Berührung die LED nicht mehr leuchtet. BITTE nicht verzweifeln. Es ist sehr, sehr ticky die richtige Position zu finden.
Danach ist zu kontrollieren, ob die LED erlischt, wenn die rote Markierung auf der Aluminium-Drehscheibe den Sensor erreicht. Beim verlassen des Sensors muss die LED wieder leuchten.
Der MQTT-Stromzähler zählt dann zwei Einheiten im TASMOTA Webinterface (Zähler1) hoch. Einmal beim Erreichen des Sensors und einmal beim Verlassen.
Nun muss man noch die Zählerkonstante notieren (hier 75 U/kWh) und weiter geht es mit der Konfiguration…


Quelle: https://www.kompf.de/tech/emeir.html


Video zur Einstellung des Poti



Konfiguration

Bitte TASMOTA nicht mit einer Standard Firmware updaten!
Die installierte Firmware enthält das Scripting Modul, welches in Standard Versionen nicht enthalten ist. Siehe am Ende dieser Wiki Seite, wie man ein Update oder eine Neuinstallation durchführt.

Gerät konfigurieren


MQTT-Einstellungen

Unter Host ist die IP-Adresse der Hausautomation einzutragen. ggf. auch user/password falls erforderlich.

Sonstige Konfiguration





Zählerstand einstellen

Der auf dem Stromzähler bereits erfasste Zählerstand wird folgendermaßen in TASMOTA per Konsole übertragen:
Kommando: Sensor53 c1 (ZS x ZK x 2)
Zunächst muss aber auch verstanden werden, wie der Sensor arbeitet. Beim Erfassen der roten Markierung wird die Anzeige Zähler1 um 1 erhöht. Ebenso wenn die rote Markierung den Sensor verlässt.
Somit werden für die Berechnung nicht 75 sondern 150 Zählungen pro kWh herangezogen (Bei Zählerkonstante 75 U/kWh). Also (ZS x ZK x 2)

ZS = Zählerstand (kWh)
ZK = Zählerkonstante (U/kWh)

Beispiel: 44717,3 kWH * 75 * 2

Sensor53 c1 6707595


Eine weitere Möglichkeit um den Stromzählerstand anzupassen, ist die Angabe einer Differenz anhand der Variable strominit im Script.
Diese kann man also mit dem aktuellen Zählerstand versehen und sie wird den neuen Zählungen hinzugefügt.
Beispiel:

strominit=45041.35



Weiterhin sind folgende Werte einzustellen.
Beim CounterDeBounce muss man ggf. etwas experimentieren. Dieser ist so einzustellen, dass pro Umlauf 2 Einheiten gezählt werden.
Werden 1 oder 3 Einheiten gezählt, muss man weiter optimieren. Bei 1 muss der Wert runter gesetzt werden und bei 3 entsprechend hoch, solange bis letztendlich nur 2 Einheiten gezählt werden.

TelePeriod 60
CounterDebounce 600
SaveData 60



Konsolen Script

In folgendem Script (Konsolen > Script konfigurieren) sind drei Variablenwerte zu ersetzen.
Der Strompreis, die Zählerkonstante, welche am Stromzähler aufgedruckt und mit der Einheit (U/kWh) angegegben ist und die Mindestumlaufzeit der Aluminium-Drehscheibe.

  1. sp (Strompreis in Cent)
  2. zk (Zählerkonstante)
  3. mu (Mindest Umlaufzeit der Scheibe)


Für den Wert mu am Besten einen oder mehrere hohe Verbraucher (Wasserkocher, Fön, etc.) einschalten und mit der Stoppuhr messen, wieviele Sekunden die Aluminium-Drehscheibe benötigt um eine Umdrehung zu erreichen.
Dieser Wert oder ggf. etwas weniger, ist für mu anzusetzen. :!: Nochmal kontrollieren, ob CounterDebounce noch passt.
Der Default Wert ist mu=10 also 10 Sekunden für einen Umlauf. Das sind bereits 4800W Leistung. Alles was größer gemessen wird, bleibt unberücksichtigt und reduziert die Fehlmeldungen.

>D
p:s1=0
p:g1=0
p:g2=0
p:m1=0
p:m2=0
p:m3=0
p:gesamt=0
p:power=0
p:c1old=0
p:c1=0
sp=27.59
zk=75
mu=10
c1ts=0
c1oldts=0
s1=0
h1=0
e1=0
e2=0
e3=0
sph1=0
spg1=0
spg2=0
spgs=0
spm1=0
spm2=0
spm3=0
hr=0
dy=0
sec=0
total=0
power=0
strominit=0

>B
=>sensor53 l255

>S
h1=c1-s1
e1=h1/(2*zk)
e2=g1/(2*zk)
e3=g2/(2*zk)
sph1=e1*sp/100
spg1=e2*sp/100
spg2=e3*sp/100
spgs=gesamt*sp/100
spm1=m1*sp/100
spm2=m2*sp/100
spm3=m3*sp/100

' Aktuelle Leistung
c1ts=upsecs
if c1>c1old 
   and c1ts>(c1oldts+mu)
   then
    sec=c1ts-c1oldts
    power=3600000/(sec*zk)
    c1oldts=c1ts
    c1old=c1
else 
    c1old=c1
endif


' Historische Werte
hr=hours
dy=day
if chg[hr]>0
 and hr==0
  then
   s1=c1
   g2=g1
   g1=h1
   m1=m1+e1
   gesamt=gesamt+e1
   if chg[dy]<2
    and dy==1
     then
      m3=m2
      m2=m1
      m1=0
   endif
   svars
endif

' MQTT
if upsecs%tper==0{
=>Publish tasmota/%topic%/main/zk %zk%
=>Publish tasmota/%topic%/main/electric_price %sp%
=>Publish tele/%topic%/main/today_kwh %3e1%
=>Publish tele/%topic%/main/today_money %2sph1%
=>Publish tele/%topic%/main/yd_kwh %3e2%
=>Publish tele/%topic%/main/yd_money %2spg1%
=>Publish tele/%topic%/main/dbyd_kwh %3e3%
=>Publish tele/%topic%/main/dbyd_money %2spg2%
=>Publish tele/%topic%/main/actpower %0power%
=>Publish tele/%topic%/main/energytotal %total%
=>Publish tele/%topic%/json {"energytotal": "%total%", "today_kwh": "%3e1%", "today_money": "%2sph1%", "yd_kwh": "%3e2%", "yd_money": "%2spg1%", "dbyd_kwh": "%3e3%", "dbyd_money": "%2spg2%", "zk": "%zk%", "electric_price": "%sp%", "actpower": "%0power%"}
}

>T
c1=Counter#C1
total=c1/(2*zk)+strominit

>W
Zählerstand: {m} %total% kWh
aktuelle Leistung: {m} %0power% W
============
Strompreis: {m} %sp% Cent/kWh
============
Verbrauch:
---------------------
Heute: {m} %3e1% kWh
Kosten: {m} %2sph1% €
---------------------
Gestern: {m} %3e2% kWh
Kosten: {m} %2spg1% €
---------------------
Vorgestern: {m} %3e3% kWh
Kosten: {m} %2spg2% €
---------------------
Aktueller Monat: {m} %2m1% kWh | %2spm1% €
Letzter Monat: {m} %2m2% kWh | %2spm2% €
Vorletzter Monat: {m} %2m3% kWh | %2spm3% €
Gesamt: {m} %2gesamt% kWh | %2spgs% €

#

Sieht dann in etwas so aus:

Konfiguration in FHEM

In FHEM ist dann noch das einmalige Anlegen eines Brokers erforderlich.

define myBroker MQTT2_SERVER 1883 global

Anschließend sollte sich der Stromzähler in FHEM nach kurzer Zeit folgendermaßen, aber mit abweichender Adresse (4F9216) melden (autocreate muss aktiviert sein):


Zusätzlich sind noch folgende Attribute von Vorteil.

attr MQTT2_DVES_4F9216 alias Stromzähler
attr MQTT2_DVES_4F9216 group Strom
attr MQTT2_DVES_4F9216 icon stromzaehler_icon
attr MQTT2_DVES_4F9216 stateFormat {ReadingsVal($name,"LWT","") eq "Offline" ? "absent" : ReadingsVal($name,"energytotal","") . " kWh"}

Zusätzlich werden noch folgende dummies und eine Notification benötigt.

Stromverbrauch:

defmod StromVerbrauch dummy
attr StromVerbrauch group Strom
attr StromVerbrauch room 99_Zähler
attr StromVerbrauch sortby 12

Stromverbrauch Letzte Abrechnung: (Im Alias steht das Datum der Abrechnung als Hinweis)

defmod ZaehlerStandLetzteAbrechnung dummy
attr ZaehlerStandLetzteAbrechnung alias Stromzähler_20220522
attr ZaehlerStandLetzteAbrechnung group Strom
attr ZaehlerStandLetzteAbrechnung room 99_Zähler
attr ZaehlerStandLetzteAbrechnung sortby 110

Stromzählerstand letzte Abrechnung: (Im Alias steht das Datum der Abrechnung als Hinweis)

defmod ZaehlerStandLetzteAbrechnung dummy
attr ZaehlerStandLetzteAbrechnung alias Stromzähler_20220522
attr ZaehlerStandLetzteAbrechnung group Strom
attr ZaehlerStandLetzteAbrechnung room 99_Zähler
attr ZaehlerStandLetzteAbrechnung sortby 110

Stromverbrauch Heute:

defmod StromVerbrauch_Heute dummy
attr StromVerbrauch_Heute group Strom
attr StromVerbrauch_Heute room 99_Zähler
attr StromVerbrauch_Heute sortby 20

Stromverbrauch Gestern:

defmod StromVerbrauch_Gestern dummy
attr StromVerbrauch_Gestern group Strom
attr StromVerbrauch_Gestern room 99_Zähler
attr StromVerbrauch_Gestern sortby 30

Stromverbrauch Vorgestern:

defmod StromVerbrauch_Vorgestern dummy
attr StromVerbrauch_Vorgestern group Strom
attr StromVerbrauch_Vorgestern room 99_Zähler
attr StromVerbrauch_Vorgestern sortby 40

Notification:

defmod StromverbrauchNoti notify MQTT2_DVES_BE3FE3:energytotal.* {\
my $Zaehlerstand=round(ReadingsNum("MQTT2_DVES_BE3FE3","energytotal","0"),0);;\
my $ZaehlerStandLetzteAbrechnung=round(ReadingsNum("ZaehlerStandLetzteAbrechnung","state","0"),0);;\
my $Diff=$Zaehlerstand-$ZaehlerStandLetzteAbrechnung;;\
fhem("set StromVerbrauch $Diff kWh");;\
my $strom_db_yesterday=ReadingsNum("MQTT2_DVES_BE3FE3","dbyd_kwh","0");;\
my $strom_yesterday=ReadingsNum("MQTT2_DVES_BE3FE3","yd_kwh","0");;\
my $strom_today=ReadingsNum("MQTT2_DVES_BE3FE3","today_kwh","0");;\
fhem("set StromVerbrauch_Vorgestern $strom_db_yesterday kWh");;\
fhem("set StromVerbrauch_Gestern $strom_yesterday kWh");;\
fhem("set StromVerbrauch_Heute $strom_today kWh");;\
}

SVG_Stromzaehler.gplot: (DBLOG)

# Created by FHEM/98_SVG.pm, 2023-02-10 22:07:04
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title 'Stromverbrauch'
set ytics
set y2tics
set grid ytics
set ylabel "Watt"
set y2label ""
set yrange [0:4300]
set y2range [0:4300]

#DBLOG MQTT2_DVES_4F9216:actpower:::

plot "<IN>" using 1:2 axes x1y1 title 'Aktuell (Watt)' ls l0 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Aktuell (Watt)' ls l0 lw 1 with lines

Danach sollte es in FHEM ungefähr so aussehen:
stromzaehler_20.jpg

Konfiguration Home Assistant

Bitte die Konfiguration in Anlehnung an die des Gaszählers vornehmen.
https://wiki.gorjup.de/doku.php?id=public:gaszaehler#konfiguration_im_home_assistant

Script:

mqtt:
  sensor:
    - name: "Stromzähler Zählerstand"
      unique_id: sensor.stromzaehler_zaehlerstand
      state_topic: "tele/Stromzaehler/json"
      value_template: '{{ value_json.energytotal }}'
      unit_of_measurement: 'kWh'
      payload_available: "Online"
      payload_not_available: "Offline"
      device_class: energy
      state_class: "total_increasing"
    - name: "Stromzähler Strompreis"
      unique_id: sensor.stromzaehler_strompreis
      state_topic: "tele/Stromzaehler/json"
      value_template: '{{ value_json.electric_price }}'
      unit_of_measurement: 'Cent/kWh'
      payload_available: "Online"
      payload_not_available: "Offline"
      device_class: energy
      state_class: "total_increasing"
    - name: "Stromzähler Aktuelle Leistung"
      unique_id: sensor.stromzaehler_aktuelle_leistung 
      state_topic: "tele/Stromzaehler/json"
      value_template: '{{ value_json.actpower }}'
      unit_of_measurement: 'kWh'
      payload_available: "Online"
      payload_not_available: "Offline"
      device_class: energy
      state_class: "total_increasing"
    - name: "Stromzähler Verbrauch Energie heute"
      unique_id: sensor.stromzaehler_verbrauch_energie_heute
      state_topic: "tele/Stromzaehler/json"
      value_template: '{{ value_json.today_kwh }}'
      unit_of_measurement: 'kWh'
      payload_available: "Online"
      payload_not_available: "Offline"
      device_class: energy
      state_class: "total_increasing"
    - name: "Stromzähler Verbrauch Kosten heute"
      unique_id: sensor.stromzaehler_verbrauch_kosten_heute
      state_topic: "tele/Stromzaehler/json"
      value_template: '{{ value_json.today_money }}'
      unit_of_measurement: 'EUR'
      payload_available: "Online"
      payload_not_available: "Offline"
      device_class: energy
      state_class: "total_increasing"
    - name: "Stromzähler Verbrauch Energie gestern"
      unique_id: sensor.stromzaehler_verbrauch_energie_gestern
      state_topic: "tele/Stromzaehler/json"
      value_template: '{{ value_json.yd_kwh }}'
      unit_of_measurement: 'kWh'
      payload_available: "Online"
      payload_not_available: "Offline"
      device_class: energy
      state_class: "total_increasing"
    - name: "Stromzähler Verbrauch Kosten gestern"
      unique_id: sensor.stromzaehler_verbrauch_kosten_gestern
      state_topic: "tele/Stromzaehler/json"
      value_template: '{{ value_json.yd_money }}'
      unit_of_measurement: 'EUR'
      payload_available: "Online"
      payload_not_available: "Offline"
      device_class: energy
      state_class: "total_increasing"
    - name: "Stromzähler Verbrauch Energie vorgestern"
      unique_id: sensor.stromzaehler_verbrauch_energie_vorgestern
      state_topic: "tele/Stromzaehler/json"
      value_template: '{{ value_json.dbyd_kwh }}'
      unit_of_measurement: 'kWh'
      payload_available: "Online"
      payload_not_available: "Offline"
      device_class: energy
      state_class: "total_increasing"
    - name: "Stromzähler Verbrauch Kosten vorgestern"
      unique_id: sensor.stromzaehler_verbrauch_kosten_vorgestern
      state_topic: "tele/Stromzaehler/json"
      value_template: '{{ value_json.dbyd_money }}'
      unit_of_measurement: 'EUR'
      payload_available: "Online"
      payload_not_available: "Offline"
      device_class: energy
      state_class: "total_increasing"
    - name: "Stromzähler Zählerkonstante"
      unique_id: sensor.stromzaehler_konstante
      state_topic: "tele/Stromzaehler/json"
      value_template: '{{ value_json.db_zk }}'
      unit_of_measurement: 'U/kWh'
      payload_available: "Online"
      payload_not_available: "Offline"
      device_class: energy
      state_class: "total_increasing"

Neue TASMOTA Firmware für den MQTT Stromzähler

Neue TASMOTA Releases stehen zum Download unter folgendem Link zur Verfügung (Passwort = 10 stellige, aphanumerische Nummer auf dem Gerätelabel „unterste Zeile“)
Download TASMOTA Releases für Stromzähler

Troubleshooting

Es wurde eine Standard TASMOTA Firmware auf den MQTT-Stromzähler geflashed/geupdated

Solange kein blank_1MB.bin Image geflashed wurde, sind die Einstellungen noch vorhanden, aber das Script funktioniert nicht mehr.
In diesem Fall muss zuerst die tasmota-minimal_xxx.bin Firmware und anschließend wieder die scripting_tasmota_xxx.bin Firmware über das Webinterface geflashed werden. (Siehe „Neue TASMOTA Firmware für den MQTT Stromzähler“).


MQTT-Stromzähler meldet sich nicht mit seiner WLAN/SSID

Bitte prüfen, ob das 5V Stromkabel richtig tief eingesteckt wurde. Es kann sein, dass das Kabel nicht 100% Kontakt mit dem D1 Wemos Mini im inneren des Gehäuses hat.
Im Zweifelsfall bitte den Deckel öffen, den D1 Wemos Mini heraus nehmen und nochmal das Kabel einstecken. Wenn er sich immer noch nicht meldet, scheint die TASMOTA Software nicht geflashed oder korrupt zu sein.
Es kann auch sein, dass bei der WLAN Verbindung ein falsches Passwort eingegeben wurde und das Gerät jetzt permanent versucht sich mit falschem Passwort zu verbinden.
In diesem Fall muss das Gerät neu geflashed werden. Zuerst mit dem blank_1MB.bin und anschließend mit der scripting_tasmota_xxx.bin. (Siehe „Neue TASMOTA Firmware für den MQTT Stromzähler“).
Danach muss eine komplette Neukonfiguration gemäß dieser Wiki Anleitung durchgeführt werden.


MQTT-Stromzähler wird am USB-Port nicht erkannt

In diesem Fall handelt es sich bei dem verwendeten Kabel evtl. nur um ein reines Stromkabel und nicht um ein Datenkabel. Bitte ein anderes Micro-USB-Kabel verwenden.
Meistens ist beim Einstecken des MQTT-Stomzählers in den Computer-USB Port bei Verwendung eines Datenkabels ein Windows-Sound zu hören (Windows 10 oder höher).


MQTT-Stromzähler verhält sich seltsam und geht aus, wenn der Poti auf Anschlag gedreht wird

In diesem Fall liegen vermutlich die Lötpunkte des IR-Sensor blank auf dem Metallgehäuse (Chip) des D1-Mini und verursachen einen Kurzschluß.
Bitte daruf achten, dass die Rückseite des IR-Sensor mit Klebeband beklebt ist und somit kein Kurzschluß entstehen kann.


MQTT-Stromzähler zählt nicht / LED leuchtet dauerhaft grün

In diesem Fall ist der Sensor nicht richtig justiert. Bitte mit einem kleinen Schraubendreher den Poti so fein einstellen, dass die linke, grüne LED gerade noch leuchtet und bei leichtem Kontakt mit dem Schraubendreher diese wieder ausgeht.
Dann abwarten ob bei Ankunft der roten Markierung auf der Aluminiumscheibe die LED aus geht. Ist dies der Fall, ist der Sensor korrekt eingestellt. Andernfalls bitte weiter justieren.

Um die Funktion generell zu testen, kann man mit dem Finger oder einen Stift vorne vorbeistreichen um zu sehen, ob die die LED erlischt. Wenn ja, ist der Sensor generell in Ordnung.


Navigation
Eigene Werkzeuge