Elektronische Haushalts Zähler [eHZ] auslesen

Hier ein Script zum auslesen eines eHz mit optischer(Infrarotschnittstelle) nach DIN EN 62056-21 Protokoll IEC-1107.

Dieses Script funktioniert nicht mit dem neuen SML Protokoll.

Registervariable, Cutter und Comport anlegen, diese entsprechen verbinden. Das Script der Registervariable zuweisen.

Die Obiskennzahlen im Array eintragen und IDs der Variablen(Float) zuweisen.

Die Zählerkennung im Cutter eintragen.
VariablenID bei Netzperiodendauer und var1-3 eintragen, sofern diese zur Verfügung stehen.

<?
$eHZdata = array("1-0:0.0.0*255"    => 15447,
                 "1-0:1.8.0*255"    => 27081,
                 "1-0:1.7.255*255"  => 11938,
                 "1-0:96.5.5*255"   => 14262,
                 "0-0:96.1.255*255" => 55994, 
                 "1-0:21.7.255*255" => 42432, // Wirkleistung L1
                 "1-0:41.7.255*255" => 40687, // Wirkleistung L2
                 "1-0:61.7.255*255" => 20592  // Wirkleistung L3
                 );

$Netzperiodendauer = 0; // VariablenID der Obis Kennzahl der Netzperiodendauer
$var1 = 0; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden
$var2 = 0; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden
$var3 = 0; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden

//Dateneingang von Registervariable
$string = explode("
", trim($IPS_VALUE));
for($i = 0; $i < count($string); $i++)
{
    $id = strstr($string[$i], "(", true); // split nach Obis Kennzahl
    $value = strstr($string[$i], "("); // split nach Daten
    $check = strpos($value, "*"); // suche nach Daten mit Angaben V-A-W
    if($check !== false) // Daten mit V-A-W ausgeben und formatieren auf 2 Stellen nach dem Komma
    {
       $value = strstr($value, "*", true); // split nach *V-A-W
        $data = substr($value, 1);
        SetValue($eHZdata[$id], number_format((float)$data, 2, ',', ''));
    }
    else // alle anderen Daten ausgeben
    {
        $data = substr(trim($value), 1, -1);
        if(strlen($data) <= 4) // Daten mit bis zu 2 Byte
        {
           if($eHZdata[$id] == $Netzperiodendauer)
            {
               $data = hexdec($data)/100; // Daten umrechnen 1/100 in ms
            }
            elseif(($eHZdata[$id] == $var1) || ($eHZdata[$id] == $var2) || ($eHZdata[$id] == $var3))
            {
               $data = $data; // Daten ohne Umrechnung
            }
            else
            {
               $data = hexdec($data); // Daten von Hex nach Dec umrechnen
            }
        }
        SetValue($eHZdata[$id], (float)$data);
    }
}
?>

Hallo Rainer,

fuer welchen eHZ hast Du das benutzt und wie tastet Du die Impulse ab?

Hallo Uwe,

das sollte eigentlich für alle Zähler welches das oben genannte Protokoll unterstützen funktionieren.

Auslesen kann man das ganze mit einem OKK (Optischer Kommunikationskopf) z.B. vom EMH. Es gibt noch verschiedene Anbieter.

Woher bekommt man solch einen Optischer Kommunikationskopf?
Gibts da auch eine Selbstbaulösung?

Hallo Rainer,

mit dem OKK kann man aber nur einen dann anbinden, ich habe gleich mehrere, die ich rein haben will. Auch mit den MUCs scheint das so nicht ohne Probleme zu funktionieren. Hast Du Dich mit dem Thema genauer befasst oder ist das nur eine Nebenanwendung bei Dir geworden?

Hallo Uwe,

das ganze Thema ist nicht so ohne, da noch nicht ganz ausgegoren. Das mit dem MUC wird nur mit dem neuen SML Protokoll funktionieren da das ganze und auch die neuen Zähler darauf basieren. Bis das ganze dann mal so funktioniert wie die Herren sich das vorgestellt haben, wird noch einige Zeit ins Land gehen.

Wir haben zwar schon Versuchsaufbauten aber nix genaues weiss man nicht. :confused:

Hallo zusammen,
möchte in IPS einsteigen u. bin gerade beim brainstorming und dabei mir ein erstes Konzept zu stricken. An der Stelle Einlesen meiner eHZ wird es offensichtlich etwas spezieller da es kein Standard SO ist.

In meinen Hager eHZ musste bei der Installation rückseitig eine optische BKE-Datenschnittstelle EHZ001 installieren lassen. Jetz baumelt ein RJ10 4P/4C heraus. s. Anhang. Diesen würde gerne ich ins IPS einlesen.

M.E. müsste dies über RS232 gehen? Falls ja wie bekommt man heute noch RS232 elegant in einen Rechner? Ich hätte z.B. LAN in der Nähe.

Zum Protokoll habe ich auch noch was gefunden

Danke im voraus für jegliche Hilfstellung

Gruss

Fiat-Lux

eHZ-09DE0009_eHZ_tech_Infos.pdf (155 KB)

Welches Protokoll verwendet denn dein Zähler.

Hallo Rainer,
das Protokoll aus dem genannten link

http://www.mikrocontroller.net/attac...kation_v11.pdf

also

Optische Datenschnittstelle D0 nach DIN EN 62056‐21 und eHZ kompatibel ( VDN‐ Lastenheft „Elektronische Haushaltzähler“ Version 1.02).
Aufbau des Datentelegramms
Telegram Mode D (unidirectional readout only, “virtual Taster”) nach
DIN EN 625056‐21
Baudrate 9600 Baud (Z=5) (nach DIN 2400 Baud für mode D, aber
für eHZ – 9600)
Byte Format Character – 1 start bit, 7 data bits, 1 parity bit (even), 1
stop bit (ISO/IEC 1177:1985)

Bin in der Zwischzeit einen Schritt weiter. Habe mir bei ibäh einen RJ10 untangler bzw. twist stop für 1,50€ geholt (anderweitig habe ich dort keine RJ10 Buchse gefunden) Buchse abgeschnitten und mit einem RS232 Stecker zusammen gebrutzelt. Ans Hyperterminal gehängt, Baudrate etc. s. link eingestellt und :eek: das Ding spuckt die Daten so wie in der Spec beschrieben. Wenn ich dann mal in IPS einsteige hoffe ich mit Deinem Skript was machen zu können.

beste Grüsse + guten Rutsch

FL

PS: habe noch einen Datenschrieb angehangen

ehz-rev.txt (13 KB)

Hallo,
ich habe seit 12/10 folgenden Zähler:

[ul]
[li]eHZ-Adapter BKE-M (Aufrüstung eines Zählerplatzes mit Zählerkreuz zu einem eHZ-Zählerplatz)[/li][li]eHZ EDL21 (EMH) mit SML-Schnittstelle[/li][li]BKE-Datenschnittstelle EHZ001 rückseitig eingebaut[/li][li]Ethernet-Gateway COM-1 von „Co.met“ (Schittstellenwandler „WIZnet WIZ110SR“ modifiziert von RJ10 4P/4C - RJ45)[/li][li]Software: Strom-cockpit App für das iPhone[/li][/ul]

Mit dem iPhone App kann ich jetzt überall mein Stromverbrauch sehen :smiley:

Ich würde es nun auch für IPS nutzen wollen. Gibt es denn schon eine Möglichkeit das SML-Protokoll (1.03) auszulesen (bzw. zu übersetzen)?

Anbei mal ein PuTTY Log:

Gruß


=~=~=~=~=~=~=~=~=~=~=~= PuTTY log 2011.01.12 13:21:19 =~=~=~=~=~=~=~=~=~=~=~=
SML(1B1B1B1B010101017607001900D7797162006200726301017601010700190043D3260B06454D4801001D4062360101636CE5007607001900D77972620062007263070177010B06454D4801001D4062360172620165004390ED7777078181C78203FF0101010104454D480177070100000009FF010101010B06454D4801001D4062360177070100010800FF63018201621E52FF56000045C2C80177070100010801FF0101621E52FF560000459B6C0177070100010802FF0101621E52FF56000000275C01770701000F0700FF0101621B52FF5500000BA00177078181C78205FF010101018302E050C5ACEB0A6B4C5C862D77B2C2A2502434BD1C4A9EB250CA81EF93D26D7B7A52B7F265C9BACF6A370FCF162A213DAE010101638F34007607001900D77974620062007263020171016384A400001B1B1B1B1A017177)
      8589
DE0000000000000000000000000000123
SML(1B1B1B1B010101017607001900D7797762006200726301017601010700190043D3280B06454D4801001D4062360101633F3F007607001900D77978620062007263070177010B06454D4801001D4062360172620165004390EF7777078181C78203FF0101010104454D480177070100000009FF010101010B06454D4801001D4062360177070100010800FF63018201621E52FF56000045C2CA0177070100010801FF0101621E52FF560000459B6E0177070100010802FF0101621E52FF56000000275C01770701000F0700FF0101621B52FF5500000BB90177078181C78205FF010101018302E050C5ACEB0A6B4C5C862D77B2C2A2502434BD1C4A9EB250CA81EF93D26D7B7A52B7F265C9BACF6A370FCF162A213DAE010101639C72007607001900D7797A620062007263020171016359ED00001B1B1B1B1A01993F)
      8591
DE0000000000000000000000000000123

Ob wir im Zuge des „Smart Metering“ das SML-Protokoll unterstützen werden steht noch nicht fest.
Dies hängt von der Marktdurchdringung ab.

MST

Das wird eh nichts bringen, da jeder sein eigenes Süppchen kocht. Ohne genau zu wissen was der Netzbetreiber für Daten zur Verfügung stellt wird es schwierig sein die Daten aufzubereiten.

…na aber das SML Protokoll ist doch ein Standard (Zählerstand, Leistung…), wenn das angezeigt wird ist das doch schon ok, oder?

das ist genauso Standart wie das alte. :smiley: Der eine bietet nur den Verbrauch an, der andere alles und der nächste denkt was kümmert mich der Rest der Welt.

Da es leider derzeit noch keinen frei verfügbaren Parser für das SML-Protokoll gibt lese ich meinen Zähler mit der EDL-cockpit Software aus.

Um die Daten in IPS zu verarbeiten und in das Webinterface zu integrieren habe ich folgendes gemacht:

  1. Da es in EDL-cockpit (noch) keinen automatischen CSV Export gibt (nur manuell) habe ich den CSV Export mit dem Tool „AutoHotKey“ automatisiert. So kann ich alle 15 Minuten einen CSV Export per IPS Skript machen und anschließend die Daten per PHP-Skript zu IPS einlesen. Hier mein AutoHotKey Skript zum exportieren der Daten nach CSV:

IfWinExist EDL-cockpit :																		
{                                                           
    WinActivate																							
}                                                           
else                                                        
{                                                           
    Run C:\Programme\EDL-cockpit\EDL-cockpit.exe						
    WinWait EDL-cockpit :																		
    WinActivate																							
    Sleep, 500																							
}                                                           
                                                            
MouseClick, left,  36,  308																	
                                                            
Sleep, 200																									
Send, {ALTDOWN}{ALTUP}{ESC}{ESC}														
                                                            
Sleep, 200																									
Send, {ALTDOWN}{ALTUP}d{ENTER}{ENTER}												
Sleep, 200																									
Send, C:\Programme\IP-Symcon_V2\export\edl-export.csv{ENTER}
                                                            
Sleep, 500																									
Send, j																											
Sleep, 500																									
Send, {ENTER}																									

  1. Zudem habe ich die EDL-cockpit SW per metaVNC in das Webinterface integriert. Somit kann ich dann auch auch die historischen Daten zugreifen. Siehe Screenshot:

Hallo RWN,

ich nutze Dein angepasstes Script um meinen eHZ von Itron (Hager) mit dem alten Protokoll auszulesen. Obwohl alle Variablen korrekt korrekt gefüllt werden, kommen bei der Verarbeitung noch einige Fehlermeldungen, die ich gerne eliminieren möchte. Da ich ein absoluter Script Anfänger bin, würde ich mich freuen, wenn Du 1. mal über das Script schaust und 2. mir mal Stichworte gibst, was genau im Script gemacht wird.

Herzlichen Dank, Stromer

<?
$eHZdata = array("1-0:0.0.0*255" => 50333, // Zaehlernummer
       "1-0:1.8.0*255" => 43029, // aktueller Zaehlerstand
       "1-0:96.5.5*255" => 56189, // Unbekannt1
                "0-0:96.1.255*255" => 28514, // Unbekannt2
                "1-0:32.7.0*255" => 10358, // Spannung L1
                "1-0:52.7.0*255" => 39458, // Spannung L2
                "1-0:72.7.0*255" => 46118, //Spannung L3
                "1-0:31.7.0*255" => 30356, //Strom L1
                "1-0:51.7.0*255" => 41944, // Strom L2
                "1-0:71.7.0*255" => 15036, // Strom L3
                "1-0:21.7.0*255" => 51462, // Wirkleistung L1
                "1-0:41.7.0*255" => 52669, // Wirkleistung L2
                "1-0:61.7.0*255" => 15335, // Wirkleistung L3
                 );

$Netzperiodendauer = 0; // VariablenID der Obis Kennzahl der Netzperiodendauer
$var1 = 0; // VariablenID der Obis Kennzahl der Daten welche nicht umgrechnet werden und nur 2 Stellen haben.
$var2 = 0; // VariablenID der Obis Kennzahl der Daten welche nicht umgrechnet werden und nur 2 Stellen haben.

//Dateneingang von Registervariable
$string = explode("
", trim($IPS_VALUE));
for($i = 0; $i < count($string); $i++)
{
    $id = strstr($string[$i], "(", true);
    $value = strstr($string[$i], "(");
    $check = strpos($value, "*");
    if($check !== false)
    {
       $value = strstr($value, "*", true);
        $data = substr($value, 1);
        SetValue($eHZdata[$id], number_format((float)$data, 2, ',', ''));
    }
    else
    {
        $data = substr(trim($value), 1, -1);
        if(strlen($data) <= 4)
        {
           if($eHZdata[$id] == $Netzperiodendauer)
            {
               $data = hexdec($data)/100;
            }
            elseif(($eHZdata[$id] == $var1) || ($eHZdata[$id] == $var2))
            {
               $data = $data;
            }
            else
            {
               $data = hexdec($data);
            }
          }
        SetValue($eHZdata[$id], (float)$data);
    }
}
$wirk_gesamt = GetValue(51462 /*[13 eHZ1 Haushalt\Wirkleistung L1]*/) + GetValue(52669 /*[13 eHZ1 Haushalt\Wirkleistung L2]*/) + GetValue(15335 /*[13 eHZ1 Haushalt\Wirkleistung L3]*/);
SetValue(19726 /*[13 eHZ1 Haushalt\Wirkleistung Summe]*/,$wirk_gesamt);
?>

wenn Du 1. mal über das Script schaust

über welches Script, ich sehe keins. Die Fehlermeldungen kommen von nicht vorhandenen Obis Kennzahlen, welche Du wohl in deinem Script stehen hast.

Verzeihung, habe mein Post erweitert. Danke

Das Script scheint nicht ganz zu deinem Zähler zupassen. Da fehlen die Kenzahlen 1-0:96.50.0*x

Probier es mal hiermit.

<?
$eHZdata = array("1-0:0.0.0*255"    => 15447,
                 "1-0:1.8.0*255"    => 42432,
                 "1-0:1.7.255*255"  => 11938,
                 "1-0:96.5.5*255"   => 14262,
                 "0-0:96.1.255*255" => 55994,
                 "1-0:21.7.0*255" => 27081, 
                 "1-0:41.7.0*255" => 40687, 
                 "1-0:61.7.0*255" => 20592,  
                 "1-0:96.50.0*0" => 11938,
                      "1-0:96.50.0*1" => 13656,
                 "1-0:96.50.0*2" => 49255,
                 "1-0:96.50.0*3" => 18449,
                 "1-0:96.50.0*4" => 14338,
                 "1-0:96.50.0*5" => 25477,
                 "1-0:96.50.0*6" => 27081,
                 "1-0:96.50.0*7" => 16969
                 );

$Netzperiodendauer = 13656 /*[eHZ\Netzperiodendauer]*/; // VariablenID der Obis Kennzahl der Netzperiodendauer
$var1 = 16969 /*[eHZ\Diagnose]*/; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden
$var2 = 11938 /*[eHZ\Netzstatus]*/; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden
$var3 = 14262 /*[eHZ\Status]*/; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden

//Dateneingang von Registervariable
$string = explode("
", trim(RegVar_GetBuffer(14099 /*[eHZ\Register Variable]*/)));
for($i = 0; $i < count($string); $i++)
{
    $id = strstr($string[$i], "(", true); // split nach Obis Kennzahl
    $value = strstr($string[$i], "("); // split nach Daten
    $check = strpos($value, "*"); // suche nach Daten mit Angaben *V-A-W
    if($check !== false) // Daten mit V-A-W ausgeben und formatieren auf 2 Stellen nach dem Komma
    {
       $value = strstr($value, "*", true); // split nach *V-A-W
        $data = substr($value, 1);
        SetValue($eHZdata[$id], number_format((float)$data, 2, ',', ''));
    }
    else // alle anderen Daten ausgeben
    {
        $data = substr(trim($value), 1, -1);
        if(strlen($data) <= 4) // Daten mit bis zu 2 Byte
        {
           if($eHZdata[$id] == $Netzperiodendauer)
            {
               $data = hexdec($data)/100; // Daten umrechnen 1/100 in ms
            }
            elseif(($eHZdata[$id] == $var1) || ($eHZdata[$id] == $var2) || ($eHZdata[$id] == $var3))
            {
               $data = $data; // Daten ohne Umrechnung
            }
            else
            {
               $data = hexdec($data); // Daten von Hex nach Dec umrechnen
            }
          }
         //echo $data."
";
        if(preg_match('/[A-F]/', $data))
        {
           SetValue($eHZdata[$id], (string)$data);
        }
        else
        {
            SetValue($eHZdata[$id], (float)$data);
        }
    }
}
?>

Hallo Rainer,

vielen Dank auch für die Kommentare. Um das besser zu lernen, würde ich sofort einen kleinen Workshop in Nidda buchen… Im Ernst.

Grüße, Stromer