Skip to content
English
  • There are no suggestions because the search field is empty.

Juno TH TILT Data converter .js

You are looking for the Juno TH TILT Data converter in .js?

Here you can find the decoder for the Juno TH TILT module LoRaWAN®. It allows you to decode all transmitted sensor data.

 function Decoder(bytes, port) {
 
    // Conversion of signed integers
    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 = {};
 
    if (port === 1) {
 
        // Attributes
        decoded.base_id         = bytes[0] >> 4;
        decoded.major_version   = bytes[0] & 0x0F;
        decoded.minor_version   = bytes[1] >> 4;
        decoded.product_version = bytes[1] & 0x0F;
 
        // Telemetry
        decoded.up_cnt               = bytes[2];
        decoded.battery_voltage      = ((bytes[3] << 8) | bytes[4]) / 1000.0;
        decoded.internal_temperature = bytes[5] - 128;
        
        var idx = 6;//Start of variable size, version dependent payload section

        if(decoded.product_version & 0x01){//magentic field sensor for operating hours counting
            decoded.operating_seconds = (bytes[idx++] << 24) | (bytes[idx++] << 16) | (bytes[idx++] << 8) | bytes[idx++];
            decoded.cycles = (bytes[idx++] << 24) | (bytes[idx++] << 16) | (bytes[idx++] << 8) | bytes[idx++];
            decoded.utilization_rate = ((bytes[idx++] << 8) | bytes[idx++]) / 100.0;
            decoded.is_active = bytes[idx++];
        }
        if(decoded.product_version & 0x08){//Has Precision TH Sensor
            decoded.temperature = ((bytes[idx++] << 8) | bytes[idx++]) / 10 - 100;
            decoded.humidity = bytes[idx++];
        }

    }else if(port == 197){ //Manual decode of wifi scan for when semtech cloud is not available
      
      var format = bytes[0];
      var offset = 1;
      var results = [];
      var count = 0;
      var i = 0;
      var macBytes;
      var mac;
      
      if (format === 0) {
        // MAC-only format
       // Remaining length should be divisible by 6
        count = Math.floor((bytes.length - offset) / 6);
        for (i = 0; i < count; i++) {
          macBytes = bytes.slice(offset + i*6, offset + i*6 + 6);
          mac = macBytes.map(function(b) {
            return (b < 16 ? "0" : "") + b.toString(16).toUpperCase();
          }).join(":");
          results.push({ mac: mac });
        }
      } else if (format === 1) {
        // MAC+RSSI format
        // Remaining length should be divisible by 7
        count = Math.floor((bytes.length - offset) / 7);
        for (i = 0; i < count; i++) {
          var rssiRaw = bytes[offset + i*7];
          // Convert to signed int8
          var rssi = rssiRaw > 127 ? rssiRaw - 256 : rssiRaw;
          macBytes = bytes.slice(offset + i*7 + 1, offset + i*7 + 7);
          mac = macBytes.map(function(b) {
            return (b < 16 ? "0" : "") + b.toString(16).toUpperCase();
          }).join(":");
          results.push({ mac: mac, rssi: rssi });
        }
      } else {
        return { errors: ["Unknown payload format: " + format] };
      }
    
      decoded.format = format;
      decoded.access_points = results;
      
    }
    
    return decoded;
}

Specifications subject to change without notice. All information provided without guarantee.