Hi ,
nun habe ich mit einen skript, welches ich bei euch in der mailingliste
gefunden haben.
http://volkszaehler.org/pipermail/volkszaehler-dev/2012-April/001826.html
ich habe leicht modifiziert um nur die werde anzuzeigen.
#!/usr/bin/perl
# Zaehlerabfrage fuer Zaehler nach Protokoll IEC 62056-21 / OBIS
# Ein Anfrage-Telegramm ist mit 300 Baud, 7 Bit, 1 Stoppbit
use warnings;
use strict;
use Device::SerialPort;
use RRDs;
### KONFIGURATION ###
my $device="/dev/ttyS0";#Schnittstelle
my $request = "/?!\r\n";#Anforderungstelegramm "/?!" \r\n
entspricht CR-LF
my $ga = "0/0/4"; #Gruppenadresse DPT9
my $obiskey="1.8.0("; #Schluessel vor Angabe des Zaehlerstandes
z.B. "1.8.0(0001234.5 kWh)"
my $file = "/var/tmp/Zaehler_WP.log"; #Logdatei
wird automatisch angelegt!
### ENDE KONFIGURATION ###
### Seriellen Port initialisieren
my $port = new Device::SerialPort($device) || die "can't open $device: $!";
$port->baudrate(300) || die 'fail setting baudrate';
$port->databits(7)|| die 'fail setting databits';
$port->stopbits(1)|| die 'fail setting stopbits';
$port->parity("even") || die 'fail setting parity';
$port->write_settings || die 'fail write settings';
$port->rts_active(1);
$port->dtr_active(1);
$port->read_char_time(500); # 0.5 seconds for each character
$port->read_const_time(3000); # 3 second per unfulfilled "read" call
### Anforderungstelegramm senden
my $num_out = $port->write($request);
die "write failed\n" unless ($num_out);
die "write inclomplete\n" unless ($num_out == length($request));
print "send request telegram : $num_out Bytes written\n";
### AUSLESEN
my $STALL_DEFAULT=2; # how many seconds to wait for new input
my $timeout=$STALL_DEFAULT;
my $chars=0;
my $buffer="";
while ($timeout>0) {
my ($count,$saw)=$port->read(255); # Liest 255 Zeichen je
Durchlauf aus
if ($count > 0) {
$chars+=$count;
$buffer.=$saw;
print $buffer; # Ausgabe der eingelesenen
Daten
}
else
{
$timeout--;
}
}
if ($timeout<=0){
$port->close || die "can't close $device: $!";
print "Waited $STALL_DEFAULT seconds and never saw what I wanted\n";
}
### SUBS
sub encode_dpt9 { # 2byte signed float
my $state = shift;
my $data;
my $sign = ($state <0 ? 0x8000 : 0);
my $exp = 0;
my $mant = 0;
$mant = int($state * 100.0);
while (abs($mant) > 2047) {
$mant /= 2;
$exp++;
}
$data = $sign | ($exp << 11) | ($mant & 0x07ff);
return $data >> 8, $data & 0xff;
}
Soweit so gut.
Die Startsequenz und die Einstellungen der Seriellen Schnittstelle sind nun
bekannt.
Als nächstes werde ich mit dann den vzlogger von peter evertz mal anschauen.
Da er nicht im als ubuntu package vorhanden ist werde ich ihn selber
compiliere...
Geben euch noch eine Rückmeldung wenn es gelaufen ist.
Grüsse und Danke
Am 18. Mai 2013 20:03 schrieb Peter Kreutzer :
> Hi Torben,
>
> sudo strace -f -s vzlogger --config /etc/vzlogger.conf -v 20
> >vzlogger.trace
>
> [pid 3742] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=1892,
> ...}) = 0
> [pid 3742] getppid() = 3740
> [pid 3742] write(3, "[May 18 19:41:51][mtr0] Got 0 new readings from
> meter:\n", 55) = 55
> [pid 3742] read(4, "", 1) = 0
> [pid 3742] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=1892,
> ...}) = 0
> [pid 3742] getppid() = 3740
> [pid 3742] write(2, "[May 18 19:41:51][d0] ", 24[May 18 19:41:51][d0]
> ) = 24
> [pid 3742] write(2, "Something unexpected happened: read:281!",
> 40Something unexpected happened: read:281!) = 40
> [pid 3742] write(2, "\n", 1
> ) = 1
>
> Sieht so aus, das der Zähler einen leeren Wert senden.
>
> Ich habe ja schon versucht mit diesem script die baudrate und die
> Startsequenz zu senden. Anschliessend sehe ich in der while auch keinen
> Output auf der Konsole.
>
> #/usr/bin/pythonimport serial
>
> ser = serial.Serial('/dev/ttyS0', 300, timeout=100)
> ser.write("/?!<0D><0A>")
>
> while True:
> x = ser.read()
> print x,
> ser.close()
>
> Dann ist das mit der Startsequenz irgendwie doch nicht so richtig.
> Ich denke ich muss erstmal das mit der start Sequenz lösen.
>
> Das obige schickt zwar die Sequenz aber der Zähler schickt dann keine
> Werte.
> Sonst würde die while schleife ja etwas auf die console schreiben
>
> Grüsse
> und vielen Dank für deine Unterstützung
>
>
>
>
> Am 18. Mai 2013 14:07 schrieb Thorben Thuermer :
>
> On Sat, 18 May 2013 12:19:01 +0200
>> Peter Kreutzer wrote:
>> > nun habe ich mit dem python script die Startsequenz geschickt ..
>> > #/usr/bin/python
>> > import serial
>> > ser = serial.Serial('/dev/ttyS0', 300, timeout=100)
>> > ser.write("/?!<0D><0A>")
>> >
>> > while True:
>> > x = ser.read()
>> > print x,
>> > ser.close()
>> >
>> > und anschlies