Smartmeter auslesen - Verschlüsselung

Hallo die Runde,

ich greife das Thema mal auf. Ich habe auch 2 dieser „schönen“ Energie AG Zähler der Rev. F. Haushaltsstrom wird beim mir mit einem LCN-Modul mit entsprechenden IR Lesekopf ausgelesen und in LCN und dann in Symcon übertragen. Funktioniert seit Jahren. Jetzt möchte ich meinen Wärmepunmpenzähler der halt auch Tag-Nachtstrom anzeigt (1.8.1 und 1.8.2) direkt über IPS auslesen. Dazu wäre der Weidmann Kopf geplant und dieses tolle Skript hier.

Was sind die dzt. Möglichkeiten? Komme ich zumindest an den Gesamtverbrauch (1.8.0), oder geben diese Zähler diesen Wert dann gar nicht über M-Bus Frame aus?

lg
hagi

btw. Daumen Hoch fürs Hausruckviertel :slight_smile:

Ich schiebe das Thema mal hoch

Hi!

Sorry für die späte Antwort. Also ich verwende das Script ja bei mir auch für den Wärmepumpenzähler. Den Gesamtverbrauch kann man ohne Probleme auslesen. Ob Tag-/Nacht getrennt auch möglich wäre und nur im Script nicht umgesetzt wurde oder ob das der Zähler gar nicht hergibt kann ich dir nicht sicher sagen, ich vermute aber eher der Zähler kann es, das Script hier liest die zwei Stände aber nicht getrennt aus.

Hallo Hofimax,

danke für dein Feedback! Als OÖer hast du ja auch die verschlüsselten Amis Dinger :wink:

Kannst du mir dein dzt. funktionierendes Skript mal zukommen lassen?

Wo in OÖ bist den zu Hause? Immer gut „Leidensgenossen“ - Scherz - Interessengenossen zu kennen :slight_smile:

lg
hagi

Hi :slight_smile:

Ich bin in Zell am Pettenfirst/Vöcklabruck zuhause. Freut mich auch Symcon Bekannschaften in der Nähe zu haben. Ich poste dir mein Script unten, hab aber meinen Key rausgenommen. Ja klar, ich hab auch so einen schönen AMIS Zähler, genauer sogar zwei.

Also wenn du Symcon als Leid empfindest, dann probier mal eine Loxone aus und setzt da die Sachen um die du in Symcon machen kannst. Dann weißt du was Leiden bedeutet :slight_smile:

Lg
Markus

<? $IDEnergieAP = 45338;//0403 (Energie A+ Obis 1.8.0) [kWh] $IDEnergieAM = 58270;//04833C (Energie A- Obis 2.8.0)[kWh] $IDEnergieRP = 32332;//8410FB8273 (Energie R+ Obis 3.8.1)[kvarh] $IDEnergieRM = 49354;//8410FB82F33C (Energie R- Obis 4.8.1)[kvarh] $IDWirkleistungPP = 19472;//042B (Wirkleistung P+ Obis 1.7.0)kW $IDWirkleistungPM = 43167;//04AB3C (Wirkleistung P- Obis 2.7.0)kW $IDBlindleistungQP = 51308;//04FB14 (Blindleistung Q+ Obis 3.7.0)kvar $IDBlindleistungQM = 23934;//04FB943C (Blindleistung Q- Obis 4.7.0)kvar $IDInkasso = 35018;//0483FF04 (Inkasso Obis 1.128.0 ) kWh $IDRegistervariable = 31963; $key_hex= "HIERMUSSKEYHIN"; if ($_IPS['SENDER'] == "RegisterVariable"){ $VarTrigger = IPS_GetVariable($IDInkasso); //Wenn über 50 sec die Variable nicht aktualisiert wurde if(($VarTrigger['VariableUpdated'] + 50) < (time())) { // 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']; if (substr($data,0,1) == "\x10"){ // wenn die Zeichen in $data der Anfrage vom MBUS-Master entsprechen if ($data == "\x10\x40\xF0\x30\x16"){ RegVar_SetBuffer($_IPS['INSTANCE'], ""); RegVar_SendText($_IPS['INSTANCE'],"\xe5"); }else{ if (strlen ($data ) > 5 ) {//datenstring fehler, löschen RegVar_SetBuffer($_IPS['INSTANCE'], ""); }else{//datenstring noch nicht vollständig in buffer schreiben RegVar_SetBuffer($_IPS['INSTANCE'], $data); } } }elseif (substr($data,0,1) == "\x68"){ RegVar_SetBuffer($_IPS['INSTANCE'], $data); $key = hex2bin ($key_hex); //$data = "\x68\x5F\x5F\x68\x53\xF0\x5B\x00\x00\x00\x00\x2D\x4C\x01\x0E\x0D\x00\x50\x05\x3F\xD0\xFE\xB7\x26\x76\x0C\xC7\xAA\xF0\xB5\x2B\x41\xF0\xC5\x41\xBD\x63\x06\xDC\xD8\xB9\x1B\x3D\xA2\x31\x1E\xF1\x3D\x25\x14\xD0\x96\x00\x82\x16\x1E\xFE\xC4\xB6\xCB\x1E\x0B\x33\x28\xBE\x61\x77\xDC\xA5\x94\xC1\x28\x00\x24\xA8\x35\xF1\xD6\x55\xBA\x71\x82\xB2\x56\xE9\x4B\xD3\x3A\xC0\xA6\xB0\x8D\xA4\x67\x81\xEB\x4E\x91\xE0\x12\x16"; //$dataVolkszaehler = "685F5F6853F05B000000002D4C010E0D0050053FD0FEB726760CC7AAF0B52B41F0C541BD6306DCD8B91B3DA2311EF13D2514D0960082161EFEC4B6CB1E0B3328BE6177DCA594C1280024A835F1D655BA7182B256E94BD33AC0A6B08DA46781EB4E91E01216"; //$data = hex2bin ($dataVolkszaehler); //$dataM21 = "685F5F6873F05B000000002D4C010E08005005BBF0C8BECA58A381934365227669CB5AA8E73778E5EABB317B76A0430DF8C505BFC03BBB782607DC3741C2028F90C09A9C6E10B08F1B3FBE5A0C91D3D6A7A462D7E78F8AACDDAC5B5B3608C7DB27574CEC16"; //$data = hex2bin ($dataM21); //hex_dump ($string); $MBUS_FRAME_FIXED_SIZE_LONG = 6; $dataarray = byteStr2byteArray ($data); $dataarray_len = count($dataarray); if ($dataarray_len < 3) { //echo ("Got a valid long/control packet start, but we need data to determine the length!"); }else{ $start1 = $dataarray[0]; $length1 = $dataarray[1]; $length2 = $dataarray[2]; if ( $length1 != $length2) { //echo ("Not a valid M-bus frame. Buffer von IPS wird vorsichtshalber gelöscht"); RegVar_SetBuffer($_IPS['INSTANCE'], ""); }else{ if ($dataarray_len < ($MBUS_FRAME_FIXED_SIZE_LONG + $length1)) { //echo ("Length of packet incorrect, we need more data! "); }else{ $start2 = $dataarray[3]; $control = $dataarray[4]; $address = $dataarray[5]; $control_information = $dataarray[6]; $IdentNr1 = $dataarray[7]; $IdentNr2 = $dataarray[8]; $IdentNr3 = $dataarray[9]; $IdentNr4 = $dataarray[10]; $ManufacCode1 = $dataarray[11]; $ManufacCode2 = $dataarray[12]; $Version = $dataarray[13]; $DeviceType = $dataarray[14]; $AcessNr = $dataarray[15]; $MBusState = $dataarray[16]; $ConfigWord1 = $dataarray[17]; $ConfigWord2 = $dataarray[18]; $checksum = $dataarray[$MBUS_FRAME_FIXED_SIZE_LONG + $length1-2]; $stop = $dataarray[$MBUS_FRAME_FIXED_SIZE_LONG + $length1-1]; /** * Calcuate checksum */ $calculated_checksum = $control; $calculated_checksum += $address; $calculated_checksum += $control_information; for ($i = 7; $i < $dataarray_len - 2; $i++) { $calculated_checksum += $dataarray[$i]; $calculated_checksum = $calculated_checksum % 256; } if ($checksum != $calculated_checksum ) { //echo("Checksums do not match!! Buffer von IPS wird vorsichtshalber gelöscht"); RegVar_SetBuffer($_IPS['INSTANCE'], ""); }else{ $encryptedData = ""; for ($i = 19; $i < $MBUS_FRAME_FIXED_SIZE_LONG + $length1-2; $i++) { $encryptedData .= pack ("C",$dataarray[$i]); } //echo "Daten zum Entschlüsseln:\n"; hex_dump ($encryptedData); // folgenden Block auskommentieren wenn abfragezyklus 1x pro Minute sein soll, wenn auskommentierung weggenommen wird erfolgt die Variablenaktualisierung 1x pro Sekunde! if ($dataarray_len > $MBUS_FRAME_FIXED_SIZE_LONG + $length1) { //reset buffer $DataAnBuffer = ""; for ($i = $MBUS_FRAME_FIXED_SIZE_LONG + $length1; $i < $dataarray_len; $i++) { //überschüssige daten in den buffer zurückschreiben $DataAnBuffer .= pack ("C",$dataarray[$i]); } RegVar_SetBuffer($_IPS['INSTANCE'], $DataAnBuffer); //RegVar_SendText($_IPS['INSTANCE'],"\xe5"); }elseif($dataarray_len = $MBUS_FRAME_FIXED_SIZE_LONG + $length1){ RegVar_SetBuffer($_IPS['INSTANCE'], ""); //RegVar_SendText($_IPS['INSTANCE'],"\xe5"); } $iv = pack("C*", $ManufacCode1, $ManufacCode2, 0 , 0 , 0 , 0 , $Version , $DeviceType , $AcessNr , $AcessNr, $AcessNr, $AcessNr, $AcessNr, $AcessNr, $AcessNr, $AcessNr); $decryptedData = openssl_decrypt(base64_encode($encryptedData), 'aes-128-cbc', $key, OPENSSL_ZERO_PADDING, $iv); $encryptedData_Kontrolle = base64_decode(openssl_encrypt($decryptedData, 'aes-128-cbc', $key, OPENSSL_ZERO_PADDING, $iv)); if (strncmp($encryptedData, $encryptedData_Kontrolle, strlen($encryptedData)) == 0) { //echo "Entschlüsselung ok\n"; } else { //echo "Entschlüsselung error\n"; } //echo "Entschlüsselte Daten:\n"; hex_dump ($decryptedData); $decrArray = byteStr2byteArray ($decryptedData); $decrArray_len = count($decrArray); if ($decrArray_len != 80) { //echo ("Die Länge der entschlüsselten Daten passt nicht!"); }else{ if ( $decrArray [0]. $decrArray [1] != $decrArray [$decrArray_len-2]. $decrArray [$decrArray_len-1]) { //echo ("keine validen entschlüsselten Daten!"); hex_dump ($decrArray [0]. $decrArray [1]); }else { //0403 (Energie A+ Obis 1.8.0) [Wh] $KontrolleObis = ByteToHex($decrArray[10]) .ByteToHex($decrArray[11]); $Byte1 = $decrArray[12]; $Byte2 = $decrArray[13]; $Byte3 = $decrArray[14]; $Byte4 = $decrArray[15]; $EnergieAP = hexdec(ByteToHex($Byte4).ByteToHex($Byte3).ByteToHex($Byte2).ByteToHex($Byte1)); //$EnergieAP = unpack ("L*",pack ("C*",$Byte4,$Byte3,$Byte2,$Byte1)); //$EnergieAP = pack ("C*",$Byte4,$Byte3,$Byte2,$Byte1); //echo "\nEnergie A+ Obis 1.8.0: ".$EnergieAP; //04833C (Energie A- Obis 2.8.0)[Wh] $KontrolleObis .= ByteToHex($decrArray[16]) .ByteToHex($decrArray[17]) . ByteToHex($decrArray[18]); $Byte1 = $decrArray[19]; $Byte2 = $decrArray[20]; $Byte3 = $decrArray[21]; $Byte4 = $decrArray[22]; $EnergieAM = hexdec(ByteToHex($Byte4).ByteToHex($Byte3).ByteToHex($Byte2).ByteToHex($Byte1)); //echo "\nEnergie A- Obis 2.8.0: ".$EnergieAM; //8410FB8273 (Energie R+ Obis 3.8.1)[varh] $KontrolleObis .= ByteToHex($decrArray[23]) .ByteToHex($decrArray[24]) . ByteToHex($decrArray[25]) . ByteToHex($decrArray[26]). ByteToHex($decrArray[27]); $Byte1 = $decrArray[28]; $Byte2 = $decrArray[29]; $Byte3 = $decrArray[30]; $Byte4 = $decrArray[31]; $EnergieRP = hexdec(ByteToHex($Byte4).ByteToHex($Byte3).ByteToHex($Byte2).ByteToHex($Byte1)); //echo "\nEnergie R+ Obis 3.8.1: ".$EnergieRP; //8410FB82F33C (Energie R- Obis 4.8.1)[varh] $KontrolleObis .= ByteToHex($decrArray[32]) .ByteToHex($decrArray[33]) . ByteToHex($decrArray[34]). ByteToHex($decrArray[35]). ByteToHex($decrArray[36]). ByteToHex($decrArray[37]); $Byte1 = $decrArray[38]; $Byte2 = $decrArray[39]; $Byte3 = $decrArray[40]; $Byte4 = $decrArray[41]; $EnergieRM = hexdec(ByteToHex($Byte4).ByteToHex($Byte3).ByteToHex($Byte2).ByteToHex($Byte1)); //echo "\nEnergie R- Obis 4.8.1: ".$EnergieRM; //042B (Wirkleistung P+ Obis 1.7.0)W $KontrolleObis .= ByteToHex($decrArray[42]) .ByteToHex($decrArray[43]); $Byte1 = $decrArray[44]; $Byte2 = $decrArray[45]; $Byte3 = $decrArray[46]; $Byte4 = $decrArray[47]; $WirkleistungPP = hexdec(ByteToHex($Byte4).ByteToHex($Byte3).ByteToHex($Byte2).ByteToHex($Byte1)); //echo "\nWirkleistung P+ Obis 1.7.0: ".$WirkleistungPP; //04AB3C (Wirkleistung P- Obis 2.7.0)W $KontrolleObis .= ByteToHex($decrArray[48]) .ByteToHex($decrArray[49]) . ByteToHex($decrArray[50]); $Byte1 = $decrArray[51]; $Byte2 = $decrArray[52]; $Byte3 = $decrArray[53]; $Byte4 = $decrArray[54]; $WirkleistungPM = hexdec(ByteToHex($Byte4).ByteToHex($Byte3).ByteToHex($Byte2).ByteToHex($Byte1)); //echo "\nWirkleistung P- Obis 2.7.0: ".$WirkleistungPM; //04FB14 (Blindleistung Q+ Obis 3.7.0)var $KontrolleObis .= ByteToHex($decrArray[55]) .ByteToHex($decrArray[56]) . ByteToHex($decrArray[57]); $Byte1 = $decrArray[58]; $Byte2 = $decrArray[59]; $Byte3 = $decrArray[60]; $Byte4 = $decrArray[61]; $BlindleistungQP = hexdec(ByteToHex($Byte4).ByteToHex($Byte3).ByteToHex($Byte2).ByteToHex($Byte1)); //echo "\nBlindleistung Q+ Obis 3.7.0: ".$BlindleistungQP; //04FB943C (Blindleistung Q- Obis 4.7.0)var $KontrolleObis .= ByteToHex($decrArray[62]) .ByteToHex($decrArray[63]) . ByteToHex($decrArray[64]). ByteToHex($decrArray[65]); $Byte1 = $decrArray[66]; $Byte2 = $decrArray[67]; $Byte3 = $decrArray[68]; $Byte4 = $decrArray[69]; $BlindleistungQM = hexdec(ByteToHex($Byte4).ByteToHex($Byte3).ByteToHex($Byte2).ByteToHex($Byte1)); //echo "\nBlindleistung Q- Obis 4.7.0: ".$BlindleistungQM; //0483FF04 (Inkasso Obis 1.128.0 ) Wh $KontrolleObis .= ByteToHex($decrArray[70]) .ByteToHex($decrArray[71]) . ByteToHex($decrArray[72]). ByteToHex($decrArray[73]); $Byte1 = $decrArray[74]; $Byte2 = $decrArray[75]; $Byte3 = $decrArray[76]; $Byte4 = $decrArray[77]; $Inkasso = hexdec(ByteToHex($Byte4).ByteToHex($Byte3).ByteToHex($Byte2).ByteToHex($Byte1)); //echo "\nInkasso Obis 1.128.0: ".$Inkasso; if ($KontrolleObis = "040304833C8410FB82738410FB82F33C042B04AB3C04FB1404FB943C0483FF04") { //echo "\nOBIS-Kennzahlen stimmen überein"; $IPSEnergieAP = GetValue($IDEnergieAP); $IPSEnergieAM = GetValue($IDEnergieAM); if (($IPSEnergieAP <= round($EnergieAP * 0.001,2)) AND ($IPSEnergieAM <= round($EnergieAM * 0.001,2))) { //Daten (endlich :-))in IPS-Variablen schreiben (und umrechnen)! Schreiben($IDEnergieAP, round($EnergieAP * 0.001,2)); Schreiben($IDEnergieAM, round($EnergieAM * 0.001,2)); Schreiben($IDEnergieRP, round($EnergieRP * 0.001,2)); Schreiben($IDEnergieRM, round($EnergieRM * 0.001,2)); Schreiben($IDWirkleistungPP, round($WirkleistungPP * 0.001,2)); Schreiben($IDWirkleistungPM, round($WirkleistungPM * 0.001,2)); Schreiben($IDBlindleistungQP, round($BlindleistungQP * 0.001,2)); Schreiben($IDBlindleistungQM, round($BlindleistungQM * 0.001,2)); SetValue($IDInkasso, round($Inkasso * 0.001,2)); //dieser Wert wird immer geschrieben damit die auslesung alle 60s möglich ist. sonst auslesen alle 1s //echo "\nWerte wurden geschrieben, falls sie sich in der Zwischenzeit geändert haben."; }else{ //echo "\nWerte wurden nicht geschrieben, fehlerhafte Werte, ausgelesener Zählerwert niedriger als Wert im IPS"; } }else{ //echo "\nFehler bei den OBIS-Kennzahlen (evtl. defekter Frame)"; } } } } } } } }else{ RegVar_SetBuffer($_IPS['INSTANCE'], ""); } } }else{ RegVar_SetBuffer($IDRegistervariable, ""); } function byteStr2byteArray($s) { return array_slice(unpack("C*", "\0".$s), 1); } function outputByteString($s) { $out = ""; $bufArr = byteStr2byteArray($s); foreach( $bufArr as $char ) { $out .= "\\"; $out .= "x"; if ( intval($char) < 16 ) { $out .= "0"; } $out .= dechex($char) . ""; } echo "\n\n" . $out . "\n"; } function ByteToHex($byte) { //$retval = "0x"; $retval = ""; if ( $byte <= 0x0F ) { $retval .= "0" . strtoupper(dechex($byte)); } else { $retval .= strtoupper(dechex($byte)); } return $retval;// . " "; } function returnByteString($byteString) { $out = ""; $byteArr = byteStr2byteArray($byteString); foreach( $byteArr as $byte ) { //$out .= "\\x"; if ( intval($byte) < 16 ) { $out .= "0"; } $out .= dechex($byte) . " "; } return strtoupper($out); } function hex_dump($data, $newline="\n"){ static $from = ''; static $to = ''; static $width = 16; # number of bytes per line static $pad = '.'; # padding for non-visible characters if ($from==='') { for ($i=0; $i<=0xFF; $i++) { $from .= chr($i); $to .= ($i >= 0x20 && $i <= 0x7E) ? chr($i) : $pad; } } $hex = str_split(bin2hex($data), $width*2); $chars = str_split(strtr($data, $from, $to), $width); $offset = 0; foreach ($hex as $i => $line) { echo sprintf('%6X',$offset).' : '.implode(' ', str_split($line,2)) . ' [' . $chars[$i] . ']' . $newline; $offset += $width; } } function Schreiben ($ID, $Wert){ $AktuellerWert = GetValue($ID); if ($AktuellerWert<> $Wert){ SetValue ($ID , $Wert); } } ?>

Nein, das mit Leid war ein Scherz am Rande! Aber cool Markus wir sind ja gar nicht soweit von einander entfernt. Eine Arbeitskollegin meiner Frau ist aus Zell :wink: In 20 min. wäre ich bei dir :slight_smile: Ist aber keine Drohung :rofl:

Danke für das Skript - könntest du das als php einstellen?
(Hab herausgefunden das muss man unter (3x Taste links neben Backspace mit Shift ) skript (3x Taste links neben Backspace mit Shift ) stellen - das ist jeweils die taste neben Backspace

<?php

echo "Hello World";

Sollten uns mal über PN austauschen :v:

lg
hagi

   $IDEnergieAP = 45338;//0403 (Energie A+ Obis 1.8.0) [kWh]
   $IDEnergieAM = 58270;//04833C (Energie A- Obis 2.8.0)[kWh]
   $IDEnergieRP = 32332;//8410FB8273 (Energie R+ Obis 3.8.1)[kvarh]
   $IDEnergieRM = 49354;//8410FB82F33C (Energie R- Obis 4.8.1)[kvarh]
   $IDWirkleistungPP = 19472;//042B (Wirkleistung P+ Obis 1.7.0)kW
   $IDWirkleistungPM = 43167;//04AB3C (Wirkleistung P- Obis 2.7.0)kW
   $IDBlindleistungQP = 51308;//04FB14 (Blindleistung Q+ Obis 3.7.0)kvar
   $IDBlindleistungQM = 23934;//04FB943C (Blindleistung Q- Obis 4.7.0)kvar
   $IDInkasso = 35018;//0483FF04 (Inkasso Obis 1.128.0 ) kWh
   $IDRegistervariable = 31963;
    $key_hex= "HIERMUSSKEYHIN";

       if ($_IPS['SENDER'] == "RegisterVariable"){
        $VarTrigger = IPS_GetVariable($IDInkasso);
        //Wenn über 50 sec  die Variable nicht aktualisiert wurde
        if(($VarTrigger['VariableUpdated']  + 50) < (time())) {

            // 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'];
         if (substr($data,0,1) == "\x10"){

                // wenn die Zeichen in $data der Anfrage vom MBUS-Master entsprechen
                if ($data == "\x10\x40\xF0\x30\x16"){
                    RegVar_SetBuffer($_IPS['INSTANCE'], "");
                    RegVar_SendText($_IPS['INSTANCE'],"\xe5");
                }else{
                    if (strlen ($data ) > 5 ) {//datenstring fehler, löschen
                        RegVar_SetBuffer($_IPS['INSTANCE'], "");
                    }else{//datenstring noch nicht vollständig in buffer schreiben
                  RegVar_SetBuffer($_IPS['INSTANCE'], $data);
                    }
                }
            }elseif (substr($data,0,1) == "\x68"){
            RegVar_SetBuffer($_IPS['INSTANCE'], $data);
                $key = hex2bin ($key_hex);

                //$data = "\x68\x5F\x5F\x68\x53\xF0\x5B\x00\x00\x00\x00\x2D\x4C\x01\x0E\x0D\x00\x50\x05\x3F\xD0\xFE\xB7\x26\x76\x0C\xC7\xAA\xF0\xB5\x2B\x41\xF0\xC5\x41\xBD\x63\x06\xDC\xD8\xB9\x1B\x3D\xA2\x31\x1E\xF1\x3D\x25\x14\xD0\x96\x00\x82\x16\x1E\xFE\xC4\xB6\xCB\x1E\x0B\x33\x28\xBE\x61\x77\xDC\xA5\x94\xC1\x28\x00\x24\xA8\x35\xF1\xD6\x55\xBA\x71\x82\xB2\x56\xE9\x4B\xD3\x3A\xC0\xA6\xB0\x8D\xA4\x67\x81\xEB\x4E\x91\xE0\x12\x16";

                //$dataVolkszaehler = "685F5F6853F05B000000002D4C010E0D0050053FD0FEB726760CC7AAF0B52B41F0C541BD6306DCD8B91B3DA2311EF13D2514D0960082161EFEC4B6CB1E0B3328BE6177DCA594C1280024A835F1D655BA7182B256E94BD33AC0A6B08DA46781EB4E91E01216";
                //$data = hex2bin ($dataVolkszaehler);

                //$dataM21 = "685F5F6873F05B000000002D4C010E08005005BBF0C8BECA58A381934365227669CB5AA8E73778E5EABB317B76A0430DF8C505BFC03BBB782607DC3741C2028F90C09A9C6E10B08F1B3FBE5A0C91D3D6A7A462D7E78F8AACDDAC5B5B3608C7DB27574CEC16";
                //$data = hex2bin ($dataM21);


                //hex_dump ($string);

                $MBUS_FRAME_FIXED_SIZE_LONG     = 6;
                $dataarray = byteStr2byteArray ($data);
                $dataarray_len = count($dataarray);
                if ($dataarray_len < 3) {
                    //echo ("Got a valid long/control packet start, but we need data to determine the length!");
                }else{

                    $start1 = $dataarray[0];
                    $length1 = $dataarray[1];
                    $length2 = $dataarray[2];

                    if ( $length1 != $length2) {
                        //echo ("Not a valid M-bus frame. Buffer von IPS wird vorsichtshalber gelöscht");
                        RegVar_SetBuffer($_IPS['INSTANCE'], "");
                    }else{

                        if ($dataarray_len < ($MBUS_FRAME_FIXED_SIZE_LONG + $length1)) {
                            //echo ("Length of packet incorrect, we need more data! ");

                        }else{

                            $start2   = $dataarray[3];
                            $control  = $dataarray[4];
                            $address  = $dataarray[5];
                            $control_information = $dataarray[6];
                            $IdentNr1 = $dataarray[7];
                            $IdentNr2 = $dataarray[8];
                            $IdentNr3 = $dataarray[9];
                            $IdentNr4 = $dataarray[10];
                            $ManufacCode1 = $dataarray[11];
                            $ManufacCode2 = $dataarray[12];
                            $Version = $dataarray[13];
                            $DeviceType = $dataarray[14];
                            $AcessNr = $dataarray[15];
                            $MBusState = $dataarray[16];
                            $ConfigWord1 = $dataarray[17];
                            $ConfigWord2 = $dataarray[18];

                            $checksum = $dataarray[$MBUS_FRAME_FIXED_SIZE_LONG + $length1-2];
                            $stop     = $dataarray[$MBUS_FRAME_FIXED_SIZE_LONG + $length1-1];

                            /**
                             * Calcuate checksum
                             */
                            $calculated_checksum = $control;
                            $calculated_checksum += $address;
                            $calculated_checksum += $control_information;

                            for ($i = 7; $i < $dataarray_len - 2; $i++) {
                                $calculated_checksum += $dataarray[$i];
                                $calculated_checksum = $calculated_checksum % 256;
                            }

                            if ($checksum != $calculated_checksum ) {
                                //echo("Checksums do not match!! Buffer von IPS wird vorsichtshalber gelöscht");
                                RegVar_SetBuffer($_IPS['INSTANCE'], "");
                            }else{
                                $encryptedData = "";
                                for ($i = 19; $i < $MBUS_FRAME_FIXED_SIZE_LONG + $length1-2; $i++) {
                                    $encryptedData .= pack ("C",$dataarray[$i]);
                                }
                                //echo "Daten zum Entschlüsseln:\n";
                                hex_dump ($encryptedData);

                                 // folgenden Block auskommentieren wenn abfragezyklus 1x pro Minute sein soll, wenn auskommentierung weggenommen wird erfolgt die Variablenaktualisierung 1x pro Sekunde!
                                if ($dataarray_len > $MBUS_FRAME_FIXED_SIZE_LONG + $length1) {
                                    //reset buffer
                                    $DataAnBuffer = "";
                                    for ($i = $MBUS_FRAME_FIXED_SIZE_LONG + $length1; $i < $dataarray_len; $i++) { //überschüssige daten in den buffer zurückschreiben
                                        $DataAnBuffer .= pack ("C",$dataarray[$i]);
                                    }

                                    RegVar_SetBuffer($_IPS['INSTANCE'], $DataAnBuffer);
                                    //RegVar_SendText($_IPS['INSTANCE'],"\xe5");
                                }elseif($dataarray_len = $MBUS_FRAME_FIXED_SIZE_LONG + $length1){
                            RegVar_SetBuffer($_IPS['INSTANCE'], "");
                                    //RegVar_SendText($_IPS['INSTANCE'],"\xe5");

                                }


                         
								$iv = pack("C*", $ManufacCode1, $ManufacCode2, 0 , 0 , 0 , 0 , $Version , $DeviceType , $AcessNr , $AcessNr, $AcessNr, $AcessNr, $AcessNr, $AcessNr, $AcessNr, $AcessNr);
								$decryptedData = openssl_decrypt(base64_encode($encryptedData), 'aes-128-cbc', $key, OPENSSL_ZERO_PADDING, $iv);
								$encryptedData_Kontrolle = base64_decode(openssl_encrypt($decryptedData, 'aes-128-cbc', $key, OPENSSL_ZERO_PADDING, $iv)); 
 
                                if (strncmp($encryptedData, $encryptedData_Kontrolle, strlen($encryptedData)) == 0) {
                                    //echo "Entschlüsselung ok\n";
                                } else {
                                    //echo "Entschlüsselung error\n";
                                }

                                //echo "Entschlüsselte Daten:\n";
                                hex_dump ($decryptedData);

                                $decrArray = byteStr2byteArray ($decryptedData);
                                $decrArray_len = count($decrArray);
                                if ($decrArray_len  != 80) {
                                    //echo ("Die Länge der entschlüsselten Daten passt nicht!");
                                }else{
                                    if ( $decrArray [0]. $decrArray [1] != $decrArray [$decrArray_len-2]. $decrArray [$decrArray_len-1]) {
                                        //echo ("keine validen entschlüsselten Daten!");
                                        hex_dump ($decrArray [0]. $decrArray [1]);

                                    }else {
                                        //0403 (Energie A+ Obis 1.8.0) [Wh]
                                        $KontrolleObis = ByteToHex($decrArray[10]) .ByteToHex($decrArray[11]);
                                        $Byte1   = $decrArray[12];
                                        $Byte2   = $decrArray[13];
                                        $Byte3   = $decrArray[14];
                                        $Byte4   = $decrArray[15];
                                        $EnergieAP = hexdec(ByteToHex($Byte4).ByteToHex($Byte3).ByteToHex($Byte2).ByteToHex($Byte1));
                                        //$EnergieAP = unpack ("L*",pack ("C*",$Byte4,$Byte3,$Byte2,$Byte1));
                                        //$EnergieAP = pack ("C*",$Byte4,$Byte3,$Byte2,$Byte1);
                                        //echo "\nEnergie A+ Obis 1.8.0: ".$EnergieAP;

                                        //04833C (Energie A- Obis 2.8.0)[Wh]
                                        $KontrolleObis .= ByteToHex($decrArray[16]) .ByteToHex($decrArray[17]) . ByteToHex($decrArray[18]);
                                        $Byte1   = $decrArray[19];
                                        $Byte2   = $decrArray[20];
                                        $Byte3   = $decrArray[21];
                                        $Byte4   = $decrArray[22];
                                        $EnergieAM = hexdec(ByteToHex($Byte4).ByteToHex($Byte3).ByteToHex($Byte2).ByteToHex($Byte1));
                                        //echo "\nEnergie A- Obis 2.8.0: ".$EnergieAM;

                                        //8410FB8273 (Energie R+ Obis 3.8.1)[varh]
                                        $KontrolleObis .= ByteToHex($decrArray[23]) .ByteToHex($decrArray[24]) . ByteToHex($decrArray[25]) . ByteToHex($decrArray[26]). ByteToHex($decrArray[27]);
                                        $Byte1   = $decrArray[28];
                                        $Byte2   = $decrArray[29];
                                        $Byte3   = $decrArray[30];
                                        $Byte4   = $decrArray[31];
                                        $EnergieRP = hexdec(ByteToHex($Byte4).ByteToHex($Byte3).ByteToHex($Byte2).ByteToHex($Byte1));
                                        //echo "\nEnergie R+ Obis 3.8.1: ".$EnergieRP;

                                        //8410FB82F33C (Energie R- Obis 4.8.1)[varh]
                                        $KontrolleObis .= ByteToHex($decrArray[32]) .ByteToHex($decrArray[33]) . ByteToHex($decrArray[34]). ByteToHex($decrArray[35]). ByteToHex($decrArray[36]). ByteToHex($decrArray[37]);
                                        $Byte1   = $decrArray[38];
                                        $Byte2   = $decrArray[39];
                                        $Byte3   = $decrArray[40];
                                        $Byte4   = $decrArray[41];
                                        $EnergieRM = hexdec(ByteToHex($Byte4).ByteToHex($Byte3).ByteToHex($Byte2).ByteToHex($Byte1));
                                        //echo "\nEnergie R- Obis 4.8.1: ".$EnergieRM;

                                        //042B (Wirkleistung P+ Obis 1.7.0)W
                                        $KontrolleObis .= ByteToHex($decrArray[42]) .ByteToHex($decrArray[43]);
                                        $Byte1   = $decrArray[44];
                                        $Byte2   = $decrArray[45];
                                        $Byte3   = $decrArray[46];
                                        $Byte4   = $decrArray[47];
                                        $WirkleistungPP = hexdec(ByteToHex($Byte4).ByteToHex($Byte3).ByteToHex($Byte2).ByteToHex($Byte1));
                                        //echo "\nWirkleistung P+ Obis 1.7.0: ".$WirkleistungPP;

                                        //04AB3C (Wirkleistung P- Obis 2.7.0)W
                                        $KontrolleObis .= ByteToHex($decrArray[48]) .ByteToHex($decrArray[49]) . ByteToHex($decrArray[50]);
                                        $Byte1   = $decrArray[51];
                                        $Byte2   = $decrArray[52];
                                        $Byte3   = $decrArray[53];
                                        $Byte4   = $decrArray[54];
                                        $WirkleistungPM = hexdec(ByteToHex($Byte4).ByteToHex($Byte3).ByteToHex($Byte2).ByteToHex($Byte1));
                                        //echo "\nWirkleistung P- Obis 2.7.0: ".$WirkleistungPM;

                                        //04FB14 (Blindleistung Q+ Obis 3.7.0)var
                                        $KontrolleObis .= ByteToHex($decrArray[55]) .ByteToHex($decrArray[56]) . ByteToHex($decrArray[57]);
                                        $Byte1   = $decrArray[58];
                                        $Byte2   = $decrArray[59];
                                        $Byte3   = $decrArray[60];
                                        $Byte4   = $decrArray[61];
                                        $BlindleistungQP = hexdec(ByteToHex($Byte4).ByteToHex($Byte3).ByteToHex($Byte2).ByteToHex($Byte1));
                                        //echo "\nBlindleistung Q+ Obis 3.7.0: ".$BlindleistungQP;

                                        //04FB943C (Blindleistung Q- Obis 4.7.0)var
                                        $KontrolleObis .= ByteToHex($decrArray[62]) .ByteToHex($decrArray[63]) . ByteToHex($decrArray[64]). ByteToHex($decrArray[65]);
                                        $Byte1   = $decrArray[66];
                                        $Byte2   = $decrArray[67];
                                        $Byte3   = $decrArray[68];
                                        $Byte4   = $decrArray[69];
                                        $BlindleistungQM = hexdec(ByteToHex($Byte4).ByteToHex($Byte3).ByteToHex($Byte2).ByteToHex($Byte1));
                                        //echo "\nBlindleistung Q- Obis 4.7.0: ".$BlindleistungQM;

                                        //0483FF04 (Inkasso Obis 1.128.0 ) Wh
                                        $KontrolleObis .= ByteToHex($decrArray[70]) .ByteToHex($decrArray[71]) . ByteToHex($decrArray[72]). ByteToHex($decrArray[73]);
                                        $Byte1   = $decrArray[74];
                                        $Byte2   = $decrArray[75];
                                        $Byte3   = $decrArray[76];
                                        $Byte4   = $decrArray[77];
                                        $Inkasso = hexdec(ByteToHex($Byte4).ByteToHex($Byte3).ByteToHex($Byte2).ByteToHex($Byte1));
                                        //echo "\nInkasso Obis 1.128.0: ".$Inkasso;

                               if ($KontrolleObis  = "040304833C8410FB82738410FB82F33C042B04AB3C04FB1404FB943C0483FF04") {
                                  //echo "\nOBIS-Kennzahlen stimmen überein";

                                            $IPSEnergieAP = GetValue($IDEnergieAP);
                                            $IPSEnergieAM = GetValue($IDEnergieAM);
                                 if (($IPSEnergieAP <= round($EnergieAP * 0.001,2)) AND ($IPSEnergieAM <= round($EnergieAM * 0.001,2))) {
                                                //Daten (endlich :-))in IPS-Variablen schreiben (und umrechnen)!
                                                Schreiben($IDEnergieAP, round($EnergieAP * 0.001,2));
                                                Schreiben($IDEnergieAM, round($EnergieAM * 0.001,2));
                                                Schreiben($IDEnergieRP, round($EnergieRP * 0.001,2));
                                                Schreiben($IDEnergieRM, round($EnergieRM * 0.001,2));
                                                Schreiben($IDWirkleistungPP, round($WirkleistungPP * 0.001,2));
                                                Schreiben($IDWirkleistungPM, round($WirkleistungPM * 0.001,2));
                                                Schreiben($IDBlindleistungQP, round($BlindleistungQP * 0.001,2));
                                                Schreiben($IDBlindleistungQM, round($BlindleistungQM * 0.001,2));
                                                SetValue($IDInkasso, round($Inkasso * 0.001,2)); //dieser Wert wird immer geschrieben damit die auslesung alle 60s möglich ist. sonst auslesen alle 1s
                                                //echo "\nWerte wurden geschrieben, falls sie sich in der Zwischenzeit geändert haben.";
                                            }else{
                                    //echo "\nWerte wurden nicht geschrieben, fehlerhafte Werte, ausgelesener Zählerwert niedriger als Wert im IPS";
                                            }

                                        }else{
                                           //echo "\nFehler bei den OBIS-Kennzahlen (evtl. defekter Frame)";
                                        }
                                    }
                                }
                     }
                        }
                    }
                }
            }else{
               RegVar_SetBuffer($_IPS['INSTANCE'], "");
            }
        }
    }else{
    RegVar_SetBuffer($IDRegistervariable, "");
    }

   function byteStr2byteArray($s) {
            return array_slice(unpack("C*", "\0".$s), 1);
    }

    function outputByteString($s) {
        $out = "";
        $bufArr = byteStr2byteArray($s);
        foreach( $bufArr as $char ) {
            $out .= "\\";
            $out .= "x";
            if ( intval($char) < 16 ) {
                $out .= "0";
            }
            $out .= dechex($char) . "";
        }
        echo "\n\n" . $out . "\n";

    }

    function ByteToHex($byte) {
        //$retval = "0x";
        $retval = "";
        if ( $byte <= 0x0F ) {
            $retval .= "0" . strtoupper(dechex($byte));
        } else {
            $retval .= strtoupper(dechex($byte));
        }
        return $retval;// . " ";
    }

    function returnByteString($byteString) {
        $out = "";
        $byteArr = byteStr2byteArray($byteString);
        foreach( $byteArr as $byte ) {
            //$out .= "\\x";

            if ( intval($byte) < 16 ) {
                $out .= "0";
            }
            $out .= dechex($byte) . " ";
        }
        return strtoupper($out);
    }

    function hex_dump($data, $newline="\n"){
        static $from = '';
        static $to = '';

        static $width = 16; # number of bytes per line

        static $pad = '.'; # padding for non-visible characters

        if ($from==='')
        {
        for ($i=0; $i<=0xFF; $i++)
        {
          $from .= chr($i);
          $to .= ($i >= 0x20 && $i <= 0x7E) ? chr($i) : $pad;
        }
        }

        $hex = str_split(bin2hex($data), $width*2);
        $chars = str_split(strtr($data, $from, $to), $width);

        $offset = 0;
        foreach ($hex as $i => $line)
        {
        echo sprintf('%6X',$offset).' : '.implode(' ', str_split($line,2)) . ' [' . $chars[$i] . ']' . $newline;
        $offset += $width;
        }
    }

    function Schreiben ($ID, $Wert){
        $AktuellerWert = GetValue($ID);
        if ($AktuellerWert<> $Wert){
          SetValue ($ID , $Wert);
        }
    }
?>

So, Skript extra nochmal eingestellt, der Ordentlichkeit halber. Achso, dann kannst du ja nur aus der Gegend Eberschwang oder Ried sein oder?
Keine Angst, nicht als Drohung wahr genommen :slight_smile: Vielleicht passts ja wirklich mal sich auszutauschen!

Super Danke nochmals!

lg hagi

Ich habe zu diesem Script hier noch eine Frage, welches nun seit Jahren tadellos läuft…

Da dieses über die Register Variable läuft und eigentlich ständig ausgeführt wird, füllt es mir meine Meldungsliste gnadenlos an. Ich habe leider echt keine Ahnung wie ich das abstellen kann. Paresy gab mir schon mal den Tipp alle Echos rausnehmen, es sind keine mehr drin und es hat nichts geändert!

Weiß hier jemand Rat?

Leerzeilen bzw Zeilenumbruch außerhalb der PHP Tags.
Den schließenden Tag kannst du auch ganz weglassen.
Michael

Hallo, mein IR Lesekopf RS232 von Volkszähler dürfe defekt sein. Hat wer eine Info oder einen Link wo ich einen neuen Bekomme?

Die Seite vom Volkszähler dürfte nicht mehr aktuell sein. Hab ihn damals 2017 dort via Email bestellt.

Danke :slight_smile: lex

Schon mal probiert, an den selben noch eine E-Mail zu senden? Die meisten Bauteile die kaputt gehen können (wenn es nicht gerade die Platine ist) wird es aber auch bei den gängigen Elektronikhändlern geben.

Hallo

Ja hab ich jedoch keine Reaktion :confused: . Hab mir nun einen auf Ebay mit einer TTL schnittstelle und den TTL-RS232 Konverter bestellt und nun geht es wieder.

Danke :slight_smile: Alex