HowTo - SML-Stromzähler mit IPS Auslesen

Hallo Steffen,

Deine Zählerstände stehen auf den Byte-Pos. 142 (1.8.1) und 164 (2.8.1). Beide sind 5 Bytes lang und in 0,1 Wh.
Die Leistungen stehen auf den Byte-Pos. 185 (1.7.0) und 220 (2.7.0). Die Beiden sind 4 Bytes lang und anscheinend in 0,1 W. ( 1.7.0 - Bezugsleistung war um 12:17:27 auf „50170“, also vermutlich 5.017,0 W, 2.7.0-Lieferleistung war logischerweise auf 0).
Alle Angaben ohne Gewähr! Hier ist es unverschämt warm, um richtig zu zählen. :wink:

Gruß
Frank

1 „Gefällt mir“

Danke Frank für deine Hilfe! Somit konnte ich mich orientieren und es waren auch 3 von 4 Stellen richtig. Lediglich die Leistung 2.8.1 beginnt bei Byte 205 (statt 220). Alles gut, das konnte ich dann selber erkennen und es funktioniert.

Folgendes Skript habe ich damit erstellt:


<?
// wenn das Skript von einer RegisterVariable-Instanz aus aufgerufen worden ist
if ($_IPS['SENDER'] == "RegisterVariable") 
{
    //bereits im Puffer der Instanz vorhandene Daten in $data kopieren
	$data  = RegVar_GetBuffer($_IPS['INSTANCE']);
    //neu empfangene Daten an $data anhängen
    $data .= $_IPS['VALUE'];

SetValueFloat(56524 /*[Spielwiese\D0-Zähler\Bezug_Zählerstand]*/,(hexdec(substr(bin2hex($_IPS['VALUE']),284,8)))/10000);
SetValueFloat(32923 /*[Spielwiese\D0-Zähler\Bezug_Leistung]*/,(hexdec(substr(bin2hex($_IPS['VALUE']),370,10)))/1000000);

SetValueFloat(40057 /*[Spielwiese\D0-Zähler\Einspeisung_Zählerstand]*/,(hexdec(substr(bin2hex($_IPS['VALUE']),328,8)))/10000);
SetValueFloat(49585 /*[Spielwiese\D0-Zähler\Einspeisung_Leistung]*/,(hexdec(substr(bin2hex($_IPS['VALUE']),410,10)))/1000000);
}
?>

DieBedingungen und Befehle der if-Anweisung habe ich irgendwoher kopiert und verstehe ehrlich gesagt noch nicht den Sinn und Zweck, aber es funktioniert bzw. ohne funktioniert es nicht.
Komisch ist auch, dass die Bytes für Zählerstand eigentlich 5 Byte lang sind, ich dort aber eine Zeichenlänge 8 brauche und die Leistung 4 Byte lang ist und ich dort 10 Zeichen benötige. Oder habe ich da einen Denkfehler?
Aber es funktioniert und es erscheinen plausible Werte. Das ist für mich erstmal die Hauptsache.

Hallo Steffen,

ich habe bei mir nochmal nachgesehen. Meine Zählerstände sind auch 5 Bytes lang, und im Skript habe ich die Länge von 12 Zeichen angegeben. Ich bin jetzt zu wenig Experte, um das zu erklären. Ich hab’s auch nur durch probieren hingekriegt.
Da würde jetzt aber nur Deine 4-Byte Werte mit den 10 Zeichen erklären. Warum Du bei den 5 Bytes mit 8 Zeichen auskommst, erklärt das nicht. Ich befürchte aber, dass bei Dir die ersten zwei Nullen des Zählerwertes nicht berücksichtigt werden. Das wird erst bei höheren Zählerständen zum Problem, wenn es keine Nullen mehr sind.

Du solltest da noch ein wenig probieren. So mit Position zwei weniger, Länge zwei mehr o.ä.

Vielleicht hat ja jemand noch eine professionellere Erklärung. Hier ist es heute noch wärmer.

Gruß
Frank

Ich habe den Zählerstand Bezug noch 2 Felder weiter vor und Zeichenlänge verändern können, da kam ich aufs selber Ergebnis. Beim Zählerstand Einspeisung hat das nicht funktioniert. Da war ich schon 2 Felder vorgerückt, kann aber nur eine Zeichenlänge von 8 nutzen, damit ein plausibles Ergebnis kommt.
Wer weiß? Es funktioniert, das ist die Hauptsache.

Danke nochmal für deine Hilfe. Wo steckst du eigentlich, wo es so heiß ist? Wohl nicht in D?

Wo steckst du eigentlich, wo es so heiß ist? Wohl nicht in D?

Doch! In Schleswig-Holstein! 32°C!

Südeuropäer mögen jetzt lächeln, aber wir hier im Norden laufen nur bis 15°C richtig.:cool:

Mein Energieversorger hat gestern einem meiner eHZ ausgetauscht. Vorher MOD und nun (so vermute ich) SML.
Ich hatte mir damals Komponenten von co.met geordert und verbaut … lief immer anstandslos. Nun „muss“ ich wohl für den Zweiten ebenfalls auf SML umsteigen. Allerdings sind die Komponenten von (s.o.) nicht ganz billig.

Lange Rede kurzer Sinn; ich möchte mir da lieber selber was bauen. Mir schwebt ein ESP8266 und ein Fototransistor vor. serial connect via UDP …
Hat da jemand Erfahrungen mit?

Welche Hardware benutzt Ihr denn?

Bei mir ist es ein IR-Lesekopf von co.met mit USB. Nicht ganz billig ist ja relativ. Günstiger gibt es die Köpfe wohl bei Udo vom volkszaehler-Projekt ( volkszaehler.org - web frontend ). Ich selber habe aber keine Erfahrung damit. Ist aber schon öfter von anderer Seite positiv darauf hingewiesen worden.

Gruß
Frank

Und Dein IR-Kopf hängt an was dran?

Der hängt an einem USB-Ethernet-Konverter. Ich meine, der wurde als „Printserver“ verkauft. Macht aber nichts anderes, als eine USB-Schnittstelle im Netzwerk zur Verfügung zu stellen. Ein Raspi mit ser2net würde auch funktionieren.

Gruß
Frank

Hallo,

ich habe auch zwei USB-Köpfe von Udo aus dem volkszaehler-Projekt. Die funktionieren von Anfang an und seither absolut zuverlässig. Angeschlossen sind beide an einem YPORT-Node. Den gibt es jedoch nicht mehr. Nachfolger ist der YPORT+.

http://wiki.volkszaehler.org/start
http://wiki.volkszaehler.org/hardware/controllers/yport-node

Viele Grüße aus dem Unterallgäu
Harry

Ich bin nun ein gehöriges Stück weiter; ich habe einen BPW40 an einem ESP8266-12E (NodeMCU) am Laufen. Jetzt endlich bekomme ich Wert geliefert. Allerdings habe ich keinen Plan, wie ich die „stückeln“ soll.
Der eHZ ist ein EMH Generation K.
Er hängt zwischen meiner PV-Anlage und dem Stromnetz (Einpeisung über eine Phase).

Ich hänge hier mal den Dump dran:

1B 1B 1B 1B 01 01 01 01 76 07 00 0D 00 63 7F C2 62 00 62 00 72 63 01 01 76 01 01 07 00 0D 00 1A 2A 96 0B 09 01 45 4D 48 00 00 6C FA 50 01 01 63 A5 F7 00 76 07 00 0D 00 63 7F C3 62 00 62 00 72 63 07 01 77 01 0B 09 01 45 4D 48 00 00 6C FA 50 07 01 00 62 0A FF FF 72 62 01 65 00 1A D8 9F 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 09 01 45 4D 48 00 00 6C FA 50 01 77 07 01 00 01 08 00 FF 64 01 01 A2 01 62 1E 52 03 56 00 00 00 00 01 01 77 07 01 00 02 08 00 FF 64 01 01 A2 01 62 1E 52 03 56 00 00 00 01 C1 01 77 07 01 00 01 08 01 FF 01 01 62 1E 52 03 56 00 00 00 00 01 01 77 07 01 00 02 08 01 FF 01 01 62 1E 52 03 56 00 00 00 01 C1 01 77 07 01 00 01 08 02 FF 01 01 62 1E 52 03 56 00 00 00 00 00 01 77 07 01 00 02 08 02 FF 01 01 62 1E 52 03 56 00 00 00 00 00 01 77 07 81 81 C7 82 05 FF 01 01 01 01 83 02 D0 4D B7 50 1A 2B DF E8 3D 0B A5 01 8D 2F 55 C0 48 64 D2 16 C1 E9 D6 7B CA E4 C1 87 C3 59 25 8E 4E 6C 8B CD 38 55 07 2F 9B B8 4D E7 0B A4 4A 10 01 01 01 63 01 FD 00 76 07 00 0D 00 63 7F C4 62 00 62 00 72 63 02 01 71 01 63 A6 17 00 1B 1B 1B 1B 1A 00 EF 7E

Jemand eine Idee?

Sieht doch gut aus.

eHZ EMH SML Protokoll auswerten

und hier was zum spielen.

<?
/*
if($_IPS['SENDER'] == "Execute")
{
   //VIO_PushTextHEX(27892, "76 05 00 09 F7 51 62 00 62 00 72 63 01 01 76 01 01 05 00 03 52 6F 0B 06 49 53 4B 01 07 22 F6 4E 47 01 01 63 0C F8 00 76 05 00 09 F7 52 62 00 62 00 72 63 07 01 77 01 0B 06 49 53 4B 01 07 22 F6 4E 47 07 01 00 62 0A FF FF 72 62 01 65 00 03 ED 21 7A 77 07 81 81 C7 82 03 FF 01 01 01 01 04 49 53 4B 01 77 07 01 00 00 00 09 FF 01 01 01 01 0B 06 49 53 4B 01 07 22 F6 4E 47 01 77 07 01 00 01 08 00 FF 65 00 01 01 A2 01 62 1E 52 FF 59 00 00 00 00 00 08 CB 23 01 77 07 01 00 01 08 01 FF 01 01 62 1E 52 FF 59 00 00 00 00 00 04 4B 48 01 77 07 01 00 01 08 02 FF 01 01 62 1E 52 FF 59 00 00 00 00 00 04 7F DB 01 77 07 01 00 02 08 00 FF 65 00 01 01 A2 01 62 1E 52 FF 59 00 00 00 00 00 06 95 E9 01 77 07 01 00 02 08 01 FF 01 01 62 1E 52 FF 59 00 00 00 00 00 06 95 E9 01 77 07 01 00 02 08 02 FF 01 01 62 1E 52 FF 59 00 00 00 00 00 00 00 00 01 77 07 01 00 10 07 00 FF 01 01 62 1B 52 00 55 FF FF FE 98 01 77 07 81 81 C7 82 05 FF");
   
 VIO_PushTextHEX(27892, "76 07 00 06 06 0C A2 21 62 00 62 00 72 63 01 01 76 01 01 07 00 06 07 5B 36 0B 09 08 05 0D DE 2D 6B 90 E1 01 01 63 8A ED 00 76 07 00 06 06 0C A2 22 62 00 62 00 72 63 07 01 77 01 09 08 05 0D DE 2D 6B 90 E1 01 72 62 01 65 07 5B F8 F9 74 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 09 08 05 0D DE 2D 6B 90 E1 01 77 07 01 00 01 08 01 FF 62 82 01 62 1E 52 FF 56 00 10 71 7A 20 01 77 07 01 00 01 07 00 FF 01 01 62 1B 52 FF 55 00 00 31 77 01 01 01 63 E4 4F 00 76 07 00 06 06 0C A2 23 62 00 62 00 72 63 02 01 71 01 63 D8 08 00 00");
}
*/
//$data = hex2str($_IPS['VALUE']);
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)));
 }
 
 // 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']);
    SetValue(17185 /*[eHZ\Test SML\Zählerstand]*/, hexdec(Str2Hex(substr($zaehlerstand[1], 11, 8)))/10000);
 }   // Zählerstand (Wirk-Energie Total Lieferung) Obiskennung:1-0.2.8.0*255 Hex:01 00 02 08 00 FF
 if(strpos($_IPS['VALUE'], chr(0x01).chr(0x00).chr(0x02).chr(0x08).chr(0x00).chr(0xFF)) !== false)
 {
    $zaehlerstand = explode(chr(0x01).chr(0x00).chr(0x02).chr(0x08).chr(0x00).chr(0xFF), $_IPS['VALUE']);
    SetValue(29639 /*[eHZ\Test SML\Zählerstand Lieferung]*/, hexdec(Str2Hex(substr($zaehlerstand[1], 11, 8)))/10000);
 }
 
 // Wirkleistung EMH(Wirk-Leistung Total) Obiskennung:1-0.15.7.0*255 Hex:01 00 0F 07 00 FF
 // Wirkleistung HAG(Wirk-Leistung Total) Obiskennung:1-0.16.7.0*255 Hex:01 00 10 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']);
    //print_r(Str2Hex(substr($wirkleistung[1], 7, 4)));
    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)
  {
     //print_r(explode(chr(0x01).chr(0x00).chr(0x01).chr(0x08).chr(0x01).chr(0xFF), Str2Hex($_IPS['VALUE'])));
   $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);
  }  // 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(52790 /*[eHZ\Test SML\Bezug 2]*/, hexdec(Str2Hex(substr($bezugTarif2[1], 7, 8)))/10000);
  }
 
 // Lieferung Tarif 1 (Wirk-Energie Tarif 1 Lieferung) Obiskennung:1-0.2.8.1*255 Hex:01 00 02 08 01 FF
   if(strpos($_IPS['VALUE'], chr(0x01).chr(0x00).chr(0x02).chr(0x08).chr(0x01).chr(0xFF)) !== false)
 {
  $bezugTarif1 = explode(chr(0x01).chr(0x00).chr(0x02).chr(0x08).chr(0x01).chr(0xFF), $_IPS['VALUE']);
  SetValue(44947 /*[eHZ\Test SML\Lieferung 1]*/, hexdec(Str2Hex(substr($bezugTarif1[1], 7, 8)))/10000);
 }
 
 // Lieferung Tarif 2 (Wirk-Energie Tarif 2 Lieferung) Obiskennung:1-0.2.8.2*255 Hex:01 00 02 08 02 FF
   if(strpos($_IPS['VALUE'], chr(0x01).chr(0x00).chr(0x02).chr(0x08).chr(0x02).chr(0xFF)) !== false)
 {
  $bezugTarif1 = explode(chr(0x01).chr(0x00).chr(0x02).chr(0x08).chr(0x02).chr(0xFF), $_IPS['VALUE']);
  SetValue(42614 /*[eHZ\Test SML\Lieferung 2]*/, hexdec(Str2Hex(substr($bezugTarif1[1], 7, 8)))/10000);
 }
 
 // Wirkleistung L1 - L3
 if(strpos($_IPS['VALUE'], chr(0x01).chr(0x00).chr(0x23).chr(0x07).chr(0x00).chr(0xFF)) !== false)
 {
    $x = explode(chr(0x01).chr(0x00).chr(0x23).chr(0x07).chr(0x00).chr(0xFF), $_IPS['VALUE']);
    SetValue(25845 /*[eHZ\Test SML\Wirkleistung L1]*/, hexdec(Str2Hex(substr($x[1], 7, 4)))/10);
 }
 if(strpos($_IPS['VALUE'], chr(0x01).chr(0x00).chr(0x37).chr(0x07).chr(0x00).chr(0xFF)) !== false)
 {
    $y = explode(chr(0x01).chr(0x00).chr(0x37).chr(0x07).chr(0x00).chr(0xFF), $_IPS['VALUE']);
    SetValue(40088 /*[eHZ\Test SML\Wirkleistung L2]*/, hexdec(Str2Hex(substr($y[1], 7, 4)))/10);
 }
 if(strpos($_IPS['VALUE'], chr(0x01).chr(0x00).chr(0x4B).chr(0x07).chr(0x00).chr(0xFF)) !== false)
 {
    $z = explode(chr(0x01).chr(0x00).chr(0x4B).chr(0x07).chr(0x00).chr(0xFF), $_IPS['VALUE']);
    SetValue(21280 /*[eHZ\Test SML\Wirkleistung L3]*/, hexdec(Str2Hex(substr($z[1], 7, 4)))/10);
 }
}Cutter_ClearBuffer(50881);function Str2Hex($daten)
{
 $hex = "";
  for($i=0; $i<strlen($daten); $i++)
   $hex .= sprintf("%02X ", ord($daten[$i]));
  return $hex;
}
function hex2str($hex)
{
 $str = "";
   for($i=0;$i<strlen($hex);$i+=2)
 $str .= chr(hexdec(substr($hex,$i,2)));
   return $str;
}
?>

Schreib doch bitte mal deine Werte hierein.

Ich möchte gerne mal vergleichen. Hab das Script nit deinen Werten mal laufen lassen und angepasst.

PS. Gelb ist was der Zähler ausgibt.

Bitte entschuldige … ich bin grad erst dazu gekommen.
Hier mal meine Werte:

Auf den ersten Blick würde ich sagen; so richtig passen die Werte nicht (Lieferung 1 und Zählerstand Lieferung).

EDIT
aktuelle Werte auf Display am eHz direkt:

  • 1.8.0 = 1 kWh
  • 2.8.0 = 506 kWh
  • aktuelle Leistung = ~ 1400 W
    eHz ist für die PV-Anlage

Häng doch im anderen Thread mal einen aktuellen Dump an mit Werten vom Zähler

Hallo Rainer,

mit dem neuen Script kann ich bestätigen …


… nun scheint alles tipptopp zu passen.
Danke für Deine Unterstützung!

Gruß Dirk

Hallo zusammen

ich habe nun auch parallel zu anderen Projekten mit den Stromzählern angefangen. Ich habe hier zwei Stück, einmal „Hausstrom“, einen Logarex LK13 und einmal Wärmepumpe, das ist ein anderer, aber darum kümmere ich mich später.

Ich lese den Logarex per IR Opto mit USB aus, was soweit auch prima funktioniert.
Allerdings komme ich mit dem Cutter nicht weiter, denn der Logarex liefert kein „1B 1B 1B 1B 01 01 01 01“ aus. Hier bräuchte ich mal Eure Hilfe.
Im Anhang der Dump vom Serial Port.

So wie ich das sehe, ist der Trenner zwischen den Datagrammen immer
/LOG5LK13BE803039
2F 4C 4F 475 4C 4B 31 33 42 45 38 30 33 30 33 39

Richtig? Muss ich das dann als Trenner einsetzen und dann in den Skripten jeweils von / bis dort zählen?
Und was mache ich mit den CR / LF? Die muss ich ja mitzählen, oder?

Wenn ich mir den Debug ansehe, ist die Anzahl der Zeichen aber nicht immer identisch, von daher kann ich ja nicht mit „fixed“ arbeiten, oder verstreich hier was falsch?

Derzeit habe ich noch die einfache Ausgabe, also ohne PIN, die bekomme ich hoffentlich bald, aber der derzeit einzig vernünftige Wert ist der Zählerstand und der ändert sich in seiner Position ja auch mit erweiterter Ausgabe nicht.

Danke für Eure Hilfe

dump.txt (16.4 KB)

Verschoben nach hier!!

Elektronische Haushalts Zähler [eHZ] auslesen - Seite 19

Ich habe die Zählerauswertung nochmal untersucht, da mir die Werte für die Leistung bei Bezug und Einspeisung nicht ganz richtig vorkamen. Vor allem die Einspeisung war mir im Vergleich zum PV-Ertrag zu wenig. Dabei ist mir aufgefallen, dass ich bei oben stehendem Skript die Bytes nicht ganz getroffen habe.

Ich habe das einmal versucht, in 2 Zählerdumps farblich hervorzuheben:
1B 1B 1B 1B 01 01 01 01 76 07 31 97 00 00 C5 10 62 00 62 00 72 63 01 01 76 01 01 07 31 97 0B 07 41 B0 09 08 05 0D DF 2D 6F 16 56 01 01 63 67 E9 00 76 07 31 97 00 00 C5 11 62 00 62 00 72 63 07 01 77 01 09 08 05 0D DF 2D 6F 16 56 01 72 62 01 65 0B 07 14 59 76 77 07 81 81 01C2 03 FF 01 01 01 01 04 45 4D 48 01 77 07 01 00 00 00 09 FF 01 01 01 01 09 08 05 0D DF 2D 6F 16 56 01 77 07 01 00 01 08 01 FF 62 82 01 62 1E 52 FF 56 00 0B 90 68 64 01 77 07 01 00 02 08 01 FF 62 82 01 62 1E 52 FF 56 00 1A 57 00 A2 01 77 07 01 00 01 07 00 FF 01 01 62 1B 52 FF 55 00 00 0B DB 01 77 07 01 00 02 07 00 FF 01 01 62 1B 52 FF 55 00 00 00 00 01 01 01 63 1E 0A 00 76 07 31 97 00 00 C5 12 62 00 62 00 72 63 02 01 71 01 63 5D B4 00 00 00 00 1B 1B 1B 1B 1A 03 89 ED

1B 1B 1B 1B 01 01 01 01 76 07 31 97 00 01 E5 58 62 00 62 00 72 63 01 01 76 01 01 07 31 97 0B 07 A1 C8 09 08 05 0D DF 2D 6F 16 56 01 01 63 6B F9 00 76 07 31 97 00 01 E5 59 62 00 62 00 72 63 07 01 77 01 09 08 05 0D DF 2D 6F 16 56 01 72 62 01 65 0B 07 BF 96 76 77 07 81 81 01C2 03 FF 01 01 01 01 04 45 4D 48 01 77 07 01 00 00 00 09 FF 01 01 01 01 09 08 05 0D DF 2D 6F 16 56 01 77 07 01 00 01 08 01 FF 62 82 01 62 1E 52 FF 56 00 0B 91 24 EF 01 77 07 01 00 02 08 01 FF 62 82 01 62 1E 52 FF 56 00 1A 57 04 33 01 77 07 01 00 01 07 00 FF 01 01 62 1B 52 FF 55 00 00 00 00 01 77 07 01 00 02 07 00 FF 01 01 62 1B 52 FF 55 00 00 1E D2 01 01 01 63 BA FE 00 76 07 31 97 00 01 E5 5A 62 00 62 00 72 63 02 01 71 01 63 EF EB 00 00 00 00 1B 1B 1B 1B 1A 03 EE 0D

Bezug_Zählerstand 282,10 nach FF 56 Wert dividiert durch 10.000
Bezug_Leistung 368,8 nach FF 55 Wert dividiert durch 10
Einspeisung_Zählerstand 326,10 nach FF 56 Wert dividiert durch 10.000
Einspeisung_Leistung 48,8 nach FF 55 Wert dividiert durch 10

Daraus ergeben sich folgende Skriptzeilen für Zählerstände und Leistungen des 2-Wege-Zählers:


SetValueFloat(56524,(hexdec(substr(bin2hex($_IPS['VALUE']),282,10)))/10000);  //Zählerstand Bezug
SetValueFloat(32923,(hexdec(substr(bin2hex($_IPS['VALUE']),368,8)))/10);  //Bezugsleistung

SetValueFloat(40057,(hexdec(substr(bin2hex($_IPS['VALUE']),326,10)))/10000);  //Zählerstand Einspeisung
SetValueFloat(49585,(hexdec(substr(bin2hex($_IPS['VALUE']),408,8)))/10);  //Einspeiseleistung

Vielleicht hilft es dem ein oder anderen, wenn euch die Werte nicht ganz geheuer erscheinen.
Falls noch jemand andere Informationen des Zählers in dem Dump identifizieren kann, wäre ich interessiert daran.

Schöne Grüße, Steffen