TTN Smart Sensor (Nexelec)

Sensor

Codec Description

Codec for Nexelec

Codec Preview

 function decodeUplink(input) { var tab_bin=[]; var output = 0; var data; stringHex = bytesString(input.bytes); var octetTypeProduit = parseInt(stringHex.substring(0,2),16); var octetTypeMessage = parseInt(stringHex.substring(2,4),16); function bytesString(input) { var bufferString=''; var decToString=''; for(var i=0; i=1023){return "Error"} if(octetTemperatureValue>=1022){return "Deconnected sensor"} if(octetTemperatureValue>=1021){return "Desactivated sensor"} else{return {"value":((octetTemperatureValue/10)-30), "unit":"°C" }} } function humidity(octetHumidityValue) { if(octetHumidityValue>=1023){return "Error"} if(octetHumidityValue>=1022){return "Deconnected sensor"} if(octetHumidityValue>=1021){return "Desactivated sensor"} else{return {"value":(octetHumidityValue/10), "unit" :"%RH"}} } function co2(octetCO2Value) { if(octetCO2Value>=16383){return "Error"} if(octetCO2Value>=16382){return "Deconnected sensor"} if(octetCO2Value>=16381){return "Desactivated sensor"} else{return {"value":octetCO2Value, "unit":"ppm"}}; } function covt(octetCOVTValue) { if(octetCOVTValue>=16383){return "Error"} if(octetCOVTValue>=16382){return "Deconnected sensor"} if(octetCOVTValue>=16381){return "Desactivated sensor"} else{return {"value":octetCOVTValue,"unit":"ug/m3"}}; } function luminosity(octetLuminosityValue) { if(octetLuminosityValue>=1023){return "Error"} if(octetLuminosityValue>=1022){return "Deconnected sensor"} if(octetLuminosityValue>=1021){return "Desactivated sensor"} else{return {"value":(octetLuminosityValue*5),"unit":"lux"}}; } function buttonPress(octetButtonValue) { if(octetButtonValue===0){return "Button not pressed"} else if(octetButtonValue===1){return "Button pressed"}; } function averageNoise(octetAverageNoise) { if(octetAverageNoise===127){return "Error"} if(octetAverageNoise>=126){return "Deconnected sensor"} if(octetAverageNoise>=125){return "Desactivated sensor"} else{return {"value":octetAverageNoise,"unit":"dB"}}; } function peakNoise(octetPeakNoise) { if(octetPeakNoise===127){return "Error"} if(octetPeakNoise>=126){return "Deconnected sensor"} if(octetPeakNoise>=125){return "Desactivated sensor"} else{return {"value":octetPeakNoise,"unit":"dB"}}; } function occupancyRate(octetOccupancyRate) { if(octetOccupancyRate===127){return "Error"} if(octetOccupancyRate>=126){return "Deconnected sensor"} if(octetOccupancyRate>=125){return "Desactivated sensor"} else{return {"value":octetOccupancyRate,"unit":"%"}}; } function iaqGlobalArgument(octetiaqGlobal) { const message_name =["Excellent","Reserved","Fair","Reserved","Bad","Reserved","Reserved","Error"] return message_name[octetiaqGlobal] } function iaqSourceArgument(octetiaqSource) { const message_name =["None","Reserved","Reserved","Reserved","Reserved","CO2","VOC","Reserved","Reserved","Reserved","Reserved","Reserved","Reserved","Reserved","Reserved","Error"] return message_name[octetiaqSource] } /////////////////////////////////////////////// // Product Status Message Function /////////////////////////////////////////////// function hwRevision(octetHWRevision) { switch(octetHWRevision){ case 0: return 0 break; case 1: return 1 break; } } function swRevision(octetSWRevision) { switch(octetSWRevision){ case 0: return 0 break; case 1: return 1 break; } } function powerSource(octetPowerSource) { const message_name =["Battery","External 5V","Reserved","Reserved"] return message_name[octetPowerSource] } function batteryVoltage(octetbatteryVoltage) { if(octetbatteryVoltage===1023){return "Error"} else if(octetbatteryVoltage === 1022){return "External power supply"} else{return {"value":(octetbatteryVoltage*5), "unit":"mV" }} } function batterieLevelArgument(octetBatteryLevel) { const message_name =["High","Medium","Low","Critical","External power supply"] return message_name[octetBatteryLevel] } function productHwStatusArgument(octetProductHwStatus) { const message_name =["Hardware working correctly","Hardware fault detected"] return message_name[octetProductHwStatus] } function sensorStatusArgument(octetSensorStatus) { const message_name =["Sensor Ok","Sensor default","Sensor not present","Sensor disabled","End-of-life sensor"] return message_name[octetSensorStatus] } function sdStatusArgument(octetSDStatus) { const message_name =["SD card OK","Fault: Cannot mount drive","Card missing","Functionality disabled","SD card at end of life"] return message_name[octetSDStatus] } function productActivationTimeCounter(octetTimeCounter) { if(octetTimeCounter===1023 ){return "Error"} else{return {"value":octetTimeCounter,"unit":"month"}}; } function lowBatterieThreshold(octetLowBatterie) { {return {"value":(octetLowBatterie*5)+2000,"unit":"mV"}}; } function antiTearArgument(octetSDStatus) { const message_name =["Product undetected","Product detected","Product just undetected","Product just detected"] return message_name[octetSDStatus] } ///////////////////////////////////////////////////// //Product Configuration Message Function //////////////////////////////////////////////////// function reconfigurationSource(octetReconfigurationSource) { const message_name =["NFC","Downlink","Product Start up","Network","GPS","Local"] return message_name[octetReconfigurationSource] } function reconfigurationState(octetReconfigurationState) { const message_name =["Total Succes","Partial Succes","Total fail","Reserved"] return message_name[octetReconfigurationState] } function period(octetPeriod) { return {"value":octetPeriod, "unit":"minutes"}; } function sensorActivation(octetSensorActivate) { if(octetSensorActivate===0){return "Sensor desactivated"} else if(octetSensorActivate===1){return "Sensor activated" }; } function sdActivation(octetSDActivate) { if(octetSDActivate===0){return "SD desactivated"} else if(octetSDActivate===1){return "SD activated"}; } function calibrationActivation(octetCalibrationActivate) { if(octetCalibrationActivate===0){return "Automatic calibration desactivated"} else if(octetCalibrationActivate===1){return "Automatic calibration activated"}; } function active(octetActive) { if(octetActive===0){return "Non-active"} else if(octetActive===1){return "Active "}; } function notificationByLEDandBuzzer(octetNotification) { if(octetNotification===0){return "CO2"} else if(octetNotification===1){return "IziAir"}; } function loraRegion(octetLoRaRegion) { const message_name =["Reserved","EU868","US915","Reserved","Reserved","Reserved","Reserved","Reserved","SF-RC1"] return message_name[octetLoRaRegion] } function deltaCO2(octetDeltaCO2) { if(octetDeltaCO2===255){return "Desactivated"} else{return {"value":(octetDeltaCO2*4),"unit":"ppm"}} } function deltaTemp(octetDeltaTemp) { if(octetDeltaTemp===127){return "Desactivated"} else{return {"value":(octetDeltaTemp*0.1),"unit":"°C"}} } function co2Threshold(octetCO2Threshold) { return {"value":octetCO2Threshold*5, "unit":"ppm"}; } function transmissionPeriodHistorical(octetPeriodHistorical) { if(octetPeriodHistorical===255){return "Erreur"} else{return {"value":(octetPeriodHistorical*10),"unit":"minute"}} } function pendingJoin(octetPending) { if(octetPending===0){return "No join request"} else if(octetPending===1){return "Programmed join request"}; } function nfcStatus(octetNfcStatus) { if(octetNfcStatus===0){return "Discoverable"} else if(octetNfcStatus===1){return " No Discoverable"}; } ////////////////////////////////////////////////////////////////////// ////// Hex to binary //////////////////////////////////////////////////////////////////// function hexToBinary(encoded) { var string_bin = ""; var string_bin_elements = ""; var i; var j; for (i = 0; i < encoded.length; i++) { string_bin_elements = encoded.charAt(i); string_bin_elements = parseInt(string_bin_elements, 16).toString(2); if (string_bin_elements.length < 4) { var nb_zeros = 4 - string_bin_elements.length; for (j = 0; j < nb_zeros; j++) { string_bin_elements = "0" + string_bin_elements; } } string_bin = string_bin + string_bin_elements; } return string_bin; } ////////////////////////////////////////////////////////////////////// ////// Product message decoding //////////////////////////////////////////////////////////////////// function periodicDataOutput(stringHex) { var data_temperature = (parseInt(stringHex.substring(4,8),16) >> 6) & 0x3FF; var data_humidity = (parseInt(stringHex.substring(6,9),16)) & 0x3FF; var data_co2 = (parseInt(stringHex.substring(9,13),16)>>2) & 0x3FFF; var data_covt = (parseInt(stringHex.substring(12,16),16)) & 0x3FFF; var data_luminosity = (parseInt(stringHex.substring(16,19),16) >> 2) & 0x3FF; var data_button_press = (parseInt(stringHex.substring(18,19),16)>>1) & 0x01; var data_avg_noise = (parseInt(stringHex.substring(18,21),16)>>2) & 0x7F; var data_peak_noise = (parseInt(stringHex.substring(20,23),16) >> 3) & 0x7F; var data_occupancy_rate = (parseInt(stringHex.substring(22,24),16)) & 0x7F; var data_izi_air_global = (parseInt(stringHex.substring(24,26),16) >> 5) & 0x07; var data_izi_air_src = (parseInt(stringHex.substring(24,26),16) >> 1) & 0x0F; var data_izi_air_co2 = (parseInt(stringHex.substring(25,27),16) >> 2) & 0x07; var data_izi_air_cov = (parseInt(stringHex.substring(26,28),16) >> 3) & 0x07; data = { "typeOfProduct": typeOfProduct(octetTypeProduit), "typeOfMessage": typeOfMessage(octetTypeMessage), "temperature": temperature(data_temperature), "humidity": humidity(data_humidity) , "co2": co2(data_co2), "covt": covt(data_covt), "luminosity": luminosity(data_luminosity), "buttonPress": buttonPress(data_button_press) , "averageNoise": averageNoise(data_avg_noise) , "peakNoise": peakNoise(data_peak_noise), "occupancyRate": occupancyRate(data_occupancy_rate), "iziairGlobal": iaqGlobalArgument(data_izi_air_global) , "iziairSrc": iaqSourceArgument(data_izi_air_src), "iziairCo2": iaqGlobalArgument(data_izi_air_co2), "iziairCov": iaqGlobalArgument(data_izi_air_cov), }; return data; } function historicalCO2DataOutput(stringHex) { var mesure = []; var debugmesure = []; var i = 0; var offset_octet = 0; var data_nombre_mesures = (parseInt(stringHex.substring(4,6),16)>>2)&0x3F; var data_time_between_measurement_min = ((parseInt(stringHex.substring(4,8),16)>>2)&0xFF); var data_repetition = (parseInt(stringHex.substring(7,9),16))&0x3F; var binary=hexToBinary(stringHex) for(i=0;i>2)&0x3F; var data_time_between_measurement_min = ((parseInt(stringHex.substring(4,8),16)>>2)&0xFF); var data_repetition = (parseInt(stringHex.substring(7,9),16))&0x3F; var binary=hexToBinary(stringHex) for(i=0;i>2)&0x3F; var data_time_between_measurement_min = ((parseInt(stringHex.substring(4,8),16)>>2)&0xFF); var data_repetition = (parseInt(stringHex.substring(7,9),16))&0x3F; var binary=hexToBinary(stringHex) for(i=0;i>6) & 0x07; var data_battery_voltage = (parseInt(stringHex.substring(8,11),16)) & 0x3FF; var data_battery_level = (parseInt(stringHex.substring(10,12),16) >> 1 ) & 0x07; var data_hw_status = (parseInt(stringHex.substring(10,12),16)) & 0x01; var data_hw_status_temperature = (parseInt(stringHex.substring(11,13),16)>>1) & 0x07; var data_hw_status_co2 = (parseInt(stringHex.substring(12,14),16)>>2) & 0x07; var data_hw_status_covt = (parseInt(stringHex.substring(13,15),16)>>3) & 0x07; var data_hw_status_pir = (parseInt(stringHex.substring(13,15),16)) & 0x07; var data_hw_status_microphone = (parseInt(stringHex.substring(15,16),16)>>1) & 0x07; var data_hw_status_luminosity = (parseInt(stringHex.substring(15,17),16)>>2) & 0x07; var data_hw_status_SD= (parseInt(stringHex.substring(16,18),16)>>3) & 0x07; var data_activation_time = (parseInt(stringHex.substring(16,20),16)>>1) & 0x3FF; var data_co2_last_manual_calibration_time = (parseInt(stringHex.substring(19,21),16)>>1); var data_low_threshold_batterie = (parseInt(stringHex.substring(22,24),16)) & 0xFF; var data_hw_status_anti_tear = (parseInt(stringHex.substring(24,25),16)>>2) & 0x3; data = { "typeOfProduct": typeOfProduct(octetTypeProduit), "typeOfMessage": typeOfMessage(octetTypeMessage), "hardwareVersion":data_hw_version, "softwareVersion":data_sw_version, "powerSource":powerSource(data_power_source), "batteryVoltage":batteryVoltage(data_battery_voltage), "batteryLevel":batterieLevelArgument(data_battery_level), "hardwareStatus":productHwStatusArgument(data_hw_status), "temperatureSensorStatus":sensorStatusArgument(data_hw_status_temperature), "co2SensorStatus":sensorStatusArgument(data_hw_status_co2), "covtSensorStatus":sensorStatusArgument(data_hw_status_covt), "pirSensorStatus":sensorStatusArgument(data_hw_status_pir), "microphoneStatus":sensorStatusArgument(data_hw_status_microphone), "luminositySensorStatus":sensorStatusArgument(data_hw_status_luminosity), "sdStatus":sdStatusArgument(data_hw_status_SD), "cumulativeProductActivationTime":productActivationTimeCounter(data_activation_time), "timeSinceLastManualCalibration": {"value":data_co2_last_manual_calibration_time,"unit":"days"}, "lowBatterieThreshold": lowBatterieThreshold(data_low_threshold_batterie), "antiTearSensorStatus": antiTearArgument(data_hw_status_anti_tear) }; return data; } function productConfigurationDataOutput(stringHex) { var data_config_source = (parseInt(stringHex.substring(4,5),16)>>1) & 0x07; var data_config_status = (parseInt(stringHex.substring(4,6),16)>>3) & 0x03; var data_periode_mesure = (parseInt(stringHex.substring(5,7),16)>>2) & 0x1F; var data_sensor_on_off_co2 = (parseInt(stringHex.substring(6,7),16)>>1) & 0x01; var data_sensor_on_off_cov = (parseInt(stringHex.substring(6,7),16))& 0x01; var data_sensor_on_off_pir = (parseInt(stringHex.substring(7,8),16)>>3)& 0x01; var data_sensor_on_off_microphone = (parseInt(stringHex.substring(7,8),16)>>2) & 0x01; var data_sd_storage_on_off = (parseInt(stringHex.substring(7,8),16)>>1) & 0x01; var data_co2_auto_calibration = (parseInt(stringHex.substring(7,8),16)) & 0x01; var data_co2_medium_level = (parseInt(stringHex.substring(8,11),16)>>2) & 0x3FF; var data_co2_high_level = (parseInt(stringHex.substring(10,13),16)) & 0x3FF; var data_led_on_off = (parseInt(stringHex.substring(13,14),16) >> 3) & 0x01; var data_led_orange_on_off = (parseInt(stringHex.substring(13,14),16)>>2) & 0x01; var data_buzzer_on_off = (parseInt(stringHex.substring(13,14),16)>>1) & 0x01; var data_buzzer_confirm_on_off = (parseInt(stringHex.substring(13,14),16)) & 0x01; var data_led_source = (parseInt(stringHex.substring(14,15),16)>>2) & 0x03; var data_button_on_off = (parseInt(stringHex.substring(14,15),16) >> 1) & 0x01; var data_lora_region = (parseInt(stringHex.substring(14,16), 16)>>1) & 0x0F; var data_periodic_tx_on_off = (parseInt(stringHex.substring(15,16),16)) & 0x01; var data_periodic_tx_period = (parseInt(stringHex.substring(16,18),16)>>2) & 0x3F; var data_periodic_delta_co2 = (parseInt(stringHex.substring(17,20),16)>>2) & 0xFF; var data_periodic_delta_temp = (parseInt(stringHex.substring(19,22),16)>>3)& 0x7F; var data_datalog_co2_on_off = (parseInt(stringHex.substring(21,22),16)>>2) & 0x01; var data_datalog_temperature_on_off = (parseInt(stringHex.substring(21,22),16)>>1) & 0x01; var data_datalog_new_measure = (parseInt(stringHex.substring(21,24),16)>>3) & 0x3F; var data_datalog_repetition = (parseInt(stringHex.substring(23,25),16)>>2) & 0x1F; var data_datalog_tx_period = (parseInt(stringHex.substring(24,27),16)>>2) & 0xFF; var data_pending_join = (parseInt(stringHex.substring(26,27),16)>>1) & 0x01; var data_nfc_status = (parseInt(stringHex.substring(26,28),16)>>3) & 0x03; var data_date_produit_annee = (parseInt(stringHex.substring(27,29),16)>>1) & 0x3F; var data_date_produit_mois = (parseInt(stringHex.substring(28,30),16)>>1) & 0x0F; var data_date_produit_jour = (parseInt(stringHex.substring(29,31),16)) & 0x1F; var data_date_produit_heure = (parseInt(stringHex.substring(31,33),16)>>3) & 0x1F; var data_date_produit_minute = (parseInt(stringHex.substring(32,34),16)>>1) & 0x3F; var data_datalog_humidity_on_off = (parseInt(stringHex.substring(33,34),16)) & 0x01; data = {"typeOfProduct": typeOfProduct(octetTypeProduit), "typeOfMessage": typeOfMessage(octetTypeMessage), "configurationSource": reconfigurationSource(data_config_source), "configurationStatus": reconfigurationState(data_config_status), "periodBetween2measures": period(data_periode_mesure), "co2SensorActivation":sensorActivation(data_sensor_on_off_co2), "covSensorActivation":sensorActivation(data_sensor_on_off_cov), "pirSensorActivation":sensorActivation(data_sensor_on_off_pir), "microphoneSensorActivation":sensorActivation(data_sensor_on_off_microphone), "localStorageActivation":sdActivation(data_sd_storage_on_off), "automaticCalibrationActivation": calibrationActivation(data_co2_auto_calibration), "mediumCO2Threshold":co2Threshold(data_co2_medium_level), "highCO2Threshold":co2Threshold(data_co2_high_level), "ledActivation":active(data_led_on_off), "orangeLEDActivation":active(data_led_orange_on_off), "buzzerActivation":active(data_buzzer_on_off), "buzzerConfirmationActivation":active(data_buzzer_confirm_on_off), "ledSourceActivation":notificationByLEDandBuzzer(data_led_source), "buttonNotification":active(data_button_on_off), "loraRegion":loraRegion(data_lora_region), "periodicalDataActivation":active(data_periodic_tx_on_off), "dataTransmissionPeriod":period(data_periodic_tx_period), "deltaCO2":deltaCO2(data_periodic_delta_co2), "deltaTemperature": deltaTemp(data_periodic_delta_temp), "historicalCO2DataActivation":active(data_datalog_co2_on_off), "historicalTemperatureDataActivation":active(data_datalog_temperature_on_off), "historicalHumidityDataActivation":active(data_datalog_humidity_on_off), "numberOfRecordsInADatalogMessage":data_datalog_new_measure, "numberOfMessagesFor1Record":data_datalog_repetition, "transmissionPeriodOfHistoricalMessage":transmissionPeriodHistorical(data_datalog_tx_period), "networkJoinStatus": pendingJoin(data_pending_join), "nfcStatus": nfcStatus(data_nfc_status), "productDateYear": {"value":data_date_produit_annee,"unit":"year"}, "productDateMonth": {"value":data_date_produit_mois,"unit":"month"}, "productDateDay": {"value":data_date_produit_jour,"unit":"day"}, "productDateHours": {"value":data_date_produit_heure,"unit":"hours"}, "productDateMinutes": {"value":data_date_produit_minute,"unit":"minutes"} }; return data; } data=dataOutput(octetTypeMessage); return {data}; } // end of decoder

This codec is sourced from The Things Network. All rights belong to The Things Network.

This codec is licensed under the GNU General Public License v3 (GPL v3). Modifications, if any, are clearly marked. You are free to use, modify, and distribute the codec under the terms of GPL v3.

Community Feedback