===== 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).\\ \\ {{:public:wlan1.jpg?300|}} \\ \\ 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.\\ {{:public:wlan2.jpg?300|}} \\ 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 .\\ {{:public:stromzaehler_2.jpg?400|}} \\ {{:public:esp8266-tcrt5000.jpg?400|}} \\ {{:public:stroemzaehler_aufbau.jpg?400|}} \\ \\ === 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.\\ {{:public:stromzaehler_4.jpg?400|}}\\ \\ 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.\\ 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...\\ \\ {{https://www.kompf.de/tech/images/ireflb-emeir.png}}\\ Quelle: [[https://www.kompf.de/tech/emeir.html]]\\ \\ \\ ===== 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 === {{:public:stromzaehler_10.jpg?400|}}\\ === MQTT-Einstellungen === Unter **Host** ist die IP-Adresse der Hausautomation einzutragen. ggf. auch user/password falls erforderlich.\\ {{:public:stromzaehler_11.jpg?400|}}\\ === Sonstige Konfiguration === {{:public:stromzaehler_12.jpg?400|}}\\ \\ \\ \\ === 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 Aliminium-Drehscheibe.\\ - sp (Strompreis in Cent) - zk (Zählerkonstante) - 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ößert 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 sp=52.15 zk=75 mu=10 c1=0 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 %2sp% =>Publish tele/%topic%/main/today_kwh %2e1% =>Publish tele/%topic%/main/today_money %2sph1% =>Publish tele/%topic%/main/yd_kwh %2e2% =>Publish tele/%topic%/main/yd_money %2spg1% =>Publish tele/%topic%/main/dbyd_kwh %2e3% =>Publish tele/%topic%/main/dbyd_money %2spg2% =>Publish tele/%topic%/main/value %2c1% =>Publish tele/%topic%/main/actpower %0power% =>Publish tele/%topic%/main/energytotal %2total% =>Publish tele/%topic%/json {"energytotal": "%2total%", "value": "%2c1%", "today_kwh": "%2e1%", "today_money": "%2sph1%", "yd_kwh": "%2e2%", "yd_money": "%2spg1%", "dbyd_kwh": "%2e2%", "dbyd_money": "%2spg2%", "zk": "%zk%, "electric_price": "%2sp%", "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: \\ \\ {{:public:strom_tasmota_script.jpg?400|}} ===== 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):\\ {{:public:gaszaehler_10.jpg?200|}} \\ \\ 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:value.* {\ 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 crop set output '.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 "" using 1:2 axes x1y1 title 'Aktuell (Watt)' ls l0 lw 1 with lines,\ "" using 1:2 axes x1y1 title 'Aktuell (Watt)' ls l0 lw 1 with lines Danach sollte es in FHEM ungefähr so aussehen:\\ {{:public:stromzaehler_20.jpg}} ===== 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"**)\\ [[https://nextcloud.gorjup.de/nextcloud/index.php/s/T4C9CWWrqWYA7rT|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 zählt nicht / LED leuchtet dauerhaft grün === In diesem Fall ist der Sensor nicht richtig justiert. Bitte mit einem kleinen Schrauebndreher den Poti so fein einstellen, dass die 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.\\