Neues Modul: Easymeter (ersetzt durch 47_OBIS)

Begonnen von Crawler, 25 Januar 2016, 16:19:10

Vorheriges Thema - Nächstes Thema

Crawler

16.02.16
OBIS ersetzt Easymeter die Hardware bleibt die gleiche
define für z.B. ttyAMA0 mit 9600 7E1 mit
define Strom OBIS /dev/ttyAMA0@9600,7,E,1 
define [name] OBIS[dev@baud,databits,parity,stopbits]
Bilder meines Aufbaus im Anhang die maße müssen nicht ganz stimmen ist schwierig auszumessen

25.01.16---------------------------------------------------------------
Nach langem Basteln habe ich es endlich geschafft mein Modul zu schreiben  ::)
Das Easymeter Modul ist für den Raspberrry Serial und den Easymeter Stromzähler geschrieben.

define mit define [name] Easymeter [dev@baud,databits,parity,stopbits]

z.B. für ttyAMA0
define Strom Easymeter /dev/ttyAMA0@9600,7,E,1 

dafür muss initialUSBCheck auskommentiert werden da sonst FHEM hängen bleibt  :(
# define initialUsbCheck notify global:INITIALIZED usb create
Anschluss des Optokopplers an 3,3V GND und GPIO15(RX) am RaspPi 2.
Ich habe ein altes Telefonkabel mit 6m Länge verwendet.

deswegen wird es wohl auch nur funktionieren wenn Lan devices für die Kommunikation mit Steuergeräten verwendet wird.(keine Ahnung ob und wie USB devices manuell angelegt werden.)
Außerdem liest es alle Telegramme die ankommen!
Bei mir alle 2 sek aber die Last hält sich in Grenzen 2%.

Wer noch ein paar Ideen hat für ein delay attr schreibt mir.
Brauche erstmal Urlaub  :P


Anbei mein Optokoppler und das Modul

27.01.16
neue Version zeigt Einspeisung nur wenn vorhanden
FHEM auf Raspi + HMLan + 14 Aktoren + OBIS(Strom) über GPIO

eldrik

Hi,

danke für das Modul und deine geleistete Arbeit, da ich meinen Easymeter bisher mit einem Perl Script und Umwandlung der Werteausgabe, ins JSON Format, zum einlesen in FHEM per JSONMETER auslese musste ich dieses gleich einmal ausprobieren.  :)

Ohne Anpassung lieferte das Modul bei mir jedoch keine Readings.  :(

Ich lese meinen Easymeter mittels USB to Serial Konverter aus demnach ist mein definestring

define Stromzaehler Easymeter /dev/ttyUSB0@9600,7,E,1

Da die Readings jedoch gefüllt wurden als ich das Modul einfach einmal gegen ein anderes angeschlossenes USB Gerät habe laufen lassen (mysensors  Serial Gateway) habe ich mir einmal den Code von dem Modul weiter angeschaut.

Damit der vom Modul gelesene und weiter zu verarbeitende Buffer berücksichtigt wurde musste ich die folgende Codezeile abändern

if (index($buffer,'!',index($buffer,'/')) >= 294) {

nach

if (index($buffer,'!',index($buffer,'/')) >= 258) {

Grund für den kleineren Buffer ist, dass mein Easymeter mangels Einspeisung auch keine Werte für die Einspeisung ausgibt.

Hier der gelesene Buffer:

/ESY5Q3DE1408 V3.04

1-0:0.0.0*255(0273160165936)
1-0:1.8.0*255(00004934.7095056*kWh)
1-0:21.7.0*255(000038.43*W)
1-0:41.7.0*255(000022.78*W)
1-0:61.7.0*255(000272.64*W)
1-0:1.7.0*255(000333.85*W)
1-0:96.5.5*255(80)
0-0:96.1.255*255(1ESY1160165936)
!

Die Codezeilen für das Auslesen und die Rückgabe des Einspeisereadings habe ich entsprechend auskommentiert, da hier ansonsten Teile der Seriennummer in dem Reading ausgegeben wurden.

Auskommentiert:
my $feedindex = index($buffer, '1-0:2.8.0*255(') + 14;
      my $feed = substr($buffer, $feedindex, 16);
      $feed =~ s/\G0//g;


Auskommentiert:
readingsBulkUpdate($hash,"Einspeisung",$feed);

Für mich passt es jetzt, aber vielleicht könnte man das Modul noch, um ein paar Attribute, erweitern um z.B. angeben zu können, ob der Easymeter mit oder ohne Einspeisung läuft.


Greetz
Eldrik

Crawler

den Gedanken hatte ich auch schon.
Aus der Werte Übergabe aus Attr bin ich aber leider noch nicht ganz schlau geworden.
Manche Module nutzen das event-min-interval was ich auch gerne einsetzen möchte.

Gut zu wissen wie bei dir das Telegramm aussieht.
Anfangs und Endzeichen sind gleich also werde ich mal schauen ob mir da was einfällt.
Habe auch nur die Telegramm Länge festgelegt weil bei mir manchmal Datenfehler auftreten.

Danke fürs Feedback ;-)
FHEM auf Raspi + HMLan + 14 Aktoren + OBIS(Strom) über GPIO

Icinger

Hmmm, wenn ich gewusst hätte, dass es mehrere Geräte gibt, die in diesem Format ihre Energiemessungen senden, hätte ich schon längst ein Modul gemacht.
Mein Voltcraft VSM102 sendet ebenfalls so:

# 1-0:0.0.0*255(GETTONE)   - Eigentumsnummer (max 20 zeichen)
# 1-0:1.8.0*255(17483.88*kWh) - Zählerstand in kWh mit 6 Vor- und 2 Nachkommastellen
# 1-0:2.1.7*255(07568.01*kWh) - momentan eingespeiste Leistung Phase 1
# 1-0:4.1.7*255(02636.12*kWh) - momentan eingespeiste Leistung Phase 2
# 1-0:6.1.7*255(07279.74*kWh) - momentan eingespeiste Leistung Phase 3
# 1-0:21.7.255*255(0000.2264*kW) - momentan bezogene Leistung Phase 1
# 1-0:41.7.255*255(0000.0123*kW) - momentan bezogene Leistung Phase 2
# 1-0:61.7.255*255(0000.1857*kW) - momentan bezogene Leistung Phase 3
# 1-0:1.7.255*255(0000.4252*kW)  - bezogene Leistung, Summe aller Phasen
# 1-0:96.5.5*255(@) - Status - Bit [6] --> 0=Leerlauf, 1=oberhalb Anlauf
#                            Bit [5] --> gesetzt bei Ausfall von L1
#                             Bit [4] --> gesetzt bei Ausfall von L2
#                              Bit [3] --> gesetzt bei Ausfall von L3
#                            Bit [2] --> reserviert, immer 0
#                              Bit [1] --> Telegramm wird synchron imfesten zeitraster gesendet
#                            Bit [0] --> 0=kein Fehler, 1=Fehler
# 0-0:96.1.255*255(11400158) - Seriennummer (max 20 Zeichen)


Habe das bisher als ECMD am laufen, könnte mich aber evtl. am Wochenende über ein Modul stürzen, wenn ihr wollt.
(Oder aber mit Crawler zusammentun)

lg, Stefan

PS: Läuft jetzt seit ca. 2 Jahren so bei mir.
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Crawler

#4
Hatte mehrfach gefragt aber keine Antworten bekommen  ::)

Meiner macht aber - wenn er einspeist und schreibt es nicht wie bei dir in getrennte Werte.
Außerdem macht meiner mehr Nachkommastellen zb.
/ESY5Q3DB1024 V3.04

1-0:0.0.0*255(0272160155556)
1-0:1.8.0*255(00000792.5617691*kWh)
1-0:2.8.0*255(00002394.6904431*kWh)
1-0:21.7.0*255(000013.06*W)
1-0:41.7.0*255(000029.72*W)
1-0:61.7.0*255(000184.51*W)
1-0:1.7.0*255(000227.29*W)
1-0:96.5.5*255(80)
0-0:96.1.255*255(1ESY1160155556)
!


/ESY5Q3DB1024 V3.04

1-0:0.0.0*255(0272160155556)
1-0:1.8.0*255(00000918.3130037*kWh)
1-0:2.8.0*255(00002458.2128718*kWh)
1-0:21.7.0*255(-000925.37*W)
1-0:41.7.0*255(-000910.88*W)
1-0:61.7.0*255(-000657.80*W)
1-0:1.7.0*255(-002494.05*W)
1-0:96.5.5*255(80)
0-0:96.1.255*255(1ESY1160155556)
!

Egal von mir aus kannst gerne weitermachen.
Ist auch ein neuer Standard ist in der PDF beschrieben.
Ich werde wohl mitlesen und hoffentlich viel lernen :D

Hab noch eine kleine Änderung gemacht die automatisch erkennt ob es ein 1 oder 2 Richtungszähler ist bei mir und im Test ging es aber vielleicht kann jemand anderes das mal testen
FHEM auf Raspi + HMLan + 14 Aktoren + OBIS(Strom) über GPIO

Icinger

Guten Morgen,

ZitatHatte mehrfach gefragt aber keine Antworten bekommen
Hatte ich nirgends gelesen, aber egal....

Wie gesagt, am Wochenende gerne......Bis dahin bin ich leider betrieblich ziemlich im Stress.

lg, Stefan
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

eldrik

Zitat von: Icinger am 26 Januar 2016, 20:31:13
Hmmm, wenn ich gewusst hätte, dass es mehrere Geräte gibt, die in diesem Format ihre Energiemessungen senden, hätte ich schon längst ein Modul gemacht.
Mein Voltcraft VSM102 sendet ebenfalls so:

# 1-0:0.0.0*255(GETTONE)   - Eigentumsnummer (max 20 zeichen)
# 1-0:1.8.0*255(17483.88*kWh) - Zählerstand in kWh mit 6 Vor- und 2 Nachkommastellen
# 1-0:2.1.7*255(07568.01*kWh) - momentan eingespeiste Leistung Phase 1
# 1-0:4.1.7*255(02636.12*kWh) - momentan eingespeiste Leistung Phase 2
# 1-0:6.1.7*255(07279.74*kWh) - momentan eingespeiste Leistung Phase 3
# 1-0:21.7.255*255(0000.2264*kW) - momentan bezogene Leistung Phase 1
# 1-0:41.7.255*255(0000.0123*kW) - momentan bezogene Leistung Phase 2
# 1-0:61.7.255*255(0000.1857*kW) - momentan bezogene Leistung Phase 3
# 1-0:1.7.255*255(0000.4252*kW)  - bezogene Leistung, Summe aller Phasen
# 1-0:96.5.5*255(@) - Status - Bit [6] --> 0=Leerlauf, 1=oberhalb Anlauf
#                            Bit [5] --> gesetzt bei Ausfall von L1
#                             Bit [4] --> gesetzt bei Ausfall von L2
#                              Bit [3] --> gesetzt bei Ausfall von L3
#                            Bit [2] --> reserviert, immer 0
#                              Bit [1] --> Telegramm wird synchron imfesten zeitraster gesendet
#                            Bit [0] --> 0=kein Fehler, 1=Fehler
# 0-0:96.1.255*255(11400158) - Seriennummer (max 20 Zeichen)


Habe das bisher als ECMD am laufen, könnte mich aber evtl. am Wochenende über ein Modul stürzen, wenn ihr wollt.
(Oder aber mit Crawler zusammentun)

lg, Stefan

PS: Läuft jetzt seit ca. 2 Jahren so bei mir.

Hi,

ich fände ein generell per FHEM verteiltes Modul für OBIS "konforme" Zähler über die Infrarotschnittstelle großartig :)

Greetz
Eldrik

eldrik

Zitat von: Crawler am 27 Januar 2016, 00:00:47
Hab noch eine kleine Änderung gemacht die automatisch erkennt ob es ein 1 oder 2 Richtungszähler ist bei mir und im Test ging es aber vielleicht kann jemand anderes das mal testen

Hab die geänderte Version übernommen, konnte nichts negatives feststellen.

Greetz
Eldrik

Icinger

Zitatich fände ein generell per FHEM verteiltes Modul für OBIS "konforme" Zähler über die Infrarotschnittstelle großartig

So stell ichs mir auch vor, ja. Wobei ein paar Tweaks auch rein müssen, weil eben zB mein VSM102 sich nicht 100%ig an die OBIS hält.
Aber das lässt sich evtl. mit einem Typ-Attribut lösen, das man dann ben auf zB "Voltcraft" stellt oder so.
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Icinger

Mal ne Frage: Das Easymeter liefert die Daten periodisch, ohne die Übertragung anstoßen zu müssen?
Bei meinem VSM102 muss ich die Sendung erst immer mit einem Datenpaket auslösen.

Da muss ich mir dann was einfallen lassen, wie ich das flexibel machen kann.
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

eldrik

#10
Hi,

der Easymeter sendet meine ich alle 2 Sekunden seine Daten!

Edit: Jupp steht auch in der oben verlinkten Spezifikation :)

Greetz
Eldrik

Icinger

#11
So, also wie versprochen hier mal eine neue Modul-Version: 47_OBIS.pm

Da sich der Easymeter auch nicht 100%ig an die OBIS-Spezifikation hält, musste ich ein wenig tricksen.
Bislang ist auch Gas noch nicht implementiert.

Neu ist:
-) Attribute offset_energy und offset_feed:
     Damit kann der Zählerstand an einen anderen Zähler angepasst werden.
     (Hintergrund: Mein Zähler hängt hinter dem offiziellen Zähler meines EVU. Durch den Offset habe ich jetzt im Reading den selben Stand wie am offiziellen Zähler)

-) Wird das OBIS mit Argument "none" initialisiert, kann es als zweistufiges Modul verwendet werden.
     Ich habe hierzu für meinen Voltcraft VSM102 ein zweites Modul (46_vc_VSM.pm) geschrieben, welches alle <interval> Sekunden (Vorgabe 600 Sek.) den Zähler aktiv abfragt und an das OBIS dispatcht.


NEUE VERSION:
Bei define kann nach der Schnittstelle zusätzlich das Gerät angegeben werden. Bislang ist
-) "VSM102" für den Voltcraft VSM102
-) "MT681" für das ISKRA MT681
verfügbar.

Für weitere Ideen und Ergänzungen bin ich gerne offen. Nur her damit, falls ihr noch was braucht.

Offene Fragen:
     -) Soll ich bei der Einspeisung das "-" wegmachen oder drinnen lassen?
     -) Würde gerne das Status-Byte in einzelne Readings aufdröseln, ABER:
          Mein Voltcraft sendet den Status als einzelnes Byte, das Easymeter die Zahl als Hex.
          Keine Ahnung, was davon richtig bzw. "Standard" ist.
          Die einzelnen Bits haben jedenfalls die selbe Bedeutung.

Wenn sich ein paar Leute finden, die das Testen, stelle ich das dann gerne ins offizielle Repo ein.

lg, Stefan
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

eldrik

Hi,

die 47_OBIS.pm habe ich bei mir, für meinen Easymeter, ohne Probleme im Einsatz.

Greetz
Eldrik

Crawler

#13
Geht bei mir bisher auch hoffen wir morgen auf ein wenig Sonne  :P

L1 bis L3 haben bei mir noch führende Nullen ist das gewollt?
Ich hätte in state gerne Lgesamt ist das möglich?
Eine zeitliche Beschränkung der Readings macht das Sinn?

Ein schönes Beispiel wie man RegEX einsetzen kann.  :D
FHEM auf Raspi + HMLan + 14 Aktoren + OBIS(Strom) über GPIO

Icinger

Habe euch oben eine neue 47_OBIS angehängt.

1) Keine führenden Nullen mehr bei den Readings Werten.
2) Attribut "channels", um die Kanal-Zuordnung zu vereinfachen.
1-0:21.7.0*255(-000925.37*W)
1-0:41.7.0*255(-000910.88*W)
1-0:61.7.0*255(-000657.80*W)
1-0:1.7.0*255(-002494.05*W)

Die 21, 41, 61 und 1 sind lt. OBIS-Standard Messgrößen.
Die Modul-Interne Zuordnung ist: "21"=>"L1","41"=>"L2","61"=>"L3","2"=>"L1","4"=>"L2","6"=>"L3","1"=>"total"
Kann aber jederzeit mittels attr myObis channels "21"=>"L1","41"=>"L2","61"=>"L3","2"=>"L1","4"=>"L2","6"=>"L3","1"=>"total" geändert werden.

3) Für L-egsamt im State: Bitte stateformat nutzen, also einfach ein
attr myOBIS stateFormat total_energy

Was meinst du mit zeitliche Beschränkung?
Dass nur alle x Sekunden ein Reading gemacht wird?
Um zB nicht zuviele Daten zu Loggen, sollte es ausreichen, ein event-min-interval zu setzen.

lg, Stefan
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho