47_OBIS.pm Erweiterung für IEC 62056 Geräte BG-ETech DRS110M und Pafal 20ec3gr

Begonnen von patmen, 25 November 2019, 11:38:18

Vorheriges Thema - Nächstes Thema

patmen

Hallo,

ich nutze das OBIS Modul und möchte konstruktiv an zwei Erweiterungen mitwirken.

Es geht einmal um den Hutschienenzähler DRS110M BG-Etech.
https://www.bg-etech.de/download/manual/DRS110M.pdf
Ich habe einmal alle OBIS-Typen durchprobiert und scheinbar ist dafür noch keine Unterstützung vorhanden.

Zum anderen geht es um den elektronischen Haushaltszähler Pafal 20ec3gr . Der funktioniert im Prinzip als MeterType=VSM102 allerdings scheint noch keine Unterstützung für die Baudratenumschaltung von 300 auf 9600 vorhanden zu sein.
Edit: Link zum Produktdatenblatt
http://www.apator.com/uploads/files/de/electricity/ec-3-de.pdf

Technisch ist das bereits alles entwickelt. Ich habe vor Jahren ein Python Projekt dafür gemacht.
https://github.com/menschel/pyehz/blob/master/iec62056.py
Als technische Referenz kann ich die folgende Seite empfehlen.
http://manuals.lian98.biz/doc.de/html/g_iec62056_struct.htm#IEC%2062056-21%20:%20Telegramm%20Struktur

Beschreibung der Nachrichten findet man sonst in der Norm ab Seite 41.
http://read.pudn.com/downloads147/doc/comm/637727/IEC%2062056-21-2002.pdf

Technische Details zu DRS110M:
Der Hutschinenzähler "DD10-S08" vom Hersteller YTL wurde von BG-Etech unter dem Namen DRS110M vertrieben.
Anschluss erfolgt über Serielle Leitung RS-485 mit fester Baudrate 9600 Baud 7E1 . Protokoll ist IEC62056 Protocol A bzw. IEC1107.

Echte Dokumentation ist schwer zu finden. Bei genauerer Suche findet man ab 2012 Beiträge in diversen Foren und Blogs.
https://www.elektronik-kompendium.de/forum/forum_entry.php?id=176634&page=0&category=all&order=time
https://passer-domesticus-in-sole.blogspot.com/2012/09/rs485-en-modbus-en-nu.html

Im Volkszähler Projekt wurde ein Perl Skript veröffentlicht.
https://wiki.volkszaehler.org/hardware/channels/meters/power/eastron_drs155m

Was man so als Auslesedaten bekommt:
$ python3 iec62056.py -c readout_drs110m -i 1613300152
Voltage:227.2V
Current:0.0A
Frequency:50.0Hz
Active Power:0.0kW
Reactive Power:0.0VAr
Apparent Power:0.0VA
Active Energy:4888Wh
Time:19112703192714 <-- Das Datumformat ist "%y%m%d0%w%H%M%S" also Jahr, Monat, Tag, Wochentag 00(Sonntag)...06(Samstag), Stunde, Minute, Sekunde
Temperature:16°C <-- Bei der Temperatur hat der Entwickler einen Bug eingebaut. Da kommt quasi die Temperatur als Hex Wert, davon jeweils eine Stelle und mit 0x30 aufaddiert als Konvertierung nach ASCII.
Serial Port:0
Baudrate:4
Meter ID:1613300152

Auszugsweise die Kommunikation  mit dem Zähler Nummer 1613300152:
>> "/?001613300152!\r\n" entspricht /?001613300152!<CR><LF>
wird nach dem zweiten Mal senden beantwortet mit
<< "/YTL:001613300152\r\n" entspricht /YTL:001613300152<CR><LF>
Hersteller YTL , ungültiger Baudraten Identifier ":" daher Protocol A , Nummer 1613300152

danach schickt man das ACK 0x06 mit dem ungültigen Baudraten Identifier ":" zurück um in den Programming Mode zu gelangen.
>> "\x060:1\r\n" entspricht "<ack>0:1<CR><LF>"

daraufhin kommt die Passwortabfrage vom Gerät als P0 Nachricht zurück
<< "\x01P0\x02(00000000)\x03`" entspricht <SOH>P0<STX>(00000000)<ETX><BCC>

danach schickt man das Passwort (Werkseitig 0) als P1 Nachricht zum Zähler
>> "\x01P1\x02(00000000)\x03a" entspricht <SOH>P1<STX>(00000000)<ETX><BCC>

wird bestätigt mit
<< "\x06" entspricht <ack>

Danach kann man die einzelnen Register per R1 Nachricht lesen, beispielhaft für Register 0
>> "\x01R1\x0200000000()\x03c" entspricht  <SOH>R1<STX>(00000000)<ETX><BCC>

darauf bekommt man eine Antwort
<< "\x0200000000(2272)\x03\x07" entspricht <STX>00000000(2272)<ETX><BCC>

Wenn man fertig ist sollte man sich mit B0 vom Gerät abmelden
>> "\x01B0\x03q"  entspricht <STX>B0<ETX><BCC>



Technische Details zu Pafal 20ec3gr:
Wird über die optische D0 Schnittstelle ausgelesen. Variable  Baudrate mit 7E1, initial bei 300 Baud, kann man umschalten auf 9600 Baud, wenn man in der acknowledge_option_select Nachricht das entsprechende Flag setzt. Protokoll ist IEC62056 Protocol C . Hier fehlt im Prinzip nur die Umschaltung der Baudrate. Die Auslesedaten sind eh sehr bescheiden. Ich verwende einen USB-IR Adapter aus dem Volkszähler Projekt an einem Raspberry Pi Zero via ser2net.
https://wiki.volkszaehler.org/hardware/controllers/ir-schreib-lesekopf-usb-ausgang

Gruß,
Patrick


Ganz Großes Edit: Einmal sortiert und zusammengefasst.

patmen

Hallo nochmal,

ich habe den funktionalen Teil nun in Perl nachprogrammiert und in ein Github Repo gepackt.
https://github.com/menschel/drs110m_perl/blob/master/test_drs110m.pl

#edit: Beispielausgabe
$ perl test_drs110m.pl
         cosphi : 0.585
        Current : 0.3
   Active Power : 40
           Time : 2019-12-22 17:22:05
Reactive Power : 0
  Active Energy : 16
        Voltage : 227.8
Apparent Power : 80
    Temperature : 28
      Frequency : 50


Gruß,
Patrick

patmen


Ralf_62

Hallo,
ich hoffe Du bist bei Deinem Projekt weitergekommen und kannst mir weiterhelfen. Ich habe auch einen Pafal 20EC3gr Zähler und würde den auch gerne mit dem OBIS Modul auslesen.
Kannst Du mir einen Rat geben, bzw. hast Du schon eine Erweiterung fertig?
Danke und viele Grüße
Ralf

patmen

Sorry, hab keine E-Mail Benachrichtigung bekommen, dass es hier eine Antwort gab.

Das Thema DRS110M wartet auf Integration seitens Maintainer, @Icinger , ist schon 'ne Weile her.

Der Pafal ist seit gut einem Jahr in Betrieb.

Wenn der IR Kopf auf dem gleichen Gerät wie FHEM läuft:

define Stromzaehler OBIS <serial>@300,7,E,1 VMS102 9600
es empfiehlt sich eine definition per ID, also sowas in der Art.
/dev/serial/by-id/usb-Silicon_Labs_CP2104_USB_to_UART_Bridge_Controller_0072D0A9-if00-port0


Wenn du ser2net nutzt:
   
define Stromzaehler OBIS  <HOSTNAME>:<PORT>@300,7,E,1 VSM102

Guzzi-Charlie

Hallo Patrick,

ich schlage mich nun schon über 6 Jahre mit den DRS110M-Zählern herum. Seit der Installation habe ich schon mehrere Versuche unternommen diesen Zählern ihre Daten zu entlocken. Außer der Seriennummer und dem Herstellernamen ist mir nichts weiter gelungen. Seither lese ich die Daten der 44 Zähler einmal im Monat manuell ab und trage die Werte in meine Excel-Tabelle ein. So hatte ich mir das bei der Installation 2015 natürlich nicht gedacht, aber ich hatte anderes zu tun als mich immer wieder mit diesen "Schei..." Zählern herumzuärgern.

Im Zuge der Installation einer weiteren PV-Anlage mit Batteriespeicher, digitalen EVU-und weiteren Modbus-Zählern (die alle wunderbar ihre Daten per RS485-Adapter über D1-Mini/USB-Adaptern an FHEM senden) habe ich mal wieder nach Lösungsmöglichkeiten gesucht die "alten" DRS110M vielleicht doch noch zur Datenhergabe bewegen zu können. Dabei bin ich auf dieses Thema gestoßen.

Ich habe mir dann von Github das Modul geholt und wollte es installieren, aber es gab eine Fehlermeldung über ein fehlendes Modul "Can't locate POSIX/strptime.pm in @INC (you may need to install the POSIX::strptime module)..."

Kannst Du mir sagen was es damit auf sich hat?
- RasPi 5: Cuno-V2 -2x KS300,JeeLink -13x EC3000
- Stromzähler: 6x SDM120M,9x XTM100A,38x DRS110M,3x eHz
- LAN: IT-GW 34x RMF-R1(Roll-Mot.),- 1x Loxone MSgo
- WLAN: 89x Shelly,12x Gosund SP111,16x D1-Mini,15x Sonoff Basic,85x 1wire T-Sens.
- DECT: 6x DECT200,11x DECT301,-HmIP: 3x FalmotC12,16x WTH2

patmen

TL:DR

https://perlmaven.com/how-to-install-a-perl-module-from-cpan#debian

http://deb.perl.it/debian/cpan-deb/#q=POSIX%3A%3Astrptime

sudo apt-get install libposix-strptime-perl

EDIT: Ich hab übrigens noch zwei Stück rumliegen, wenn jemand Ersatz braucht.

Guzzi-Charlie

Hallo Patrick,

vielen Danke für die schnelle Antwort.

Ich habe jetzt das fehlende Paket nachinstalliert. Das hat auch funktioniert (soweit ich das beurteilen kann).

Dann habe ich folgendes gemacht:

  • von Github den Code von "iec1107" nach notepad++ kopiert
  • als iec1107.pm abgespeichert
  • ins ...fhem/FHEM Verzeichnis kopiert
  • im FHEMWEB über die Eingabezeile per "reload" aktiviert
Dabei kam es zu folgender Fehlermeldung: Undefined subroutine &main::iec1107_Initialize called at fhem.pl line 2623.
# Get the name of the initialize function. This may differ from the
    # filename as sometimes we live on a FAT fs with wrong case.
    my $fnname = $m;
    foreach my $i (keys %main::) {
      if($i =~ m/^(${m})_initialize$/i) {
        $fnname = $1;
        last;
      }
    }
    &{ "${fnname}_Initialize" }(\%hash);      --> das ist bei mir die Zeile 2623
    $m = $fnname;
    return undef;
  };


Habe ich da grundsätzlich etwas falsch gemacht, oder woran liegt das?
- RasPi 5: Cuno-V2 -2x KS300,JeeLink -13x EC3000
- Stromzähler: 6x SDM120M,9x XTM100A,38x DRS110M,3x eHz
- LAN: IT-GW 34x RMF-R1(Roll-Mot.),- 1x Loxone MSgo
- WLAN: 89x Shelly,12x Gosund SP111,16x D1-Mini,15x Sonoff Basic,85x 1wire T-Sens.
- DECT: 6x DECT200,11x DECT301,-HmIP: 3x FalmotC12,16x WTH2

patmen

Versuchst du ganz zufällig, das perl modul in FHEM direkt zu nutzen?
Das kann nicht funktionieren. Das ist nicht kompatibel zu FHEM geschrieben.
Ich habe bislang keine vernünftige API Definition für Devices in FHEM gefunden.


git clone https://github.com/menschel/drs110m_perl.git
cd drs110m_perl
nano test_drs110m.pl

In Zeile 13 trägst du deinen Seriellen Port ein.

my $port = Device::SerialPort->new("/dev/ttyUSB0") || die $!;


in Zeile 25, die Seriennummern deiner Zähler.


my @ids = (1613300152,1613300153);

STRG+O
ENTER


perl test_drs110m.pl


Guzzi-Charlie

Hallo Patrick,

ja, genau das habe ich gemacht. Das war dann wohl ein fettes Mißverständnis. Ich dachte Dein Modul "iec1107.pm" ist ein FHEM-Modul.

Wenn das nicht so ist, dann stehe ich allerdings wieder komplett bei NULL.

Mein Ziel ist es ja diese Zähler a) überhaupt auszulesen und b) dann in FHEM zu integrieren.

Wie kann ich das erreichen? Ich habe keine Ahnung wie ich das angehen müßte. Vielleicht kannst Du mir dabei ja helfen. Das wäre natürlich klasse und würde mein über 6-jähriges Ärgernis mit diesen Zählern beenden. Wenn es nicht soviel Geld und Arbeit wäre hätte ich die Zähler schon längst durch andere ersetzt.
- RasPi 5: Cuno-V2 -2x KS300,JeeLink -13x EC3000
- Stromzähler: 6x SDM120M,9x XTM100A,38x DRS110M,3x eHz
- LAN: IT-GW 34x RMF-R1(Roll-Mot.),- 1x Loxone MSgo
- WLAN: 89x Shelly,12x Gosund SP111,16x D1-Mini,15x Sonoff Basic,85x 1wire T-Sens.
- DECT: 6x DECT200,11x DECT301,-HmIP: 3x FalmotC12,16x WTH2

patmen

Da musst du mal laut genug nach dem MOD rufen.

Grundsätzlich ist das PERL Modul seit 2 Jahren fertig und wartet die Integration in ein vorhandenes FHEM Modul.

Der Funktionsnachweis ist da, es muss nur jemand in die vorhandene FHEM API einbauen.

Ich laufe den Leuten nicht mehr hinterher.

Guzzi-Charlie

Hallo Patrick,

leider habe ich von Perl und den Zusammenhängen zu FHEM keine Ahnung. Wenn ich Dich richtig verstehe, dann läßt sich Dein "Modul" so für FHEM gar nicht nutzen, oder nur über den Umweg einer separaten Installation in einer anderen Umgebung?? Wie nutzt Du das denn?
Den Maintainer @Icinger kann ich gerne mal anschreiben. Gab es denn von dort in den zwei Jahren irgendwelche Reaktionen oder Einwände warum es nicht released wurde?

Jetzt hatte ich schon Licht am Ende des Tunnels für meine Zähler gesehen und nun war das wieder (noch) nichts.
- RasPi 5: Cuno-V2 -2x KS300,JeeLink -13x EC3000
- Stromzähler: 6x SDM120M,9x XTM100A,38x DRS110M,3x eHz
- LAN: IT-GW 34x RMF-R1(Roll-Mot.),- 1x Loxone MSgo
- WLAN: 89x Shelly,12x Gosund SP111,16x D1-Mini,15x Sonoff Basic,85x 1wire T-Sens.
- DECT: 6x DECT200,11x DECT301,-HmIP: 3x FalmotC12,16x WTH2

patmen

Von Icinger habe ich seit 2 Jahren keine Rückmeldung, er hatte wohl privat 'ne Menge um die Ohren.

Ich nutze das Modul selbst gar nicht. Es ist als Proof-of-Concept entstanden und das Projekt ist tot, u.a. auch weil die Zähler urplötzlich nicht mehr lieferbar waren.
Die Zähler sind eigentlich spitze, sicher die Anschlüsse hätte man besser machen können, aber wo bekommt man schon einen 1TE Zähler mit 10A Nennstrom?!
Diese 5A Nachfolger sind einfach nur lächerlich.

Du kannst das Skript einfach per Kommandozeile aufrufen und es schreibt die Daten der einzelnen Zähler nacheinander auf.

Guzzi-Charlie

Wie gesagt, ich habe 38 Stück von den Dingern installiert (für jeden Stromkreis Einen) und kann die bisher (seit 6 Jahren) nur händisch auslesen. Das mit den Anschlüssen ist zwar nicht gerade toll, aber mit der richtigen Lösung kein Problem. Ich habe dafür einfach 6,3mm Flachkabelschuhe auf die Adern gekrimpt. Da sitzen die Schrauben perfekt drauf und es kann auch nichts verrutschen.

Ich habe noch eine Menge andere Zähler (XTM100A, SDM120M, ABB B23) und alle lassen sich problemlos per Modbus-Protokoll auslesen, nur die DRS110 nicht. Wegen dem IEC1107-Protokoll und anderer Zicken.

Ich werde den Maintainer Icinger nach Weihnachten mal anschreiben. Vielleicht habe ich ja Glück und er kümmert sich doch noch.

ZitatSkript einfach per Kommandozeile aufrufen
Von welcher Kommandozeile? Einer Python-Installation? Da hab ich leider keine Ahnung von.

Ich danke Dir erstmal und will Dich an Weihnachten auch nicht länger stören, aber wenn Du die nächsten Tage nochmal Zeit hast, dann kannst Du mir die Vorgehensweise ja vielleicht mal detailliert erklären.
- RasPi 5: Cuno-V2 -2x KS300,JeeLink -13x EC3000
- Stromzähler: 6x SDM120M,9x XTM100A,38x DRS110M,3x eHz
- LAN: IT-GW 34x RMF-R1(Roll-Mot.),- 1x Loxone MSgo
- WLAN: 89x Shelly,12x Gosund SP111,16x D1-Mini,15x Sonoff Basic,85x 1wire T-Sens.
- DECT: 6x DECT200,11x DECT301,-HmIP: 3x FalmotC12,16x WTH2

patmen

ZitatIch habe dafür einfach 6,3mm Flachkabelschuhe auf die Adern gekrimpt.
Jupp, die Methode habe ich auch gewählt. Der Hersteller hätte einfach Klemmhalter mit V-Ausschnitt einbauen sollen, so wie bei den Wago Reihenklemmen bis 4mm². Dann wäre das ein perfektes Produkt.

ZitatVon welcher Kommandozeile?
Die ganz normale Bash, die du bei jedem Raspberry Pi hast.
Nennt sich auch Terminal.

Das test_drs110m.pl ist ein Shell Skript. Wenn du die Bash gefunden hast, einfach stupide die Kommandos aus dem vorherigen Beitrag abtippen.