ISKRA eHZ-EDL Type MT681-D4A51-K0p - SML Protokoll auswerten, LAN

Hallo zusammen,

anbei meine Lösung zur Einbindung des Stromzählers ISKRA MT681 per Ethernet.
(Vorab nochmals vielen Dank für das Script von RWN - das als Grundlage gedient hat)

Verwendete Komponenten:

Stromzähler: ISKRA - eHZ-EDL Type MT681-D4A51-K0p
Lesekopf: co.met - COM-IR Datenschnittstelle Infrarot RS232 gem. IEC 1107 bzw. EN61107
Gateway: co.met - Smart Meter LAN/DSL-Gateway für elektronische Stromzähler

Aufbau Hardware

Stromzähler -> IR Datenschnittstelle -> Gateway -> Ethernet

Das Gateway von co.met sucht automatisch über den DHCP Server eine IP Adresse, alternativ lässt sich das Gateway per Java-Tool auch auf eine feste IP Adresse konfigurieren.

Konfiguration IPS

I/O Instanz - Client Socket
Aktiv, IP Adresse Gateway + Port 5000

Splitter Instanz - Cutter
Benutze Zeichen für Schritte
Benutzerdefiniert
Linke Trennzeichen: 30 31 30 31 30 31 30 31 (Haken bei HEX)
Rechte Trennzeichen: 31 42 31 42 31 42 31 42 (Haken bei HEX)
Übergeordnete Instanz: Der zuvor angelegte Client Socket

Variablen
Bitte folgenden Variablen Anlegen

  • Wirkenergie, Float, Einheit khW
  • Wirkenergie - Tarif 1, Float, Einheit khW
  • Wirkenergie - Tarif 2, Float, Einheit khW
  • Wirkleistung, Float, Einheit W
  • Wirkleistung - L1, Float, Einheit W
  • Wirkleistung - L2, Float, Einheit W
  • Wirkleistung - L3, Float, Einheit W
  • Zähler ID, String, keine Einheit

ggf. entsprechende Profile (W und KhW) für die Variablen anlegen und definieren.

Script
Bitte Script anlegen und die ID der Variablen entsprechen anpassen - mehr ist nicht zu tun.

<?
if($_IPS['SENDER'] == "RegisterVariable")

{
    // Wirkenergie - Obiskennung:1-0.1.8.0*255 Hex:01 00 01 08 00 FF
    if(strpos($_IPS['VALUE'], chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x30).chr(0x31).chr(0x30).chr(0x38).chr(0x30).chr(0x30).chr(0x46).chr(0x46)) !== false)
    {
       $wirkenergie = explode(chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x30).chr(0x31).chr(0x30).chr(0x38).chr(0x30).chr(0x30).chr(0x46).chr(0x46), $_IPS['VALUE']);
       SetValue(55203/*[Stromzähler\Allgemeinstrom\Wirkenergie]*/, hexdec(substr($wirkenergie[1], 22, 16))/10000);
    }
    else
    {
       LogMessage();
    }
    // Wirkenergie - Tarif 1 - Obiskennung:1-0.1.8.1*255 Hex:01 00 01 08 01 FF
   if(strpos($_IPS['VALUE'], chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x30).chr(0x31).chr(0x30).chr(0x38).chr(0x30).chr(0x31).chr(0x46).chr(0x46)) !== false)
    {
        $wirkenergieT1 = explode(chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x30).chr(0x31).chr(0x30).chr(0x38).chr(0x30).chr(0x31).chr(0x46).chr(0x46), $_IPS['VALUE']);
        SetValue(27584/*[Stromzähler\Allgemeinstrom\Positive Wirkenergie - Tarif 1]*/, hexdec(substr($wirkenergieT1[1], 14, 16))/10000);
    }
    else
    {
       LogMessage();
    }
    // Wirkenergie - Tarif 2 - Obiskennung:1-0.1.8.2*255 Hex:01 00 01 08 02 FF
    if(strpos($_IPS['VALUE'], chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x30).chr(0x31).chr(0x30).chr(0x38).chr(0x30).chr(0x32).chr(0x46).chr(0x46)) !== false)
    {
        $wirkenergieT2 = explode(chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x30).chr(0x31).chr(0x30).chr(0x38).chr(0x30).chr(0x32).chr(0x46).chr(0x46), $_IPS['VALUE']);
        SetValue(29688/*[Stromzähler\Allgemeinstrom\Wirkenergie - Tarif 2]*/, hexdec(substr($wirkenergieT2[1], 14, 16))/10000);
    }
   else
    {
       LogMessage();
    }
	    // Wirkleistung - Obiskennung:1-0.15.7.0*255 Hex:01 00 0F 07 00 FF
    if(strpos($_IPS['VALUE'], chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x30).chr(0x46).chr(0x30).chr(0x37).chr(0x30).chr(0x30).chr(0x46).chr(0x46)) !== false)
    {
        $wirkleistung = explode(chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x30).chr(0x46).chr(0x30).chr(0x37).chr(0x30).chr(0x30).chr(0x46).chr(0x46), $_IPS['VALUE']);
        SetValue(15667/*[Stromzähler\Allgemeinstrom\Wirkleistung]*/, hexdec(substr($wirkleistung[1], 14, 8)));
    }
   else
    {
       LogMessage();
    }
	    // Wirkleistung - L1 - Obiskennung:1-0.21.7.0*255 Hex:01 00 15 07 00 FF
    if(strpos($_IPS['VALUE'], chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x31).chr(0x35).chr(0x30).chr(0x37).chr(0x30).chr(0x30).chr(0x46).chr(0x46)) !== false)
    {
        $wirkleistungL1 = explode(chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x31).chr(0x35).chr(0x30).chr(0x37).chr(0x30).chr(0x30).chr(0x46).chr(0x46), $_IPS['VALUE']);
        SetValue(34200/*[Stromzähler\Allgemeinstrom\Wirkleistung - L1]*/, hexdec(substr($wirkleistungL1[1], 14, 8)));
    }
   else
    {
       LogMessage();
    }
	    // Wirkleistung - L2 - Obiskennung:1-0.41.7.0*255 Hex:01 00 29 07 00 FF
    if(strpos($_IPS['VALUE'], chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x32).chr(0x39).chr(0x30).chr(0x37).chr(0x30).chr(0x30).chr(0x46).chr(0x46)) !== false)
    {
        $wirkleistungL2 = explode(chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x32).chr(0x39).chr(0x30).chr(0x37).chr(0x30).chr(0x30).chr(0x46).chr(0x46), $_IPS['VALUE']);
        SetValue(28949/*[Stromzähler\Allgemeinstrom\Wirkleistung - L2]*/, hexdec(substr($wirkleistungL2[1], 14, 8)));
    }
   else
    {
       LogMessage();
    }
	    // Wirkleistung - L3 - Obiskennung:1-0.61.7.0*255 Hex:01 00 3D 07 00 FF
    if(strpos($_IPS['VALUE'], chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x33).chr(0x44).chr(0x30).chr(0x37).chr(0x30).chr(0x30).chr(0x46).chr(0x46)) !== false)
    {
        $wirkleistungL3 = explode(chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x33).chr(0x44).chr(0x30).chr(0x37).chr(0x30).chr(0x30).chr(0x46).chr(0x46), $_IPS['VALUE']);
        SetValue(44814/*[Stromzähler\Allgemeinstrom\Wirkleistung - L3]*/, hexdec(substr($wirkleistungL3[1], 14, 8)));
    }
   else
    {
       LogMessage();
    }
        // Zähler-ID):1-0.0.0.9*255 Hex:01 00 00 00 09 FF
    if(strpos($_IPS['VALUE'], chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x30).chr(0x30).chr(0x30).chr(0x30).chr(0x30).chr(0x39).chr(0x46).chr(0x46)) !== false)
    {
        $ServerID = explode(chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x30).chr(0x30).chr(0x30).chr(0x30).chr(0x30).chr(0x39).chr(0x46).chr(0x46), $_IPS['VALUE']);
        SetValue(52463/*[Stromzähler\Allgemeinstrom\Zähler-ID*/, hexdec(substr($ServerID[1], 20, 6)));
    }
   else
    {
       LogMessage();
    }
}
function Str2Hex($daten)
{
    $hex = "";
     for($i=0; $i<strlen($daten); $i++)
   $hex .= sprintf("%02X ", ord($daten[$i]));
     return $hex;
}
function LogMessage()
{
    // Fehlermeldung nach logs schreiben
    $log = IPS_GetKernelDir()."logs\\Error eHZ_EMH.txt";
    $fp = fopen($log, "a");
    fwrite($fp, date("H:i:s ")."Datenlaenge: ".strlen($_IPS['VALUE'])." Daten: ".Str2Hex($_IPS['VALUE'])."
");
    fclose($fp);
}
?>

Register Variable
Target: Das zuvor angelegte Script
Übergeordnete Instanz: Der zuvor angelegte Cutter

Fertig

Ich hoffe ich kann damit jemanden helfen!

Grüße Micha

Hi,

ich habe vor einer geraumen Zeit auch ein Skript für eHZ geschrieben und hier veröffentlicht. Magst du mal deinen Datenstream zeigen. Damit ich sehen kann, ob ich das bei mir ergänzen kann?

Gruß
Kevin

Hi Kevin,

klar schicke dir die Dumps per PM.

Habe so ziemlich alles was brauchbar war ausgelesen. Nur auf Server-ID, Hersteller-Nummer, und Individuelle-ID habe ich verzichtete. Laut Hersteller gibt der Zähler noch weitere Informationen wie z.B. Spannung, Frequenz… aus, allerdings nur bei entsprechender Konfiguration. Daher wäre es interessant zu wissen was anderen Zähler so an Daten liefern.

Grüße

Micha

…gelöscht…