Benutzer-Werkzeuge

Webseiten-Werkzeuge


hardware:channels:meters:power:edl-ehz:emh-ehz-h1

Dies ist eine alte Version des Dokuments!


EMH eHZ-H

Der EMH eHZ-H kann auch nach EN 62056-21 über die IR-Schnittstelle ausgelesen werden.

Hardware

Man benötigt den IR-Schreib-Lesekopf. Je nachdem woran man den IR-Kopf anschließen will, braucht man die USB-Version, RS232-Version oder die TTL-Version.

Der Zähler sendet lastabhängig alle paar Sekunden unaufgefordert ein SML-Datenpaket. Die Sendediode ist oben rechts hinter dem rechten der beiden Löcher in der Metallplatte. Gesendet wird mit 9600 Baud, 8N1. Die Signalqualität scheint sehr gut zu sein, mit einem Steckbrett-Aufbau war der Empfang ohne Abdunkelungsmaßnahmen aus mehreren cm Abstand möglich.

Beispieldaten

1B 1B 1B 1B                                     Start Escape Zeichenfolge
01 01 01 01                                     Start Übertragung Version 1
76                                              Liste mit 6 Einträgen
   07 00 14 04 EC 6D 20                         transactionID (7 Byte)
   62 00                                        groupNo
   62 00                                        abortOnError
   72                                           Liste mit 2 Einträgen
      63 01 01                                  Nachricht 0101 = SML_PublicOpen.Res
      76                                        Liste mit 6 Einträgen
         01                                     codepage (leer)
         01                                     clientID (leer)
         07 00 14 01 82 24 60                   reqFileID 
         0B 06 45 4D 48 xx xx xx xx xx xx       serverID 
         01                                     username (leer)
         01                                     password (leer)
   63 B7 96                                     CRC
00                                              Ende Nachricht
76                                              Liste mit 6 Einträgen
   07 00 14 04 EC 6D 21                         transactionID
   62 00                                        groupNo
   62 00                                        abortOnError
   72                                           Liste mit 2 Einträgen
      63 07 01                                  Nachricht 0701 = SML_GetList.Res
      77                                        Liste mit 7 Einträgen
         01                                     clientID (leer)
         0B 06 45 4D 48 xx xx xx xx xx xx       serverID 
         01                                     listName (leer)
         72                                     Liste mit 2 Einträgen = actSensorTime
            62 01                               Typ = secIndex
            65 01 82 78 48                      Sekunden-Index als unsigned 32
         77                                     Liste mit 7 Einträgen = valList mit ValListEntries
            77 (1)                               
               07 81 81 C7 82 03 FF             objName 129-129:199.130.3*255
                                                Herstelleridentifikation
               01                               status (leer)
               01                               valTime (leer)
               01                               unit (leer)
               01                               scaler (leer)
               04 45 4D 48                      value
               01                               valueSignature (leer)
            77 (2)                                
               07 01 00 00 00 09 FF             objName 1-0:0.0.9*255
                                                Geräteidentifikation
               01                               status
               01                               valTime
               01                               unit
               01                               scaler
               0B 06 45 4D 48 xx xx xx xx xx xx value
               01                               valueSignature
            77 (3)                                
               07 01 00 01 08 00 FF             objName 1-0:1.8.0*255
                                                Wirkarbeit Bezug total
               63 01 82                         status = unsigned 16
               01                               valTime
               62 1E                            unit (unsigned8) 1E = Wh
               52 FF                            scaler (int8) -1 = *10^-1 = /10
               56 00 01 29 71 4F                value  19493967/10 = 1949396,7 Wh = 1949,3967 kWh
               01                               valueSignature (leer)
            77 (4)
               07 01 00 01 08 01 FF             objName 1-0:1.8.1*255
                                                Wirkarbeit Bezug Tarif 1
               01                               status (leer)
               01                               valTime (leer)
               62 1E                            unit (unsigned8) 1E = Wh
               52 FF                            scaler (int8) -1 = *10^-1 = /10
               56 00 01 29 71 4F                value  19493967/10 = 1949396,7 Wh = 1949,3967 kWh
               01                               valueSignature (leer)
            77 (5)
               07 01 00 01 08 02 FF             objName 1-0:1.8.2*255
                                                Wirkarbeit Bezug Tarif 2
               01                               status (leer)
               01                               valTime (leer)
               62 1E                            unit (unsigned8) 1E = Wh
               52 FF                            scaler (int8) -1 = *10^-1 = /10
               56 00 00 00 00 00                value 0
               01                               valueSignature (leer)
            77 (6)
               07 01 00 0F 07 00 FF             objName 1-0:15.7.0*255
                                                Wirkleistung total
               01                               status (leer)
               01                               valTime (leer)
               62 1B                            unit (unsigned8) 1B = W
               52 FF                            scaler (int8) -1 = *10^-1 = /10
               55 00 00 11 51                   value 4433/10 = 443,3 W
               01                               valueSignature (leer)
            77 (7)
               07 81 81 C7 82 05 FF             objName 129-129:199.130.5*255
                                                Public Key des Zählers
               01                               status (leer)
               01                               valTime (leer)
               01                               unit (leer)
               01                               scaler (leer)
               83 xx xx xx xx xx xx xx xx xx xx value
                  xx xx xx xx xx xx xx xx xx xx 
                  xx xx xx xx xx xx xx xx xx xx 
                  xx xx xx xx xx xx xx xx xx xx 
                  xx xx xx xx xx xx xx xx xx
               01                               valueSignature (leer)
         01                                     listSignature (leer)
         01                                     actGatewayTime (leer)
   63 C1 04                                     CRC
00                                              Ende Nachricht
76     
   07 00 14 04 EC 6D 24                         transactionID
   62 00                                        groupNo
   62 00                                        abortOnError
   72 
      63 02 01                                  Nachricht 0201 = SML_PublicClose.Res
      71 
         01                                     Signature (leer)
   63 DD 06                                     CRC
00                                              Ende 
00                                              Ende
1B 1B 1B 1B                                     Escape-Sequenz
1A 01 64 62                                     Ende Nachricht mit Füllbyte und Prüfsumme
00                                              Ende

Zähler mit Shell-Skripte abfragen

Um die Zähler schnell und ohne große Vorarbeit auslesen zu können, bieten sich folgende Skripte an. Für einen Dauerbetrieb sind sie jedoch weniger geeignet, da manchmal einige Zeit vergehen muss, um den Datenanfang zu erfassen.

HINWEIS: für die Ausführung werden folgende Utities benötigt

  • bc
  • stty
  • xxd (wird mit dem vi installiert)

Zählerwerte ausgeben

Die folgenden Zeilen werden in eine Datei read.sh gespeichert und erzeugen nach deren Ausführung folgende Ausgabe:

Meter 1.8.0 (from plant):     1488.36 kWh
Meter 2.8.0 (to plant):       1591.32 kWh
Total effective power (+/-):  1687.14 W
#!/bin/bash
# read and evaluate SML output received from EMH eHZ

# set serial device
INPUT_DEV="/dev/ttyUSB0"

#set $INPUT_DEV to 9600 8N1
stty -F $INPUT_DEV 1:0:8bd:0:3:1c:7f:15:4:5:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0

SML_START_SEQUENCE="1B1B1B1B0101010176"
METER_OUTPUT__START_SEQUENCE=""

while [ "$METER_OUTPUT__START_SEQUENCE" != "$SML_START_SEQUENCE" ]
do
        METER_OUTPUT=`cat $INPUT_DEV 2>/dev/null | xxd -p -u -l 460`
        METER_OUTPUT__START_SEQUENCE=$(echo "${METER_OUTPUT:0:18}")
        if [ $METER_OUTPUT__START_SEQUENCE != $SML_START_SEQUENCE ];
        then
                echo "missed start and trying again..."
                #exit 1 
        fi
done

let METER_180=0x${METER_OUTPUT:390:10}
VALUE=$(echo "scale=2; $METER_180 / 10000" |bc)
echo "Meter 1.8.0 (from plant):    " $VALUE "kWh"

let METER_180=0x${METER_OUTPUT:347:10}
VALUE=$(echo "scale=2; $METER_180 / 10000" |bc)
echo "Meter 2.8.0 (to plant):      " $VALUE "kWh"

let METER_180=0x${METER_OUTPUT:518:8}
VALUE=$(echo "scale=2; $METER_180 / 10" |bc)
echo "Total effective power (+/-): " $VALUE "W"

HTML-Seite erzeugen

Die folgenden Zeilen in eine Datei read2html.sh gespeichert und als cgi-script aufgerufen, präsentieren die Zähler als HTML-Seite für einen Browser. Die Konfiguration eines http-Servers wie lighttpd muss natürlich separat erfolgen.

#!/bin/bash
# read and evaluate SML output received from EMH eHZ

# set serial device
INPUT_DEV="/dev/ttyUSB0"

#set $INPUT_DEV to 9600 8N1
stty -F $INPUT_DEV
1:0:8bd:0:3:1c:7f:15:4:5:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0

SML_START_SEQUENCE="1B1B1B1B0101010176"
METER_OUTPUT__START_SEQUENCE=""

while [ "$METER_OUTPUT__START_SEQUENCE" != "$SML_START_SEQUENCE" ]
do
        METER_OUTPUT=`cat $INPUT_DEV 2>/dev/null | xxd -p -u -l 365`
        METER_OUTPUT__START_SEQUENCE=$(echo "${METER_OUTPUT:0:18}")
done

echo "Content-Type: text/html; charset=utf-8"
echo ""
echo ""
echo "<html>"
echo " <head>"
echo "   <title>Z&auml;hlerauswertung</title>"
echo "   <meta name=\"viewport\" content=\"width=device-width,
initial-scale=1.0, user-scalable=no\">"
echo " </head>"
echo " <body>"

echo " <h1> Z&auml;hlerst&auml;nde </h1>"

let METER_180=0x${METER_OUTPUT:390:10}
VALUE=$(echo "scale=2; $METER_180 / 10000" |bc)
echo " <tt>Bezug.......: " $VALUE "kWh</tt><br>"

let METER_180=0x${METER_OUTPUT:347:10}
VALUE=$(echo "scale=2; $METER_180 / 10000" |bc)
echo " <tt>Einspeisung.: " $VALUE "kWh</tt><br>"

let METER_180=0x${METER_OUTPUT:518:8}
VALUE=$(echo "scale=2; $METER_180 / 10" |bc)
echo " <tt>Wirkleistung: " $VALUE "W</tt>"

echo " </body>"
echo "</html>"

Stromzähler Wert auslesen

Um Monatswerte des Stromzählers zum Vergleich zu dokumentieren, ist es sinnvoll an jedem 1sten des Monats den absoluten Zählerwert zu notieren.

Um den absoluten Stromzähler Wert auszulesen, muss man die Datenbank abfragen. Damit das komfortabel über einen Web Browser gemacht werden kann, habe ich einen PHP Script entwickelt. Nach dem Aufruf im Web Browser erscheint eine Ausgabe, siehe Bild rechts. Ohne Auswahl von Monat und Jahr wird der Zähler Wert zum 1sten des aktuellen Monats angezeigt. Durch Auswahl von Monat und Jahr und anklicken des Knopfes submit wird der entsprechende Wert angezeigt.

Zum eigenen Gebrauch müssen noch die Datenbank Variablen angepasst werden: $username, $password, $channel_id.

Der File muss auf dem Web Server in den Volkszaehler Pfad im Ordner htdocs gespeichert werden.

Web Adresse im lokalen Netzwert: <IP-Adresse>/vz_read_strom.php

<?php // program "vz_read_strom.php", 2014-05-09 RudolfReuter 
// Version Zaehler EMH eHZ
?>
<h3>Stromzaehler auslesen</h3>
<?php
if (isset($_GET['month']) && isset($_GET['year'])) {
    $month = $_GET['month'];
    $year = $_GET['year'];
}
else {
    $month = date("m");
    //echo "actual date \n";
    $year = date("Y");
}
?>
<form id="user_form" action="vz_read_strom.php" method="get">
    <fieldset>
        <select name="month">
            <option value="01">Januar</option>
            <option value="02">Februar</option>
            <option value="03">Maerz</option>
            <option value="04">April</option>
            <option value="05">Mai</option>
            <option value="06">Juni</option>
            <option value="07">Juli</option>
            <option value="08">August</option>
            <option value="09">September</option>
            <option value="10">Oktober</option>
            <option value="11">November</option>
            <option value="12">Dezember</option>
        </select>
        <select name="year">
            <option value="2014">2014</option>
            <option value="2015">2015</option>
            <option value="2016">2016</option>
            <option value="2017">2017</option>
            <option value="2018">2018</option>
            <option value="2019">2019</option>
            <option value="2020">2020</option>
            <option value="2021">2021</option>
            <option value="2022">2022</option>
            <option value="2023">2023</option>
        </select>
        <input type="submit" name="submit" value="submit">
    </fieldset>
</form>
<?php
    $str_from = "$year-$month-01 08:00:00";
    $date1 = new DateTime($str_from);
    //echo $date1->format('Y-m-d H:i:s') . "\n";
    $time_from = $date1->getTimestamp() * 1000;
    //echo $time_from . "\n";

    $str_to = "$year-$month-01 08:15:00";
    $date2 =  new DateTime($str_to);
    $time_to = $date2->getTimestamp() * 1000;
    //echo $time_to . "\n";

    $username="root";
    $password="raspberry";
    $channel_id="11";
    $str_sql = "SELECT value FROM data WHERE channel_id=$channel_id AND timestamp BETWEEN $time_from AND $time_to LIMIT 0, 1";
    //echo $str_sql . "\n";
    $db = mysql_connect('localhost', $username, $password);
    if (!$db) {
        die('Verbindung schlug fehl: ' . mysql_error());
    }
    $db_vz = mysql_select_db('volkszaehler', $db);
    $sql_res = mysql_query($str_sql);
    $row = mysql_fetch_assoc($sql_res);
    echo ($row["value"]/1000) . " KWh, ";
    echo "$year-$month-01 08:00 \n";
?>
hardware/channels/meters/power/edl-ehz/emh-ehz-h1.1399711827.txt.gz · Zuletzt geändert: 2014/05/10 10:50 von rudolf