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

Hallo @all,

ich habe leider das problem das ich den stream welcher aus meinem ISKRA-Zähler kommt nicht verstehe zum umrechnen.
Könne mir jemand bitte helfen?
Ich würde gerne die Ausgabe direkt mit PHP auf meinem Webserver machen, ist das möglich?

Vielen Dank!!

zweirichtungszaehler.txt (10.2 KB)

Heizungs_drehtstrom.txt (162 KB)

Kann mir niemand helfen?
Ich komme einfach nicht weiter!!!
Hier mal die aktuelle Datei von heute, der Zählerstand beträgt 1145.

heizung_stand_1145.txt (30.4 KB)

Hallo,

grundsätzlich klappt das mit dem Auslesen des Zählers wunderbar. Nur wenn die Sonne scheint und ich zum EVU liefere stimmt die Wirkleistungsanzeige nicht, dann steht da immer eine große Zahl.

Hier mal der Teil meines Skriptes in welchem die Leistung ausgewertet wird:

    // Wirkleistung (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(0x10).chr(0x07).chr(0x00).chr(0xFF)) !== false)
    {
       $wirkleistung = explode(chr(0x01).chr(0x00).chr(0x10).chr(0x07).chr(0x00).chr(0xFF), $_IPS['VALUE']);
       SetValue(35051 /*[Daten\EVU Zähler\Wirkleistung]*/, hexdec(Str2Hex(substr($wirkleistung[1], 7, 4)))/10);
		SetValue(13371 /*[Daten\EVU Zähler\Test]*/,Str2Hex(substr($wirkleistung[1], 0, 12)));
	 }

Dump bei negativer Wirkleistung:

1B 1B 1B 1B 01 01 01 01 
76 07 00 0B 01 E7 56 D2 62 00 62 00 72 63 01 01 
76 01 01 07 00 0B 00 99 72 46 0B 06 45 4D 48 01 07 19 7F 79 6D 01 01 63 73 C7 00 
76 07 00 0B 01 E7 56 D3 62 00 62 00 72 63 07 01 
77 01 0B 06 45 4D 48 01 07 19 7F 79 6D 07 01 00 62 0A FF FF 72 62 01 65 00 99 21 C1 7A 
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 06 45 4D 48 01 07 19 7F 79 6D 01 
77 07 01 00 01 08 00 FF 64 01 02 A2 01 62 1E 52 FF 56 00 00 F2 2E 13 01 
77 07 01 00 02 08 00 FF 64 01 02 A2 01 62 1E 52 FF 56 00 00 31 51 1E 01 
77 07 01 00 01 08 01 FF 01 01 62 1E 52 FF 56 00 00 00 00 00 01 
77 07 01 00 02 08 01 FF 01 01 62 1E 52 FF 56 00 00 31 51 1E 01 
77 07 01 00 01 08 02 FF 01 01 62 1E 52 FF 56 00 00 F2 2E 13 01 
77 07 01 00 02 08 02 FF 01 01 62 1E 52 FF 56 00 00 00 00 00 01 
[b]77 07 01 00 10 07 00 FF 01 01 62 1B 52 FF 55 FF FF C9 5B 01 "Wirkleistung"[/b]
77 07 81 81 C7 82 05 FF 01 72 62 01 65 00 99 21 C1 01 01 83 02 2D DB CA 
76 7B 28 84 56 C7 9A A6 83 D2 0E 28 BF 11 71 C8 7B FE F7 54 75 4C 74 6D DD 29 74 C7 B8 7D 86 9E 67 40 E2 91 F3 D5 4D 24 F7 80 C2 03 D4 01 01 01 63 D8 61 00 
76 07 00 0B 01 E7 56 D6 62 00 62 00 72 63 02 01 71 01 63 D9 7F 00 00 1B 1B 1B 1B 1A 01 EB 59

irgendwie komme ich da nicht weiter.

Gruß

Frank

das ist bestimmt ein signed Long Integer, also der echte (negative) Wert ist die Differenz zu 2^32

Hey,

komme aktuell nicht wirklich weiter, ich habe einen hager EHZ363W5
(http://datenblatt.stark-elektronik.de/hager/Bedienungsanleitung%20EHZ363.PDF)

Bekomme aber nicht wirklich sinnvolle Daten, hexdec(Str2Hex(substr($zaehlerstand[1], 9, 5))) z.B. ergibt INF

Habe mal einen Dump angehängt, wäre toll wenn mir jemand helfen könnte.
Die OBIS Hex-Werte aus der PDF funktionieren leider nicht oder ergeben genannte unsinnige Daten.
(Der Dump beginnt scheinbar mitten in einem „Paket“, habe 3 Terminal Programme ausprobiert und das leider nicht „schöner“ hinbekommen)

20140120203300.txt (9.58 KB)

Einmal Dump von der Regvar in Hex bitte und einen vom Comport!

Hier die Dumps

dump - COM.txt (115 KB)

dump - regvar.txt (10.5 KB)

Deine Daten wären, wie folgt:

Bezug 1: 888,70 kWh
Bezug 2. 432,58 kWh
Hersteller: HAG
Zählerstand: 889.70 kWh

Stimmt das mit deiner Anzeige im Zähler überein ?

Auf dem Display steht 10958 kWh, habe leider die PIN nicht, ist scheinbar das Einzige was ich ohne angezeigt bekomme.

Stimmt, passt. Hatte eine Stelle unterschlagen. Du musst strpos anpassen.

// 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(xxxxx/*[eHZ\Test SML\Zählerstand]*/, hexdec(Str2Hex(substr($zaehlerstand[1], 8, 4)))/10000);    }
// 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(xxxxx/*[eHZ\Test SML\Bezug 1]*/, hexdec(Str2Hex(substr($bezugTarif1[1], 7, 4)))/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(xxxxx/*[eHZ\Test SML\Bezug 2]*/, hexdec(Str2Hex(substr($bezugTarif2[1], 7, 4)))/10000);    }

Vielen vielen Dank, funktioniert wunderbar :slight_smile:

Hab jetzt den PIN aber mit dem bekomm ich über den Port leider auch nicht mehr Informationen.
Lässt sich das „optionale“ Protokoll nicht irgendwie freischalten oder hängt das vom Zähler ab?

Könntest du mir bitte noch den entsprechenden Code für die aktuelle Wirkleistung (01 00 10 07 00 FF) schicken?

Was wäre denn der optimale Weg das Script zeitgesteuert aufzurufen? Würde die Daten gerne Loggen und dabei die Datenbank nicht zu stark belasten, aber das Ganze baut ja auf den Aufruf durch die RegisterVariable mit $_IPS[‚VALUE‘] auf.

SetValue(xxxxx/*[eHZ\Test SML\Wirkleistung]*/, hexdec(Str2Hex(substr($wirkleistung[1], 7, 2)))/10);

Sollte passen.

Bei mir sind die Daten Live. Wenn Du nur alle Minute oder 10 usw loggen willst, leg dir zusätzliche Variablen an. Diese kannst Du dann loggen wie Du willst.

Alles klar, danke :slight_smile:

Aktuelle Wirkleistung liegt bei mir laut dem Script aktuell um 90W, kommt mir irgendwie ein bisschen wenig vor.

Mir auch. Ich hab grad nochmal genau nachgesehen. Hier gibt es eine andere Teilung. Bei Bezug2 auch.
Änder das mal ab und vergleich nochmal. So, sollte es eigentlich richtig sein. Sorry.
Wirkleistung:

SetValue(xxxxx/*[eHZ\Test SML\Wirkleistung]*/, hexdec(Str2Hex(substr($wirkleistung[1], 7, 2))));

Bezug2

SetValue(xxxxx/*[eHZ\Test SML\Bezug 2]*/, hexdec(Str2Hex(substr($bezugTarif2[1], 7, 2))));

Garkein Problem, vielen vielen Dank :smiley:

Was ist denn bei dir Bezug2. Der Wert hat sich seit gestern nicht verändert. Nur Interesse halber.

Ehrlich gesagt habe ich da keine Ahnung, ist mir noch garnicht aufgefallen, muss ich mal rausfinden :slight_smile:

Hast Du Nachtstrom oder ähnliches. Dafür, ist er eigentlich gedacht.

Nicht dass ich wüsste oO vielleicht wird der garnicht benutzt.

Hmm,

ich komm mit dem SML von ED300L auch nicht klar.
Es kommt zwar was an aber die Daten sind irgendwie nicht richtig.

SENDCHUNK sieht gut aus (siehe Dump Cutter).
In der Varribale kommen aber ab und an der Wert 0, dann wieder ganz komische Zahlen an. (Wie im Screen)

Was mach ich denn falsch?

if ($_IPS['SENDER'] == "RegisterVariable")
	{
      $zaehlerstand = "";
    	// Zählerstand (Wirkarbeit Bezug (+) Zählerstand Total) Obiskennung:1-0.1.8.0*255 Hex:77 07 01 00 01 08 00 ff
      if(strpos($_IPS['VALUE'], chr(0x77).chr(0x07).chr(0x01).chr(0x00).chr(0x01).chr(0x08).chr(0x00).chr(0xFF)) !== false)
    	{
			$zaehlerstand = explode(chr(0x77).chr(0x07).chr(0x01).chr(0x00).chr(0x01).chr(0x08).chr(0x00).chr(0xFF), $_IPS['VALUE']);
			print Str2Hex($zaehlerstand[1]);
       	SetValue(48077  /*[01_Programme\04_VOLKSZÄHLER\EMH - Wirk-Energie Total Bezug]*/, hexdec(Str2Hex(substr($zaehlerstand[1], 9, 6)))/10000);
    	}
    	$zaehlerstand = "";
    	// Zählerstand (Wirkarbeit Bezug Tarif 1) objName 1-0:1.8.1*255 Hex:77 07 01 00 01 08 01 ff
      if(strpos($_IPS['VALUE'], chr(0x77).chr(0x07).chr(0x07).chr(0x01).chr(0x00).chr(0x01).chr(0x08).chr(0x01).chr(0xFF)) !== false)
    	{
		 	$zaehlerstand = explode(chr(0x77).chr(0x07).chr(0x07).chr(0x01).chr(0x00).chr(0x01).chr(0x08).chr(0x01).chr(0xFF), $_IPS['VALUE']);
       	SetValue(40642  /*[01_Programme\04_VOLKSZÄHLER\EMH - Wirkarbeit Bezug Tarif 1]*/, hexdec(Str2Hex(substr($zaehlerstand[1], 7, 8)))/10000);
    	}
    	$zaehlerstand = "";
    	// Zählerstand (Wirkarbeit Bezug (+) Zählerstand Tarif 2) objName 1-0:1.8.2*255 Hex:7 07 01 00 01 08 02 ff
      if(strpos($_IPS['VALUE'], chr(0x77).chr(0x07).chr(0x01).chr(0x00).chr(0x01).chr(0x08).chr(0x02).chr(0xFF)) !== false)
    	{
		 	$zaehlerstand = explode(chr(0x77).chr(0x07).chr(0x01).chr(0x00).chr(0x01).chr(0x08).chr(0x02).chr(0xFF), $_IPS['VALUE']);
       	SetValue(55937  /*[01_Programme\04_VOLKSZÄHLER\EMH - Wirkarbeit Bezug Tarif 2]*/, hexdec(Str2Hex(substr($zaehlerstand[1], 7, 8)))/10000);
    	}
    

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

dump RegisterVar.txt (131 KB)

dump.txt (99.5 KB)

dump_Cutter.txt (170 KB)