====== 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;