Sie suchen den .js Payload Decoder für den Neptun Pegelsensor?
Hier finden Sie den .js Payload Decoder für den Neptun Pegelsensor.
Neptun Payload Decoder LoRaWAN®
function decodeUplink(input) {
function uncomplement(val, bitwidth) {
var isnegative = val & (1 << (bitwidth - 1));
var boundary = (1 << bitwidth);
var minval = -boundary;
var mask = boundary - 1;
return isnegative ? minval + (val & mask) : val;
}
var decoded = {};
var bytes = input.bytes;
var subtypedict = {1:"radar-peaks", 2: "ultrasonic-peak"};
if(input.fPort == 1){//TELEMETRY
var moduleid = bytes[0] >> 4;
var versionMajor= bytes[0] & 0x0F;
var versionMinor= bytes[1] >> 4;
var versionSub = bytes[1] & 0x0F;
if ( moduleid == 1 && versionMajor == 1 && versionMinor >= 1 && versionSub == 1){//MODULE == 1 (Sentiface), MAJOR == 1, MINOR >=1, SUBTYPE == 1 (Radar)
//Attributes
decoded.versionMajor = versionMajor;
decoded.versionMinor = versionMinor;
decoded.versionSub = versionSub;
decoded.model= "radar-peaks";
decoded.networkType ="lorawan";
decoded.networkSubType ="tti";
decoded.firmwareType = "SENTOS2";
////Telemetry
//8 Bit Uplink Count for diagnostic purposes
decoded.up_cnt = bytes[2];
//Battery-Voltage in Volts
decoded.battery_voltage = (bytes[3] << 8 | bytes[4]) / 1000.0;
//Internal temperature in degrees C.
decoded.internal_temperature = bytes[5] - 128.0;
//Indicates wheter the uplink is regular or irregular (delta or vandalism alarm)
decoded.alarm = bytes[6];
//When peaks are sorted by amplitude, this is the distance to the object with the biggest amplitude (default).
//Otherwise, this is the distance to the nearest detected object.
decoded.distance_max_peak = bytes[7] << 8 | bytes[8];
decoded.distance_quality = 0;
//Success of data acquisition. Flase indicates SW/HW error
decoded.detection_success = bytes[9]?true:false;
//Number of detected peaks (objects). 0 means that no reflection reaches threshold.
decoded.detected_peaks = bytes[10];
////Additional Telemety
//The sensor transmits an array of length <detected_peaks>.
//For every peak, distance and amplitude are transmitted
//To ensure support with all data converter implementations,
//we generate a key for every entry and add a key value pair
//to the decoded object
var offset = 11;
var i = offset;
var n = 1;
for(i; i+4 <= (offset+decoded.detected_peaks*4);i+=4){
var distance_mm = bytes[i] << 8 | bytes[i+1];
var amplitude = uncomplement(bytes[i+2] << 8 | bytes[i+3],16);
if(amplitude < 0){
amplitude = 0;
}
decoded["rd_"+n] = distance_mm;
decoded["ra_"+n] = amplitude;
if(n==1){
if(decoded.versionMinor >= 3){
decoded.distance_quality = amplitude/10;
}else{
decoded.distance_quality = (amplitude*distance_mm)/3000000;
}
}
n++;
}
}else if ( moduleid == 1 && versionMajor == 1 && versionMinor >= 1 && versionSub == 2){//MODULE == 1 (Sentiface), MAJOR == 1, MINOR >=1, SUBTYPE == 2 (Ultraschall)
//Attributes
decoded.versionMajor = versionMajor;
decoded.versionMinor = versionMinor;
decoded.versionSub = versionSub;
decoded.model= "sonar-peaks";
decoded.networkType ="lpwan-ism";
decoded.networkSubType ="lorawan";
decoded.firmwareType = "SENTOS2";
////Telemetry
//8 Bit Uplink Count for diagnostic purposes
decoded.up_cnt = bytes[2];
//Battery-Voltage in Volts
decoded.battery_voltage = (bytes[3] << 8 | bytes[4]) / 1000.0;
//Internal temperature in degrees C.
decoded.internal_temperature = bytes[5] - 128.0;
decoded.sonic_status = bytes[6];
if(bytes[6] === 0){
decoded.detection_success = true;
decoded.detected_peaks = 1;
decoded.distance_quality = 1;
}else{
decoded.detection_success = false;
decoded.detected_peaks = 0;
decoded.distance_quality = 0;
}
decoded.distance_max_peak = (bytes[7] << 8 | bytes[8])*10;
}
}
return {
data: decoded,
warnings: [],
errors: []
};
}
Revision Table - Dokumentenhistorie
Datum | Beschreibung |
01.05.2023 | Erstellung |