Zählerstand mit DvLIR und httpmod auslesen

Begonnen von ch.eick, 20 Dezember 2018, 16:18:58

Vorheriges Thema - Nächstes Thema

ch.eick

Hallo zusammen,

bei dem hier beschriebenen Device, DvLIR handelt es sich um ein IP Gerät zum auslesen der Infoschnittstelle von Stromzählern.
Stromzähler befinden sich ja leider an den unmöglichsten Stellen und die Platzierung eines kompletten Raspberry PI mit Infrarotkopf und der notwendigen Software, dem Gehäuse, der Speicherkarte und allem drum und dran finde ich oft viel. Die Eigenlösung bedarf dann auch noch einer gewissen Wartung, die ich ebenfalls minimieren wollte.

Nun zum DvLIR der Firma Device GmbH, für das es auf der Herstellerseite eine detaillierte Beschreibung gibt.
Dieser kleine Lesekopf wird wie gewohnt mit einem Ringmagnet direkt auf die Infoschnittstelle am Zähler aufgesetzt und wird über zwei aus dem Kopf kommende Flachleitungen angeschlossen. Beide Leitungen sind mehr als ausreichend in der Länge dimensioniert und dienen zum einen für die Spannungsversorgung mit einem 5V USB Steckernetzteil, sowie der 10/100 LAN Anbindung mit einem RJ45 Stecker. Die Leitungen sollten aus dem Zählerschrank herausgeführt werden und können dann über einen kleinen Kanal zu einer Steckdose und einem LAN Anschluss verlegt werden.

Der DvLIR stellt alle Auslesewerte über ein WEB Interface im LAN zur Verfügung und sichert den Zugriff über einen einfachen Passwortschutz ab. Die IP Adresse wird per dhcp bezogen und lässt sich anschließend über die WEB Oberfäche konfigurieren. HTTPS konnte ich jedoch nicht finden, was jedoch in einem geschützten, separaten SMART Home Netzerk für eine reine Lesende Info Schnittstelle sicherlich zu verschmerzen ist.
Weiterhin ist die Firmware über eine HTTP API Schnittstelle ansteuerbar und auch teilweise konfigurierbar. Für meine Tests wurde jedoch erstmal auf den schreibenden Zugriff verzichtet, da ein Umkonfigurieren sicherlich nicht an der Tagesordnung ist.

Besonders hervor zu heben ist, dass der DvLIR auch die Sammlung von Daten übernimmt. Es werden bis zu 1940 csv Datenzätze als Datei angeboten, die dann je nach eingestelltem Leseintervall für verschieden lange Statistiken reichen.

Auch die Zählerregister für Strom Lieferung werden ausgelesen und im Interface angezeigt.

Bei meinem Stromzähler wurde über die, vom Netzbetreiber, zugesandte Zähler PIN eine Freischaltung des momentanen Stromverbrauchs konfiguriert. Dies wurde durch den DvLIR sofort erkannt und die zusätzlichen Werte erschienen in der WEB Oberfläche. Durch diese Freischaltung veränderten sich dann alle Zählerwerte auf eine größere Anzahl von Nachkommastellen, die man sich dann jedoch im FHEM wieder auf die gewünschte Anzahl formatieren kann.

Inbetriebnahme

1.  Modul auf den Zähler aufstecken
2.  5V USB Steckernetzteil in die Steckdose und mit dem USB Stecker verbinden
3.  10/100 LAN Anschluss herstellen
4.  Der Lesekopf startet und bezieht eine IP Adresse
5.  Mit einem Browser und der IP Adresse auf den DvLIR zugreifen
5.1 Es gibt auch eine Handy APP, die hier nicht ausprobiert wurde
6.  Das Passwort steht hinten in der beiliegenden Benutzerdokumentation
6.1 Das Passwort lässt sich über die WEB Oberfläche und die http API verändern
    und auch wieder auf die Werkseinstellung zurück setzen.
7.  Eventuell die Netzwerkeinstellung an das bestehende SMART Home Netzwerk anpassen.


Ab Schritt 5 sollte der Lesekopf bereits vollumfänglich laufen und die Zählerwerte liefern.

Nun kommt dann endlich die gewünscht Einbindung ins FHEM mit dem httpmod Modul über die http API des DvLIR.
An dieser Stelle möchte ich mich dann auch noch mal recht herzlich bei der tollen Unterstützung durch den Hersteller bedanken, der mir ohne jedes Problem die komplette API Dokumentation hat zukommen lassen.
Kleinere issues habe ich bereits gemeldet und werden sicherlich in einem späteren Firmware Update korrigiert. Hierbei ist jedoch nichts massiv fehlerhaftes aufgetreten. Vielen, vielen Dank.

defmod StromZaehler HTTPMOD http://<IP Addresse>/data.txt?sid=$sid 0
attr StromZaehler get01Name Strom_Status
attr StromZaehler get01URL http://<IP Addresse>/data.txt?sid=$sid
attr StromZaehler get02Name Strom_Info
attr StromZaehler get02URL http://<IP Addresse>/info.txt?sid=$sid
attr StromZaehler get03Name Strom_Network
attr StromZaehler get03URL http://<IP Addresse>/network.txt?sid=$sid
attr StromZaehler get04Name Strom_System
attr StromZaehler get04URL http://<IP Addresse>/system.txt?sid=$sid
attr StromZaehler get05Name Strom_NTP_Test
attr StromZaehler get05URL http://<IP Addresse>/ntpTest.cmd?sid=$sid&ntpName=pool.ntp.org
attr StromZaehler get06Name Strom_Daten
attr StromZaehler get06URL http://<IP Addresse>/daten.csv?sid=$sid&lines=1940
attr StromZaehler httpVersion 1.1
attr StromZaehler reAuthRegex Melden Sie sich mit Ihrem Kennwort an
attr StromZaehler reading01Name Server-ID
attr StromZaehler reading01Regex ([0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2})
attr StromZaehler reading02Name Zaehlernummer
attr StromZaehler reading02Regex ([0-9]{8})
attr StromZaehler reading03Name Herstellerkennung
attr StromZaehler reading03Regex ((?<=[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]#)[A-Z]{3})
attr StromZaehler reading04Name Net_IP-Adresse
attr StromZaehler reading04Regex ((?<=#[A-Z]{3}#)[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})
attr StromZaehler reading05Name Net_Gateway
attr StromZaehler reading05Regex ((?<=[1-9]#)[1-9]{1,3}\.[1-9]{1,3}\.[1-9]{1,3}\.[1-9]{1,3}(?=#[1-9]))
attr StromZaehler reading06Name Net_DNS-Server
attr StromZaehler reading06Regex ((?<=[0-9]#)[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}(?=#[A-Z]))
attr StromZaehler reading07Name Net_Netzwerkname
attr StromZaehler reading07Regex (DVLIR_[0-9]{6})
attr StromZaehler reading08Name DvLIR_MAC-Adresse
attr StromZaehler reading08Regex (..:..:..:..:..:..)
attr StromZaehler reading09Name Speicherintervall_in_Sekunden
attr StromZaehler reading09Regex ((?<=:..#)[0-9][0-9])
attr StromZaehler reading10Name Aktuell_Datum
attr StromZaehler reading10Regex (..\...\.....(?<=#..\...\.....))
attr StromZaehler reading11Name Aktuell_Zeit
attr StromZaehler reading11Regex ((?=..:..:.. )..:..:..)
attr StromZaehler reading12Name DvLIR_Seriennummer
attr StromZaehler reading12Regex ((?<=\)\#)[0-9]{6})
attr StromZaehler reading13Name DvLIR_Firmware
attr StromZaehler reading13Regex ((?=[0-90-9]\... - ..\...\.....).*..\...\.....)
attr StromZaehler reading14Name data_csv
attr StromZaehler reading14RegOpt s
attr StromZaehler reading14Regex ([0-9]*\;;..\...\.....\;;.*)
attr StromZaehler reading21-10Format %.8s
attr StromZaehler reading21-11Format %.8s
attr StromZaehler reading21-12Format %.8s
attr StromZaehler reading21-13Format %.8s
attr StromZaehler reading21-3Format %.8s
attr StromZaehler reading21-5Format %.8s
attr StromZaehler reading21-6Format %.8s
attr StromZaehler reading21-7Format %.8s
attr StromZaehler reading21-8Format %.8s
attr StromZaehler reading21-9Format %.8s
attr StromZaehler reading21AutoNumLen 2
attr StromZaehler reading21Name Strom_Status
attr StromZaehler reading21RegOpt g
attr StromZaehler reading21Regex (?:^|#)(16.7.0|[0-9]*,[0-9]*|nicht verf|OK|min)
attr StromZaehler reading22AutoNumLen 2
attr StromZaehler reading22Name Strom_Network
attr StromZaehler reading22RegOpt g
attr StromZaehler reading22Regex (?:^|#)(yes|no|(yes#[a-z]|no#[a-z])|[a-z]*\.[a-z]*\.[a-z]{2,3})
attr StromZaehler room Strom,Informationen
attr StromZaehler showBody 0
attr StromZaehler showError 0
attr StromZaehler sid1IdRegex ([0-9A-F]{32})
attr StromZaehler sid1URL http://<IP Addresse>/getSID.txt?pwd=<Passwort>
attr StromZaehler stateFormat {sprintf("%s Momentan: %.6s Watt Gesamt: %.8s kWh", ReadingsVal("StromZaehler","Aktuell_Datum","?"), ReadingsVal("StromZaehler","Strom_Status-02","?"), ReadingsVal("StromZaehler","Strom_Status-03","?"))}
attr StromZaehler timeout 5
attr StromZaehler verbose 0


Okay, für die erfahrenen FHEM Nutzer wäre hier dann aller soweit klar, aber zu denen zähle selbst ich noch nicht. Ich denke kleinere Erklärungen wären sinnvoll und beschreiben dann auch den wachsenden Aufbau der Einbindung.

Schritt 1: Das HTTPMOD für den DvLIR definieren
Dies erzeugt den grundlegenden Eintrag in FHEM, dem dann die Readings und Attribute zugeordnet werden.

defmod StromZaehler HTTPMOD http://<IP Addresse>/data.txt?sid=$sid 0


Schritt 2: Grundlegende Attribute
Zu beginn verwende ich einige Attribute zum besseren Debugging und um die HTTP Meldungen komplett sehen zu können. Genaue Beschreibungen sind in der Commandref und im WIKI nach zu lesen.

attr StromZaehler showBody 1
attr StromZaehler showError 1
attr StromZaehler verbose 5


Schritt 3: Anmeldung am DvLIR mit Passwort
Das HTTPMOD ruft als ersten Schritt die gewünschte URL auf und prüft anschließend, ob ein Login notwendig ist. Kommt vom DvLIR eine Rückmeldung, wird dies mit reAuthRegex verglichen. Trifft reAuthRegex zu, so wird sid1URL ausgeführt. Beim DvLIR wird hierauf ein 32 Stelliger Hexadezimaler String zurück gesendet, der im weiteren als Session ID zu verwenden ist. HTTPMOD speichert diese durch sid1IDRegex in der Variablen $sid.

attr StromZaehler sid1IdRegex ([0-9A-F]{32})
attr StromZaehler sid1URL http://<IP Addresse>/getSID.txt?pwd=<Passwort>
attr StromZaehler reAuthRegex Melden Sie sich mit Ihrem Kennwort an


Schritt 4: Hinzufügen der verschiedenen DvLIR Abfragen
In der vom Hersteller zur Verfügung gestellten API Dokumentation habe ich exemplarisch einige bereits definiert. Die Session ID wird hier durch die Variable $sid übergeben. Im einzelnen wurden folgende Abfragen umgesetzt:

1. data.txt      Grundlegender Status mit Verbrauchswerten der letzten Intervalle
2. info.txt      Allgemeine Zähler Informationen
3. network.txt   Netzwerk Konfiguration
4. system.txt    Das ist noch nicht korrekt implementiert
5. ntpTest.cmd   Hierdurch führt der DvLIR einen NTP Test durch
6. daten.csv     Die gesammelten Zähler Daten werden im csv Format heruntergeladen. Mit lines kann die Ausgabe begrenzt werden.


attr StromZaehler get01Name Strom_Status
attr StromZaehler get01URL http://<IP Addresse>/data.txt?sid=$sid
attr StromZaehler get02Name Strom_Info
attr StromZaehler get02URL http://<IP Addresse>/info.txt?sid=$sid
attr StromZaehler get03Name Strom_Network
attr StromZaehler get03URL http://<IP Addresse>/network.txt?sid=$sid
attr StromZaehler get04Name Strom_System
attr StromZaehler get04URL http://<IP Addresse>/system.txt?sid=$sid
attr StromZaehler get05Name Strom_NTP_Test
attr StromZaehler get05URL http://<IP Addresse>/ntpTest.cmd?sid=$sid&ntpName=pool.ntp.org
attr StromZaehler get06Name Strom_Daten
attr StromZaehler get06URL http://<IP Addresse>/daten.csv?sid=$sid&lines=1940


Schritt 5: Definition der Readings
Bei den Readings wäre es wünschenswert gewesen, wenn diese in der http Rückmeldung vom DvLIR mit Bezeichnern oder besser als JSON Liste bereitgestellt würden. Aus diesem Grund sind nun die Regex Definitionen etwas komplexer geworden. Es ist zu beachten, dass jedes Reading eineindeutig über alle Abfragen sein muss, da es ansonsten zu Wechselwirkungen kommen kann. Als Beispiel ist hier die Zaehlernummer zu nennen, die bei Aufruf von Strom_Info, Strom_Status und Strom_Daten gesetzt wird.

5.1 Strom_Info readings

attr StromZaehler reading01Name Server-ID
attr StromZaehler reading01Regex ([0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2})
attr StromZaehler reading02Name Zaehlernummer
attr StromZaehler reading02Regex ([0-9]{8})
attr StromZaehler reading03Name Herstellerkennung
attr StromZaehler reading03Regex ((?<=[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]#)[A-Z]{3})
attr StromZaehler reading04Name Net_IP-Adresse
attr StromZaehler reading04Regex ((?<=#[A-Z]{3}#)[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})
attr StromZaehler reading05Name Net_Gateway
attr StromZaehler reading05Regex ((?<=[1-9]#)[1-9]{1,3}\.[1-9]{1,3}\.[1-9]{1,3}\.[1-9]{1,3}(?=#[1-9]))
attr StromZaehler reading06Name Net_DNS-Server
attr StromZaehler reading06Regex ((?<=[0-9]#)[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}(?=#[A-Z]))
attr StromZaehler reading07Name Net_Netzwerkname
attr StromZaehler reading07Regex (DVLIR_[0-9]{6})
attr StromZaehler reading08Name DvLIR_MAC-Adresse
attr StromZaehler reading08Regex (..:..:..:..:..:..)
attr StromZaehler reading09Name Speicherintervall_in_Sekunden
attr StromZaehler reading09Regex ((?<=:..#)[0-9][0-9])
attr StromZaehler reading10Name Aktuell_Datum
attr StromZaehler reading10Regex (..\...\.....(?<=#..\...\.....))
attr StromZaehler reading11Name Aktuell_Zeit
attr StromZaehler reading11Regex ((?=..:..:.. )..:..:..)
attr StromZaehler reading12Name DvLIR_Seriennummer
attr StromZaehler reading12Regex ((?<=\)\#)[0-9]{6})
attr StromZaehler reading13Name DvLIR_Firmware
attr StromZaehler reading13Regex ((?=[0-90-9]\... - ..\...\.....).*..\...\.....)


5.2 Strom_Status readings
Für das Auslesen der Status readings bietet sich das automatische reading von HTTPMOD an. Hierbei werden alle auf die Regex passenden readings, in dieser Definition, zweistellig durchnummeriert.

attr StromZaehler reading21AutoNumLen 2
attr StromZaehler reading21Name Strom_Status
attr StromZaehler reading21RegOpt g
attr StromZaehler reading21Regex (?:^|#)(16.7.0|[0-9]*,[0-9]*|nicht verf|OK|min)


5.2.1 Strom_Status Format
Auch automatische readings lassen sich mit einem Format nach eigenen Wünschen belegen.

attr StromZaehler reading21-3Format %.8s
attr StromZaehler reading21-5Format %.8s
attr StromZaehler reading21-6Format %.8s
attr StromZaehler reading21-7Format %.8s
attr StromZaehler reading21-8Format %.8s
attr StromZaehler reading21-9Format %.8s
attr StromZaehler reading21-10Format %.8s
attr StromZaehler reading21-11Format %.8s
attr StromZaehler reading21-12Format %.8s
attr StromZaehler reading21-13Format %.8s


5.3 Strom_Network readings
Für das Auslesen der Network readings bietet sich wiederum das automatische reading von HTTPMOD an. Hierbei werden alle auf die Regex passenden readings, auch in dieser Definition, zweistellig durchnummeriert.

attr StromZaehler reading22AutoNumLen 2
attr StromZaehler reading22Name Strom_Network
attr StromZaehler reading22RegOpt g
attr StromZaehler reading22Regex (?:^|#)(yes|no|(yes#[a-z]|no#[a-z])|[a-z]*\.[a-z]*\.[a-z]{2,3})


5.4 Daten als CSV reading
Die Abfrage der statistischen Daten bereitet mir ein wenig Kopfweh. Ich wollte mich nicht einfach geschlagen geben und ein zusätzliches Programm für die Daten Annahme und - Aufbereitung schreiben. Der momentane Weg ist ein reading, das die Datei komplett aufnimmt. Dies führt natürlich zu einem sehr großen reading, was in der FHEM Oberfläche nicht schön ist. Anschließend zeige ich noch eine Log Definition, die das reading dann zusätzlich in eine separates Log File speichert. Hier wäre gerne noch Eure Hilfe gefragt, wie man das ansprechender umsetzen könnte.

attr StromZaehler reading14Name data_csv
attr StromZaehler reading14RegOpt s
attr StromZaehler reading14Regex ([0-9]*\;;..\...\.....\;;.*)


Schritt 6: Den NTP Test einbinden
Das Attribut timeout wurde vom default auf 5 Sekunden angehoben, was für den NTP_test notwendig ist, da im NTP Fehlerfall ein Timeout abgewartet werden muss.
Hierzu gibt es noch kein reading, bzw keine weitere Implementierung. Es besteht noch ein Fehler in der API, der den Status 0 nicht korrekt zurückmeldet.

attr StromZaehler timeout 5


Schritt 7: Ein Status Format für DeviceOverview
Dieses Format zeigt im DeviceOverview das Aktuelle_Datum, den Momentan Verbrauch, sofern er per PIN freigeschaltet wurde, und den Zählerstand an. Die angezeigten werte sind natürlich nur aktuell, wenn die darunter liegenden readings regelmäßig aktualisiert werden.

attr StromZaehler stateFormat {sprintf("%s Momentan: %.6s Watt Gesamt: %.8s kWh", ReadingsVal("StromZaehler","Aktuell_Datum","?"), ReadingsVal("StromZaehler","Strom_Status-02","?"), ReadingsVal("StromZaehler","Strom_Status-03","?"))}

Beispielausgabe:
DeviceOverview
StromZaehler        21.12.2018 Momentan: 622,0 Watt Gesamt: 04161,42 kWh

Schritt 8: Etwas aufräumen
Sobald das Analysieren und debuggen beendet wurde sollte man noch einige Attribute zurücksetzen, um die Flut an Meldungen einzudämmen.

attr StromZaehler showBody 0
attr StromZaehler showError 0
attr StromZaehler verbose 0


Schritt 9: Weitere Einbindung in FHEM

9.1 FileLog für data_csv reading
Dies soll nur eine Zwischenlösung sein, um die csv Daten in ein file, für die spätere Auswertung, zu schreiben. Habt Ihr da eine elegantere Lösung?

defmod FileLog_StromZaehler_data FileLog ./log/StromZaehler-%Y.log StromZaehler:data_csv:.*|StromZaehler:Zaehlernummer:.*
attr FileLog_StromZaehler_data logtype text
attr FileLog_StromZaehler_data verbose 0
setstate FileLog_StromZaehler_data active


9.2 Einbindung in eine readingsGroup

defmod Energieverbrauch readingsGroup <Zähler>,<Information>,<Wert> StromZaehler:<Ablesedatum>,Aktuell_Datum StromZaehler:<Gesamt>,Strom_Status-03 Heizung:<Heizung>,counterHeatQHeating Heizung:<Warmwasser>,counterHeatQHotWater Heizung:<Gesamt>,counterHeatQTotal
attr Energieverbrauch nameStyle style="color:grey"
attr Energieverbrauch room Abrechnung,Heizung
attr Energieverbrauch style style="font-size:18px"


9.3 Zuordung in verschiedene rooms
Das darf ja auch nicht fehlen.

attr StromZaehler room Strom,Informationen


Für weitere Verbesserungen und Tipps und Tricks bin ich immer offen.
Natürlich habe ich wochenlang das Forum durchforstet und die Dokumentationen gelesen. Diese Beschreibung sollte mal wieder ein Beispiel sein und die vielen verstreuten Informationen zusammen tragen.

Viele Grüße
   Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

KölnSolar

Hallo Christian,
ich kann ehrlich gesagt Deine Ausgangssituation nicht nachvollziehen.
ZitatStromzähler befinden sich ja leider an den unmöglichsten Stellen und die Platzierung eines kompletten Raspberry PI mit Infrarotkopf und der notwendigen Software, dem Gehäuse, der Speicherkarte und allem drum und dran finde ich oft viel.
Ich hätte Verständnis, würdest Du eine Lösung für z.B. Mehrfamilienhäuser mit zentralen Zählerschränken vorstellen. Aber dort hat man ja eben eher keine Steckdose, und noch seltener LAN.
Was meinst Du mit viel ?
- Der Preis kann es nicht sein, denn für den Preis, den ich ergoogled habe, bekommst Du x RPi's.
- Meinst Du Größe ? Wo bekommt man denn keinen RPi unter ?
ZitatDie Eigenlösung bedarf dann auch noch einer gewissen Wartung, die ich ebenfalls minimieren wollte.
Wo ist der Unterschied zu einem FHEM und OBIS-Modul auf einem RPi mit USB-IR-Lesekopf ? Das ist doch viel einfacher als Deine Lösung, wenn man eh FHEM hat.

Deine Lösung scheint mir nur dann sinnvoll, wenn man erst die Harware hatte und dann zu FHEM kam. Nicht aber umgekehrt.

Grüße Markus
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

Rene Wolf

Hallo Christian,

vielen Dank, für Deine Anleitung.
Das kam genau zum richtigen Zeitpunkt. Bei mir hat Stromnetz Hamburg in den letzten Tagen den Zähler getauscht und im Rahmen eines Projektes (mysmartlife) gab es den Ausleseadapter kostenlos dazu.
Eine Anmerkung hab ich zu "5.2 Strom_Status readings", hier verwende ich folgenden regulären Ausdruck:

(?:^|#)(16.7.0|\d+,?\d*|nicht verf|OK|min)

--> der momentane Verbrauch wird bei mir ohne Nachkommastelle angezeigt

Gruß
René

ch.eick

#3
Hallo KölnSolar
Bei den Mehrfamilienhäuser mit zentralen Zählerschränken stimme ich Dir voll und ganz zu.

———————
Was meinst Du mit viel ?
- Der Preis kann es nicht sein, denn für den Preis, den ich ergoogled habe, bekommst Du x RPi's.
- Meinst Du Größe ? Wo bekommt man denn keinen RPi unter ?Wo ist der Unterschied zu einem FHEM und OBIS-Modul auf einem RPi mit USB-IR-Lesekopf ? Das ist doch viel einfacher als Deine Lösung, wenn man eh FHEM hat.
———————
Der Preis für die RPi's ist unschlagbar und auch der Aufwand für die Installation überschaubar. Nach der Installation läuft es auch über IP mit ssh. Ein zusätzliches FHEM, die regelmäßigen Updates, Einbindung von Backup und sonstige Verwaltung kann man auch machen.
Bei mir wäre das dann mal zwei, da ich noch einen weiteren Zähler an anderer Stelle habe. Und der Wärmemengenzähler wäre dann der dritte RPi nur zum Zähler auslesen, da auch dieser wieder fern ab ist.
Somit ist die RPi Lösung für mich bei zwei oder mehr, in der Nähe befindlichen Zähllösungen die perfekte Wahl.

Ich denke, dass ich bei der ursprünglichen Beschreibung nicht gründlich genug war.

Der DvLIR oder vergleichbares wird sicherlich auch noch günstiger werden. Ein RPi mit allem Zubehör und dem Aufwand für das Aufsetzen gefolgt von der Zeit für die Wartung, ist momentan sicherlich günstiger. Da stimme ich schon zu.

Die vorgestellte Lösung bindet den DvLIR ohne Basteln direkt über IP ins FHEM ein und findet sicherlich auch testwillige Nachahmer. Im Bild kann man das Gerät am Zähler sehen.

Mein FHEM steuert bereits an einer anderen zentralen Stelle über die IC2 Schnittstelle Relaisboards Und kann somit nicht in den Zählerschrank platziert werden.

Viel Spaß
    Christian

P.S.
Renè
Ich schau mir das Reading noch mal an. Danke dafür.

RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

Hallo René

--> der momentane Verbrauch wird bei mir ohne Nachkommastelle angezeigt

Die Mainzer Netze verwenden Zähler von ESY. Nach der Freischaltung durch den PIN wurde der momentan Stromverbrauch in Watt mit einer Nachkommastelle angezeigt und der Gesamtverbrauch wechselte von,ich glaube zwei Nachkommastellen auf jetzt fünf.

Gruß Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

KölnSolar

Zitatgab es den Ausleseadapter kostenlos dazu.
Das ist ein Argument  ;D

Zitatwäre dann der dritte RPi nur zum Zähler auslesen, da auch dieser wieder fern ab ist.
Warum ? Für Dein Beispiel benötigst Du doch LAN-Anschlüsse. Und die Leitungen könntest Du doch auch für RS232 oder USB oder..... missbrauchen, um nur auf dem einen zentralen Rpi und zentralem FHEM die Signale zu verarbeiten.  :-\

ZitatZähler von ESY
Eher vermutlich von Easymeter.

Ich hoffe, dass sowohl die Hardware, als auch der von Dir entwickelte Code nicht irgendwelche Besonderheiten von bestimmten Zählertypen(Hersteller, Kundenvarianten....) nutzen oder sogar ausfiltern. Ich hab z.B. nicht gesehen, dass Du Phasenwerte von Spannung und Leistung verarbeitest, was z.B. der 3-Punkt-Zähler von Easymeter je nach Kundenkonfiguration(Stadtwerk bzw. MSB) kann. Das OBIS-Modul verarbeitet ALLES automatisch, was ein Zähler an Infos per SML/D0-Schnittstelle preisgibt.

Und wenn Du von basteln schreibst: hardwaretechnisch ist das sicherlich PnP, wenn man LAN-Anschlüsse verfügbar hat. Aber softwaretechnisch ist das mit dem OBIS-Modul alles viel einfacher, transparenter und universeller.

Grüße Markus
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

ch.eick

#6
ZitatWarum ? Für Dein Beispiel benötigst Du doch LAN-Anschlüsse. Und die Leitungen könntest Du doch auch für RS232 oder USB oder..... missbrauchen, um nur auf dem einen zentralen Rpi und zentralem FHEM die Signale zu verarbeiten.  :-\
Das geht, ich möchte jedoch nicht verschiedene physikalische Layer auf einer Leitung betreiben.
USB wäre wegen der maximalen Leitungslänge nicht möglich.

ZitatEher vermutlich von Easymeter.
Korrekt

ZitatIch hoffe, dass sowohl die Hardware, als auch der von Dir entwickelte Code nicht irgendwelche Besonderheiten von bestimmten Zählertypen(Hersteller, Kundenvarianten....) nutzen oder sogar ausfiltern.
Der DvLIR unterstützt:
SML nach FNN-Lastenheft für EDL21- und Basiszähler

ZitatIch hab z.B. nicht gesehen, dass Du Phasenwerte von Spannung und Leistung verarbeitest, was z.B. der 3-Punkt-Zähler von Easymeter je nach Kundenkonfiguration(Stadtwerk bzw. MSB) kann. Das OBIS-Modul verarbeitet ALLES automatisch, was ein Zähler an Infos per SML/D0-Schnittstelle preisgibt.
Phasenwerte werden bei mir nicht angezeigt :-)
EasyMeter Q3M1000  V6.03

ZitatUnd wenn Du von basteln schreibst: hardwaretechnisch ist das sicherlich PnP, wenn man LAN-Anschlüsse verfügbar hat. Aber softwaretechnisch ist das mit dem OBIS-Modul alles viel einfacher, transparenter und universeller.
Wie gesagt, wenn alle Zähler erreichbar wären würde ich das auch bevorzugen.

Hast Du mal eine Empfehlung für einen USB Kopf?
Könnte man damit auch einen Wärmemengen Zähler mit dem OBIS-Modul verarbeiten? (Ich hab die Dokumentation noch nicht gelesen)

Vielen Dank für Deine vielfältigen Anregungen.

Grüße Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

KölnSolar

ZitatHast Du mal eine Empfehlung für einen USB Kopf?
Nicht direkt.  :'( Ich nehme die 08/15 seriellen Leseköpfe.(Hab hier gerade OKK-BKE von EMH hier liegen, den ich morgen verbauen werde). Daran angeschlossen(gebastelt  ;)) ein RS232-USB-Wandler.
ZitatPhasenwerte werden bei mir nicht angezeigt :-)
EasyMeter Q3M1000  V6.03
Ich hoffe bei meinem Q3MB3060 gibt es die. Sehe ich dann morgen nach dessen Einbau. Das blöde scheint zu sein, dass man das gar nicht aus der Typenbezeichnung ableiten kann.
ZitatKönnte man damit auch einen Wärmemengen Zähler mit dem OBIS-Modul verarbeiten?
Wissen tue ich es nicht. Wenn die bzgl. der Schnittstelle ähnlich funktionieren, müsste es aber klappen, da das Modul alles ausliest, was eine OBIS-Kennzahl trägt.

Grüße Markus
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

ch.eick

Hallo zusammen.

Nur noch ein Update als langzeit Test. Bisher gibt es keine Fehler oder Probleme.

Gruß
    Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

#9
Hallo zusammen,

falls auch jemand die daten.csv als langzeit Log haben möchte, könnte man das per Skript erschlagen.


{ DvLIR_SID=`curl http://192.168.178.28/getSID.txt?pwd=qgE9WFNW`;    \         #Am DvLIR anmelden und die SID merken
              curl http://192.168.178.28/daten.csv?sid=$DvLIR_SID |  \         #Die csv Datei abholen (mit SID Übergabe)
              grep -v "Date" |  \                                              #entfernen der Spaltenüberschrift
              cut -d";" -f2,3,12; |  \                                         #Datum, Urzeit und Momentanverbrauch filtern
              cat daten.csv; }   |  \                                          #Merge mit den bereits vorhandenen Daten
              sort -u -t"." -k3,1 -k2,2 -k1,3 > daten.csv.tmp  && \            #nach Jahr, Monat, Tag sortieren und doppelte Datensätze entfernen
              mv daten.csv.tmp daten.csv                                       #Die alte Datei mit der Neuen ersetzen


Gruß
    Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

#10
Ich habe noch eine Komma zu Punkt Umsetzung für die Status readings eingefügt, um Diagramme mit SVG erstellen zu können.


attr StromZaehler reading21-10Format %.8s
attr StromZaehler reading21-11Format %.8s
attr StromZaehler reading21-12Format %.8s
attr StromZaehler reading21-13Format %.8s
attr StromZaehler reading21-3Format %.8s
attr StromZaehler reading21-5Format %.8s
attr StromZaehler reading21-6Format %.8s
attr StromZaehler reading21-7Format %.8s
attr StromZaehler reading21-8Format %.8s
attr StromZaehler reading21-9Format %.8s
attr StromZaehler reading21AutoNumLen 2
attr StromZaehler reading21Name Strom_Status

attr StromZaehler reading21OExpr $val =~ s/,/\./;; $val;;                           <====== das ist die Komma zu Punkt Umsetzung

attr StromZaehler reading21RegOpt g                                                 <======= Die Regex soll für alle readings gelten (global)
attr StromZaehler reading21Regex (?:^|#)(16.7.0|[0-9]*,[0-9]*|nicht verf|OK|min)    <======= Das filtert hoffentlich alles raus


Gruß
   Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

#11
Hallo nochmal,

hier kommt noch mal eine Datenaufbereitung als Muster.

Ich denke das ist auch etwas für Regex Liebhaber

Zuerst eine Erklärung der einzelnen Schritte:

0) So sehen die Beispieldaten aus

Index;Date[UTC];Time[UTC];DvLIR-SN;MeterNumber;1.8.0[kWh];1.8.1[kWh];1.8.2[kWh];2.8.0[kWh];2.8.1[kWh];2.8.2[kWh];CurrentPower[W];Status
1;03.04.2019;12:49:00;000145;60875920;7159,95538;7159,73083;0,22454;;;;218,7;
2;03.04.2019;12:48:00;000145;60875920;7159,95173;7159,72718;0,22454;;;;219,2;


1) Die Session ID holen
    DvLIR_SID=`curl http://192.168.178.28/getSID.txt?pwd=<Passwort>`

2) Die Daten als csv Datei holen
    curl http://192.168.178.28/daten.csv?sid=$DvLIR_SID

3) Den Spalten Header aus der Datei entfernen
    grep -v "Date"

4) Die benötigten Spalten auswählen
    cut -d";" -f2,3,12

5) Jetzt kommt ein wenig sed mit Regex suchen und ersetzen Magie
    sed -r -e "s/\./-/g ;                                                                                <==== Punkt durch Minus ersetzen
                   s:([0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]):\1_:g ;                    <=== Am Ende von TT-MM-YYYY einen Unterstrich einfügen
                   s/_\;/_/g ;                                                                                <=== Die Zeichenfolge Unterstrich Semikolon durch Unterstrich ersetzen (Semikolon gelöscht)
                   s/\;/ StromZaehler Strom_Status-02: /g ;                                   <=== Das andere Semokolon durch den Text ersetzen (Vorbereitung für SVG Logfile Format)
                   s:(^..)-([0-1][0-9])-([0-9][0-9][0-9][0-9])_(.*):\3-\2-\1_\4:g ;      <=== Das Datum ist für das FHEM Log Format falsch, also Tag und Jahr vertauschen
                   s/,/\./g ;"                                                                                    <=== nun noch Komma durch Punkt ersetzen (für SVG Diagramme)

6) Hier werden die bisherigen daten mit in den Datenstrom gemischt
    cat Strom_Momentanverbrauch.log

7) Nun die Daten nach dem Datum sortieren und doppelte Zeilen entfernen. Die csv Datei wird in meinem Fall als Puffer immer wieder fortgeschrieben und beinhaltet eventuell schon bereits gesammelte Daten.
    sort -u -t"-" -k3,1 -k2,2 -k1,3 > daten.log.tmp

8) Die alte Datei durch die neue ersetzen
    mv daten.csv.tmp Strom_Momentanverbrauch.log

9) So sehen dann die Daten nach der Konvertierung aus.

2019-04-03_13:31:00 StromZaehler Strom_Status-02: 268.1
2019-04-03_13:32:00 StromZaehler Strom_Status-02: 267.7
2019-04-03_13:33:00 StromZaehler Strom_Status-02: 220.9
2019-04-03_13:34:00 StromZaehler Strom_Status-02: 218.1
2019-04-03_13:35:00 StromZaehler Strom_Status-02: 215.8
2019-04-03_13:36:00 StromZaehler Strom_Status-02: 215.7


Nun wird hierduch die Datei Strom_Momentanverbrauch.log im FHEM Log Format immer weiter fortgeschrieben.

Hier das kommando zum kopieren in ein Skript (getestet auf RPi2)

{ DvLIR_SID=`curl http://192.168.178.28/getSID.txt?pwd=<Passwort>`;curl http://192.168.178.28/daten.csv?sid=$DvLIR_SID | grep -v "Date" | cut -d";" -f2,3,12 | sed -r -e "s/\\./-/g ; s:([0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]):\1_:g ; s/_\;/_/g ; s/\;/ StromZaehler Strom_Status-02: /g ; s:(^..)-([0-1][0-9])-([0-9][0-9][0-9][0-9])_(.*):\3-\2-\1_\4:g ; s/,/\./g ;" ; cat Strom_Momentanverbrauch.log; } | sort -u -t"-" -k3,1 -k2,2 -k1,3 > daten.log.tmp && mv daten.log.tmp Strom_Momentanverbrauch.log


Viel Spaß
    Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

#12
Hallo zusammen,

auch wenn es etwas exotisch ist, da ich nicht weiss, ob jemand anderes auch noch diesen Lesekopf verwendet, kommt hier mal ein Update.
Der Hintergrund ist, dass ich jetzt einen anderen Zaehler bekommen haben, der auch den eingespeisten Strom der PV-Anlage zaehlt.

Der Zaehlerwechsel war sehr simpel:
1. Ein letztes mal den Zaehlerstand auslesen und automatisch zum Stromanbieter senden.
2. Lesekopf runter nehmen
3. Zaehlerwechsel durch den Netzbetreiber
4. Lesekopf wieder drauf
5. Beim naechsten Lesevorgang wurden dann mehr Register uebermittelt
5.1 httpmod Formatierung anpassen
5.2 Leider hat sich die Reihenfolge der Register etwas verschoben, da die Infoschnittstelle wohl nur belegte Register Uebertraegt.
5.3 Einmalige Neuformatierung der userreadings
6. Und es laeuft :-)

Fuer andere Zaehler wird sich nun der Aufwand weiter verringern, da ja bereits zwei Typen als Muster vorliegen. Eine weitere Variante wuerde dann wohl noch ein Doppeltarifzaehler sein.

neuer Zaehler: eBZ Zweirichtung ET V107


defmod StromZaehler HTTPMOD http://<Ip-Adresse>/data.txt?sid=$sid 120

attr StromZaehler DbLogExclude .*
attr StromZaehler DbLogInclude Strom_Status-01,Strom_Status-02,Strom_Status-03
attr StromZaehler alias StromZaehler
attr StromZaehler event-on-change-reading Strom_Status-01,Strom_Status-02,Strom_Status-03,GridFeedIn,GridConsumption
attr StromZaehler get01Name Strom_Status
attr StromZaehler get01URL http://<Ip-Adresse>/data.txt?sid=$sid
attr StromZaehler get02Name Strom_Info
attr StromZaehler get02URL http://<Ip-Adresse>/info.txt?sid=$sid
attr StromZaehler get03Name Strom_Network
attr StromZaehler get03URL http://<Ip-Adresse>/network.txt?sid=$sid
attr StromZaehler get04Name Strom_System
attr StromZaehler get04URL http://<Ip-Adresse>/system.txt?sid=$sid
attr StromZaehler get05Name Strom_NTP_Test
attr StromZaehler get05URL http://<Ip-Adresse>/ntpTest.cmd?sid=$sid&ntpName=pool.ntp.org
attr StromZaehler get06Name Strom_Daten
attr StromZaehler get06URL http://<Ip-Adresse>/daten.csv?sid=$sid&lines=1940
attr StromZaehler httpVersion 1.1
attr StromZaehler icon measure_power
attr StromZaehler reAuthRegex Melden Sie sich mit Ihrem Kennwort an
attr StromZaehler reading01Name Server-ID
attr StromZaehler reading01Regex ([0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2})
attr StromZaehler reading02Name Zaehlernummer
attr StromZaehler reading02Regex ([0-9]{8})
attr StromZaehler reading03Name Herstellerkennung
attr StromZaehler reading03Regex ((?<=[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]#)[A-Z]{3})
attr StromZaehler reading04Name Net_IP-Adresse
attr StromZaehler reading04Regex ((?<=#[A-Z]{3}#)[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})
attr StromZaehler reading05Name Net_Gateway
attr StromZaehler reading05Regex ((?<=[1-9]#)[1-9]{1,3}\.[1-9]{1,3}\.[1-9]{1,3}\.[1-9]{1,3}(?=#[1-9]))
attr StromZaehler reading06Name Net_DNS-Server
attr StromZaehler reading06Regex ((?<=[0-9]#)[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}(?=#[A-Z]))
attr StromZaehler reading07Name Net_Netzwerkname
attr StromZaehler reading07Regex (DVLIR_[0-9]{6})
attr StromZaehler reading08Name DvLIR_MAC-Adresse
attr StromZaehler reading08Regex (..:..:..:..:..:..)
attr StromZaehler reading09Name Speicherintervall_in_Sekunden
attr StromZaehler reading09Regex ((?<=:..#)[0-9][0-9])
attr StromZaehler reading10Name Aktuell_Datum
attr StromZaehler reading10Regex (..\...\.....(?<=#..\...\.....))
attr StromZaehler reading11Name Aktuell_Zeit
attr StromZaehler reading11Regex ((?=..:..:.. )..:..:..)
attr StromZaehler reading12Name DvLIR_Seriennummer
attr StromZaehler reading12Regex ((?<=\)\#)[0-9]{6})
attr StromZaehler reading13Name DvLIR_Firmware
attr StromZaehler reading13Regex ((?=[0-90-9]\... - ..\...\.....).*..\...\.....)
attr StromZaehler reading14Name data_csv
attr StromZaehler reading14RegOpt s
attr StromZaehler reading14Regex ([0-9]*\;;..\...\.....\;;.*)
attr StromZaehler reading21-10Format %.8s
attr StromZaehler reading21-11Format %.8s
attr StromZaehler reading21-12Format %.8s
attr StromZaehler reading21-13Format %.8s
attr StromZaehler reading21-14Format %.8s
attr StromZaehler reading21-15Format %.8s
attr StromZaehler reading21-16Format %.8s
attr StromZaehler reading21-17Format %.8s
attr StromZaehler reading21-18Format %.8s
attr StromZaehler reading21-19Format %.8s
attr StromZaehler reading21-20Format %.8s
attr StromZaehler reading21-21Format %.8s
attr StromZaehler reading21-4Format %.8s
attr StromZaehler reading21-5Format %.8s
attr StromZaehler reading21-6Format %.8s
attr StromZaehler reading21-7Format %.8s
attr StromZaehler reading21-8Format %.8s
attr StromZaehler reading21-9Format %.8s
attr StromZaehler reading21AutoNumLen 2
attr StromZaehler reading21Name Strom_Status
attr StromZaehler reading21OExpr $val =~ s/,/\./;; $val;;
attr StromZaehler reading21RegOpt g
attr StromZaehler reading21Regex (?:^|#)(16.7.0|[-,0-9]*,[0-9]*|nicht verf|OK|min)
attr StromZaehler reading22AutoNumLen 2
attr StromZaehler reading22Name Strom_Network
attr StromZaehler reading22RegOpt g
attr StromZaehler reading22Regex (?:^|#)(yes|no|(yes#[a-z]|no#[a-z])|[a-z]*\.[a-z]*\.[a-z]{2,3})
attr StromZaehler room Strom->Info,Strom->System
attr StromZaehler showBody 1
attr StromZaehler showError 0
attr StromZaehler sid1IdRegex ([0-9A-F]{32})
attr StromZaehler sid1URL http://<Ip-Adresse>/getSID.txt?pwd=<Passwort>
attr StromZaehler stateFormat {sprintf("\
<TABLE>\
\
<TR>\
  <TD VALIGN=\"TOP\" ALIGN=\"RIGHT\" WIDTH=\"100\">\
    Momentan: %08.2f Watt<br>\
    Bezug: %08.2f kWh<br>\
    Einspeisung: %08.2f kWh<br>\
  </TD>\
\
  <TD VALIGN=\"TOP\" ALIGN=\"RIGHT\" WIDTH=\"70\">\
  </TD>\
</TR>\
\
</TABLE> " ,\
ReadingsVal("$name","Strom_Status-01","?"), \
ReadingsVal("$name","Strom_Status-02","?"), \
ReadingsVal("$name","Strom_Status-03","?")\
)}
attr StromZaehler timeout 5
attr StromZaehler userReadings GridFeedIn:Strom_Status-01.* { ReadingsVal("$NAME","Strom_Status-01",0)<=0 ? ReadingsVal("$NAME","Strom_Status-01",0) : 0},\
GridConsumption:Strom_Status-01.* { ReadingsVal("$NAME","Strom_Status-01",0)>=0 ? ReadingsVal("$NAME","Strom_Status-01",0) : 0}
attr StromZaehler verbose 0

setstate StromZaehler \
<TABLE>\
\
<TR>\
  <TD VALIGN="TOP" ALIGN="RIGHT" WIDTH="100">\
    Momentan: 00000.00 Watt<br>\
    Bezug: 00001.00 kWh<br>\
    Einspeisung: 00091.00 kWh<br>\
  </TD>\
\
  <TD VALIGN="TOP" ALIGN="RIGHT" WIDTH="70">\
  </TD>\
</TR>\
\
</TABLE>



alter Zaehler: EastMeter Q3MA1000 V6.03


define StromZaehler HTTPMOD http://<IP-Adresse>/data.txt?sid=$sid 120

attr StromZaehler DbLogExclude .*
attr StromZaehler DbLogInclude Strom_Status-02,Strom_Status-03
attr StromZaehler alias StromZaehler
attr StromZaehler event-on-change-reading Strom_Status-02,Strom_Status-03,GridFeedIn,GridConsumption
attr StromZaehler get01Name Strom_Status
attr StromZaehler get01URL http://<IP-Adresse>/data.txt?sid=$sid
attr StromZaehler get02Name Strom_Info
attr StromZaehler get02URL http://<IP-Adresse>/info.txt?sid=$sid
attr StromZaehler get03Name Strom_Network
attr StromZaehler get03URL http://<IP-Adresse>/network.txt?sid=$sid
attr StromZaehler get04Name Strom_System
attr StromZaehler get04URL http://<IP-Adresse>/system.txt?sid=$sid
attr StromZaehler get05Name Strom_NTP_Test
attr StromZaehler get05URL http://<IP-Adresse>/ntpTest.cmd?sid=$sid&ntpName=pool.ntp.org
attr StromZaehler get06Name Strom_Daten
attr StromZaehler get06URL http://<IP-Adresse>/daten.csv?sid=$sid&lines=1940
attr StromZaehler httpVersion 1.1
attr StromZaehler icon measure_power
attr StromZaehler reAuthRegex Melden Sie sich mit Ihrem Kennwort an
attr StromZaehler reading01Name Server-ID
attr StromZaehler reading01Regex ([0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2})
attr StromZaehler reading02Name Zaehlernummer
attr StromZaehler reading02Regex ([0-9]{8})
attr StromZaehler reading03Name Herstellerkennung
attr StromZaehler reading03Regex ((?<=[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]#)[A-Z]{3})
attr StromZaehler reading04Name Net_IP-Adresse
attr StromZaehler reading04Regex ((?<=#[A-Z]{3}#)[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})
attr StromZaehler reading05Name Net_Gateway
attr StromZaehler reading05Regex ((?<=[1-9]#)[1-9]{1,3}\.[1-9]{1,3}\.[1-9]{1,3}\.[1-9]{1,3}(?=#[1-9]))
attr StromZaehler reading06Name Net_DNS-Server
attr StromZaehler reading06Regex ((?<=[0-9]#)[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}(?=#[A-Z]))
attr StromZaehler reading07Name Net_Netzwerkname
attr StromZaehler reading07Regex (DVLIR_[0-9]{6})
attr StromZaehler reading08Name DvLIR_MAC-Adresse
attr StromZaehler reading08Regex (..:..:..:..:..:..)
attr StromZaehler reading09Name Speicherintervall_in_Sekunden
attr StromZaehler reading09Regex ((?<=:..#)[0-9][0-9])
attr StromZaehler reading10Name Aktuell_Datum
attr StromZaehler reading10Regex (..\...\.....(?<=#..\...\.....))
attr StromZaehler reading11Name Aktuell_Zeit
attr StromZaehler reading11Regex ((?=..:..:.. )..:..:..)
attr StromZaehler reading12Name DvLIR_Seriennummer
attr StromZaehler reading12Regex ((?<=\)\#)[0-9]{6})
attr StromZaehler reading13Name DvLIR_Firmware
attr StromZaehler reading13Regex ((?=[0-90-9]\... - ..\...\.....).*..\...\.....)
attr StromZaehler reading14Name data_csv
attr StromZaehler reading14RegOpt s
attr StromZaehler reading14Regex ([0-9]*\;;..\...\.....\;;.*)
attr StromZaehler reading21-10Format %.8s
attr StromZaehler reading21-11Format %.8s
attr StromZaehler reading21-12Format %.8s
attr StromZaehler reading21-13Format %.8s
attr StromZaehler reading21-3Format %.8s
attr StromZaehler reading21-5Format %.8s
attr StromZaehler reading21-6Format %.8s
attr StromZaehler reading21-7Format %.8s
attr StromZaehler reading21-8Format %.8s
attr StromZaehler reading21-9Format %.8s
attr StromZaehler reading21AutoNumLen 2
attr StromZaehler reading21Name Strom_Status
attr StromZaehler reading21OExpr $val =~ s/,/\./;; $val;;
attr StromZaehler reading21RegOpt g
attr StromZaehler reading21Regex (?:^|#)(16.7.0|[-,0-9]*,[0-9]*|nicht verf|OK|min)
attr StromZaehler reading22AutoNumLen 2
attr StromZaehler reading22Name Strom_Network
attr StromZaehler reading22RegOpt g
attr StromZaehler reading22Regex (?:^|#)(yes|no|(yes#[a-z]|no#[a-z])|[a-z]*\.[a-z]*\.[a-z]{2,3})
attr StromZaehler room Strom->Info,Strom->System
attr StromZaehler showBody 1
attr StromZaehler showError 0
attr StromZaehler sid1IdRegex ([0-9A-F]{32})
attr StromZaehler sid1URL http://<IP-Adresse>/getSID.txt?pwd=<Passwort>
attr StromZaehler stateFormat {sprintf("\
<TABLE>\
\
<TR>\
  <TD VALIGN=\"TOP\" ALIGN=\"RIGHT\" WIDTH=\"100\">\
    Momentan: %08.2f Watt<br>\
    <br>\
    Gesamt: %08.2f kWh<br>\
  </TD>\
\
  <TD VALIGN=\"TOP\" ALIGN=\"RIGHT\" WIDTH=\"70\">\
  </TD>\
</TR>\
\
</TABLE> " ,\
ReadingsVal("$name","Strom_Status-02","?"), \
ReadingsVal("$name","Strom_Status-03","?")\
)}
attr StromZaehler timeout 5
attr StromZaehler userReadings GridFeedIn:Strom_Status-02.* { ReadingsVal("$NAME","Strom_Status-02",0)<=0 ? ReadingsVal("$NAME","Strom_Status-02",0) : 0},\
GridConsumption:Strom_Status-02.* { ReadingsVal("$NAME","Strom_Status-02",0)>=0 ? ReadingsVal("$NAME","Strom_Status-02",0) : 0}
attr StromZaehler verbose 0


Gruss
     Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

Moin, ich habe ja alle Daten ins DbLog übernommen und jetzt dann endlich die Bereinigung gemacht.
Jetzt passen die Registernamen auch wieder und in der Datenbank sieht es aus, wie ein normaler Zählerwechsel.

MySQL [fhem]> update history set TIMESTAMP=TIMESTAMP,READING='Strom_Status-02' WHERE DEVICE='StromZaehler' and READING='Strom_Status-03' and TIMESTAMP > '2019-01-01 00:00:00' and TIMESTAMP < '2020-01-01 0:00:00' ;

Gruß
   Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick