eHZ EMH SML Protokoll auswerten (veraltet kein Support mehr!)

Ich habe es mit

Baud: 9600
Databits: 8
Stopbits: 1
Parity: None

und mit:

Baud: 9600
Databits: 7
Stopbits: 1
Parity: Even

probiert. Das Ergebniss ist leider das selbe.

Hallo zusammen,

erstmal vielen Dank für die vielen Informationen die ihr hier im Forum zusammengetragen habt!
Bis jetzt bin ich aufgrund der bestehenden HowTo etc. immer weitergekommen. Bis jetzt…

Als nächstes Projekt wollte ich jetzt meinen „EMH eHZ-IW8E2A5L0EK2P“ auslesen und in eine Visualisierung bringen.
Aber dazu muss ich gestehen fehlen mir wohl noch einige Grundlagen die ich nicht zu füllen weiß.

  1. Ich sehe von der hintern Schnittstelle ein 4Pol Kabel mit Stecker jedoch weiß ich nicht ob dies ein MUK oder ??? ist.
    Kann mich nur daran erinnern das die Schnittstelle sehr Günstig war 30-40€

  2. Wenn dies wirklich eine Idra - Com Schnittstelle wäre (wovon man bei dem Preis ausgehen kann) wäre dann diese Pin Belegung Richtig?

Stecker Belegung:
EMH --> COM1
2 --> 3
3 --> 2
4 --> 4
5 --> 5

  1. Gibt es ein Zusammenhängendes HowTo bzgl. Cutter und Einstellungen?

Im Voraus vielen Dank und Grüße aus Köln,
Steinii

Vielleicht hilft Dir mein HowTo (PDF Dokument) aus diesem Thread weiter.

Eintrag kann gelöscht werden, danke

Hy ich klinke mich hier jetzt auch mal ein.

Bin in Sachen IPS ein Neuling und bin gerade an meiner Grundkonfiguration. Um meinen Stromzähler auszulesen wollte ich gerne dein Script nutzen.
Daten werden mir auch angezeigt nur leider nicht die richtigen. Daher wäre ich über ein wenig Starthilfe sehr dankbar!
Hier erst mal die harten Fakten

Stromzähler: Easymeter Q3Ba mit USB IR Lesekopf an der Infoschnittstelle
Diese Liefert: SML 1.03

Über hTerm bekomme ich folgende Daten

77070100010801FF0101621E5201650003C04401 = Tarif HT = 2458 kw/h
77070100010802FF0101621E5201650001D09B01 = Tarif NT = 1189 kw/h
77070100010700FF0101621B52FE5500000E7B01 = L1+L2+L3 = 15 W

in IPS sieht es dann folgendermaßen aus

Der Cutter ist folgendermaßen eingestellt:

Linkes Trennzeichen: 01 01 01 01
Rechtes Trennzeichen: 1B 1B 1B 1B

<?

if($_IPS['SENDER'] == "RegisterVariable")
{
    // HerstellerID Obiskennung:129-129.199.130.3*255 Hex:81 81 C7 82 03 FF
    if(strpos($_IPS['VALUE'], chr(0x81).chr(0x81).chr(0xC7).chr(0x82).chr(0x03).chr(0xFF)) !== false)
    {
        $herstellerID = explode(chr(0x81).chr(0x81).chr(0xC7).chr(0x82).chr(0x03).chr(0xFF), $_IPS['VALUE']);
        SetValue(29101 /*[Home\HWR\Stromzähler\Easymeter Q3B\HerstellerID]*/, substr($herstellerID[1], 5, 3));
    }
    else
    {
       LogMessage();
    }

    // Zählerstand (Wirk-Energie Total Bezug) Obiskennung:1-0.1.8.1*255 Hex:01 00 01 08 00 FF
    if(strpos($_IPS['VALUE'], chr(0x01).chr(0x00).chr(0x01).chr(0x08).chr(0x01).chr(0xFF)) !== false)
    {
       $zaehlerstand_ht = explode(chr(0x01).chr(0x00).chr(0x01).chr(0x08).chr(0x01).chr(0xFF), $_IPS['VALUE']);
       SetValue(20773 /*[Home\HWR\Stromzähler\Easymeter Q3B\Zählerstand HT]*/, hexdec(Str2Hex(substr($zaehlerstand_ht[1], 9, 5)))/10000);
    }
    else
    {
       LogMessage();
    }

    // Wirkleistung (Wirk-Leistung Total) Obiskennung:1-0.15.7.0*255 Hex:01 00 0F 07 00 FF
    if(strpos($_IPS['VALUE'], chr(0x01).chr(0x00).chr(0x01).chr(0x07).chr(0x00).chr(0xFF)) !== false)
    {
       $wirkleistung = explode(chr(0x01).chr(0x00).chr(0x01).chr(0x07).chr(0x00).chr(0xFF), $_IPS['VALUE']);
       SetValue(23397 /*[Home\HWR\Stromzähler\Easymeter Q3B\Wirkleistung]*/, hexdec(Str2Hex(substr($wirkleistung[1], 7, 4)))/10);
    }
   else
    {
       LogMessage();
    }

    // Bezug Tarif 1 (Wirk-Energie Tarif 1 Bezug) Obiskennung:1-0.1.8.2*255 Hex:01 00 01 08 01 FF
   if(strpos($_IPS['VALUE'], chr(0x01).chr(0x00).chr(0x01).chr(0x08).chr(0x02).chr(0xFF)) !== false)
    {
        $zaehlerstand_nt = explode(chr(0x01).chr(0x00).chr(0x01).chr(0x08).chr(0x02).chr(0xFF), $_IPS['VALUE']);
        SetValue(34678 /*[Home\HWR\Stromzähler\Easymeter Q3B\Zählerstand NT]*/, hexdec(Str2Hex(substr($zaehlerstand_nt[1], 7, 5)))/10000);
    }
    else
    {
       LogMessage();
    }

    // Bezug Tarif 2 ((Wirk-Energie Tarif 2 Bezug) Obiskennung:1-0.1.8.2*255 Hex:01 00 01 08 02 FF
    if(strpos($_IPS['VALUE'], chr(0x01).chr(0x00).chr(0x01).chr(0x08).chr(0x02).chr(0xFF)) !== false)
    {
        $bezugTarif2 = explode(chr(0x01).chr(0x00).chr(0x01).chr(0x08).chr(0x02).chr(0xFF), $_IPS['VALUE']);
        SetValue(35966 /*[Objekt #35966 existiert nicht]*/, hexdec(Str2Hex(substr($bezugTarif2[1], 7, 5)))/10000);
    }
   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);
}
?>

Danke für die Hilfe

Hi powrdk,

hier mal deine „harten Fakten“, denke das Komma habe ich richtig gesetzt? Oder verbrauchst du gerade 14 Watt, dann würde ich die Kommas weiter oben wohl auch nochmals weiter nach links verschieben :smiley:

Wirkenergie im Tarif 1
7707 01 00 01 08 01 FF 0101621E520165 0003C044 01 | = 319268 vermutlich /100 = 3192,68 kw/h.

Wirkenergie im Tarif 2
7707 01 00 01 08 02 FF 0101621E520165 0001D09B 01 | = 1208155 vermutlich /100 = 12081,55 kw/h.

Wirkleistung Gesamt
7707 01 00 01 07 00 FF 0101621B52FE55 00000E7B 01 = 14123 vermutlich /1000 = 14,123 W

Der Befehl substr muss die ersten 14 Stellen nach der Kennung ignorieren, und dann die folgenden 8 Stellen ausgeben.

Probier es mal mit folgendem Script, habe es bis auf die 3 Variablen für dich angepasst - hoffe es funktioniert (ist noch viel zu früh am Morgen :slight_smile: )

Viel erfolg!

Micha

Und HIER findest du den Rest vom Script, falls benötigt.


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

{

    // 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(22897 /*[Stromzähler\Heizstrom\Wirkenergie - Tarif 1]*/, hexdec(substr($wirkenergieT1[1], 14, 8))/100);
    }
    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(37161 /*[Stromzähler\Heizstrom\Wirkenergie - Tarif 2]*/, hexdec(substr($wirkenergieT2[1], 14, 8))/100);
    }
   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(54000 /*[Stromzähler\Heizstrom\Wirkleistung]*/, hexdec(substr($wirkleistung[1], 14, 8))/10);
    }
   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);
}
?>

Supi werde es morgen gleich mal ausprobieren (heute muss ich leider arbeiten)

Sieht aber schon fast gut aus. Nur die Wirkleistung stimmt noch nicht aber so langsam steige ich auch durch die Hex Zahlen durch. :smiley:
Müßte dann also so aussehen

Wirkleistung Gesamt
7707 01 00 01 07 00 FF 0101621B52FE55 00000E7B 01 = 14W (am Zähler abgelesen)

HEX: 00 00 0E 7B = Dec: 0 0 14 123 = 14,123W

$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(54000 /*[Stromzähler\Heizstrom\Wirkleistung]*/, hexdec(substr($wirkleistung[1], 14, 6)));

Hab ich mir das so richtig abgeleitet?

Danke für die Hilfe und noch einen schönen Sonntag :wink:

Genau :slight_smile:

hatte beim umwandeln vergessen das Leerzeichen zu setzen, hab mein Fehler jetzt aber korrigiert, sorry :slight_smile:

Im Script übernimmt diese Aufgabe der Befehl „hexdec“, durch eine entsprechende Division am Ende wird das Ergebniss als Float in der richtigen Skalierung ausgegeben. In deinem letzten Beispiel durch 1000.

Sollte mein Script nicht funktionieren entferne bitte den Befehl „hexdec“ und die Division am Ende. Das Ergebnis dann in eine Test Integer Variable ausgeben lassen, dann siehst du den HEX wert in der Variable. Ist dieser nicht identisch mit dem Wert aus der RegVar -> Werte aus der Funktion substr schrittweise anpassen bis der vollständige HEX Wert korrekt ausgegeben wird. Hier die Werte die verändert werden können: hexdec(substr($wirkleistung[1], 14, 6))); . Danach wieder alle Befehle einfügen und die Variable zurück ändern.

Viel Erfolg :slight_smile:

Grüße

So hab´s heute mal ausprobiert. Leider haut´s noch nicht hin.
Bin aber trotzdem ein stück weiter. Auf meiner Suche nach einer lösung bin ich im freesol Forum darauf gestoßen das der Zählerstand berechnet werden muss. Ich hab das mal in Excel eingegeben und siehe da die richtigen Werte :smiley: jetzt muss es nur noch in IPS funktionieren.

Hier mal die Formel:

Q3Ba_Berechnung.JPG

wie muss ich diese denn jetzt ins Script eingeben?

UPDATE:

Ich habs hinbekommen :smiley:

 <?

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

    // Zählerstand (Wirk-Energie Total Bezug) Obiskennung:1-0.1.8.0*255 Hex:01 00 01 08 00 FF
    if(strpos($_IPS['VALUE'], chr(0x01).chr(0x00).chr(0x01).chr(0x08).chr(0x00).chr(0xFF)) !== false)
    {
       $zaehlerstand = explode(chr(0x01).chr(0x00).chr(0x01).chr(0x08).chr(0x00).chr(0xFF), $_IPS['VALUE']);
       $zahl1 = bin2hex(substr($zaehlerstand[1], 31, 1));
       $zahl2 = bin2hex(substr($zaehlerstand[1], 32, 1));
       $zahl3 = bin2hex(substr($zaehlerstand[1], 33, 1));
       $zahl4 = bin2hex(substr($zaehlerstand[1], 34, 1));
       
		 $zahl5 = hexdec($zahl1);
		 $zahl6 = hexdec($zahl2);
		 $zahl7 = hexdec($zahl3);
		 $zahl8 = hexdec($zahl4);
       
              SetValue(51063 /*[Home\HWR\Stromzähler\Easymeter Q3B	est]*/,(((($zahl5*256)+$zahl6)*256+$zahl7)*256+$zahl8)/100);
    }
    

}
?>

Sieht vielleicht nicht schön aus, aber dafür das ich bis letzte Woche noch nie mit PHP gearbeitet habe schon ganz gut und es erfüllt seinen Zweck!

Habe gerade mal meinen Hager Zähler an IPS angebunden.
Im Anhang mal ein Dump vom Cutter.
Ich finde dort leider kein: „01 00 01 08 00 FF“
Und das sollte doch der Zählerstand sein?
Kann mir jemand helfen?

dump.txt (85.1 KB)

Hallo Thomas,

ich schau mir das heute Abend mal an. :wink:

Häng nochmal einen Dump vom Comport an.

Das ist nett, danke.:slight_smile:

Hier der Dump vom Comport.

dump.txt (20.6 KB)

Würde mal sagen nach „1E 52 FF 56“ kommt der Zählerstand (kWh) und nach „1B 52 FF 55“ die Leistung (W).
Auf den ersten Blick sieht es zumindest so aus. Am besten mal die Werte danach in Dezimal umrechnen und mit den tatsächlich (bekannten) Werten vergleichen. Hoffe das hilft weiter.

dump_analyse.JPG

Perfekt! Danke Dir. Das klappt.
Hier noch für alle die es mal brauchen:


if($_IPS['SENDER'] == "RegisterVariable")
{
    if(strpos($_IPS['VALUE'], chr(0x1E).chr(0x52).chr(0xFF).chr(0x56)) !== false)
    {
       $zaehlerstand = explode(chr(0x1E).chr(0x52).chr(0xFF).chr(0x56), $_IPS['VALUE']);
       SetValue(26059 /*[Test\Test_2\Zählerstand]*/, hexdec(Str2Hex(substr($zaehlerstand[1], 0, 5)))/10000);
    }
}

function Str2Hex($daten)
{
    $hex = "";
    for($i=0; $i<strlen($daten); $i++)
    $hex .= sprintf("%02X ", ord($daten[$i]));
    return $hex;
}

Hallo Thomas,

sorry wurde bisschen später. Hatte noch Gäste. :wink:

Hier das Script. Dein Hager gibt sich als EMH aus.

if($_IPS['SENDER'] == "RegisterVariable"){    // HerstellerID Obiskennung:129-129.199.130.3*255 Hex:81 81 C7 82 03 FF    if(strpos($_IPS['VALUE'], chr(0x81).chr(0x81).chr(0xC7).chr(0x82).chr(0x03).chr(0xFF)) !== false)    {       //print_r(explode(chr(0x81).chr(0x81).chr(0xC7).chr(0x82).chr(0x03).chr(0xFF), $_IPS['VALUE']));        $herstellerID = explode(chr(0x81).chr(0x81).chr(0xC7).chr(0x82).chr(0x03).chr(0xFF), $_IPS['VALUE']);        SetValue(53270 /*[eHZ\Test SML\Hersteller]*/, substr($herstellerID[1], 5, 3));    }
    // ServerID   if(strpos($_IPS['VALUE'], chr(0x01).chr(0x00).chr(0x00).chr(0x00).chr(0x09).chr(0xFF)) !== false)    {       $serverID = explode(chr(0x01).chr(0x00).chr(0x00).chr(0x00).chr(0x09).chr(0xFF), $_IPS['VALUE']);       SetValue(30154 /*[eHZ\Test SML\ServerID]*/, Str2Hex(substr($serverID[1], 5, 10)));    }        // Leistung    if(strpos($_IPS['VALUE'], chr(0x01).chr(0x00).chr(0x01).chr(0x07).chr(0x00).chr(0xFF)) !== false)    {       $wirkleistung = explode(chr(0x01).chr(0x00).chr(0x01).chr(0x07).chr(0x00).chr(0xFF), $_IPS['VALUE']);       SetValue(14730 /*[eHZ\Test SML\Wirkleistung]*/, hexdec(Str2Hex(substr($wirkleistung[1], 7, 4)))/10);    }        // Bezug Tarif 1 (Wirk-Energie Tarif 1 Bezug) Obiskennung:1-0.1.8.1*255 Hex:01 00 01 08 01 FF    if(strpos($_IPS['VALUE'], chr(0x01).chr(0x00).chr(0x01).chr(0x08).chr(0x01).chr(0xFF)) !== false)    {        $bezugTarif1 = explode(chr(0x01).chr(0x00).chr(0x01).chr(0x08).chr(0x01).chr(0xFF), $_IPS['VALUE']);        SetValue(47791 /*[eHZ\Test SML\Bezug 1]*/, hexdec(Str2Hex(substr($bezugTarif1[1], 8, 5)))/10000);    }}
function Str2Hex($daten){    $hex = "";     for($i=0; $i<strlen($daten); $i++)   $hex .= sprintf("%02X ", ord($daten[$i]));     return $hex;}

Danke Rainer, werde ich am Wochenende bestimmt mal testen und mich dann melden.
Ich muss erstmal sehen wie ich den optischen Kopf ordentlich befestigt bekomme.
Denke ein Ringmagnet ist wohl die erste Wahl.

Habe meinen mit Heißkleber gefestigt. Das geht recht gut wieder ab. (ist ein Hager).

Oli

Habe es jetzt mit tesa Klettband gemacht, hällt ganz ordentlich.

@ RWN

Hatt alles super funktioniert, vielen Dank nochmal!

FM_008.png