Select Page
This entry has been published on 2016-12-07 and may be out of date.

Last Updated on 2016-12-07.

[:en] 

Using a KNX server like eibd with PHP in combination, you might come to a point where you want to convert the DPT/EIS encoded telegram values to decimal format.

For some data types, it works by simply using PHP hexbin(), but it does not for 2-byte floating point values.

In many forum threads the following sample is used:

 $first_byte = decbin(hexdec(substr($value, 0, 2)));
 $second_byte = decbin(hexdec(substr($value, 2, 2)));

 while (strlen($first_byte) != 8) {
   $first_byte= "0".$first_byte;
 }

 while (strlen($second_byte) != 8) {
   $second_byte= "0".$second_byte;
 }

 $tmpdata = $first_byte.$second_byte;
 $eib_base_value=bindec(substr($tmpdata,5,15));
 $eib_exponent=bindec(substr($tmpdata,1,4));
 return (0.01*$eib_base_value)*pow(2,$eib_exponent);

 

 
BUT it converts negative values wrong! This can lead to e.g. wrong temperature values which might affect the heating control.

Use this snippet instead:

$intValue = hexdec($value);
$floatValue = ($intValue & 0x07ff);

if (($intValue & 0x08000) != 0)
{
  $floatValue = $floatValue | 0xfffffffffffff800;
  $floatValue = $floatValue *-1;
}

$floatValue = $floatValue << (($intValue & 0x07800) >> 11);
            
if (($intValue & 0x08000) != 0)
{
  $floatValue = $floatValue * -1;
}

return $floatValue / 100;

Reference[:]