Stromzähler DRS155M über RS485 Auslesen

Begonnen von fischle, 21 Dezember 2013, 00:07:21

Vorheriges Thema - Nächstes Thema

fischle

Hallo,
ich bin neu bei dem Thema FHEM. Mein Ziel ist es, mehrere Stromzähler DRS155M und SDM630M über RS485 auszulesen.

Um mir den Aufwand zu sparen hier das Rad neu zu erfinden, wollte ich fragen, ob jemand schon ein Modul zum Auslesen der Zähler geschrieben hat, bzw. welches Modul sich als gute Ausgangslage zum Anpassen eignet?

Man muss an das Modul einen Mix aus Hex (Zeilenumbruch, Start, ESC)- und ASCI (Adresse des Zählers) Zeichen senden und am Ende eine BCC Checksumme anhängen. Die Antwort kommt dann auch gemischt und muss eben interpretiert werden.

Am PC mit USB-RS485 Adapter habe ich das ganze schon hinbekommen, nun soll es die Fritzbox automatisiert übernehmen.

Hier noch der Mitschnitt einer Kommunikation:
https://gist.github.com/4231981

Perl-Script zum Auslesen des Zählers
http://pastebin.com/WbBStBd9

Über Tipps, in welche Richtung ich weitersuchen kann, wäre ich dankbar.

Fabian
RPi,
- USB RS485 Adapter für Stromzähler DRS155M und SDM630M-DC (B+G E-Tech)
- Viesmann KO2B Heizung mit selbstbau Optolink Adapter
- Mi-Light WiFi-Bridge V4, WW/CW LED-Birne

fischle

Hallo,
inzwischen bin ich etwas weiter gekommen, ich habe meinen USB auf RS485 Adapter über ECMD eingebunden und kann nun über

get ADAPTERNAME raw

auch werte auf die Schnitstelle schreiben und lesen. Zum teste habe ich nun erst mal am anderen Ende noch mal einen Adapter angeschlossen, mit dem ich am PC sehen kann, was ich so rausschreiben.

Funktioniert so weit so gut.

Nun habe ich aber das Problem, dass ich zum Auslesen des Stromzählers gemischt hex und asci schreiben muss, z.B.

0x01 R1 0x02 00000000() 0x03 0x63

Kann mir jemand einen guten Tipp geben, wie ich das der Funktion übergebe? Ich habe schon mit chr(0x03) probiert, das gibt er mir aber auch immer als Text aus :-(

Vielen Dank schon mal
RPi,
- USB RS485 Adapter für Stromzähler DRS155M und SDM630M-DC (B+G E-Tech)
- Viesmann KO2B Heizung mit selbstbau Optolink Adapter
- Mi-Light WiFi-Bridge V4, WW/CW LED-Birne

fischle

... was ich vergessen habe, ich gebe die Befehle gerade händisch per Putte in die FHEM Konsole ein.
RPi,
- USB RS485 Adapter für Stromzähler DRS155M und SDM630M-DC (B+G E-Tech)
- Viesmann KO2B Heizung mit selbstbau Optolink Adapter
- Mi-Light WiFi-Bridge V4, WW/CW LED-Birne

fischle

So, inzwischen bin ich schon um einiges weitergekommen. Ich habe eine stromzaehler.classdef angelegt


get Info cmd {"/?!".chr(0x0D)}
get ProgMode cmd {chr(0x06)."0:1".chr(0x0D)}
get SetPwd cmd {chr(0x01)."P1".chr(0x02)."(00000000)".chr(0x03).chr(0x61).chr(0x0D)}
get Voltage cmd {chr(0x01)."R1".chr(0x02)."00000000()".chr(0x03).chr(0x63).chr(0x0D)}
get Current cmd {chr(0x01)."R1".chr(0x02)."00000001()".chr(0x03).chr(0x62).chr(0x0D)}


Meine fhem.cfg sieht wie folgt aus:

define RS232 ECMD serial /dev/ttyUSB0@9600
attr RS232 classdefs Stromzahler=./stromzaehler.classdef
define Zaehl ECMDDevice Stromzahler
attr Zaehl room Wohnzimmer


In der ECMD... habe ich die Serielle Schnittstelle direkt auf 7bit und gerade parität umgestellt - gefällt mir noch nicht so richtig, tuts aber mal fürs erste.

Jetzt kann ich über set Zaehl Info mir die Info vom Stromzähler ausgeben lassen. Das Problem ist nun nur, dass die Funktion manchmal zu schnell eine Rückgabewert ausgibt, bevor die Antwort vom Stromzähler schon da ist. Auf meinem Parallel angeschlossenen Terminal sehe ich die richtige Antwort, fhem zeigt mir manchmal die Werte von der Abfrage davor an. Kann mir jemand helfen die "Wartezeit" zu erhöhen?

Vielen Dank

Fabian
RPi,
- USB RS485 Adapter für Stromzähler DRS155M und SDM630M-DC (B+G E-Tech)
- Viesmann KO2B Heizung mit selbstbau Optolink Adapter
- Mi-Light WiFi-Bridge V4, WW/CW LED-Birne

fischle

... um das ganze mal wieder weiter zu führen, und andere die den Zähler auslesen wollen zu unterstützen:
Ich habe es inzwischen geschafft, den Zähler korrekt auszulesen. Ich habe in der 66_ECMD.pm die ECMD_ReadAnwer angepasst um vor dem auslesen der Schnittstelle noch 100ms zu warten. Das ganze fuktioniert nun ziemlich zuverlässig, vielleicht könnte man das Warten noch verkürzen, war für mich aber nicht wichtig.

Diese sieht jetzt wie folgt aus:

sub
ECMD_ReadAnswer($$)
{
  my ($hash, $arg) = @_;

  #Log 5, "ECMD reading answer for get $arg...";

  return ("No FD", undef)
        if(!$hash || ($^O !~ /Win/ && !defined($hash->{FD})));

  my ($data, $rin) = ("", '');
  my $buf;
  my $to = 3;                                         # 3 seconds timeout
  $to = $hash->{RA_Timeout} if($hash->{RA_Timeout});  # ...or less
  #Log 5, "Timeout is $to seconds";
  select(undef, undef, undef,0.1);   #sleep for 100ms
  for(;;) {

        return ("Error: device lost when reading answer for get $arg", undef)
                if(!$hash->{FD});

        vec($rin, $hash->{FD}, 1) = 1;
        my $nfound = select($rin, undef, undef, $to);
        if($nfound < 0) {
                next if ($! == EAGAIN() || $! == EINTR() || $! == 0);
                my $err = $!;
                ECMD_Disconnected($hash);
                return("Error reading answer for get $arg: $err", undef);
        }
        return ("Error: timeout reading answer for get $arg", undef)
              if($nfound == 0);

      $buf = ECMD_SimpleRead($hash);
      return ("No data", undef) if(!defined($buf));

      if($buf) {
        chomp $buf; # remove line break
        Log 5, "ECMD (ReadAnswer): $buf";
        $data .= $buf;
        }
       return (undef, $data)
  }
}


meine stromzaehler.classdef sieht inzwischen so aus:

get Info cmd {"/?!".chr(0x0D)}

get ProgMode cmd {chr(0x06)."0:1".chr(0x0D)}

get SetPwd cmd {chr(0x01)."P1".chr(0x02)."(00000000)".chr(0x03).chr(0x61).chr(0x0D)}

get U cmd {chr(0x01)."R1".chr(0x02)."00000000()".chr(0x03).chr(0x63).chr(0x0D)}
get U postproc {(substr $_, 10, 4)/10;}

get I cmd {chr(0x01)."R1".chr(0x02)."00000001()".chr(0x03).chr(0x62).chr(0x0D)}
get I postproc {(substr $_, 10, 4)/10;}

get Freq cmd {chr(0x01)."R1".chr(0x02)."00000002()".chr(0x03).chr(0x61).chr(0x0D)}
get Freq postproc {(substr $_, 10, 4)/10;}

get P_Wirk cmd {chr(0x01)."R1".chr(0x02)."00000003()".chr(0x03).chr(0x60).chr(0x0D)}
get P_Wirk postproc {(substr $_, 10, 4)*10;}

get P_Blind cmd {chr(0x01)."R1".chr(0x02)."00000004()".chr(0x03).chr(0x67).chr(0x0D)}
get P_Blind postproc {(substr $_, 10, 4)*10;}

get P_Schein cmd {chr(0x01)."R1".chr(0x02)."00000005()".chr(0x03).chr(0x66).chr(0x0D)}
get P_Schein postproc {(substr $_, 10, 4)*10;}

get cosPhi cmd {chr(0x01)."R1".chr(0x02)."00000006()".chr(0x03).chr(0x65).chr(0x0D)}
get cosPhi postproc {(substr $_, 10, 4)/1000;}

get Wh cmd {chr(0x01)."R1".chr(0x02)."00000010()".chr(0x03).chr(0x62).chr(0x0D)}
get Wh postproc {(substr $_, 10, 8);}

#Eingespeiste Energie
get negWh cmd {chr(0x01)."R1".chr(0x02)."00000020()".chr(0x03).chr(0x61).chr(0x0D)}
get negWh postproc {(substr $_, 10, 8);}

get RTC cmd {chr(0x01)."R1".chr(0x02)."00000031()".chr(0x03).chr(0x61).chr(0x0D)}
get RTC postproc {(substr $_, 10, 12);}

get Temperatur cmd {chr(0x01)."R1".chr(0x02)."00000032()".chr(0x03).chr(0x62).chr(0x0D)}
get Temperatur postproc {(substr $_, 10, 4);}

get Serial cmd {chr(0x01)."R1".chr(0x02)."00000034()".chr(0x03).chr(0x64).chr(0x0D)}
get Serial postproc {(substr $_, 10, 12);}

get MeterId cmd {chr(0x01)."R1".chr(0x02)."00000036()".chr(0x03).chr(0x66).chr(0x0D)}
get MeterId postproc {(substr $_, 10, 12);}

get Close cmd {chr(0x01)."B01".chr(0x03).chr(0x71)}


und die Einträge in meiner  fhem.cfg


#Stromzähler definieren
define RS485 ECMD serial /dev/ttyUSB0@9600
attr RS485 classdefs Stromzahler=./stromzaehler.classdef
define Zaehl1 ECMDDevice Stromzahler
attr Zaehl1 room Stromzaehler

#Ausleserutinen
define Zaehl1Auslesen1 notify Zaehl1Auslesen1 get Zaehl1 Info;;get Zaehl1 ProgMode;;get Zaehl1 SetPwd;;get Zaehl1 I;;get Zaehl1 U;;get Zaehl1 P_Wirk;;get Zaehl1 Wh;;get Zaehl1 negWh;;get Zaehl1 cosPhi;;get Zaehl1 Close
define Zaehl1Auslesen2 notify Zaehl1Auslesen2 get Zaehl1 Info;;get Zaehl1 ProgMode;;get Zaehl1 SetPwd;;get Zaehl1 Serial;; get Zaehl1 Temperatur;; get Zaehl1 RTC;; get Zaehl1 MeterId;;get Zaehl1 P_Schein;;get Zaehl1 P_Blind;;get Zaehl1 Close

#Alle 20s auslesen
define Zaehler1Auslesen at +*00:00:20 trigger Zaehl1Auslesen1

RPi,
- USB RS485 Adapter für Stromzähler DRS155M und SDM630M-DC (B+G E-Tech)
- Viesmann KO2B Heizung mit selbstbau Optolink Adapter
- Mi-Light WiFi-Bridge V4, WW/CW LED-Birne

martinschm

Hi Fabian,

warum hast du dich für RS485 entschieden?

ciao
Martin

fischle

Hallo Martin,
ganz einfach, die Stromzähler sind recht günstig und ich wollte auch Informationen wie den Aktuellen Stromverbrauch o.Ä. auslesen. Weiterhin ist RS485 (wie ich gelesen habe) auch für längere Übertragungsstrecken einsetzbar - das kam mir entgegen, da die FHEM-Zentrale nicht am Stromzähler ist.

Ich habe auch einen SDM630M-DC hier liegen, bin allerdings noch nicht zur Einbindung gekommen. Werde dazu auch definitiv einen zweiten USB-RS485 wandler brauchen, da ein anderes Datenformat verwendet wird.

Wenn du in die Richtung etwas unternehmen willst, dann melde dich, dann mach ich vielleicht auch wieder weiter. Mein langfristiges Ziel ist, das ganze ein wenig wie das VCONTROL modul aufzubauen.
RPi,
- USB RS485 Adapter für Stromzähler DRS155M und SDM630M-DC (B+G E-Tech)
- Viesmann KO2B Heizung mit selbstbau Optolink Adapter
- Mi-Light WiFi-Bridge V4, WW/CW LED-Birne

martinschm

Hi Fabian,

für mein Stromzähler von eHZ hab mir ein Lesekopf von volkszähler bestellt. Mein Zähler ist circa 11m von meinem Pi entfernt. Die Leseköpfe von volkszähler gibt es mit USB, TTL oder RS232 Anschluß. Bei USB ist wohl gewöhnlich bei 5m Schluß, TTL reicht wohl auch nicht so weit.

Als Deswegen hab ich mich für RS232 entschieden. Angeschlossen ist noch nichts, der Plan ist mit einem USB/RS232 Wandler die Daten in den Pi zu kriegen. Transportiert werden die Daten über ein Lan Kabel, das ich an den Enden jeweils mit einem RJ45/RS232 versehe.

ciao
Martin

mechatronic

Hallo Fabian,

ich möchte das Modul ECMD ebenfalls für eine bidirektionale serielle Kommunikation nutzen und bin auf das Problem der zu kurzen Wartezeit gespolpert.
Es handelt sich im speziellen um NI Fieldpoint Module, bei denen ich 8 16bit HEX-Werte abfragen möchte, mit Checksumme etc. sind das dann 36 Zeichen Antwort.

Ich habe versucht deine Lösung zu implementieren, musste aber feststellen, dass EMCD nun DevIO nutzt. Bitte korrigiere mich falls ich da falsch liege. Habe ReadAnswer in der ECMD nicht gefunden.

Wie hast du es im Augenblick umgesetzt? Überhaupt weiter verfolgt?

Die eleganteste Lösung aus meiner Sicht wäre ein Timeout in Verbindung mit EOL-Charakter, wobei dieser frei definierbar wäre.
Ich benötige in diesem Fall \r. Vielleicht kommt die Möglichkeit ja irgendwann.

Schönen Gruß

Christian


Guzzi-Charlie

Hallo zusammen,

ich möchte meine Energiezähler (DRS155M) mit fhem erfassen und protokollieren. Wie ich sehe gibt es offensichtlich schon eine Lösung hierfür. Bisher habe ich es noch nicht ausprobiert da ich keinen RS485 zu USB Adapter habe. Zum Testen werde ich mir aber vielleicht einen besorgen.

Nun zu meiner eigentlichen Frage:
Meine bisher spärliche fhem-Funktionalität besteht im Moment nur aus 2 KS300-Sensoren die ich über einen CUNO angebunden habe. Mein Ziel ist es auch die Energiezähler über die RS485-Schnittstelle des CUNO via Ethernet an fhem anbinden und nicht über den "USB-Weg". Gibt es dafür schon eine Lösung?

Zur Info:
Ich bin absoluter Neuling was fhem betrifft und habe auch keine wirkliche Programmiererfahrung. Ich beschäftige mich allerdings schon länger mit dem Gedanken einiges in meinem Haus zu überwachen/automatisieren. Deshalb verfolge ich auch schon seit ca. 2 Jahren mehr oder weniger regelmäßig News aus der fhem Community. Ich habe viele Ideen und bin sehr beeindruckt was hier offensichtlich geleistet wird. Heute habe ich mich nun endlich registriert um noch mehr in die fhem-Welt eintauchen zu können.
Ich weiß, daß ich noch einen sehr langen Weg vor mir habe, hoffe aber auf Unterstützung durch Euch. Und vielleicht kann ich ja irgendwann auch mal was Substanzielles beitragen.

Gruß
Bernd

- 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

Florian_GT

#10
Hallo zusammen,

ich habe meinen DRS110M per RS485 Telnet Comserver im Netzwerk Verfügbar gemacht.
Siehe: http://www.ebay.de/itm/New-RS232-RS485-Serial-to-TCP-IP-Ethernet-Server-Module-Converter-/271822262098?pt=LH_DefaultDomain_77&hash=item3f49de8f52
Ich benutze aktuell noch etwas eigenes auf PHP Basis. Ich möchte aber schon gerne umsteigen auf FHEM.

Ich habe dabei einiges neues gelernt, das möchte ich den Personen nach mir, nicht vorenthalten...

- Also der Zähler ist kein Modbus, ergo kann man alle Modbus Module vergessen. (Viele Stunden umsonst getestet...)
- Die Kommunikation basiert auf einem Standard: IEC1107
- Der DRS155M ist von der Kommunikation her so gut wie identisch.[/li][/list]

Ich lese bei mir den Strom aus mittels:
chr(0x01)."R1".chr(0x02)."00000001()".chr(0x03).chr(0x62)
FHEM: Proxmox Server, FHEM in VM, pgSQL DB
Hardware: Ethersex (Pollin NETIO Boards), Diverse Tasmota MQTT Devices, Raspberry Pi Zero W Kameras, (Github RaspberryPiStreamingCamera), Zigbee2MQTT, ESPEasy

Development: UBA (Umwelt Bundesamt), BFS (Bundesamt für Strahlenschutz)

Guzzi-Charlie

Hallo,

@afloria
Ich benötige unbedingt etwas Unterstützung. Ich hoffe, Du kannst mir weiterhelfen.

Ich versuche nun schon über fast 2 Monate meine DRS110M-Zähler auszulesen. Alle bisherigen Versuche sind gescheitert. Das Maximum was ich bisher erreichen konnte war, daß ich mit dem MeterTest Tool von http://www.meter-test-equipment.com/ über einen USB-RS485 Konverter den Zähler ansprechen konnte und der mit Herstellerkennung (YTL) und Seriennummer geantwortet hat. Leider liefert der Zähler aber keine weiteren Daten. Auch mit dem Kommunikationstool von B+G E-Tech bekomme ich keine Daten. Nun habe ich mir auch den gleichen Serial-to-Ethernet-Converter besorgt wie Du ihn verwendest. Leider komme damit aber auch nicht weiter. Bei einer Anfrage "Search via Com" mit dem zugehörigen USR-TCP232-Setup Tool kommt auch keine Antwort, sondern nur ein TimeOut.

Könntest Du mir vielleicht mal Deine genaue HW- und SW-Konfi mitteilen? Ich stehe inzwischen komplett auf dem Schlauch. Ich komme allein einfach nicht mehr weiter und bin total frustriert. Und 38 Zähler warten darauf ausgelesen zu werden.

Gruß
Bernd
- 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

pejonp

Zitat von: Guzzi-Charlie am 27 Oktober 2015, 13:42:22
....
Ich versuche nun schon über fast 2 Monate meine DRS110M-Zähler auszulesen. Alle bisherigen Versuche sind gescheitert. ...
Hallo Guzzi-Charlie,

schau dir mal diesen Beitrag an (http://forum.fhem.de/index.php/topic,25315.msg183236.html#msg183236) am besten von vorne bis hinten. Dort sind auch einige Tools beschrieben. Ich habe mir auch einen anderen RS485 Adapter zugelegt (http://forum.fhem.de/index.php/topic,25315.msg300513.html#msg300513)
Bei Volkszähler gibt es ein Perlscript, mit dem man etwas auslesen kann (http://wiki.volkszaehler.org/hardware/channels/meters/power/drs155m). Habe es aber nicht getestet.

Ich selber haben einen  DRT710M(RS485) und lese diesen über die Modbus Schnittstelle aus. Hat auch eine Weile gedauert und neuen RS485 Adapter. Meinen Wechselrichter lese ich per USR-TCP232-T24. Das geht sehr gut.

pejonp
LaCrossGW 868MHz:WT470+TFA+TX37-IT+EMT7110+W136+WH25A HP1003+WH2621
SignalD(CC1101):Bresser+WS-0101(868MHz WH1080)+Velux KLF200+MAX!+HM-MOD-UART:Smoke HM-SEC-SD+VITOSOLIC 200 RESOL VBUS-LAN+SolarEdge SE5K(Modbus)+Sonnen!eco8(10kWh)+TD3511+DRT710M(Modbus)+ZigBee+Z-Wave+MQTT+vitoconnect

Guzzi-Charlie

#13
Hallo pejonp,

vielen Dank für die Tips. Mal sehen ob mich davon etwas weiter bringt.
Ich werde den Modbus thread mal durchackern. Allerdings ist das Protokoll an meinen Zählern IEC1107 und nicht Modbus.

       
  • Das Perl-Script vom Volkszähler-Forum habe ich auch schon versucht. Das klappt aber bisher auch nicht.
  • Am Adapter liegt es glaube ich nicht, da ich ja zumindest mit "/?!" die Herstellerkennung und die Seriennummer auslesen kann (sowohl mit händischem Schreiben auf der Schnittstelle als auch mit dem IEC1107 Testtool und dem B+G E-Tech Kommunikationstool).
  • Mit dem neuen USR-TCP232-T24 komme ich noch nicht ganz klar. Ich habe die serielle Schnittstelle eingerichtet und auch die IP-Adresse für mein Netzwerk mit dem Konfitool angepaßt, aber wie erstelle ich denn einen virtuellen Com-Port unter Windows (erstmal zu Testzwecken, bevor ich alles an den Raspberry und Fhem hänge)? Gibts hiefür noch ein weiteres Tool? Ich habe bisher nur das Setup- und das Test-Tool von USR.
Gruß
Bernd
- 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

Guzzi-Charlie

Hallo,

leider hat der große Thread zum Thema Modbus mir auch keine neuen Erkenntnisse gebracht.
Den Beitrag im Volkszählerforum kannte ich schon und hab auch schon mit dem Perl-Script experimentiert, leider ebenfalls ohne Erfolg. Ich werde mal dort auch meine Probleme schildern. Vielleicht gibt's ja da Hilfe für mich.

Immerhin habe ich nun mittels VCOM einen virtuellen COM-Port für den COM-Server USR-TCP232-T24 eingerichtet. Ich kann den COM-Port auch ansprechen und auf ihn schreiben (mit dem USR-TCP232-Test Tool), aber von der Gegenseite (mein Zähler) bekomme ich keine Antwort (gar keine). Ich weiß nun wirklich nicht mehr weiter.

Kann mir denn keiner helfen?

Gruß
- 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