Benutzer-Werkzeuge

Webseiten-Werkzeuge


hardware:channels:meters:power:edl-ehz:pafal-20ec3gr

Dies ist eine alte Version des Dokuments!


Pafal 20ec3gr

Nach mehr oder weniger erfolgreicher Inbetriebnahme des Zählers von Pafal mit dem Lesekopf von Udo und raspberrypi habe ich das vorhandene perl-script angepasst. Der Zähler wird von Bayernwerk (vormals EON) eingebaut.

Achtung der Zaehler ist sehr langsam und benötigt mindest-Wartezeiten zwischen den Befehlen. Er gibt nur einfache Zählerstände und keinen aktuelle Verbrauch aus.

Der Zähler kann auch mit vzlogger und der VZ-Software ausgelesen werden.

Beispiel für eine vzlogger.conf

{
  "retry": 0,
  "daemon": true,
  "verbosity": 15,
  "log": "/var/log/vzlogger.log",
  "local": {
    "enabled": false,
    "port": 8080,
    "index": true,
    "timeout": 0,
    "buffer": 0
  },
  "meters": [
    {
      "enabled": true,
      "allowskip": false,
      "interval": -1,
      "aggtime": -1,
      "aggfixedinterval": false,
      "channels": [
        {
          "uuid": "hier die UUID des erstellten Kanals für Bezug eintragen",
          "identifier": "1-0:1.8.0",
          "api": "volkszaehler",
          "middleware": "http://localhost/middleware.php",
          "aggmode": "max",
          "duplicates": 3
        },
        {
          "uuid": "hier die UUID des erstellten Kanals für Einspeisung eintragen",
          "identifier": "1-0:2.8.0",
          "api": "volkszaehler",
          "middleware": "http://localhost/middleware.php",
          "aggmode": "max",
          "duplicates": 3
        }
      ],
      "protocol": "d0",
      "device": "/dev/ttyUSB0",
      "pullseq": "2F3F210D0A",
      "ackseq": "063030300D0A",
      "baudrate": 300,
      "baudrate_read": 300,
      "parity": "7e1",
      "wait_sync": "off",
      "read_timeout": 10,
      "baudrate_change_delay": 0
    }
  ]
}

Beispiel

Hier das Script soweit es auf dem Raspberrypi funktioniert. Das Protokoll ist sehr dem Elster ähnlich.

#!/usr/bin/perl
#
# Holt die Daten vom D0-Zaehler Pafal 20ec3gr
# es wird die obere optische Schnittstelle ausgelesen
# dort liefert der Zaehler alle 2sec. einen Datensatz
# wird von CRON jede Minute aufgerufen
# http://wiki.volkszaehler.org/software/sml
# 03.2012 by NetFritz
# 07.2013 by Ollir
# 09.2013 by TK for Pafal 20ec3gr


# ========================================
#
use Device::SerialPort;
my $port = Device::SerialPort->new("/dev/ttyAMA0") || die $!;
$port->databits(7);
$port->baudrate(300);
$port->parity("even");
$port->stopbits(1);
$port->handshake("none");
$port->write_settings;

$port->purge_all();
$port->read_char_time(0);     # don't wait for each character
$port->read_const_time(1000); # 1 second per unfulfilled "read" call

#
# OBIS-Kennzahl und Anzahl der Zeichen von Anfang OBIS bis Messwert,
# Messwertwertlaenge  8-10 Zeichen
# Multiplikator (Einspeisung negativ)

%channel = (
  'dde4f180-2bf3-11e3-8380-XXXXXXXXXXXX' => ['1.8.0',4,9,1000], # 1-0:1.8.0  /* kWh aufgenommen */
  '054e89b0-26cf-11e3-a635-XXXXXXXXXXXX' => ['2.8.0',4,9,-1000],# 1-0:2.8.0  /* kWh rueckgespeis*/
);

#request for pafal
$output="/?!\r\n";
$count=$port->write($output);
sleep(2);
$output="\x06\x30\x30\x30\r\n";
$count=$port->write($output);

# von der schnittstelle lesen
for($i=0;$i<=10;$i++) {
        # wenn mehr als 10 chars gelesen werden wird ausgewertet,
        # wenn nicht wird Schleife 10 mal wiederholt
         my ($count,$saw)=$port->read(255);   # will read max 255 chars
         if ($count >10) {
                        # print  "read $count chars\n";
                        # print  "$count <> $saw\n";  # gibt die empfangenen Daten aus

                while (($uuid) = each(%channel)){
                        $key =  $channel{$uuid}[0] ;
                        $pos =  $channel{$uuid}[1] ;
                        $len =  $channel{$uuid}[2] ;
                                #print "uuid=$uuid , key=$key, pos=$pos, len=$len\n" ;

                        # Stringpos raussuchen
                        $pos1=index($saw,$key);

                        # grob rausschneiden
                        $val1 = substr( $saw , $pos1  , 50);
                        # print $key . " = " . $val1  . "\n";

                        # Messwert selber
                        $val2 = substr( $val1 , length($key) + $pos , $len);

                        # Wert umwandeln
                        $val3 =  $val2*$channel{$uuid}[3]; 
                        # print $uuid . " : " . $val3 . "\n";

                        # Wert im Hash ablegen
                        $channel{$uuid}[4] = $val3 ;
                }
                # last; # while verlassen
        } else {
                #print "Schnittstellenlesefehler redu = $i ; count = $count <> \n";
         }
}

# ========================================
# Daten per post an den Server senden
# http://xmodulo.com/2013/05/how-to-send-http-get-or-post-request-in-perl.html
# http://wiki.volkszaehler.org/development/api/reference

# das geht:  curl -d "" http://localhost/middleware.php/data/5ae94780-ecc7-11e2-91b8-33a3b9ebc717.json?value=24.9

use LWP::UserAgent;

$timestamp = time() * 1000 ; # msec seit 1.1.1970
while (($uuid) = each(%channel)){
        $val =  $channel{$uuid}[4] ;
        if ($val != 0) {
        print $uuid . " : " . $timestamp . " : " . $val . "\n";

        my $server_endpoint = "http://localhost/middleware.php/data/${uuid}.json?value=" . $val;
        print "ss=" . $server_endpoint . "\n";

        my $ua = LWP::UserAgent->new;
        # set custom HTTP request header fields
        my $req = HTTP::Request->new(POST => $server_endpoint);
        $req->header('content-type' => 'application/json');
        $req->header('x-auth-token' => 'kfksj48sdfj4jd9d');

        # add POST data to HTTP request body
        $req->content(" ");

        my $ua = LWP::UserAgent->new;
        my $resp = $ua->request($req);
        if ($resp->is_success) {
                my $message = $resp->decoded_content;
                print "Received reply: $message\n";
        } else {
                print "HTTP GET error code: ", $resp->code, "\n";
                print "HTTP GET error message: ", $resp->message, "\n";
        }
    }

}

Ergebnis

das Script liefert:

/?!   <- gesendet
/PAF5EC3gr00006
^F000  <- gesendet
^B0.0.0(715xxxxx)
0.0.1(PAF)
F.F(00)
0.2.0(1.27)
1.8.0*00(000094.17)
2.8.0*00(000266.55)
C.2.1(000000000000)(                                                )
0.2.2(:::::G11)!
hardware/channels/meters/power/edl-ehz/pafal-20ec3gr.1447427322.txt.gz · Zuletzt geändert: 2015/11/13 16:08 von udo1