Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
EDL21 eHZ
Nach der erfolgreichen IBN des EDL21 eHZ in Kombination mit dem IR Lesekopf, hier ein paar Infos zum Zähler. Diese geben die grundlegende Bedienung wie auch Hinweise über die OBIS wieder. Die Spezifikationen sind aus dem „vzlogger“ Log nach Prüfung der geloggten ID´s übernommen und bilden die Grundlage der Datenerfassung durch die Middleware.
Hier das Schema des EDL21:
Prinzipiell ist es möglich verschiedene Werte am Display ausgeben zu lassen.
Dies wird erst möglich, wenn Sie durch die Eingabe der PIN, welche Sie durch Ihren Energieversorgen erhalten haben, möglich. Danach stehen Ihnen außer den Grundanzeigen wie z.B. Zählerstände zu einzelenen Tarifen, auch Leistung und Verbräuche aus den letzten 24 h, 7,30 und 365 Tagen zur Verfügung.
Aktivieren können Sie das Menü des Zählers mit einer handelsüblichen TASCHENLAMPE. Mit dieser wird einfach der „Lichtsensor“ am EDL21 eHZ angeleuchtet. Dabei ist wie folgt vorzugehen:
Hier ein paar technische Infos zum Zähler:
Protokoll und Daten EDL21 eHZ
Der Lesekopf muss oben rechts am Zähler angebracht werden.
Die ausgelesenen Daten sind mit dem http://wiki.volkszaehler.org/hardware/channels/meters/power/edl-ehz/emh-ehz-h1 identisch. Wobei ich weitere, am Anfang nicht identifizierte OBIS ID´s im vzlogger.log hatte. Diese lauten bei mir „id=1-0:15.7.0*255“. Wobei dann in Zusammenarbeit mit den Entwicklern von VZ, herausgefunden wurde, dass dies der „Wirkleistung Total“ entspricht. Damit war das Rätsel der unplausiblen Daten im Frontend gelöst.
hier mal ein Auszug aus dem „vzlogger.log“ „1. IR Lesekopf“ am HZ:
[mtr0] Got 10 new readings from meter: [mtr0] Reading: id=129-129:199.130.3*255 value=0.00 ts=1332150460.171 [mtr0] Reading: id=1-0:0.0.9*255 value=0.00 ts=1332150460.171 [mtr0] Reading: id=1-0:1.8.0*255 value=1288046.90 ts=1332150460.171 [mtr0] Reading: id=1-0:2.8.0*255 value=2423148.00 ts=1332150460.171 [mtr0] Reading: id=1-0:1.8.1*255 value=957322.20 ts=1332150460.171 [mtr0] Reading: id=1-0:2.8.1*255 value=2423148.00 ts=1332150460.171 [mtr0] Reading: id=1-0:1.8.2*255 value=330724.70 ts=1332150460.171 [mtr0] Reading: id=1-0:15.7.0*255 value=708.30 ts=1332150460.171 [mtr0] Reading: id=1-0:15.7.0*255 value=708.30 ts=1332150460.171 [mtr0] Reading: id=129-129:199.130.5*255 value=0.00 ts=1332150460.171 [mtr0] Reading: id=0-0:0.0.0*0 value=0.00 ts=0.000
Wie Ihr seht kommen am 1. IR Lesekopf10 IDś an. Davon verwende ich aber nur 3 Stück. In meiner VZ Motivation liegt die Datenerfassung der Fotovoltaik und der Energie-Bezug vom Versorger zu Grunde.
[mtr0] –> beschreibt den Hauszähler „HZ“. Die damit verbundenen Daten beziehen sich auf den gesamten Enegiebedarf eines Zweifamilienhaus. Die OBIS ID war mir dabei nicht bekannt. Anhand der Liste für OBIS Kennzahlen, wurde die ID aber genau zugeordnet. Damit steht mir die aktuelle Wirkleistung zur Verfügung.
Damit ergibt sich ein Messwert der aktuellen Wirkleistung von 708,30 Watt.
hier mal ein Auszug aus dem „vzlogger.log“ „2. IR Lesekopf“ am HZ:
[mtr1] Got 7 new readings from meter: [mtr1] Reading: id=129-129:199.130.3*255 value=0.00 ts=1332150462.601 [mtr1] Reading: id=1-0:0.0.9*255 value=0.00 ts=1332150462.601 [mtr1] Reading: id=1-0:2.8.0*255 value=3093725.50 ts=1332150462.601 [mtr1] Reading: id=1-0:2.8.1*255 value=3093725.50 ts=1332150462.601 [mtr1] Reading: id=1-0:15.7.0*255 value=908.60 ts=1332150462.601 [mtr1] Reading: id=129-129:199.130.5*255 value=0.00 ts=1332150462.601 [mtr1] Reading: id=0-0:0.0.0*0 value=0.00 ts=0.000
[mtr1] –> beschreibt den Fotovoltaik Zähler „PV“. Die damit verbundenen Daten beziehen sich auf die gesamte Energie Abgabe der Anlage.
Damit ergibt sich ein Messwert der aktuellen Wirkleistung von 908,60 Watt.
Perl-script zum Zählerauslesen
Als Alternative für den zvlogger kann das folgene Per-Script verwendet werden: Das Script habe ich unter /root/bin/getZaehler abgespeichert. Mit crontab -e können dann im Intervall die Daten ausgelesen werden und in der Datenbak gespeichert werden. Achtung: Leerzeile am Ende nicht vergessen. Das Script wird mit der folgenden Einstellung alle 1min ausgeführt.
# m h dom mon dow command */1 * * * * /root/bin/getZaehler >/dev/null 2>&1
In der Datei /etc/default/cron sollte noch das Logging angepasst werden:
# For quick reference, the currently available log levels are: # 0 no logging (errors are logged regardless) # 1 log start of jobs # 2 log end of jobs # 4 log jobs with exit status != 0 # 8 log the process identifier of child process (in all logs) # EXTRA_OPTS="-L 0"
Einen Teil des Scripts habe ich aus dem Forum http://volkszaehler.org/pipermail/volkszaehler-users/2012-September/000451.html
Die uuid müssen entsprechend den erstellten Kanälen durch das Webinterface geändert werden.
Es wird noch ein perl-Paket für die serielle Schnittstelle installiert werden:
„apt-get libdevice-serialport-perl“
#!/usr/bin/perl # # Holt die Daten vom SML-Zaehler Easymeter Q3C # 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 # ======================================== sub hexstr_to_signed32int { my ($hexstr) = @_; die "Invalid hex string: $hexstr" if $hexstr !~ /^[0-9A-Fa-f]/; #if $hexstr !~ /^[0-9A-Fa-f]{1,8}$/; my $num = hex($hexstr); return $num >> 31 ? $num - 2 ** 32 : $num; } # ======================================== # use Device::SerialPort; my $port = Device::SerialPort->new("/dev/ttyAMA0") || die $!; $port->databits(8); $port->baudrate(9600); $port->parity("none"); $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 %channel = ( '56c94300-f188-11e2-aa85-eb712aefabf9' => ['070100010800FF',20,10], # 1-0:1.8.0 /* kWh aufgenommen */ 'dbc081e0-f188-11e2-8e30-3dd74b6c6043' => ['070100020800FF',20,10], # 1-0:2.8.0 /* kWh rueckgespeis*/ 'a301d8d0-903b-1234-94bb-d943d061b6a8' => ['070100100700FF',14,8] # 1-0:16.7.0 /* Wirkleistung aktuell */ ); # von der schnittstelle lesen for($i=0;$i<=5;$i++) { # wenn 540 chars gelesen werden wird mit last # abgebrochen, wenn nicht wird Schleife 2 mal widerholt my ($count,$saw)=$port->read(540); # will read 540 chars if ($count >300) { #print "read $count chars\n"; my $x=uc(unpack('H*',$saw)); # nach hex wandeln # print "$count <> $x\n"; # gibt die empfangenen Daten in Hex 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($x,$key); # grob rausschneiden $val1 = substr( $x , $pos1 , 50); #print $key . " = " . $val1 . "\n"; # Messwert selber $val2 = substr( $val1 , length($key) + $pos , $len); # Wert umwandeln $val3 = hexstr_to_signed32int($val2)/10; print $uuid . " : " . $val3 . "\n"; # Wert im Hash ablegen $channel{$uuid}[3] = $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}[3] ; 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"; } }
Rohdaten aus dem EDL21 eHZ
Die Rohdaten wurden mit dem Tool „Hterm“ gemessen um dabei die SML Botschaft zu überprüfen. Dabei wird sichtbar, dass der Aufbau der SML Botschaft der Spezifikation der SML entspricht. http://wiki.volkszaehler.org/software/sml#beispiel_3emh_ehz_fw8e2a50bak2 Beginnend mit dem Start „1B 1B 1B 1B“ und Ende „1B 1B 1B 1B“.
1B 1B 1B 1B 01 01 01 01 76 07 00 09 03 7B 4F 6F 62 00 62 00 72 63 01 01 76 01 01 07 00 09 01 37 1A 7C 0B 06 45 4D 48 01 02 71 54 2B 20 01 01 63 C0 61 00 76 07 00 09 03 7B 4F 70 62 00 62 00 72 63 07 01 77 01 0B 06 45 4D 48 01 02 71 54 2B 20 01 72 62 01 65 01 37 46 19 79 77 07 81 81 C7 82 03 FF 01 01 01 01 04 45 4D 48 01 77 07 01 00 00 00 09 FF 01 01 01 01 0B 06 45 4D 48 01 02 71 54 2B 20 01 77 07 01 00 01 08 00 FF 63 01 82 01 62 1E 52 FF 56 00 00 B9 5A 9D 01 77 07 01 00 02 08 00 FF 63 01 82 01 62 1E 52 FF 56 00 01 58 45 D2 01 77 07 01 00 01 08 01 FF 01 01 62 1E 52 FF 56 00 00 8A 90 CD 01 77 07 01 00 02 08 01 FF 01 01 62 1E 52 FF 56 00 01 58 45 D2 01 77 07 01 00 01 08 02 FF 01 01 62 1E 52 FF 56 00 00 2E C9 D0 01 77 07 01 00 0F 07 00 FF 01 01 62 1B 52 FF 55 00 00 08 41 01 77 07 81 81 C7 82 05 FF 01 01 01 01 83 02 F6 77 BE E9 2A 25 71 60 40 FC A3 DB A7 62 C0 B3 90 35 96 2D 34 44 01 CF DC 44 E8 83 72 A8 16 16 34 13 D4 5E 5D 81 72 84 D8 D7 A5 0C 43 21 40 61 01 01 01 63 3B F9 00 76 07 00 09 03 7B 4F 71 62 00 62 00 72 63 02 01 71 01 63 E1 FF 00 00 1B 1B 1B 1B