Ejemplo n.º 1
0
 /**
  * Look up the unit from a VIF field in the data record.
  *
  * See section 8.4.3  Codes for Value Information Field (VIF) in the M-BUS spec
  */
 public static function vif_unit_lookup($vif)
 {
     //mbus_utils::mylog("********** [" . (0x00+2) . "]");
     $vifNoExt = $vif & 0x7f;
     switch ($vifNoExt) {
         // E000 0nnn Energy 10(nnn-3) W
         case $vifNoExt >= 0x0 && $vifNoExt <= 0x7:
             $n = ($vif & 0x7) - 3;
             return "Energy (" . mbus_utils::unit_prefix($n) . "Wh)";
             break;
             // 0000 1nnn          Energy       10(nnn)J     (0.001kJ to 10000kJ)
         // 0000 1nnn          Energy       10(nnn)J     (0.001kJ to 10000kJ)
         case $vifNoExt >= 0x8 && $vifNoExt <= 0xf:
             $n = $vif & 0x7;
             return "Energy (" . mbus_utils::unit_prefix($n) . "J)";
             break;
             // E001 1nnn Mass 10(nnn-3) kg 0.001kg to 10000kg
         // E001 1nnn Mass 10(nnn-3) kg 0.001kg to 10000kg
         case $vifNoExt >= 0x18 && $vifNoExt <= 0x1f:
             $n = $vif & 0x7;
             return "Mass (" . mbus_utils::unit_prefix($n - 3) . "kg)";
             break;
             // E010 1nnn Power 10(nnn-3) W 0.001W to 10000W
         // E010 1nnn Power 10(nnn-3) W 0.001W to 10000W
         case $vifNoExt >= 0x28 && $vifNoExt <= 0x2f:
             $n = $vif & 0x7;
             return "Power (" . mbus_utils::unit_prefix($n - 3) . "W)";
             break;
             // E011 0nnn Power 10(nnn) J/h 0.001kJ/h to 10000kJ/h
         // E011 0nnn Power 10(nnn) J/h 0.001kJ/h to 10000kJ/h
         case $vifNoExt >= 0x30 && $vifNoExt <= 0x37:
             $n = $vif & 0x7;
             return "Power (" . mbus_utils::unit_prefix($n) . "J/h)";
             break;
             // E001 0nnn Volume 10(nnn-6) m3 0.001l to 10000l
         // E001 0nnn Volume 10(nnn-6) m3 0.001l to 10000l
         case $vifNoExt >= 0x10 && $vifNoExt <= 0x17:
             $n = $vif & 0x7;
             return "Volume (" . mbus_utils::unit_prefix($n - 6) . " m^3)";
             break;
             // E011 1nnn Volume Flow 10(nnn-6) m3/h 0.001l/h to 10000l/
         // E011 1nnn Volume Flow 10(nnn-6) m3/h 0.001l/h to 10000l/
         case $vifNoExt >= 0x38 && $vifNoExt <= 0x3f:
             $n = $vif & 0x7;
             return "Volume flow (" . mbus_utils::unit_prefix($n - 6) . " m^3/h)";
             break;
             // E100 0nnn Volume Flow ext. 10(nnn-7) m3/min 0.0001l/min to 1000l/min
         // E100 0nnn Volume Flow ext. 10(nnn-7) m3/min 0.0001l/min to 1000l/min
         case $vifNoExt >= 0x40 && $vifNoExt <= 0x47:
             $n = $vif & 0x7;
             return "Volume flow (" . mbus_utils::unit_prefix($n - 7) . " m^3/min)";
             break;
             // E100 1nnn Volume Flow ext. 10(nnn-9) m3/s 0.001ml/s to 10000ml/
         // E100 1nnn Volume Flow ext. 10(nnn-9) m3/s 0.001ml/s to 10000ml/
         case $vifNoExt >= 0x48 && $vifNoExt <= 0x4f:
             $n = $vif & 0x7;
             return "Volume flow (" . mbus_utils::unit_prefix($n - 9) . "m^3/s)";
             break;
             // E101 0nnn Mass flow 10(nnn-3) kg/h 0.001kg/h to 10000kg/h
         // E101 0nnn Mass flow 10(nnn-3) kg/h 0.001kg/h to 10000kg/h
         case $vifNoExt >= 0x50 && $vifNoExt <= 0x57:
             $n = $vif & 0x7;
             return "Mass flow (" . mbus_utils::unit_prefix($n - 3) . ") kg/h 0.001kg/h to 10000kg/h";
             break;
             // E101 10nn Flow Temperature 10(nn-3) °C 0.001°C to 1°C
         // E101 10nn Flow Temperature 10(nn-3) °C 0.001°C to 1°C
         case $vifNoExt >= 0x58 && $vifNoExt <= 0x5b:
             $n = $vif & 0x3;
             return "Flow temperature (" . mbus_utils::unit_prefix($n - 3) . ") °C 0.001°C to 1°C";
             break;
             // E101 11nn Return Temperature 10(nn-3) °C 0.001°C to 1°C
         // E101 11nn Return Temperature 10(nn-3) °C 0.001°C to 1°C
         case $vifNoExt >= 0x5c && $vifNoExt <= 0x5f:
             $n = $vif & 0x3;
             return "Return temperature (" . mbus_utils::unit_prefix($n - 3) . ") °C 0.001°C to 1°C";
             break;
             // E110 10nn Pressure 10(nn-3) bar 1mbar to 1000mbar
         // E110 10nn Pressure 10(nn-3) bar 1mbar to 1000mbar
         case $vifNoExt >= 0x68 && $vifNoExt <= 0x6b:
             $n = $vif & 0x3;
             return "Pressure 10(" . mbus_utils::unit_prefix($n - 3) . ") bar 1mbar to 1000mbar";
             break;
             // E010 00nn On Time
             // nn = 00 seconds
             // nn = 01 minutes
             // nn = 10   hours
             // nn = 11    days
             // E010 01nn Operating Time coded like OnTime
         // E010 00nn On Time
         // nn = 00 seconds
         // nn = 01 minutes
         // nn = 10   hours
         // nn = 11    days
         // E010 01nn Operating Time coded like OnTime
         case $vifNoExt >= 0x20 && $vifNoExt <= 0x23:
         case $vifNoExt >= 0x24 && $vifNoExt <= 0x27:
             $s = "";
             if ($vif & 0x4) {
                 $s = "Operating time ";
             } else {
                 $s = "On time ";
             }
             switch ($vif & 0x3) {
                 case 0x0:
                     $s .= "(seconds)";
                     break;
                 case 0x1:
                     $s .= "(minutes)";
                     break;
                 case 0x2:
                     $s .= "(hours)";
                     break;
                 case 0x3:
                     $s .= "(days)";
                     break;
             }
             return $s;
             break;
             // E110 110n Time Point
             // n = 0        date
             // n = 1 time & date
             // data type G
             // data type F
         // E110 110n Time Point
         // n = 0        date
         // n = 1 time & date
         // data type G
         // data type F
         case $vifNoExt >= 0x6c && $vifNoExt <= 0x6d:
             if ($vif & 0x1) {
                 return "Time Point (time & date)";
             } else {
                 return "Time Point (date)";
             }
             break;
             // E110 00nn    Temperature Difference   10(nn-3)K   (mK to  K)
         // E110 00nn    Temperature Difference   10(nn-3)K   (mK to  K)
         case $vifNoExt >= 0x60 && $vifNoExt <= 0x63:
             $n = $vif & 0x3;
             return "Temperature Difference (" . mbus_utils::unit_prefix($n - 3) . " deg C)";
             break;
             // E110 01nn External Temperature 10(nn-3) °C 0.001°C to 1°C
         // E110 01nn External Temperature 10(nn-3) °C 0.001°C to 1°C
         case $vifNoExt >= 0x64 && $vifNoExt <= 0x67:
             $n = $vif & 0x3;
             return "External temperature (" . mbus_utils::unit_prefix($n - 3) . " deg C)";
             break;
             // E110 1110 Units for H.C.A. dimensionless
         // E110 1110 Units for H.C.A. dimensionless
         case 0x6e:
             return "Units for H.C.A.";
             break;
             // E110 1111 Reserved
         // E110 1111 Reserved
         case 0x6f:
             return "Reserved";
             break;
             // Fabrication No
         // Fabrication No
         case 0x78:
             return "Fabrication number";
             break;
         case 0x7c:
             return "Plain Text";
             break;
             // Manufacturer specific: 7Fh / FF
         // Manufacturer specific: 7Fh / FF
         case 0x7f:
         case 0xff:
             return "Manufacturer specific";
             break;
         default:
             return "Unknown (VIF=0x" . dechex($vif & 0x7f) . ")";
             break;
     }
     return "";
 }