DAS SMART METER FÜR JEDEN
Bei der Installation einer Solaranlage haben die Stadtwerke bei mir Zähler TD-3511 von Siemens installiert. Es handelt sich um Zweirichtungszähler mit IR-Schnittstelle. Der Zähler besitzt auch noch einen frei zugänglichen Steckplatz für einen M-Bus Adapter, der allerdings hier nicht weiter betrachtet wird.
Man benötigt den IR-Schreib-Lese-Kopf, da der Zähler erst angesprochen werden muss, bevor er sendet.
Die linke der beiden Punkte im Bereich des Lesekopfes ist der Empfänger. Rechts ist die IR-Sendediode des Zählers. Wenn man den IR-Schreib-Lese-Kopf zusammen mit der USB-Erweiterung wie im Wiki beschrieben aufbaut, geht das USB-Kabel nach unten weg.
Zum Testen habe ich hterm verwendet.
Einzustellen sind:
Port: bei Windows:verwendeter COM-Anschluss des USB-Adapters, bei Linux z.B. /dev/ttyUSB0
Baud: 300
Data: 7
Stop: 1
Parity: Even
Bei „input control“: Send on Enter auf „CR-LF“
Auf „Connect“ klicken, dann im Eingabefeld “/?!“ (ohne Anführungszeichen) eingeben und Enter drücken. Dann sollte der Zähler sofort mit seiner Seriennummer antworten. Nach 2-3 Sekunden fängt der Zähler dann an, Daten auszugeben.
Das folgende Perlscript automatisiert die manuelle Bearbeitung des Zählers mit hterm.
#!/usr/bin/perl
#
# (m)ein Stromzähler mit IR-Schnittstelle blubbert nach einem "Anforderung-
# telegramm" Daten raus. Das Telegramm ist mit 300 Baud, 7 Bit, 1 Stoppbit
# und gerader Parität zu senden. Das ist der Initialmodus von Geräten,
# die das Protokoll IEC 62056-21 implementieren.
#
# Autor: Andreas Schulze
# Bugfix: Eric Schanze
# Datum: 20120302
#
my $PORT='/dev/ttyUSB0';
my $anforderungstelegramm = "\n/?!\r\n";
use warnings;
use strict;
use utf8;
use Device::SerialPort;
my $tty = new Device::SerialPort($PORT) || die "can't open $PORT: $!";
$tty->baudrate(300) || die 'fail setting baudrate';
$tty->databits(7) || die 'fail setting databits';
$tty->stopbits(1) || die 'fail setting stopbits';
$tty->parity("even") || die 'fail setting parity';
$tty->write_settings || die 'fail write settings';
#$tty->debug(1);
my $num_out = $tty->write($anforderungstelegramm);
die "write failed\n" unless ($num_out);
die "write inclomplete\n" unless ($num_out == length($anforderungstelegramm));
print "$num_out Bytes written\n";
my ($num_read, $s);
$tty->read_const_time(10);
while(1) {
($num_read, $s) = $tty->read(1);
print $s if $s;
}
$tty->close || die "can't close $PORT: $!";