hardware:channels:meters:power:drs155m
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
hardware:channels:meters:power:drs155m [2013/11/26 22:13] – [Anschluss an den Computer: Software] ollir | hardware:channels:meters:power:drs155m [2018/03/25 10:58] (aktuell) – jau | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== Hutschienenzähler DRS110M ====== | + | #redirect |
- | + | {{indexmenu_n>99}} | |
- | 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. | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | ====== mechanischer Einbau ====== | + | |
- | Das Gerät passt zwar auf eine Standarthutschiene, | + | |
- | + | ||
- | Die Klemmen des Zähler sind allerdings sehr unschön ausgeführt. Unter 6mm^2 Anschlussleitung geht da nichts. Für einen Zähler mit 10A Dauerstrom schon recht großzügig dimensioniert. | + | |
- | + | ||
- | + | ||
- | ====== 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. | + | |
- | + | ||
- | ====== Adressen: ====== | + | |
- | + | ||
- | + | ||
- | {{ : | + | |
- | + | ||
- | Die folgenden Adressen scheinen auch gültig zu sein: | + | |
- | + | ||
- | ^ Name ^ Adresse ^ Faktor ^ Einheit ^ | + | |
- | | Spannung | + | |
- | | Strom | 00000001 | 0.1 | A | | + | |
- | | Frequenz | + | |
- | | Wirkeistung | + | |
- | | Blindleistung | + | |
- | | Scheinleistung | + | |
- | | Zaehler1 | + | |
- | | Zaehler1a | + | |
- | | Zaehler2 | + | |
- | | Zaehler2a | + | |
- | | Zeit | 00000031 | 1 | Format? | | + | |
- | | Temperatur | + | |
- | + | ||
- | + | ||
- | ====== 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“ | + | |
- | „apt-get install libwww-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://www.ip-symcon.de/ | + | |
- | # 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>10 ) { | + | |
- | 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-> | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | </ | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | ===== Beispielausgabe ===== | + | |
- | + | ||
- | Falls das Script läuft, bekommt man folgende Ausgaben: | + | |
- | < | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | </ | + | |
- | + | ||
- | Die Zählerangabe sind Wh. | + | |
- | ===== Bugs ===== | + | |
- | 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.1385500412.txt.gz · Zuletzt geändert: 2013/11/26 22:13 von ollir