Benutzer-Werkzeuge

Webseiten-Werkzeuge


hardware:channels:meters:power:edl-ehz:edl21-ehz

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
hardware:channels:meters:power:edl21-ehz [2012/03/29 15:08] – [Protokoll und Daten EDL21 eHZ] dossidrhardware:channels:meters:power:edl-ehz:edl21-ehz [2022/04/21 20:20] (aktuell) – daemon, logfile und port jau
Zeile 1: Zeile 1:
 ====== EDL21 eHZ ====== ====== EDL21 eHZ ======
 +{{ :hardware:channels:meters:power:edl-ehz:edl21_ehz.png?200|}}
 +===== Hardware ====
 +Der [[hardware:controllers:ir-schreib-lesekopf|IR-Schreib-Lesekopf]] wird oben rechts am Zähler, mit dem Kabel nach unten, angebracht.\\
 +Schnittstellenparameter und Daten sind mit dem [[hardware:channels:meters:power:edl-ehz:emh-ehz-h1|EMH eHz]] identisch.
  
-Nach der erfolgreichen IBN des EDL21 eHZ in Kombination mit dem IR Lesekopf, hier ein paar Infos zum Zähler. +==== Display ==== 
-Diese geben die grundlegende Bedienung wie auch Hinweise über die OBIS wieder. +Prinzipiell ist es möglich verschiedene Werte am Display ausgeben zu lassen.
-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:__ +
- +
-{{:hardware:channels:meters:power:edl-ehz:edl21_ehz.png?200|}}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. 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. Aktivieren können Sie das Menü des Zählers mit einer handelsüblichen TASCHENLAMPE.
 Mit dieser wird einfach der "Lichtsensor" am EDL21 eHZ angeleuchtet. Mit dieser wird einfach der "Lichtsensor" am EDL21 eHZ angeleuchtet.
-__Dabei ist wie folgt vorzugehen:__ +=== Vorgehensweise ===
 {{:hardware:channels:meters:power:edl-ehz:bedienungsanleitung_edl21_ehz.png?200|}}{{:hardware:channels:meters:power:edl-ehz:bedienungsanleitung_2_edl21_ehz.png?200|}} {{:hardware:channels:meters:power:edl-ehz:bedienungsanleitung_edl21_ehz.png?200|}}{{:hardware:channels:meters:power:edl-ehz:bedienungsanleitung_2_edl21_ehz.png?200|}}
  
- +=== Technische Infos ===
- +
-__Hier ein paar technische Infos zum Zähler:__ +
- +
 {{:hardware:channels:meters:power:edl-ehz:infos.png?100|}} {{:hardware:channels:meters:power:edl-ehz:infos.png?100|}}
  
-====== Protokoll und Daten EDL21 eHZ ======+===== Beispielkonfiguration ===== 
 +Eine exemplarische vzlogger.conf: 
 +<code base vzlogger.conf> 
 +
 +"retry" : 3, 
 +"verbosity" : 0, 
 +"log" : "/var/log/vzlogger/vzlogger.log",
  
-Die ausgelesenen Daten sind mit dem http://wiki.volkszaehler.org/hardware/channels/meters/power/edl-ehz/emh-ehz-h1 identisch. +"local" { 
-Wobei ich weiteream Anfang nicht identifizierte OBIS ID´s im vzlogger.log hatte. + "enabled" : false
-Diese lauten bei mir "id=1-0:15.7.0*255". Wobei dann in Zusammenarbeit mit den Entwicklern von VZherausgefunden wurdedass dies der "Wirkleistung Totalentspricht. + "port" 8081, 
-Damit war das Rätsel der unplausiblen Daten im Frontend gelöst.+ "index" : true, 
 + "timeout" : 30, 
 + "buffer: 600 
 +},
  
-hier mal ein Auszug aus dem "vzlogger.log" "1. IR Lesekopfam HZ:+"meters" : [{ 
 + "protocol" : "sml", 
 + "enabled" : true, 
 + "device" : "/dev/ttyUSB0", 
 + "parity" : "8N1", 
 + "baudrate" : 9600, 
 + "aggtime" : -1, 
 + "aggfixedinterval" : true, 
 + "channels": [{ 
 + "uuid" : "6836dd20-00d5-11e0-bab1-856ed5f959ae", 
 + "middleware" : "http://localhost/middleware.php"
 + "identifier""1-0:1.8.0", 
 + "aggmode" : "MAX" 
 + }] 
 +
 +]} 
 +</code>
  
 +===== Protokoll und Daten =====
 +Die Daten aus einer "vzlogger.log" von einem Zweirichtungszähler:
 <code> <code>
 [mtr0] Got 10 new readings from meter: [mtr0] Got 10 new readings from meter:
Zeile 46: Zeile 67:
 [mtr0] Reading: id=0-0:0.0.0*0 value=0.00 ts=0.000 [mtr0] Reading: id=0-0:0.0.0*0 value=0.00 ts=0.000
 </code> </code>
 +Wie Ihr seht kommen 10 IDs an.
  
-Wie Ihr seht kommen am 1. IR Lesekopf10 IDś an+Hier ein Auszug aus der "vzlogger.log" eines Einrichtungszähler (Einspeisung): 
-Davon verwende ich aber nur 3 Stück+<code> 
-In meiner VZ Motivation liegt die Datenerfassung der Fotovoltaik und der Energie-Bezug vom Versorger zu Grunde.+[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 
 +</code>
  
-[mtr0] --> beschreibt den Hauszähler "HZ". Die damit verbundenen Daten beziehen sich auf den gesamten Enegiebedarf eines Zweifamilienhaus. +===== Rohdaten  =====
-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. +
-<note>[mtr0] Reading: id=1-0:15.7.0*255 value=708.30 ts=1332150460.171</note> +
-Damit ergibt sich ein Messwert der aktuellen Wirkleistung von 708,30 Watt.+
  
 +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. [[software:sml#beispiel_3emh_ehz_fw8e2a50bak2]]\\
 +Beginnend mit dem Start "1B 1B 1B 1B" und Ende "1B 1B 1B 1B".
  
 +<code>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</code> 
  
----- 
  
 +===== Zählerauslesen mit Perl-Script =====
 +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 Datenbank gespeichert werden. Achtung: Leerzeile am Ende nicht vergessen. Das Script wird mit der folgenden Einstellung alle 1min ausgeführt.
 +<code>
 +# m h  dom mon dow   command
 +*/1 *        /root/bin/getZaehler >/dev/null 2>&1
 +</code>
  
 +Jetzt wird nur noch die Datei ''/var/log/auth.log'' vollgeschrieben. Wie man dies umgehen kann steht auf [[http://crycode.de/linux/64-cron-spam-aus-auth-log-fernhalten]].
  
 +In der Datei ''/etc/default/cron'' sollte noch das Logging angepasst werden:
 +<code>
 +# For quick reference, the currently available log levels are:
 +#     no logging (errors are logged regardless)
 +#     log start of jobs
 +#     log end of jobs
 +#     log jobs with exit status != 0
 +#     log the process identifier of child process (in all logs)
 +#
 +EXTRA_OPTS="-L 0"
 +</code>
  
-hier mal ein Auszug aus dem "vzlogger.log" "2. IR Lesekopf" am HZ: 
  
 +Einen Teil des Scripts stammt aus der Mailingliste [[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 das perl-Paket für die serielle Schnittstelle benötigt:
 <code> <code>
-[mtr1] Got 7 new readings from meter: +„apt-get install libdevice-serialport-perl“
-[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+
 </code> </code>
  
-[mtr1] --> beschreibt den Fotovoltaik Zähler "PV". Die damit verbundenen Daten beziehen sich auf die gesamte Energie Abgabe der Anlage.  
-<note>[mtr1] Reading: id=1-0:15.7.0*255 value=908.60 ts=1332150462.601</note> 
-Damit ergibt sich ein Messwert der aktuellen Wirkleistung von 908,60 Watt. 
  
 +<code perl getZaehler>
 +#!/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"; 
 +        } 
 + 
 +
 + 
 +</code>
  
-<note important>[mtr0] = /dev/ttyUSB0 = 1. IR Lesekopf</note> 
-<note important>[mtr1] = /dev/ttyUSB1 = 2. IR Lesekopf</note> 
hardware/channels/meters/power/edl-ehz/edl21-ehz.1333026483.txt.gz · Zuletzt geändert: 2012/03/29 15:08 von dossidr