Neptun Datenkonverter in .js

Sie suchen den .js Payload Decoder für den Neptun Pegelsensor?

Hier finden Sie den .js Payload Decoder für den Neptun Pegelsensor.

Neptun senti 2.2-1

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