Re: [vz-dev] Inbetriebnahme ZMD120AR Landis & Gyr mit IR Lesekopf über RS232

2013-05-19 Diskussionsfäden Justin Otherguy
Hi Peter,

Am 19.05.2013 um 21:20 schrieb Peter Kreutzer:

> 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.
prima; derzeit sieht's so aus, als könnten wir mit Peters Fork den aktuellen 
Master (https://github.com/volkszaehler/vzlogger) ersetzen.
Bei mir läuft er seit Tagen problemlos und auch von anderen kam bislang nur 
positive Rückmeldung. Das bezieht sich erst mal auf die "Grundfunktionalität", 
also das, was derzeit bereits im Master enthalten ist. Wenn wir das Triggern 
der Zähler sowie die Aggregierung als Funktionen mit dazu nehmen können, wäre 
das sehr schick.

Daher: ich freue mich über Rückmeldung.


Gruss, J.



Re: [vz-dev] Inbetriebnahme ZMD120AR Landis & Gyr mit IR Lesekopf über RS232

2013-05-19 Diskussionsfäden Peter Kreutzer
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