====== Landis & Gyr E110 ====== Dieser z.B. von Stedin verbaute Zähler verhält sich qua Ansprache wie der E350 ([[hardware:channels:meters:power:edl-ehz:e350|]]). ===== Hardware ===== Mit einem [[hardware:controllers:ir-schreib-lesekopf|IR-Schreib-Lesekopf]] kann der Zähler bei [[hardware:controllers:ir-schreib-lesekopf#grundlagen|300bd, 7E1]] mittels Initialisierungssequenz "/?!\r\n" die Kommunikation angestoßen werden. ===== Beispielantwort ==== --> "/?!\r\n" /AMP45227-0614 --> chr(0x06).chr(0x30).chr(0x30).chr(0x30).chr(0x0D).chr(0x0A) 0.00.6.0(K86T0000) 0.00.6.1(21497110) 2.18.1(000000.00) 2.18.2(008278.78) 2.18.0(008278.78) 3.28.1(000000.00) 3.28.2(000000.00) 3.28.0(000000.00) ===== Auslesen per Perl-Script ===== Zum Auslesen dient eine (quick and dirty) modifizierte Version des Perl-Scripts von [[hardware:channels:meters:power:drs155m|DRS115M]]. Der E110 benötigt etwas mehr Zeit zum Lesen als der DRS155 (read_char_time =3, read_const_time = 10) und sendet 165 chars zurück ($port->read(165)). Der Programmiermodus hat nicht funktioniert und es scheint, dass der E110 keine aktuellen Verbrauchswerte liefert. #!/usr/bin/perl -w # teile von http://www.ip-symcon.de/forum/threads/21407-Stromz%C3%A4hler-mit-RS485/page2 entnommen # 20130802 : ollir # vereinfachte Version von http://wiki.volkszaehler.org/hardware/channels/meters/power/eastron_drs155m use Device::SerialPort; my $port = Device::SerialPort->new("/dev/ttyUSB0") || die $!; $port->baudrate(300); $port->databits(7); $port->parity("even"); $port->stopbits(1); $port->handshake("none"); $port->write_settings; $port->purge_all(); $port->read_char_time(3); # don't wait for each character $port->read_const_time(10); # 100 millisecond per unfulfilled "read" call my $verbose = 11 ; # ======================================== sub sendgetserial { my ($cmd) = @_; my $count; my $saw; my $sawprint; my $x; $port->lookclear; $port->write( $cmd ); ($count,$saw)=$port->read(165); # will read 165 chars $x=uc(unpack('H*',$saw)); # nach hex wandeln $sawprint = $saw; $cmd =~ s/\n/\\n/mg; $cmd =~ s/\r/\\r/mg; $saw =~ s/\n/\\n/mg; $saw =~ s/\r/\\r/mg; if ( $verbose>10 ) { printf "+++ sendserial\n" ; print " CMD: $cmd \n"; # gibt den Befehl in ASCII aus print " COUNT: $count \n"; # gibt die Anzahl der empfangenen Daten aus print " HEX: $x \n"; # gibt die empfangenen Daten in Hex aus print " ASCII:\n$sawprint \n"; # gibt die empfangenen Daten aus printf "--- sendserial\n" ; } return $saw; } # ======================================== ## Variablen my $cmd; my $res; my $counter; # Initialisierung sendgetserial("/?!\r\n"); # Zählerabfrage $cmd = chr(0x06).chr(0x30).chr(0x30).chr(0x30).chr(0x0D).chr(0x0A); $_ = sendgetserial($cmd); s/2\.18\.2\(([0-9]*\.[0-9]*)\)/$1/m; print $1;