//----------------------------------------------------- // Packet parser //----------------------------------------------------- //Port to which the packet was received for LoRaWAN servers (in other cases, you must specify 10) //bytes - Data buffer function Decode (fPort, bytes, variables) { var result = { status_decode: false, raw: bytes }; if( fPort === 10 ) { var offset = 0; setpowerInformation(bytes,offset,result); offset++; setProtocolInformation(bytes,offset,result); offset++; if( result.is_sn ) { result.sn = toUInt32LE(bytes,offset); offset += 4; } if( result.is_payload_size ) { result.payload_size = toUInt16LE(bytes,offset); offset += 2; } delete result.is_sn; delete result.is_payload_size; var ts = new Date(); //result.server_isotime = ts.toISOString(); //result.server_unixtime = Math.floor(ts.getTime()/1000); parseFrames(bytes,offset,result); if( !!result.error == false) result.status_decode = true; } return result; } //----------------------------------------------------- // Frame type parser //----------------------------------------------------- function parseFrames(buf,offset,obj) { if( buf[offset] === undefined || buf[offset+1] === undefined ) return; var frameHeader = buf[offset] | ( buf[ offset+1 ] << 8 ); var MASK_TYPE_FRAME = 0x0fff; //0b0000111111111111 var MASK_REASON_FRAME = 0xf000; //0b1111000000000000 var typeFrame = ( frameHeader & MASK_TYPE_FRAME ) >> 0; var reasonFrame = ( frameHeader & MASK_REASON_FRAME ) >> 12; offset +=2; if(obj.frames === undefined) obj.frames = []; if ( typeFrame == 0x00 ) parseFramesDeviceInfo(buf,offset,obj,reasonFrame); else if ( typeFrame == 0x16 ) parseFramesMBUS(buf,offset,obj,reasonFrame); else unknownFrame(obj,typeFrame,offset-2); } //----------------------------------------------------- // Frame parsers //----------------------------------------------------- function unknownFrame(obj,type,offset) { obj.error = 'unknown_frame'; obj.error_debug_info = 'type='+type+'|offset='+offset; } function parseFramesMBUS(buf,offset,obj,reason) { var frame = {}; frame.type = 'MBUS'; if( reason == 0x00 ) frame.reason = 'regular'; else if( reason == 0x01 ) frame.reason = 'alarm'; else frame.reason = 'unknown'; frame.frame_unixtime = toUInt32LE(buf,offset); frame.frame_isotime = new Date(frame.frame_unixtime*1000).toISOString(); offset += 4; var rsp_ud = buf[offset]; offset++; var sn = toHex(buf,offset,4); offset += 4; if( sn < 0x00000000 || sn > 0x99999999 ) sn = 'unknown'; var medium = buf[offset]; offset++; var MASK_STATUS = 0x03; //0b00000011 var status = ( buf[offset] & MASK_STATUS ) >> 0; var textStatus = 'unknown'; if( status === 0 ) textStatus = 'no_error'; else if( status === 1 ) textStatus = 'application_buse'; else if( status === 2 ) textStatus = 'any_application_error'; offset++; frame.medium = getTextMediumMBUS(medium); frame.status = textStatus; frame.meter_serial_number = sn; var dif_raw = buf[offset]; frame.dif = parseDif(dif_raw); if(frame.dif.type === undefined ) { frame.error = 'unknown_dif_in_frame_mbus'; frame.error_debug_info = 'type='+frame.type+'|offset='+offset; } else if( frame.dif.type ==='selection_readout' || frame.dif.type ==='veriable_length' || frame.dif.type ==='special_function' ) { frame.error = 'unsupported_dif_in_frame_mbus'; frame.error_debug_info = 'type='+frame.type+'|offset='+offset+'|dif_type='+frame.dif.type; } else { offset++; if( frame.dif.extension_bit === 1 ) setDife(buf,offset,frame); if( frame.dife_list && frame.dife_list.length > 0 ) offset += frame.dife_list.length; var vif_raw = buf[offset]; frame.vif = parseVif(vif_raw); offset++; if( frame.vif.value === 0xfd || frame.vif.value === 0xfb ) { frame.vif.value = buf[offset]; offset++; //if(frame.vif.value === 0xfd ) frame.vif.data=findVife( frame.vif.value+256 ); //if(frame.vif.value === 0xfb ) frame.vif.data=findVife( frame.vif.value+512 ); } else if( frame.vif.value === 0x7c ) { frame.error = 'unsupported_vif_in_frame_mbus'; frame.error_debug_info = 'type='+frame.type+'|offset='+(offset-1)+'|vif_type=plain_text'; } else if( frame.vif.value === 0x7f ) { frame.error = 'unsupported_vif_in_frame_mbus'; frame.error_debug_info = 'type='+frame.type+'|offset='+(offset-1)+'|vif_type=manufacturer_specific_coding'; } else { frame.vif.data = findVife( frame.vif.value ); } if(frame.vif.extension_bit === 1 && frame.error === undefined) { setVife(buf,offset,frame,vif_raw); if( frame.countByteVife !== undefined ) offset += frame.countByteVife; } if( frame.vife_list && frame.vife_list.length > 0 ) { frame.units = frame.vife_list[frame.vife_list.length-1].data; } else { frame.units = frame.vif.data; } if( !isNaN(offset) && frame.error === undefined ) { frame.measurement = {}; if(frame.dif.type == 'no_data') { frame.measurement.value_raw = 'no_data'; } else if ( frame.dif.countByte ) { frame.measurement.raw = buf.slice(offset,offset+frame.dif.countByte); offset+=frame.dif.countByte; if(frame.dif.type === 'int') { frame.measurement.value_raw = toIntLE (frame.measurement.raw, 0, frame.dif.countByte); } else if(frame.dif.type === 'bcd') { frame.measurement.value_raw = toBcdLE(frame.measurement.raw); } else if(frame.dif.type === 'real') { frame.measurement.value_raw = to32Real(frame.measurement.raw) } else { frame.error = 'error_parse_frame_mbus'; frame.error_debug_info = 'type='+frame.type+'|offset='+(offset)+'|unknown_type_data'; } if( frame.error === undefined && frame.units !== undefined ) { // frame.units frame.measurement.value = frame.measurement.value_raw * frame.units[1]; frame.measurement.desc = frame.units[3]; frame.measurement.unit = frame.units[2]; frame.measurement.dataType = frame.dif.function_field_desc; } } else { frame.error = 'error_parse_frame_mbus'; frame.error_debug_info = 'type='+frame.type+'|offset='+(offset)+''; } } } obj.frames.push(frame); if( obj.error === undefined ) parseFrames(buf,offset,obj); } function parseFramesDeviceInfo(buf,offset,obj,reason) { var frame = {}; frame.type = 'device_info'; if( reason == 0x00 ) frame.reason = 'boot'; else if( reason == 0x01 ) frame.reason = 'result_request'; else frame.reason = 'unknown'; frame.frame_unixtime = toUInt32LE(buf,offset); frame.frame_isotime = new Date(frame.frame_unixtime*1000).toISOString(); offset += 4; frame.model_id = toUInt16LE(buf, offset); frame.model_name = getModelNameById(frame.model_id); offset += 2; setDeviceFirmwareVersion(buf[offset],frame); offset++; obj.frames.push(frame); parseFrames(buf,offset,obj); } //----------------------------------------------------- // Converters //----------------------------------------------------- function hexToBuffer( hex ) { var buffer=[]; for ( var i = 0; i < hex.length - 1; i = i + 2 ) { var item = hex.substring( i, i + 2 ); var value = parseInt(item,16); if(isNaN(value)) return false; buffer.push( value ); } return buffer; } function toInt8 (buf, offset) { offset = offset >>> 0; if (!(buf[offset] & 0x80)) return (buf[offset]); return ((0xff - buf[offset] + 1) * -1); } function to32Real(bytes) { var bits = (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | (bytes[3]); var sign = ((bits >>> 31) == 0) ? 1.0 : -1.0; var e = ((bits >>> 23) & 0xff); var m = (e == 0) ? (bits & 0x7fffff) << 1 : (bits & 0x7fffff) | 0x800000; var f = sign * m * Math.pow(2, e - 150); return f; } function toUInt8 (buf, offset) { offset = offset >>> 0; return (buf[offset]); } function toMac(arr) { var res = ''; for ( var i = 0; i>> 0; return buf[offset] | ( buf[offset + 1] << 8 ); } function toInt16LE (buf, offset) { offset = offset >>> 0; var val = buf[offset] | (buf[offset + 1] << 8); return (val & 0x8000) ? val | 0xFFFF0000 : val; } function toUInt32LE (buf, offset) { offset = offset >>> 0; return ((buf[offset]) | (buf[offset + 1] << 8) | (buf[offset + 2] << 16)) + (buf[offset + 3] * 0x1000000); } function toBcdLE (buf) { //v_2 var MASK_1 = 0xf0; //0b11110000 var MASK_2 = 0x0f; //0b00001111 var z = 0; var res = 0; for( var i = 0; i < buf.length; i++ ) { var t1 = ( buf[i] & MASK_1 ) >> 4; var t2 = ( buf[i] & MASK_2 ) >> 0; res += t2*Math.pow(10,z); z++; res += t1*Math.pow(10,z); z++; } return res; } function toIntLE (buf, offset, length) { offset = offset >>> 0; length = length >>> 0; var result = buf[offset]; var i = 0; var mul = 1; while ( ++i < length && (mul *= 0x100) ) { var byte = buf[offset + i]; result += byte * mul; } mul *= 0x80; if (result >= mul) { result -= Math.pow(2, 8 * length); } return result; } function toASCII(buf,offset,countByte) { offset = offset >>> 0; countByte = countByte >>> 0; var result = ''; for (var i = offset; i < (offset+countByte); i++ ) { result+=String.fromCharCode(buf[i]); } return result; } function toHex(buf,offset,countByte) { offset = offset >>> 0; countByte = countByte >>> 0; var result = ''; for (var i = offset; i < (offset+countByte); i++ ) { var byte = buf[i].toString(16); if( byte.length == 1 ) byte = '0'+byte; result = byte + result ; } return result; } //----------------------------------------------------- // Auxiliaries Functions //----------------------------------------------------- function setpowerInformation(buf,offset,obj) { var MASK_TYPE_POWER = 0x01; //0b00000001 var MASK_BATTERY_CHARGE = 0xfe; //0b11111110 var type_power = ( buf[offset] & MASK_TYPE_POWER ) >> 0; if( type_power === 0 ) { obj.type_power = 'battery'; } else { obj.type_power = 'external'; } var charge = ( buf[offset] & MASK_BATTERY_CHARGE ) >> 1; if( charge >= 0 ) { obj.battery_pct = charge; } } function setProtocolInformation(buf,offset,obj) { var MASK_SI_SN = 0x01; //0b00000001 var MASK_VERSION_W_PROTOCOL = 0x0e; //0b00001110 var MASK_IS_PAYLOAD_SIZE = 0x10; //0b00010000 var MASK_RFU = 0xe0; //0b11100000 var isSN = ( buf[offset] & MASK_SI_SN ) >> 0; var versionWProtocol = ( buf[offset] & MASK_VERSION_W_PROTOCOL ) >> 1; var isPayloadSize = ( buf[offset] & MASK_IS_PAYLOAD_SIZE ) >> 4; var rfu = ( buf[offset] & MASK_RFU ) >> 5; obj.is_sn = !!isSN; obj.version_protocol = versionWProtocol; obj.is_payload_size = !!isPayloadSize; // obj.rfu = rfu; } function setDeviceFirmwareVersion(byte,obj) { var MASK_MAJOR = 0x0f; //0b00001111 var MASK_MINOR = 0xf0; //0b11110000 var major = ( byte & MASK_MAJOR ) >> 0; var minor = ( byte & MASK_MINOR ) >> 4; obj.version = major+'.'+minor; } function getNameModbusFunction(id) { if( id == 0x00 ) return 'read_coil_status'; else if( id == 0x01 ) return 'read_discrete_inputs'; else if( id == 0x02 ) return 'read_hlding_registers'; else if( id == 0x03 ) return 'input_registers'; else return 'unknown'; } function getModelNameById(id) { id = parseInt(id); if( id === 1 ) return 'Airbit light controller'; else if( id === 200 ) return 'IXOCAT-LW-FULL'; else if( id === 201 ) return 'IXOCAT-LW-LIGHT'; else if( id === 3 ) return 'Betar LoRaWAN water meter LC'; else if( id === 4 ) return 'Betar Nb-IoT water meter LC'; else if( id === 500 ) return 'IXOCAT-NB-FULL'; else if( id === 501 ) return 'IXOCAT-NB-LIGHT'; else if( id === 7 ) return 'ERTX-L01'; else if( id === 8 ) return 'Construtag'; else if( id === 9 ) return 'MTBO-01-Nb'; else if( id === 10 ) return 'TaigaBikeTracker'; else if( id === 11 ) return 'MTBO-01-2G'; else if( id === 12 ) return 'SST_GAS_radio_module'; else if( id === 13 ) return 'NbIoT Button'; else if( id === 14 ) return 'МКРС-02'; else if( id === 15 ) return 'BS controller'; else if( id === 16 ) return 'Airbit light controller NbIoT'; else if( id === 17 ) return 'IoT node'; else if( id === 18 ) return 'NIS_METER'; else if( id === 19 ) return 'RoadsignTracker-LW-FULL'; else if( id === 21 ) return 'Stels Smoke Sensor'; else if( id === 22 ) return 'Betar LoRaWAN water meter HALL'; else if( id === 23 ) return 'Betar Nb-IoT water meter HALL'; else if( id === 24 ) return 'NodeG'; else if( id === 25 ) return 'TaigaTracker LoRaWAN'; else if( id === 26 ) return 'TaigaTracker Nb-IoT'; else if( id === 27 ) return 'TaigaBeacon'; else if( id === 28 ) return 'ERTX-ODK-2CH'; else if( id === 29 ) return 'ERTX crypto kit'; else if( id === 30 ) return 'TaigaPersonalTracker LW'; else if( id === 31 ) return 'TaigaPersonalTracker NB'; else if( id === 32 ) return 'TaigaPersonalTracker 2G'; else if( id === 33 ) return 'TaigaNode Lw'; else if( id === 34 ) return 'TaigaNode Nb'; else if( id === 35 ) return 'TaigaTracker2G'; else if( id === 36 ) return 'AirbitSensorHub-LW'; else if( id === 37 ) return 'AuroraNodeODK'; else if( id === 38 ) return 'TaigaBigTracker'; else if( id === 39 ) return 'NhrsPersonalTracker'; else if( id === 40 ) return 'WasteSensor-UKS'; else if( id === 41 ) return 'TaigaBikeTrackerE'; else if( id === 42 ) return 'ClickButton'; else if( id === 43 ) return 'FannaConcentrator'; else if( id === 44 ) return 'MyLogger'; else if( id === 45 ) return 'TaigaCartTracker'; else if( id === 46 ) return 'NtmPulseNB'; else if( id === 47 ) return 'SoftControl-Pass'; else if( id === 48 ) return 'TempButton'; else if( id === 49 ) return 'Uveos'; else if( id === 50 ) return 'McsmPulseNB'; else if( id === 51 ) return 'FannaConcentrator IN PWR'; else if( id === 52 ) return 'AuroraNodeOdkBoard'; else if( id === 53 ) return 'Siltrack V1 EXT ANT'; else if( id === 54 ) return 'RaceAnalyse'; else if( id === 55 ) return 'MaximaContainerTracker'; else if( id === 56 ) return 'FannaEframe'; else if( id === 57 ) return 'MaximaWasteSensorV2'; else if( id === 58 ) return 'Module SGMB-USPD-NB-1'; else if( id === 59 ) return 'AuroraNodeLTE'; else if( id === 60 ) return 'AuroraNodeNB'; else if( id === 61 ) return 'AuroraNodeETH'; else if( id === 62 ) return 'TaigaPulseCounterNb'; else if( id === 63 ) return 'FannaAnchor'; else if( id === 64 ) return 'AuroraNodeExtBoards'; else if( id === 65 ) return 'TaigaPersonalTracker LW_without GNSS'; else if( id === 66 ) return 'TaigaPersonalTracker NB_without GNSS'; else if( id === 67 ) return 'AuroraNodeGTS'; else if( id === 68 ) return 'TetronTrackerLight'; else if( id === 69 ) return 'SGMB-NB-2G'; else if( id === 70 ) return 'TaigaPulseCounterLW'; else if( id === 71 ) return 'AnalogPCBBoard'; else if( id === 75 ) return 'ErtxTermologgerNb'; else return 'unknown'; } function getTextMediumMBUS(code) { if( code === 0x00 ) return 'Other'; else if( code === 0x01 ) return 'Oil'; else if( code === 0x02 ) return 'Electricity'; else if( code === 0x03 ) return 'Gas'; else if( code === 0x04 ) return 'Heat (volume measured at return temperature: outlet)'; else if( code === 0x05 ) return 'Steam'; else if( code === 0x06 ) return 'Hot Water'; else if( code === 0x07 ) return 'Water'; else if( code === 0x08 ) return 'Heat Cost Allocator.'; else if( code === 0x09 ) return 'Compressed Air'; else if( code === 0x0A ) return 'Cooling load meter (volume measured at return temperature: outlet)'; else if( code === 0x0B ) return 'Cooling load meter (volume measured at flow temperature: inlet)'; else if( code === 0x0C ) return 'Heat (volume measured at flow temperature: inlet)'; else if( code === 0x0D ) return 'Heat / Cooling load meter'; else if( code === 0x0E ) return 'Bus / System'; else if( code === 0x0F ) return 'Unknown Medium'; else if( code >= 0x10 && code <= 0x15 ) return 'Reserved'; else if( code === 0x16 ) return 'Cold Water'; else if( code === 0x17 ) return 'Dual Water'; else if( code === 0x18 ) return 'Pressure'; else if( code === 0x19 ) return 'A/D Converter'; else if( code >= 0x20 && code <= 0xFF ) return 'Reserved'; else return 'unknown'; } function getTextFuncFieldDif(val) { if( 0x00 === val ) return 'instantaneous_value'; //0b00 else if( 0x02 === val ) return 'minimum_value'; //0b10 else if( 0x01 === val ) return 'maximum_value'; //0b01 else if( 0x03 === val ) return 'value_during_error_state'; //0b11 return undefined; } function parseVif( vif ) { var result = { raw: vif }; var MASK_UNIT = 0x7f; //0b01111111 var MASK_EXTENSION_BIT = 0x80; //0b10000000 var unit = ( vif & MASK_UNIT ) >> 0; var extensionBit = ( vif & MASK_EXTENSION_BIT ) >> 7; result.extension_bit = extensionBit; result.value = unit; return result; } function parseDif( dif ) { var result = { raw: dif }; var MASK_DATA_FIELD = 0x0f; //0b00001111 var MASK_FUNCTION_FIELD = 0x30; //0b00110000 var MASK_LSB_STORAGE_NUMBER = 0x40; //0b01000000 var MASK_EXTENSION_BIT = 0x80; //0b10000000 var dataField = ( dif & MASK_DATA_FIELD ) >> 0; var functionField = ( dif & MASK_FUNCTION_FIELD ) >> 4; var lsbStorageNumb = ( dif & MASK_LSB_STORAGE_NUMBER ) >> 6; var extensionBit = ( dif & MASK_EXTENSION_BIT ) >> 7; result.extension_bit = extensionBit; result.lsb_storage_number = lsbStorageNumb; result.function_field = functionField; result.function_field_desc = getTextFuncFieldDif( result.function_field ); if( dataField === 0x00 ) //0b0000 { result.type = 'no_data'; result.countByte = 0; } else if( dataField === 0x01 ) //0b0001 { result.type = 'int'; result.countByte = 1; } else if( dataField === 0x02 ) //0b0010 { result.type = 'int'; result.countByte = 2; } else if( dataField === 0x03 ) //0b0011 { result.type = 'int'; result.countByte = 3; } else if( dataField === 0x04 ) //0b0100 { result.type = 'int'; result.countByte = 4; } else if( dataField === 0x05 ) //0b0101 { result.type = 'real'; result.countByte = 4; } else if( dataField === 0x06 ) //0b0110 { result.type = 'int'; result.countByte = 6; } else if( dataField === 0x07 ) //0b0111 { result.type = 'int'; result.countByte = 8; } else if( dataField === 0x08 ) //0b1000 { result.type = 'selection_readout'; result.countByte = undefined; } else if( dataField === 0x09 ) //0b1001 { result.type = 'bcd'; result.countByte = 1; } else if( dataField === 0x0a ) //0b1010 { result.type = 'bcd'; result.countByte = 2; } else if( dataField === 0x0b ) //0b1011 { result.type = 'bcd'; result.countByte = 3; } else if( dataField === 0x0c ) //0b1100 { result.type = 'bcd'; result.countByte = 4; } else if( dataField === 0x0d ) //0b1101 { result.type = 'veriable_length'; result.countByte = undefined; } else if( dataField === 0x0e ) //0b1110 { result.type = 'bcd'; result.countByte = 12; } else if( dataField === 0x0f ) //0b1111 { result.type = 'special_function'; result.countByte = undefined; } return result; } function findVife(val) { for(var key in mbus_variable_vif_table) { var vif = mbus_variable_vif_table[key]; if(val === vif[0]) return vif; } return [val,1.0e0,'','unknown']; } function setVife(buf,offset,frame,oldVif) { if( frame.vife_list === undefined ) frame.vife_list = []; if( frame.countByteVife === undefined ) frame.countByteVife = 0; frame.countByteVife++; var vif = { raw: buf[offset] }; var MASK_UNIT = 0x7f; //0b01111111 var MASK_EXTENSION_BIT = 0x80; //0b10000000 vif.value = ( buf[offset] & MASK_UNIT ) >> 0; vif.extension_bit = ( buf[offset] & MASK_EXTENSION_BIT ) >> 7; if( vif.value === 0xfd || vif.value === 0xfb ) { offset++; frame.countByteVife++; vif.value = buf[offset]; //if(vif.value === 0xfd ) vif.data=findVife( vif.value+256 ); //if(vif.value === 0xfb ) vif.data=findVife( vif.value+512 ); } else { if( oldVif === 0xfd ) vif.data=findVife( vif.value+256 ); else if( oldVif === 0xfb ) vif.data=findVife( vif.value+512 ); else vif.data = findVife( vif.value ) } frame.vife_list.push(vif); if( frame.vif.value === 0x7c ) { frame.error = 'unsupported_vif_in_frame_mbus'; frame.error_debug_info = 'type='+frame.type+'|offset='+(offset-1)+'|vif_type=plain_text'; } else if( frame.vif.value === 0x7f ) { frame.error = 'unsupported_vif_in_frame_mbus'; frame.error_debug_info = 'type='+frame.type+'|offset='+(offset-1)+'|vif_type=manufacturer_specific_coding'; } if( frame.error === undefined && vif.extension_bit === 1 ) { offset++; setVife(buf,offset,frame,vif.raw); } } function setDife(buf,offset,frame) { if( frame.dife_list === undefined ) frame.dife_list = []; var dife = {}; var MASK_STORAGE_NUMBER = 0x0f; //0b00001111 var MASK_TARIF = 0x30; //0b00110000 var MASK_UNIT = 0x40; //0b01000000 var MASK_EXTENSION_BIT = 0x80; //0b10000000 var storageNumber = ( buf[offset] & MASK_STORAGE_NUMBER ) >> 0; var tarif = ( buf[offset] & MASK_TARIF ) >> 4; var unit = ( buf[offset] & MASK_UNIT ) >> 6; var extensionBit = ( buf[offset] & MASK_EXTENSION_BIT ) >> 7; dife.storage_number = storageNumber; dife.tarif = tarif; dife.unit = unit; dife.extensionBit = extensionBit; frame.dife_list.push(dife); if( dife.extensionBit === 1 ) { offset++; setDife(buf,offset,frame); } } //----------------------------------------------------- // A table of VIF values for the analysis of mbus frames //----------------------------------------------------- var mbus_variable_vif_table = [ /* Primary VIFs (main table), range 0x00 - 0xFF */ /* E000 0nnn energy Wh (0.001Wh to 10000Wh) */ [0x00, 1.0e-3, "Wh", "energy"], [0x01, 1.0e-2, "Wh", "energy"], [0x02, 1.0e-1, "Wh", "energy"], [0x03, 1.0e0, "Wh", "energy"], [0x04, 1.0e1, "Wh", "energy"], [0x05, 1.0e2, "Wh", "energy"], [0x06, 1.0e3, "Wh", "energy"], [0x07, 1.0e4, "Wh", "energy"], /* E000 1nnn energy J (0.001kJ to 10000kJ) */ [0x08, 1.0e0, "J", "energy"], [0x09, 1.0e1, "J", "energy"], [0x0A, 1.0e2, "J", "energy"], [0x0B, 1.0e3, "J", "energy"], [0x0C, 1.0e4, "J", "energy"], [0x0D, 1.0e5, "J", "energy"], [0x0E, 1.0e6, "J", "energy"], [0x0F, 1.0e7, "J", "energy"], /* E001 0nnn volume m^3 (0.001l to 10000l) */ [0x10, 1.0e-6, "m^3", "volume"], [0x11, 1.0e-5, "m^3", "volume"], [0x12, 1.0e-4, "m^3", "volume"], [0x13, 1.0e-3, "m^3", "volume"], [0x14, 1.0e-2, "m^3", "volume"], [0x15, 1.0e-1, "m^3", "volume"], [0x16, 1.0e0, "m^3", "volume"], [0x17, 1.0e1, "m^3", "volume"], /* E001 1nnn mass kg (0.001kg to 10000kg) */ [0x18, 1.0e-3, "kg", "mass"], [0x19, 1.0e-2, "kg", "mass"], [0x1A, 1.0e-1, "kg", "mass"], [0x1B, 1.0e0, "kg", "mass"], [0x1C, 1.0e1, "kg", "mass"], [0x1D, 1.0e2, "kg", "mass"], [0x1E, 1.0e3, "kg", "mass"], [0x1F, 1.0e4, "kg", "mass"], /* E010 00nn On Time s */ [0x20, 1.0, "s", "on_time"], /* seconds */ [0x21, 60.0, "s", "on_time"], /* minutes */ [0x22, 3600.0, "s", "on_time"], /* hours */ [0x23, 86400.0, "s", "on_time"], /* days */ /* E010 01nn Operating Time s */ [0x24, 1.0, "s", "operating_time"], /* seconds */ [0x25, 60.0, "s", "operating_time"], /* minutes */ [0x26, 3600.0, "s", "operating_time"], /* hours */ [0x27, 86400.0, "s", "operating_time"], /* days */ /* E010 1nnn power W (0.001W to 10000W) */ [0x28, 1.0e-3, "W", "power"], [0x29, 1.0e-2, "W", "power"], [0x2A, 1.0e-1, "W", "power"], [0x2B, 1.0e0, "W", "power"], [0x2C, 1.0e1, "W", "power"], [0x2D, 1.0e2, "W", "power"], [0x2E, 1.0e3, "W", "power"], [0x2F, 1.0e4, "W", "power"], /* E011 0nnn power J/h (0.001kJ/h to 10000kJ/h) */ [0x30, 1.0e0, "J/h", "power"], [0x31, 1.0e1, "J/h", "power"], [0x32, 1.0e2, "J/h", "power"], [0x33, 1.0e3, "J/h", "power"], [0x34, 1.0e4, "J/h", "power"], [0x35, 1.0e5, "J/h", "power"], [0x36, 1.0e6, "J/h", "power"], [0x37, 1.0e7, "J/h", "power"], /* E011 1nnn volume Flow m3/h (0.001l/h to 10000l/h) */ [0x38, 1.0e-6, "m^3/h", "volume_flow"], [0x39, 1.0e-5, "m^3/h", "volume_flow"], [0x3A, 1.0e-4, "m^3/h", "volume_flow"], [0x3B, 1.0e-3, "m^3/h", "volume_flow"], [0x3C, 1.0e-2, "m^3/h", "volume_flow"], [0x3D, 1.0e-1, "m^3/h", "volume_flow"], [0x3E, 1.0e0, "m^3/h", "volume_flow"], [0x3F, 1.0e1, "m^3/h", "volume_flow"], /* E100 0nnn volume Flow ext. m^3/min (0.0001l/min to 1000l/min) */ [0x40, 1.0e-7, "m^3/min", "volume_flow"], [0x41, 1.0e-6, "m^3/min", "volume_flow"], [0x42, 1.0e-5, "m^3/min", "volume_flow"], [0x43, 1.0e-4, "m^3/min", "volume_flow"], [0x44, 1.0e-3, "m^3/min", "volume_flow"], [0x45, 1.0e-2, "m^3/min", "volume_flow"], [0x46, 1.0e-1, "m^3/min", "volume_flow"], [0x47, 1.0e0, "m^3/min", "volume_flow"], /* E100 1nnn volume Flow ext. m^3/s (0.001ml/s to 10000ml/s) */ [0x48, 1.0e-9, "m^3/s", "volume_flow"], [0x49, 1.0e-8, "m^3/s", "volume_flow"], [0x4A, 1.0e-7, "m^3/s", "volume_flow"], [0x4B, 1.0e-6, "m^3/s", "volume_flow"], [0x4C, 1.0e-5, "m^3/s", "volume_flow"], [0x4D, 1.0e-4, "m^3/s", "volume_flow"], [0x4E, 1.0e-3, "m^3/s", "volume_flow"], [0x4F, 1.0e-2, "m^3/s", "volume_flow"], /* E101 0nnn mass_flow kg/h (0.001kg/h to 10000kg/h) */ [0x50, 1.0e-3, "kg/h", "mass_flow"], [0x51, 1.0e-2, "kg/h", "mass_flow"], [0x52, 1.0e-1, "kg/h", "mass_flow"], [0x53, 1.0e0, "kg/h", "mass_flow"], [0x54, 1.0e1, "kg/h", "mass_flow"], [0x55, 1.0e2, "kg/h", "mass_flow"], [0x56, 1.0e3, "kg/h", "mass_flow"], [0x57, 1.0e4, "kg/h", "mass_flow"], /* E101 10nn flow_temperature В°C (0.001В°C to 1В°C) */ [0x58, 1.0e-3, "°C", "flow_temperature"], [0x59, 1.0e-2, "°C", "flow_temperature"], [0x5A, 1.0e-1, "°C", "flow_temperature"], [0x5B, 1.0e0, "°C", "flow_temperature"], /* E101 11nn return_temperature В°C (0.001В°C to 1В°C) */ [0x5C, 1.0e-3, "°C", "return_temperature"], [0x5D, 1.0e-2, "°C", "return_temperature"], [0x5E, 1.0e-1, "°C", "return_temperature"], [0x5F, 1.0e0, "°C", "return_temperature"], /* E110 00nn temperature Difference K (mK to K) */ [0x60, 1.0e-3, "K", "temperature_difference"], [0x61, 1.0e-2, "K", "temperature_difference"], [0x62, 1.0e-1, "K", "temperature_difference"], [0x63, 1.0e0, "K", "temperature_difference"], /* E110 01nn External temperature В°C (0.001В°C to 1В°C) */ [0x64, 1.0e-3, "°C", "external_temperature"], [0x65, 1.0e-2, "°C", "external_temperature"], [0x66, 1.0e-1, "°C", "external_temperature"], [0x67, 1.0e0, "°C", "external_temperature"], /* E110 10nn Pressure bar (1mbar to 1000mbar) */ [0x68, 1.0e-3, "bar", "Pressure"], [0x69, 1.0e-2, "bar", "Pressure"], [0x6A, 1.0e-1, "bar", "Pressure"], [0x6B, 1.0e0, "bar", "Pressure"], /* E110 110n Time Point */ [0x6C, 1.0e0, "-", "time_point_date"], /* n = 0 date, data type G */ [0x6D, 1.0e0, "-", "time_point_date_time"], /* n = 1 time & date, data type F */ /* E110 1110 Units for H.C.A. dimensionless */ [0x6E, 1.0e0, "Units for H.C.A.", "H_C_A"], /* E110 1111 Reserved */ [0x6F, 0.0, "Reserved", "reserved"], /* E111 00nn averaging_duration s */ [0x70, 1.0, "s", "averaging_duration"], /* seconds */ [0x71, 60.0, "s", "averaging_duration"], /* minutes */ [0x72, 3600.0, "s", "averaging_duration"], /* hours */ [0x73, 86400.0, "s", "averaging_duration"], /* days */ /* E111 01nn Actuality Duration s */ [0x74, 1.0, "s", "averaging_duration"], /* seconds */ [0x75, 60.0, "s", "averaging_duration"], /* minutes */ [0x76, 3600.0, "s", "averaging_duration"], /* hours */ [0x77, 86400.0, "s", "averaging_duration"], /* days */ /* Fabrication No */ [0x78, 1.0, "", "fabrication_no"], /* E111 1001 (Enhanced) Identification */ [0x79, 1.0, "", "enhanced_identification"], /* E111 1010 Bus Address */ [0x7A, 1.0, "", "bus_address"], /* Any VIF: 7Eh */ [0x7E, 1.0, "", "any_vif"], /* manufacturer_specific: 7Fh */ [0x7F, 1.0, "", "manufacturer_specific"], /* Any VIF: 7Eh */ [0xFE, 1.0, "", "Any VIF"], /* manufacturer_specific: FFh */ [0xFF, 1.0, "", "manufacturer_specific"], //VIF = FD START // // /* Main VIFE-Code Extension table (following VIF=FDh for primary VIF) See 8.4.4 a, only some of them are here. Using range 0x100 - 0x1FF */ /* E000 00nn credit of 10nn-3 of the nominal local legal currency units */ [0x100, 1.0e-3, "Currency units", "credit"], [0x101, 1.0e-2, "Currency units", "credit"], [0x102, 1.0e-1, "Currency units", "credit"], [0x103, 1.0e0, "Currency units", "credit"], /* E000 01nn debit of 10nn-3 of the nominal local legal currency units */ [0x104, 1.0e-3, "Currency units", "debit"], [0x105, 1.0e-2, "Currency units", "debit"], [0x106, 1.0e-1, "Currency units", "debit"], [0x107, 1.0e0, "Currency units", "debit"], /* E000 1000 Access Number (transmission count) */ [0x108, 1.0e0, "", "access_number_transmission_count"], /* E000 1001 Medium (as in fixed header) */ [0x109, 1.0e0, "", "device_type"], /* E000 1010 Manufacturer (as in fixed header) */ [0x10A, 1.0e0, "", "manufacturer"], /* E000 1011 Parameter set identification */ [0x10B, 1.0e0, "", "parameter_set_identification"], /* E000 1100 Model / Version */ [0x10C, 1.0e0, "", "device_type"], /* E000 1101 Hardware version # */ [0x10D, 1.0e0, "", "hardware_version"], /* E000 1110 Firmware version # */ [0x10E, 1.0e0, "", "firmware_version"], /* E000 1111 Software version # */ [0x10F, 1.0e0, "", "software_version"], /* E001 0000 Customer location */ [0x110, 1.0e0, "", "customer_location"], /* E001 0001 Customer */ [0x111, 1.0e0, "", "customer"], /* E001 0010 Access Code User */ [0x112, 1.0e0, "", "access_code_user"], /* E001 0011 Access Code Operator */ [0x113, 1.0e0, "", "access_code_operator"], /* E001 0100 Access Code System Operator */ [0x114, 1.0e0, "", "access_code_system_operator"], /* E001 0101 Access Code Developer */ [0x115, 1.0e0, "", "access_code_developer"], /* E001 0110 Password */ [0x116, 1.0e0, "", "password"], /* E001 0111 Error flags (binary) */ [0x117, 1.0e0, "", "error_flags"], /* E001 1000 Error mask */ [0x118, 1.0e0, "", "error_mask"], /* E001 1001 Reserved */ [0x119, 1.0e0, "Reserved", "кeserved"], /* E001 1010 digital_output (binary) */ [0x11A, 1.0e0, "", "digital_output"], /* E001 1011 Digital Input (binary) */ [0x11B, 1.0e0, "", "digital_input"], /* E001 1100 Baudrate [Baud] */ [0x11C, 1.0e0, "Baud", "baudrate"], /* E001 1101 Response delay time [bittimes] */ [0x11D, 1.0e0, "Bittimes", "response_delay_time"], /* E001 1110 Retry */ [0x11E, 1.0e0, "", "retry"], /* E001 1111 Reserved */ [0x11F, 1.0e0, "Reserved", "reserved"], /* E010 0000 First storage # for cyclic storage */ [0x120, 1.0e0, "", "first_storage_for cyclic storage"], /* E010 0001 Last storage # for cyclic storage */ [0x121, 1.0e0, "", "last_storage_for_cyclic_storage"], /* E010 0010 Size of storage block */ [0x122, 1.0e0, "", "size_of_storage_block"], /* E010 0011 Reserved */ [0x123, 1.0e0, "Reserved", "reserved"], /* E010 01nn storage_interval [sec(s)..day(s)] */ [0x124, 1.0, "s", "storage_interval"], /* second(s) */ [0x125, 60.0, "s", "storage_interval"], /* minute(s) */ [0x126, 3600.0, "s", "storage_interval"], /* hour(s) */ [0x127, 86400.0, "s", "storage_interval"], /* day(s) */ [0x128, 2629743.83, "s", "storage_interval"], /* month(s) */ [0x129, 31556926.0, "s", "storage_interval"], /* year(s) */ /* E010 1010 Reserved */ [0x12A, 1.0e0, "Reserved", "reserved"], /* E010 1011 Reserved */ [0x12B, 1.0e0, "Reserved", "reserved"], /* E010 11nn duration_since_last_readout [sec(s)..day(s)] */ [0x12C, 1.0, "s", "duration_since_last_readout"], /* seconds */ [0x12D, 60.0, "s", "duration_since_last_readout"], /* minutes */ [0x12E, 3600.0, "s", "duration_since_last_readout"], /* hours */ [0x12F, 86400.0, "s", "duration_since_last_readout"], /* days */ /* E011 0000 Start (date/time) of tariff */ /* The information about usage of data type F (date and time) or data type G (date) can */ /* be derived from the datafield (0010b: type G / 0100: type F). */ [0x130, 1.0e0, "Reserved", "reserved"], /* ???? */ /* E011 00nn Duration of tariff (nn=01 ..11: min to days) */ [0x131, 60.0, "s", "storage_interval"], /* minute(s) */ [0x132, 3600.0, "s", "storage_interval"], /* hour(s) */ [0x133, 86400.0, "s", "storage_interval"], /* day(s) */ /* E011 01nn period_of_tariff [sec(s) to day(s)] */ [0x134, 1.0, "s", "period_of_tariff"], /* seconds */ [0x135, 60.0, "s", "period_of_tariff"], /* minutes */ [0x136, 3600.0, "s", "period_of_tariff"], /* hours */ [0x137, 86400.0, "s", "period_of_tariff"], /* days */ [0x138, 2629743.83, "s", "period_of_tariff"], /* month(s) */ [0x139, 31556926.0, "s", "period_of_tariff"], /* year(s) */ /* E011 1010 dimensionless / no VIF */ [0x13A, 1.0e0, "", "dimensionless"], /* E011 1011 Reserved */ [0x13B, 1.0e0, "Reserved", "reserved"], /* E011 11xx Reserved */ [0x13C, 1.0e0, "Reserved", "reserved"], [0x13D, 1.0e0, "Reserved", "reserved"], [0x13E, 1.0e0, "Reserved", "reserved"], [0x13F, 1.0e0, "Reserved", "reserved"], /* E100 nnnn Volts electrical units */ [0x140, 1.0e-9, "V", "voltage"], [0x141, 1.0e-8, "V", "voltage"], [0x142, 1.0e-7, "V", "voltage"], [0x143, 1.0e-6, "V", "voltage"], [0x144, 1.0e-5, "V", "voltage"], [0x145, 1.0e-4, "V", "voltage"], [0x146, 1.0e-3, "V", "voltage"], [0x147, 1.0e-2, "V", "voltage"], [0x148, 1.0e-1, "V", "voltage"], [0x149, 1.0e0, "V", "voltage"], [0x14A, 1.0e1, "V", "voltage"], [0x14B, 1.0e2, "V", "voltage"], [0x14C, 1.0e3, "V", "voltage"], [0x14D, 1.0e4, "V", "voltage"], [0x14E, 1.0e5, "V", "voltage"], [0x14F, 1.0e6, "V", "voltage"], /* E101 nnnn A */ [0x150, 1.0e-12, "A", "current"], [0x151, 1.0e-11, "A", "current"], [0x152, 1.0e-10, "A", "current"], [0x153, 1.0e-9, "A", "current"], [0x154, 1.0e-8, "A", "current"], [0x155, 1.0e-7, "A", "current"], [0x156, 1.0e-6, "A", "current"], [0x157, 1.0e-5, "A", "current"], [0x158, 1.0e-4, "A", "current"], [0x159, 1.0e-3, "A", "current"], [0x15A, 1.0e-2, "A", "current"], [0x15B, 1.0e-1, "A", "current"], [0x15C, 1.0e0, "A", "current"], [0x15D, 1.0e1, "A", "current"], [0x15E, 1.0e2, "A", "current"], [0x15F, 1.0e3, "A", "current"], /* E110 0000 Reset counter */ [0x160, 1.0e0, "", "reset_counter"], /* E110 0001 Cumulation counter */ [0x161, 1.0e0, "", "cumulation_counter"], /* E110 0010 Control signal */ [0x162, 1.0e0, "", "control_signal"], /* E110 0011 Day of week */ [0x163, 1.0e0, "", "day_of_week"], /* E110 0100 Week number */ [0x164, 1.0e0, "", "week_number"], /* E110 0101 Time point of day change */ [0x165, 1.0e0, "", "time_point_of_day_change"], /* E110 0110 State of parameter activation */ [0x166, 1.0e0, "", "state_of_parameter_activation"], /* E110 0111 Special supplier information */ [0x167, 1.0e0, "", "special_supplier_information"], /* E110 10pp duration_since_last_cumulation [hour(s)..years(s)] */ [0x168, 3600.0, "s", "duration_since_last_cumulation"], /* hours */ [0x169, 86400.0, "s", "duration_since_last_cumulation"], /* days */ [0x16A, 2629743.83, "s", "duration_since_last_cumulation"], /* month(s) */ [0x16B, 31556926.0, "s", "duration_since_last_cumulation"], /* year(s) */ /* E110 11pp operating_time battery [hour(s)..years(s)] */ [0x16C, 3600.0, "s", "operating_time battery"], /* hours */ [0x16D, 86400.0, "s", "operating_time battery"], /* days */ [0x16E, 2629743.83, "s", "operating_time battery"], /* month(s) */ [0x16F, 31556926.0, "s", "operating_time battery"], /* year(s) */ /* E111 0000 Date and time of battery change */ [0x170, 1.0e0, "", "date_and_time_of_battery_change"], /* E111 0001-1111 Reserved */ [0x171, 1.0e0, "Reserved", "reserved"], [0x172, 1.0e0, "Reserved", "reserved"], [0x173, 1.0e0, "Reserved", "reserved"], [0x174, 1.0e0, "Reserved", "reserved"], [0x175, 1.0e0, "Reserved", "reserved"], [0x176, 1.0e0, "Reserved", "reserved"], [0x177, 1.0e0, "Reserved", "reserved"], [0x178, 1.0e0, "Reserved", "reserved"], [0x179, 1.0e0, "Reserved", "reserved"], [0x17A, 1.0e0, "Reserved", "reserved"], [0x17B, 1.0e0, "Reserved", "reserved"], [0x17C, 1.0e0, "Reserved", "reserved"], [0x17D, 1.0e0, "Reserved", "reserved"], [0x17E, 1.0e0, "Reserved", "reserved"], [0x17F, 1.0e0, "Reserved", "reserved"], //VIF = FD END // // // // // // //VIF = FB START /* Alternate VIFE-Code Extension table (following VIF=0FBh for primary VIF) See 8.4.4 b, only some of them are here. Using range 0x200 - 0x2FF */ /* E000 000n energy 10(n-1) MWh 0.1MWh to 1MWh */ [0x200, 1.0e5, "Wh", "energy"], [0x201, 1.0e6, "Wh", "energy"], /* E000 001n Reserved */ [0x202, 1.0e0, "Reserved", "reserved"], [0x203, 1.0e0, "Reserved", "reserved"], /* E000 01nn Reserved */ [0x204, 1.0e0, "Reserved", "reserved"], [0x205, 1.0e0, "Reserved", "reserved"], [0x206, 1.0e0, "Reserved", "reserved"], [0x207, 1.0e0, "Reserved", "reserved"], /* E000 100n energy 10(n-1) GJ 0.1GJ to 1GJ */ [0x208, 1.0e8, "Reserved", "energy"], [0x209, 1.0e9, "Reserved", "energy"], /* E000 101n Reserved */ [0x20A, 1.0e0, "Reserved", "reserved"], [0x20B, 1.0e0, "Reserved", "reserved"], /* E000 11nn Reserved */ [0x20C, 1.0e0, "Reserved", "reserved"], [0x20D, 1.0e0, "Reserved", "reserved"], [0x20E, 1.0e0, "Reserved", "reserved"], [0x20F, 1.0e0, "Reserved", "reserved"], /* E001 000n volume 10(n+2) m3 100m3 to 1000m3 */ [0x210, 1.0e2, "m^3", "volume"], [0x211, 1.0e3, "m^3", "volume"], /* E001 001n Reserved */ [0x212, 1.0e0, "Reserved", "reserved"], [0x213, 1.0e0, "Reserved", "reserved"], /* E001 01nn Reserved */ [0x214, 1.0e0, "Reserved", "reserved"], [0x215, 1.0e0, "Reserved", "reserved"], [0x216, 1.0e0, "Reserved", "reserved"], [0x217, 1.0e0, "Reserved", "reserved"], /* E001 100n mass 10(n+2) t 100t to 1000t */ [0x218, 1.0e5, "kg", "mass"], [0x219, 1.0e6, "kg", "mass"], /* E001 1010 to E010 0000 Reserved */ [0x21A, 1.0e0, "Reserved", "reserved"], [0x21B, 1.0e0, "Reserved", "reserved"], [0x21C, 1.0e0, "Reserved", "reserved"], [0x21D, 1.0e0, "Reserved", "reserved"], [0x21E, 1.0e0, "Reserved", "reserved"], [0x21F, 1.0e0, "Reserved", "reserved"], [0x220, 1.0e0, "Reserved", "reserved"], /* E010 0001 volume 0,1 feet^3 */ [0x221, 1.0e-1, "feet^3", "volume"], /* E010 001n volume 0,1-1 american gallon */ [0x222, 1.0e-1, "American gallon", "volume"], [0x223, 1.0e-0, "American gallon", "volume"], /* E010 0100 volume_flow 0,001 american gallon/min */ [0x224, 1.0e-3, "American gallon/min", "volume_flow"], /* E010 0101 volume_flow 1 american gallon/min */ [0x225, 1.0e0, "American gallon/min", "volume_flow"], /* E010 0110 volume_flow 1 american gallon/h */ [0x226, 1.0e0, "American gallon/h", "volume_flow"], /* E010 0111 Reserved */ [0x227, 1.0e0, "Reserved", "reserved"], /* E010 100n power 10(n-1) MW 0.1MW to 1MW */ [0x228, 1.0e5, "W", "power"], [0x229, 1.0e6, "W", "power"], /* E010 101n Reserved */ [0x22A, 1.0e0, "Reserved", "reserved"], [0x22B, 1.0e0, "Reserved", "reserved"], /* E010 11nn Reserved */ [0x22C, 1.0e0, "Reserved", "reserved"], [0x22D, 1.0e0, "Reserved", "reserved"], [0x22E, 1.0e0, "Reserved", "reserved"], [0x22F, 1.0e0, "Reserved", "reserved"], /* E011 000n power 10(n-1) GJ/h 0.1GJ/h to 1GJ/h */ [0x230, 1.0e8, "J", "power"], [0x231, 1.0e9, "J", "power"], /* E011 0010 to E101 0111 Reserved */ [0x232, 1.0e0, "Reserved", "reserved"], [0x233, 1.0e0, "Reserved", "reserved"], [0x234, 1.0e0, "Reserved", "reserved"], [0x235, 1.0e0, "Reserved", "reserved"], [0x236, 1.0e0, "Reserved", "reserved"], [0x237, 1.0e0, "Reserved", "reserved"], [0x238, 1.0e0, "Reserved", "reserved"], [0x239, 1.0e0, "Reserved", "reserved"], [0x23A, 1.0e0, "Reserved", "reserved"], [0x23B, 1.0e0, "Reserved", "reserved"], [0x23C, 1.0e0, "Reserved", "reserved"], [0x23D, 1.0e0, "Reserved", "reserved"], [0x23E, 1.0e0, "Reserved", "reserved"], [0x23F, 1.0e0, "Reserved", "reserved"], [0x240, 1.0e0, "Reserved", "reserved"], [0x241, 1.0e0, "Reserved", "reserved"], [0x242, 1.0e0, "Reserved", "reserved"], [0x243, 1.0e0, "Reserved", "reserved"], [0x244, 1.0e0, "Reserved", "reserved"], [0x245, 1.0e0, "Reserved", "reserved"], [0x246, 1.0e0, "Reserved", "reserved"], [0x247, 1.0e0, "Reserved", "reserved"], [0x248, 1.0e0, "Reserved", "reserved"], [0x249, 1.0e0, "Reserved", "reserved"], [0x24A, 1.0e0, "Reserved", "reserved"], [0x24B, 1.0e0, "Reserved", "reserved"], [0x24C, 1.0e0, "Reserved", "reserved"], [0x24D, 1.0e0, "Reserved", "reserved"], [0x24E, 1.0e0, "Reserved", "reserved"], [0x24F, 1.0e0, "Reserved", "reserved"], [0x250, 1.0e0, "Reserved", "reserved"], [0x251, 1.0e0, "Reserved", "reserved"], [0x252, 1.0e0, "Reserved", "reserved"], [0x253, 1.0e0, "Reserved", "reserved"], [0x254, 1.0e0, "Reserved", "reserved"], [0x255, 1.0e0, "Reserved", "reserved"], [0x256, 1.0e0, "Reserved", "reserved"], [0x257, 1.0e0, "Reserved", "reserved"], /* E101 10nn flow_temperature 10(nn-3) В°F 0.001В°F to 1В°F */ [0x258, 1.0e-3, "В°F", "flow_temperature"], [0x259, 1.0e-2, "В°F", "flow_temperature"], [0x25A, 1.0e-1, "В°F", "flow_temperature"], [0x25B, 1.0e0, "В°F", "flow_temperature"], /* E101 11nn return_temperature 10(nn-3) В°F 0.001В°F to 1В°F */ [0x25C, 1.0e-3, "В°F", "return_temperature"], [0x25D, 1.0e-2, "В°F", "return_temperature"], [0x25E, 1.0e-1, "В°F", "return_temperature"], [0x25F, 1.0e0, "В°F", "return_temperature"], /* E110 00nn temperature Difference 10(nn-3) В°F 0.001В°F to 1В°F */ [0x260, 1.0e-3, "В°F", "temperature_difference"], [0x261, 1.0e-2, "В°F", "temperature_difference"], [0x262, 1.0e-1, "В°F", "temperature_difference"], [0x263, 1.0e0, "В°F", "temperature_difference"], /* E110 01nn External temperature 10(nn-3) В°F 0.001В°F to 1В°F */ [0x264, 1.0e-3, "В°F", "external_temperature"], [0x265, 1.0e-2, "В°F", "external_temperature"], [0x266, 1.0e-1, "В°F", "external_temperature"], [0x267, 1.0e0, "В°F", "external_temperature"], /* E110 1nnn Reserved */ [0x268, 1.0e0, "Reserved", "reserved"], [0x269, 1.0e0, "Reserved", "reserved"], [0x26A, 1.0e0, "Reserved", "reserved"], [0x26B, 1.0e0, "Reserved", "reserved"], [0x26C, 1.0e0, "Reserved", "reserved"], [0x26D, 1.0e0, "Reserved", "reserved"], [0x26E, 1.0e0, "Reserved", "reserved"], [0x26F, 1.0e0, "Reserved", "reserved"], /* E111 00nn cold_or_warm_temperature_limit 10(nn-3) В°F 0.001В°F to 1В°F */ [0x270, 1.0e-3, "В°F", "cold_or_warm_temperature_limit"], [0x271, 1.0e-2, "В°F", "cold_or_warm_temperature_limit"], [0x272, 1.0e-1, "В°F", "cold_or_warm_temperature_limit"], [0x273, 1.0e0, "В°F", "cold_or_warm_temperature_limit"], /* E111 01nn cold_or_warm_temperature_limit 10(nn-3) В°C 0.001В°C to 1В°C */ [0x274, 1.0e-3, "°C", "cold_or_warm_temperature_limit"], [0x275, 1.0e-2, "°C", "cold_or_warm_temperature_limit"], [0x276, 1.0e-1, "°C", "cold_or_warm_temperature_limit"], [0x277, 1.0e0, "°C", "cold_or_warm_temperature_limit"], /* E111 1nnn cumul. count max power В§ 10(nnn-3) W 0.001W to 10000W */ [0x278, 1.0e-3, "W", "cumul_count_max_power"], [0x279, 1.0e-3, "W", "cumul_count_max_power"], [0x27A, 1.0e-1, "W", "cumul_count_max_power"], [0x27B, 1.0e0, "W", "cumul_count_max_power"], [0x27C, 1.0e1, "W", "cumul_count_max_power"], [0x27D, 1.0e2, "W", "cumul_count_max_power"], [0x27E, 1.0e3, "W", "cumul_count_max_power"], [0x27F, 1.0e4, "W", "cumul_count_max_power"], //VIF = FB END /* End of array */ [0xFFFF, 0.0, "", ""] ]; /*************************************************** */ function decodeUplink(input) { let data = {}; let error = {}; let errors = []; let buffer = input.bytes; if(buffer !== false && buffer.length>0) { data = Decode(10,buffer); delete data.raw; if (data && data.error !== undefined){ error.error_type = data.error; delete data.error; error.debug_info = data.error_debug_info; delete data.error_debug_info; errors.push(error); } } return { data, warnings: [], errors : errors }; }