Register Variable Warning

Hallo zusammen,
ich habe z.B. zum Auslesen eines SMA Home Managers Instanzen vom Typ Register Variable angelegt. Das Auslesen funktioniert auch fehlerfrei, aber es werden alle paar Sekunden Warnungen mit dem Inhalt „Register Variable“ in den Meldungen angezeigt. Kann man das irgendwie unterbinden?
Vielen Dank für eure Hilfe

Mit welchem Script füllst bzw verarbeitest du das? Ist da ein ios_logmessage eingebaut?

Was unterbinden? Die Fehlermeldung ist ja auf dem Screenshot gar nicht drauf.
Michael

Vermutlich hat dein Abarbeitungsskript noch eine Ausgabe oder ein Leerzeichen am Ende.

paresy

Die Warnungen enthalten keine weiteren Informationen, sondern füllen so wie auf dem Screenshot das Log. Hier das Abarbeitungsskript:

 <?
if ($_IPS["SENDER"] == "RegisterVariable")                               // über Register Var ausgeführt
{
    $Data  = RegVar_GetBuffer($_IPS["INSTANCE"]);                 // im Puffer der Instanz vorhandene Daten in $data kopieren
    $Data .= $_IPS["VALUE"];                                                        // neu empfangene Daten an $data anhängen
    $CRLF  = ",\n";
    $HexData = bin2hex($Data);
    SetValue(11967, substr($HexData,417, 16 ));
    
    $bezugSumme=(float)hexdec(substr($HexData,64, 8 ))/10;
    if ($bezugSumme<100000)
        SetValue(12779,$bezugSumme);
    
    $einspeisungSumme=(float)hexdec(substr($HexData,104, 8 ))/10;
    if ($einspeisungSumme<100000)
        SetValue(20661,$einspeisungSumme);

    //SetValue(14735,(float)hexdec(substr($HexData,320, 8 ))/10);
    //SetValue(54000,(float)hexdec(substr($HexData,608, 8 ))/10-(float)hexdec(substr($HexData,648, 8 ))/10);
    //SetValue(22638,(float)hexdec(substr($HexData,896, 8 ))/10);
    $bezogeneEnergieAlt=GetValueFloat(59074);
    $eingespeisteEnergieAlt=GetValueFloat(50391);

    $bezogeneEnergieNeu=(float)hexdec(substr($HexData,80, 16 ))/3600000;
    $eingespeisteEnergieNeu=(float)hexdec(substr($HexData,120, 16 ))/3600000;

    if($bezogeneEnergieNeu<$bezogeneEnergieAlt+1000 and $bezogeneEnergieNeu>=$bezogeneEnergieAlt)
        SetValue(59074,$bezogeneEnergieNeu);
    if($eingespeisteEnergieNeu<$eingespeisteEnergieAlt+1000 and $eingespeisteEnergieNeu>=$eingespeisteEnergieAlt)    
        SetValue(50391,$eingespeisteEnergieNeu);
}
?>

Lösche das und der Fehler sollte weg sein.
Michael

Danke, das hat funktioniert

Wofür verwendest du das? Der Buffer wird ja nie durch dich gefüllt.

Ich muss zugeben, dass ich das Skript nur kopiert habe. Daher verstehe ich leider die Frage nicht richtig. Es gibt eine RegVar-Instanz, die das Skript als Ziel hat. Was müsste ich denn anstelle von RegVar_GetBuffer verwenden?

garnichts. Da du nie was rein schreibst, steht auch nichts drin. Lass dir doch mit echo mal ausgeben, was überhaupt im Buffer steht.

Ich hab auch so ein Problem das mir eine Register Variable die Meldungsliste anfüllt. Habe eure Tipps schon versucht, aber es bleibt leider so. Mein Script sieht so aus, hab nur den Key für den Zähler abgeändert damit nicht der echte hier drin steht:

 <?
   $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= "hierstehtderkey";
       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);
        }
    }

Ich finde dreimal ein nicht auskommentierten Aufruf von hex_dump was ein echo enthält

Michael

Leider hab ich das Script auch nicht selber geschrieben und so nur wenig Ahnung was da wo wie läuft. Ich habe auf alle Fälle mal die 3 Hexdumps aus kommentiert und noch zwei weitere Echos gefunden die ich auch aus kommentiert habe, aber es ändert leider nichts. Immer noch jede Menge Meldungen!

Dann ist da noch das Leerzeichen vor dem PHP Tag.
Michael

Tatsächlich, das Leerzeichen weg und alles ist gut. Ich konnte mit diesem Wissen jetzt auch noch viele andere Scripts bereinigen und habe jetzt eine richtig saubere Meldungsliste, das ist richtig fein!

Vielen dank für deine Hilfe Michael!

Mahlzeit, auch ich habe beim Auslesen der Registervariable einen Fehler, den ich nicht zuorden kann?

Die zeile 165 im Script ist diese hier:

SetChangedValueFloat(37194, $res_l1[‚Real Power -‘]); //Einspeisung L1

Danke für die Info.

Wwo kommt denn das Script her? Wer hat es geschrieben und was soll es machen?

Die Funktion SetChangedValueFloat gibt es so in IP-Smycon nicht.

Der sichtbare Fehler allerdings bezieht sich darauf, dass die Variable $res_l1 nicht existiert und in der Folge dann auch der Offset (also ‚Real Power‘) ebenso nicht.

Danke dir für die rasche Info. Hab das Script hier aus dem Forum Kopiert.
Intressant, das der Wert trotzdem aktualisiert wird?

Ich habe das „Changed“ entfernt.

Du erwartest jetzt nicht ernsthaft eine Antwort, ohne dass wir das Script kennen?

Sorry, das Anbei das Script:

<?PHP
declare(strict_types=1);

if (time() % 5 != 0) return;

// OBIS Parameter
$list_sum   = []; //Summen
$list_sum['00010400'] = ['OBIS' => '0140', 'divisor' => 10, 'name' => 'Real Power +'];
$list_sum['00010800'] = ['OBIS' => '0180', 'divisor' => 3600000, 'name' => 'Counter Real Power +'];
$list_sum['00020400'] = ['OBIS' => '0240', 'divisor' => 10, 'name' => 'Real Power -'];
$list_sum['00020800'] = ['OBIS' => '0280', 'divisor' => 3600000, 'name' => 'Counter Real Power -'];
$list_sum['00030400'] = ['OBIS' => '0340', 'divisor' => 10, 'name' => 'Reactive Power +'];
$list_sum['00030800'] = ['OBIS' => '0380', 'divisor' => 3600000, 'name' => 'Counter ReReactive Power +'];
$list_sum['00040400'] = ['OBIS' => '0440', 'divisor' => 10, 'name' => 'Reactive Power -'];
$list_sum['00040800'] = ['OBIS' => '0480', 'divisor' => 3600000, 'name' => 'Counter ReReactive Power -'];
$list_sum['00090400'] = ['OBIS' => '0940', 'divisor' => 10, 'name' => 'Apparent Power +'];
$list_sum['00090800'] = ['OBIS' => '0980', 'divisor' => 3600000, 'name' => 'Counter Apparent Power +'];
$list_sum['000a0400'] = ['OBIS' => '1040', 'divisor' => 10, 'name' => 'Apparent Power -'];
$list_sum['000a0800'] = ['OBIS' => '1080', 'divisor' => 3600000, 'name' => 'Counter Apparent Power -'];
$list_sum['000d0400'] = ['OBIS' => '1340', 'divisor' => 1000, 'name' => 'Power Faktor'];
$list_sum['000e0400'] = ['OBIS' => '1440', 'divisor' => 1000, 'name' => 'Network Frequency'];

$list_l1   = []; //Phase 1
$list_l1['00150400'] = ['OBIS' => '2140', 'divisor' => 10, 'name' => 'Real Power +'];
$list_l1['00150800'] = ['OBIS' => '2180', 'divisor' => 3600000, 'name' => 'Counter Real Power +'];
$list_l1['00160400'] = ['OBIS' => '2240', 'divisor' => 10, 'name' => 'Real Power -'];
$list_l1['00160800'] = ['OBIS' => '2280', 'divisor' => 3600000, 'name' => 'Counter Real Power -'];
$list_l1['00170400'] = ['OBIS' => '2340', 'divisor' => 10, 'name' => 'Reactive Power +'];
$list_l1['00170800'] = ['OBIS' => '2380', 'divisor' => 3600000, 'name' => 'Counter ReReactive Power +'];
$list_l1['00180400'] = ['OBIS' => '2440', 'divisor' => 10, 'name' => 'Reactive Power -'];
$list_l1['00180800'] = ['OBIS' => '2480', 'divisor' => 3600000, 'name' => 'Counter ReReactive Power -'];
$list_l1['001d0400'] = ['OBIS' => '2940', 'divisor' => 10, 'name' => 'Apparent Power +'];
$list_l1['001d0800'] = ['OBIS' => '2980', 'divisor' => 3600000, 'name' => 'Counter Apparent Power +'];
$list_l1['001e0400'] = ['OBIS' => '3040', 'divisor' => 10, 'name' => 'Apparent Power -'];
$list_l1['001e0800'] = ['OBIS' => '3080', 'divisor' => 3600000, 'name' => 'Counter Apparent Power -'];
$list_l1['001f0400'] = ['OBIS' => '3140', 'divisor' => 1, 'name' => 'Power'];
$list_l1['00200400'] = ['OBIS' => '3240', 'divisor' => 1000, 'name' => 'Voltage'];
$list_l1['00210400'] = ['OBIS' => '3340', 'divisor' => 1000, 'name' => 'Network Frequency'];

$list_l2   = []; //Phase 2
$list_l2['00290400'] = ['OBIS' => '4140', 'divisor' => 10, 'name' => 'Real Power +'];
$list_l2['00290800'] = ['OBIS' => '4180', 'divisor' => 3600000, 'name' => 'Counter Real Power +'];
$list_l2['002a0400'] = ['OBIS' => '4240', 'divisor' => 10, 'name' => 'Real Power -'];
$list_l2['002a0800'] = ['OBIS' => '4280', 'divisor' => 3600000, 'name' => 'Counter Real Power -'];
$list_l2['002b0400'] = ['OBIS' => '4340', 'divisor' => 10, 'name' => 'Reactive Power +'];
$list_l2['002b0800'] = ['OBIS' => '4380', 'divisor' => 3600000, 'name' => 'Counter ReReactive Power +'];
$list_l2['002c0400'] = ['OBIS' => '4440', 'divisor' => 10, 'name' => 'Reactive Power -'];
$list_l2['002c0800'] = ['OBIS' => '4480', 'divisor' => 3600000, 'name' => 'Counter ReReactive Power -'];
$list_l2['00310400'] = ['OBIS' => '4940', 'divisor' => 10, 'name' => 'Apparent Power +'];
$list_l2['00310800'] = ['OBIS' => '4980', 'divisor' => 3600000, 'name' => 'Counter Apparent Power +'];
$list_l2['00320400'] = ['OBIS' => '5040', 'divisor' => 10, 'name' => 'Apparent Power -'];
$list_l2['00320800'] = ['OBIS' => '5080', 'divisor' => 3600000, 'name' => 'Counter Apparent Power -'];
$list_l2['00330400'] = ['OBIS' => '5140', 'divisor' => 1, 'name' => 'Power'];
$list_l2['00340400'] = ['OBIS' => '5240', 'divisor' => 1000, 'name' => 'Voltage'];
$list_l2['00350400'] = ['OBIS' => '5340', 'divisor' => 1000, 'name' => 'Network Frequency'];

$list_l3   = []; //Phase 3
$list_l3['003d0400'] = ['OBIS' => '4140', 'divisor' => 10, 'name' => 'Real Power +'];
$list_l3['003d0800'] = ['OBIS' => '4180', 'divisor' => 3600000, 'name' => 'Counter Real Power +'];
$list_l3['003e0400'] = ['OBIS' => '4240', 'divisor' => 10, 'name' => 'Real Power -'];
$list_l3['003e0800'] = ['OBIS' => '4280', 'divisor' => 3600000, 'name' => 'Counter Real Power -'];
$list_l3['003f0400'] = ['OBIS' => '4340', 'divisor' => 10, 'name' => 'Reactive Power +'];
$list_l3['003f0800'] = ['OBIS' => '4380', 'divisor' => 3600000, 'name' => 'Counter ReReactive Power +'];
$list_l3['00400400'] = ['OBIS' => '4440', 'divisor' => 10, 'name' => 'Reactive Power -'];
$list_l3['00400800'] = ['OBIS' => '4480', 'divisor' => 3600000, 'name' => 'Counter ReReactive Power -'];
$list_l3['00450400'] = ['OBIS' => '4940', 'divisor' => 10, 'name' => 'Apparent Power +'];
$list_l3['00450800'] = ['OBIS' => '4980', 'divisor' => 3600000, 'name' => 'Counter Apparent Power +'];
$list_l3['00460400'] = ['OBIS' => '5040', 'divisor' => 10, 'name' => 'Apparent Power -'];
$list_l3['00460800'] = ['OBIS' => '5080', 'divisor' => 3600000, 'name' => 'Counter Apparent Power -'];
$list_l3['00470400'] = ['OBIS' => '5140', 'divisor' => 1, 'name' => 'Power'];
$list_l3['00480400'] = ['OBIS' => '5240', 'divisor' => 1000, 'name' => 'Voltage'];
$list_l3['00490400'] = ['OBIS' => '5340', 'divisor' => 1000, 'name' => 'Network Frequency'];

if ($_IPS['SENDER'] === 'Execute'){
    //zum Testen
    $hraw = '534d4100000402a000000001024c001060690174b33a68d524a6a271000104000000000000010800000000005628897000020400000075be00020800000000037a39805000030400000000000003080000000000657b04c0000404000000093d0004080000000000436dbad00009040000000000000908000000000065e92c48000a04000000761b000a08000000000388d3e3f8000d0400000003e5000e04000000c359001504000000000000150800000000000deb6e9800160400000029d8001608000000000145ab1fd00017040000000000001708000000000020aa986000180400000003c700180800000000001e3635d0001d040000000000001d08000000000017db2560001e040000002a04001e0800000000014b33af58001f0400000012710020040000037ecc00210400000003e4002904000000000000290800000000003c4ae980002a040000002524002a0800000000010e795978002b040000000000002b0800000000002cedd9c0002c04000000023f002c08000000000012d341d800310400000000000031080000000000407691a80032040000002535003208000000000115096da0003304000000109a0034040000037fbc00350400000003e6003d040000000000003d0800000000001747a358003e0400000026c3003e080000000001316a7908003f040000000000003f0800000000002142e340004004000000033700400800000000001bc49530004504000000000000450800000000001fa4e6a000460400000026e5004608000000000136d71f6800470400000011340048040000037b7200490400000003e5900000000203055200000000';
} else {
    // Prepare data
    $hraw = bin2hex(RegVar_GetBuffer($_IPS['INSTANCE']) . $_IPS['VALUE']); // im Puffer der Instanz vorhandene Daten holen und um die letzten Werte ergänzen
}

//Zählerkennung
$offset = 0;
$len = 4;
//echo hexToStr(substr($hraw, $offset * 2, $len * 2)) . PHP_EOL;

//ProtokollID
$offset = 16;
$len = 2;
//echo (substr($hraw, $offset * 2, $len * 2)) . PHP_EOL;

//gruppe
$offset = 8;
$len = 2;
//echo (substr($hraw, $offset * 2, $len * 2)) . PHP_EOL;

//zaehlerkennung
$offset = 18;
$len = 6;
//echo (substr($hraw, $offset * 2, $len * 2)) . PHP_EOL;

//Messzeitpunkt
$offset = 24;
$len = 4;
//echo (substr($hraw, $offset * 2, $len * 2)) . PHP_EOL;

$offset += $len;
$finished = false;

while (!$finished){

    //obis Id
    $len = 4;
    $id = substr($hraw, $offset * 2, $len * 2);
    if ($id === '00000000'){
        $finished = true;
        continue;
    }
    $offset += $len;


    //obis Messwert
    $len = (int) substr($id, 2 * 2, 2); //die Länge entspricht der Messart (Byte 2)

    if (isset($list_sum[$id])){
        $value = substr($hraw, $offset * 2, $len * 2);
        $res_sum[$list_sum[$id]['name']] = base_convert(substr($hraw, $offset * 2, $len * 2), 16, 10) / $list_sum[$id]['divisor'];
    } elseif (isset($list_l1[$id])) {
        $value = substr($hraw, $offset * 2, $len * 2);
        $res_l1[$list_l1[$id]['name']] = base_convert(substr($hraw, $offset * 2, $len * 2), 16, 10) / $list_l1[$id]['divisor'];
    } elseif (isset($list_l2[$id])) {
        $value = substr($hraw, $offset * 2, $len * 2);
        $res_l2[$list_l2[$id]['name']] = base_convert(substr($hraw, $offset * 2, $len * 2), 16, 10) / $list_l2[$id]['divisor'];
    } elseif (isset($list_l3[$id])) {
        $value = substr($hraw, $offset * 2, $len * 2);
        $res_l3[$list_l3[$id]['name']] = base_convert(substr($hraw, $offset * 2, $len * 2), 16, 10) / $list_l3[$id]['divisor'];
    } elseif($id = '90000000') {
        $len = 4;
        $value = substr($hraw, $offset * 2, $len * 2);
        //echo sprintf('%s Softwareversion: %s', $id, $value) . PHP_EOL;
    } else {
        trigger_error ("$id unbekannt");
        $finished = true;
    }
    $offset += $len;

}


if ($_IPS['SENDER'] === 'Execute'){

    print_r($res_sum);
    print_r($res_l1);
    print_r($res_l2);
    print_r($res_l3);
    return;
}
 //SetValueFloat(50729,  $res_l1['Real Power +']);
 //SetChangedValueFloat(50729, $res_l1['Real Power +']); //Bezug L1
//SetChangedValueFloat(55046, $res_l2['Real Power +']); //Bezug L2
//SetChangedValueFloat(59773, $res_l1['Real Power +']); //Bezug L3
//SetChangedValueFloat(13109, $res_sum['Real Power +']); //Bezug gesamt
//SetChangedValueFloat(17496, $res_sum['Counter Real Power +']); //Bezug Zähler

SetValueFloat(37194, $res_l1['Real Power -']); //Einspeisung L1
SetValueFloat(24412, $res_l2['Real Power -']); //Einspeisung L2
SetValueFloat(41612, $res_l3['Real Power -']); //Einspeisung L3
//SetChangedValueFloat(11435, $res_sum['Real Power -']); //Einspeisung gesamt
//SetChangedValueFloat(56489, $res_sum['Counter Real Power -']); //Einspeisung Zähler

//SetChangedValueFloat(22959, max(GetValueFloat(21200) - $res_sum['Real Power -'], 0)); //Eigenversorgung
//SetChangedValueFloat(59462, max(GetValueFloat(21200) + $res_sum['Real Power +'] - $res_sum['Real Power -'], 0)); //Verbrauch


function SetChangedValueFloat(int $id, float $value){
    if (GetValueFloat($id) !== $value){
        SetValueFloat($id, $value);
    }
}


function hexToStr($hex){
    $string='';
    for ($i=0; $i < strlen($hex)-1; $i+=2){
        $string .= chr(hexdec($hex[$i].$hex[$i+1]));
    }
    return $string;
}