Benutzer-Werkzeuge

Webseiten-Werkzeuge


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

Pafal 20ec3gr

Der Zähler wird von Bayernwerk (vormals EON) verbaut.

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

Hardware

Man benötigt den IR-Schreib-Lesekopf. Gesendet wird mit 300bd, 7E1.

Beispiel für eine vzlogger.conf

Im Frontend werden zwei Kanäle 'El.Energie (Zählerstände)' angelegt. Ein Kanal für Bezug und ein Kanal für Einspeisung. Als Auflösung wird '1' eingetragen. Der Style sollte 'steps' sein. Ein Haken bei 'Öffentlich' und bei 'Cookie' machen. Weiter sollte der 'Initialverbrauch' (aktueller Zählerstand) eingetragen werden. Die UUIDs werden automatisch erzeugt und können durch klicken auf das (i) rechts neben dem Kanal sichtbar gemacht werden. Wenn alles funktioniert, kann 'verbosity' in der vzlogger.conf auf 0 gesetzt werden.

vzlogger.conf
{
  "retry": 0,
  "verbosity": 15,
  "log": "/var/log/vzlogger/vzlogger.log",
  "local": {
    "enabled": false,
    "port": 8081,
    "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": "255-255:1.8.0*0",
          "api": "volkszaehler",
          "middleware": "http://127.0.0.1/middleware.php",
          "aggmode": "none",
          "duplicates": 0
        },
        {
          "uuid": "hier die UUID des erstellten Kanals für Einspeisung eintragen",
          "identifier": "255-255:2.8.0*0",
          "api": "volkszaehler",
          "middleware": "http://127.0.0.1/middleware.php",
          "aggmode": "none",
          "duplicates": 0
        }
      ],
      "protocol": "d0",
      "device": "/dev/ttyUSB0",
      "pullseq": "2F3F210D0A",
      "ackseq": "063030300D0A",
      "baudrate": 300,
      "parity": "7e1",
      "baudrate_change_delay": 0
    }
  ]
}

Beispiel für ein Perl-Script

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 ?? KANN JA NICHT SEIN, DENN IM VERLAUF DES SCRIPTS WIRD DER ZÄHLER AUFGEFORDERT.
# 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.txt · Zuletzt geändert: 2022/04/21 21:58 von jau