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: von ollir