hardware:channels:meters:power:drs155m
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende ÜberarbeitungNächste ÜberarbeitungBeide Seiten der Revision | ||
drs155m [2013/08/24 12:27] – [offene Punkte] ollir | hardware:channels:meters:power:drs155m [2018/01/08 11:08] – alte Version wiederhergestellt (2018/01/07 20:18) jau | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== Hutschienenzähler DRS110M ====== | + | #redirect |
- | + | ||
- | Das Gerät ist ein Zähler mit einfacher Baubreite und Hutschinenmontage. Der Vorteil ist die integrierte RS485 Schnittstelle, | + | |
- | + | ||
- | Das Gerät gibt es bei Amazon für 30EUR. | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | ====== Anschluss an den Computer: RS485 - USB Wandler ====== | + | |
- | + | ||
- | Für den Anschluss am Computer benötigt man eine RS485-USB Adapter. Ich habe hierzu von Ebay einen Adapter für 15EUR gekauft. | + | |
- | + | ||
- | Bei Ebay nach " | + | |
- | + | ||
- | Elektrisch wird der Adapter mit dem Stromzähler A<->A , B<->B und G<->G verbunden. Ich habe keine Terminierung verwendet, bei mir ist das Kabel aber auch nur 50cm lang. | + | |
- | + | ||
- | ====== Anschluss an den Computer: Software ====== | + | |
- | + | ||
- | Für den Zähler habe ich keine richtige Software zum auslesen gefunden. Im Internet kursieren einige Scripte in PHP und Python, um den Zähler auszulesen. | + | |
- | + | ||
- | Da ich ein Perl-Fan bin, habe ich das ganze unter perl zum laufen gebracht. | + | |
- | + | ||
- | Es wird noch ein perl-Paket für die serielle Schnittstelle benötigt: | + | |
- | < | + | |
- | „apt-get install libdevice-serialport-perl“ | + | |
- | </ | + | |
- | + | ||
- | Das script gibt die Zählerdaten auf der Console aus, eine Speicherung in die Datenbank erfolgt auch. Zuvor muss über das Webinterface der Kanal angelegt sein. | + | |
- | + | ||
- | ====== Hier dann das Perl-script ====== | + | |
- | + | ||
- | Das Script abspeichern, | + | |
- | + | ||
- | Der serielle Port und die uuid(die uuid bekommt man über das Webinterface von volkszähler) müssen im Script angepasst werden. | + | |
- | + | ||
- | < | + | |
- | #!/usr/bin/perl -w | + | |
- | + | ||
- | # teile von http:// | + | |
- | # 20130802 : ollir | + | |
- | + | ||
- | use Device:: | + | |
- | + | ||
- | + | ||
- | my $port = Device:: | + | |
- | $port-> | + | |
- | $port-> | + | |
- | $port-> | + | |
- | $port-> | + | |
- | $port-> | + | |
- | $port-> | + | |
- | + | ||
- | $port-> | + | |
- | $port-> | + | |
- | $port-> | + | |
- | + | ||
- | my $serialID = " | + | |
- | my $password = " | + | |
- | my $uuid=" | + | |
- | + | ||
- | my $verbose = 2 ; | + | |
- | + | ||
- | # ======================================== | + | |
- | sub sendgetserial { | + | |
- | my ($cmd) = @_; | + | |
- | my $count; | + | |
- | my $saw; | + | |
- | my $x; | + | |
- | + | ||
- | $port-> | + | |
- | $port-> | + | |
- | + | ||
- | ($count, | + | |
- | $x=uc(unpack(' | + | |
- | + | ||
- | $cmd =~ s/ | + | |
- | $cmd =~ s/ | + | |
- | + | ||
- | $saw =~ s/ | + | |
- | $saw =~ s/ | + | |
- | + | ||
- | if ( $verbose> | + | |
- | printf "+++ sendserial\n" | + | |
- | print " CMD: $cmd \n"; | + | |
- | print " COUNT: $count \n"; | + | |
- | print " HEX: $x \n"; | + | |
- | print " ASCII: $saw \n"; | + | |
- | printf "--- sendserial\n" | + | |
- | } | + | |
- | + | ||
- | return $saw; | + | |
- | } | + | |
- | # ======================================== | + | |
- | sub decodeVAL { | + | |
- | my ($val) = @_; | + | |
- | + | ||
- | if ( $verbose> | + | |
- | printf "+++ decodeVAL\n" | + | |
- | print " val = ( $val ) \n" ; | + | |
- | } | + | |
- | + | ||
- | if($val =~ m/ | + | |
- | if ( $verbose> | + | |
- | print " decoded val = $1\n"; | + | |
- | printf " --- decodeVAL\n" | + | |
- | } | + | |
- | return $1; | + | |
- | } | + | |
- | + | ||
- | print " val = ( $val ) \n" ; | + | |
- | die " | + | |
- | print " | + | |
- | return -8888; | + | |
- | } | + | |
- | # ======================================== | + | |
- | + | ||
- | + | ||
- | ## Variablen | + | |
- | my $cmd; | + | |
- | my $res; | + | |
- | my %vals = (); | + | |
- | + | ||
- | # Abfrage der Initialisierung: | + | |
- | print("# | + | |
- | sendgetserial("/? | + | |
- | + | ||
- | + | ||
- | # initalisierung ueberprüfen, | + | |
- | print("# | + | |
- | sendgetserial("/?" | + | |
- | + | ||
- | + | ||
- | # ACK / Option Select Message senden (' | + | |
- | # der programming modus muss auch bei einer einfachen Strom, | + | |
- | if (1) { | + | |
- | print("# | + | |
- | $cmd = chr(0x06).chr(0x30).":" | + | |
- | sendgetserial( $cmd); | + | |
- | $cmd = chr(0x01)." | + | |
- | sendgetserial( $cmd); | + | |
- | } | + | |
- | + | ||
- | # ****************** Werte lesen | + | |
- | print("# | + | |
- | $res = sendgetserial( chr(0x01)." | + | |
- | $vals { ' | + | |
- | + | ||
- | print("# | + | |
- | $res = sendgetserial( chr(0x01)." | + | |
- | $vals { ' | + | |
- | + | ||
- | print("# | + | |
- | $res = sendgetserial( chr(0x01)." | + | |
- | $vals { ' | + | |
- | + | ||
- | print("# | + | |
- | $res = sendgetserial( chr(0x01)." | + | |
- | $vals { ' | + | |
- | + | ||
- | print("# | + | |
- | $res = sendgetserial( chr(0x01)." | + | |
- | $vals { ' | + | |
- | + | ||
- | print("# | + | |
- | $res = sendgetserial( chr(0x01)." | + | |
- | $vals { ' | + | |
- | + | ||
- | print("# | + | |
- | $res = sendgetserial( chr(0x01)." | + | |
- | $vals { ' | + | |
- | + | ||
- | print("# | + | |
- | $res = sendgetserial( chr(0x01)." | + | |
- | $vals { ' | + | |
- | $res = sendgetserial( chr(0x01)." | + | |
- | $vals { ' | + | |
- | + | ||
- | print("# | + | |
- | $res = sendgetserial( chr(0x01)." | + | |
- | $vals { ' | + | |
- | $res = sendgetserial( chr(0x01)." | + | |
- | $vals { ' | + | |
- | + | ||
- | print("# | + | |
- | $res = sendgetserial( chr(0x01)." | + | |
- | $vals { ' | + | |
- | + | ||
- | + | ||
- | # ****************** LOGOUT | + | |
- | print("# | + | |
- | $cmd = chr(0x01)." | + | |
- | $res = sendgetserial( $cmd); | + | |
- | + | ||
- | + | ||
- | + | ||
- | # ****************** Werte plotten | + | |
- | if ($verbose> | + | |
- | print("# | + | |
- | while ( my ($key, $value) = each(%vals) ) { | + | |
- | print " --> $key = $value\n"; | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | + | ||
- | # ****************** Wert in die Datenbank schreiben | + | |
- | + | ||
- | use LWP:: | + | |
- | + | ||
- | $val = $vals{ " | + | |
- | print " | + | |
- | + | ||
- | my $server_endpoint = " | + | |
- | print " | + | |
- | + | ||
- | my $ua = LWP:: | + | |
- | + | ||
- | # set custom HTTP request header fields | + | |
- | my $req = HTTP:: | + | |
- | $req-> | + | |
- | $req-> | + | |
- | + | ||
- | # add POST data to HTTP request body | + | |
- | $req-> | + | |
- | + | ||
- | if (1) { | + | |
- | my $ua = LWP:: | + | |
- | my $resp = $ua-> | + | |
- | if ($resp-> | + | |
- | my $message = $resp-> | + | |
- | print " | + | |
- | } else { | + | |
- | print "HTTP GET error code: ", $resp-> | + | |
- | print "HTTP GET error message: ", $resp-> | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | </code> | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | ===== Beispielausgabe ===== | + | |
- | + | ||
- | Falls das Script läuft, bekommt man folgende Ausgaben: | + | |
- | < | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | </code> | + | |
- | + | ||
- | Die Zählerangabe sind Wh. | + | |
- | ===== offene Punkte ===== | + | |
- | Ich habe mit meinem Zähler das Problem, dass der Zähler 1x am Tag für 60min nicht zählt. Die Datenkommunikation funktioniert, | + | |
- | + | ||
- | Ich habe das Problem an einem zweiten Zähler verifizieren können. Das Problem tritt immer zwischen 0Uhr und 1Uhr (zählerinterne Zeit) auf. | + | |
- | + | ||
- | Die Zeit kann allerdings gesetzt werden, so daß das Problem " | + | |
- | + | ||
- | + | ||
- | ===== Todos ===== | + | |
- | * < | + | |
- | * prüfen, ob das script auch bei mehreren Zähler an einem RS485 läuft | + | |
- | * die ID der Zähler setzen | + | |
- | * die Passwörter der Zähler setzen | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + |
hardware/channels/meters/power/drs155m.txt · Zuletzt geändert: 2018/03/25 10:58 von jau