ELSYS LoRa® ERS / ERS-lite

Any support questions you might have can be asked here:
https://www.thethingsnetwork.org/marketplace/product/lora-ers-ers-liteimage

3 Likes

You connect a node to the network, not to a gateway. Connecting a lorawan node to a network means you must program the node with keys supplied by the network or insert the keys supplied with the node into the network.
Did you receive any information with the hardware?

I would like to increase the time between LoRaWan transmission. From the ELSYS downlink payload document, I think this is the 0x14 SplPer (period) and 0x1F SendPer (multipler) items, but how do I specify the period (seconds??)? For example, what would a 10 minute period look like? 3E0514xxxxxxxx051F00000001

Also, it looks like the ERS-lite device currently wants each uplink confirmed. Is there a command to turn this off?

Below the Payload Format to be used in the Console. I had to modify the payload provided by Elsys slightly to make it work with TTN.

function Decoder(bytes, port) {
  if (port === 0) {
    return;
  }
  var TYPE_TEMP = 0x01; //temp 2 bytes -3276.8°C -->3276.7°C
  var TYPE_RH = 0x02; //Humidity 1 byte 0-100%
  var TYPE_ACC = 0x03; //acceleration 3 bytes X,Y,Z -128 --> 127 +/-63=1G
  var TYPE_LIGHT = 0x04; //Light 2 bytes 0-->65535 Lux
  var TYPE_MOTION = 0x05; //No of motion 1 byte 0-255
  var TYPE_CO2 = 0x06; //Co2 2 bytes 0-65535 ppm
  var TYPE_VDD = 0x07; //VDD 2byte 0-65535mV
  var TYPE_ANALOG1 = 0x08; //VDD 2byte 0-65535mV
  var TYPE_GPS = 0x09; //3bytes lat 3bytes long binary
  var TYPE_PULSE1 = 0x0A; //2bytes relative pulse count
  var TYPE_PULSE1_ABS = 0x0B; //4bytes no 0->0xFFFFFFFF
  var TYPE_EXT_TEMP1 = 0x0C; //2bytes -3276.5C-->3276.5C
  var TYPE_EXT_DIGITAL = 0x0D; //1bytes value 1 or 0
  var TYPE_EXT_DISTANCE = 0x0E; //2bytes distance in mm
  var TYPE_ACC_MOTION = 0x0F; //1byte number of vibration/motion
  var TYPE_IR_TEMP = 0x10; //2bytes internal temp 2bytes external temp -3276.5C-->3276.5C
  var TYPE_OCCUPANCY = 0x11; //1byte data
  var TYPE_WATERLEAK = 0x12; //1byte data 0-255
  var TYPE_GRIDEYE = 0x13;  //65byte temperature data 1byte ref+64byte external temp
  var TYPE_PRESSURE = 0x14; //4byte pressure data (hPa)
  var TYPE_SOUND = 0x15; //2byte sound data (peak/avg)
  var TYPE_PULSE2 = 0x16; //2bytes 0-->0xFFFF
  var TYPE_PULSE2_ABS = 0x17; //4bytes no 0->0xFFFFFFFF
  var TYPE_ANALOG2 = 0x18; //2bytes voltage in mV
  var TYPE_EXT_TEMP2 = 0x19; //2bytes -3276.5C-->3276.5C

  var bin16dec = function(bin) {
      var num=bin&0xFFFF;
      if (0x8000 & num)
          num = - (0x010000 - num);
      return num;
  }

  var bin8dec = function(bin) {
      var num=bin&0xFF;
      if (0x80 & num)
          num = - (0x0100 - num);
      return num;
  }

  var hexToBytes = function(hex) {
      for (var bytes = [], c = 0; c < hex.length; c += 2)
          bytes.push(parseInt(hex.substr(c, 2), 16));
      return bytes;
  }

  var decoded = {};
  for(i=0;i<bytes.length;i++){
        switch(bytes[i]){
            case TYPE_TEMP: //Temperature
                var temp=(bytes[i+1]<<8)|(bytes[i+2]);
                temp=bin16dec(temp);
                decoded.temperature=temp / 10;
                i+=2;
            break;
            case TYPE_RH: //Humidity
                var rh=(bytes[i+1]);
                decoded.humidity=rh;
                i+=1;
            break;
            case TYPE_ACC: //Acceleration
                decoded.x=bin8dec([i+1]);
                decoded.y=bin8dec(bytes[i+2]);
                decoded.z=bin8dec(bytes[i+3]);
                i+=3;
            break;
            case TYPE_LIGHT: //Light
                var light=(bytes[i+1]<<8)|(bytes[i+2]);
                decoded.light=light;
                i+=2;
            break;
            case TYPE_MOTION: //Motion sensor(PIR)
                var motion=(bytes[i+1]);
                decoded.motion=motion;
                i+=1;
            break;
            case TYPE_CO2: //CO2
                var co2=(bytes[i+1]<<8)|(bytes[i+2]);
                decoded.co2=co2;
                i+=2;
            break;
            case TYPE_VDD: //Battery level
                var vdd=(bytes[i+1]<<8)|(bytes[i+2]);
                decoded.vdd=vdd;
                i+=2;
            break;
            case TYPE_ANALOG1: //Analog input 1
                var analog1=(bytes[i+1]<<8)|(bytes[i+2]);
                decoded.analog1=analog1;
                i+=2;
            break;
            case TYPE_GPS: //gps
                decoded.lat=(bytes[i+1]<<16)|(bytes[i+2]<<8)|(bytes[i+3]);
                decoded.long=(bytes[i+4]<<16)|(bytes[i+5]<<8)|(bytes[i+6]);
                i+=6;
            break;
            case TYPE_PULSE1: //Pulse input 1
                var pulse1=(bytes[i+1]<<8)|(bytes[i+2]);
                decoded.pulse1=pulse1;
                i+=2;
            break;

            case TYPE_EXT_TEMP1: //External temp
            var temp=(data[i+1]<<8)|(data[i+2]);
            temp=bin16dec(temp);
            decoded.externalTemperature=temp/10;
            i+=2;
            break
            case TYPE_EXT_DIGITAL: //Digital input
            decoded.digital=(data[i+1]);
            i+=1;
            break
            case TYPE_EXT_DISTANCE: //Distance sensor input
            decoded.distance=(data[i+1]<<8)|(data[i+2]);
            i+=2;
            break
            case TYPE_ACC_MOTION: //Acc motion
            decoded.accMotion=(data[i+1]);
            i+=1;
            break
            case TYPE_IR_TEMP: //IR temperature
            var iTemp=(data[i+1]<<8)|(data[i+2]);
            iTemp=bin16dec(iTemp);
            var eTemp=(data[i+3]<<8)|(data[i+4]);
            eTemp=bin16dec(eTemp);
            decoded.irInternalTemperature=iTemp/10;
            decoded.irExternalTemperature=eTemp/10;
            i+=4;
            break
            case TYPE_OCCUPANCY: //Body occupancy
            decoded.occupancy=(data[i+1]);
            i+=1;
            break
            case TYPE_WATERLEAK: //Water leak
            decoded.waterleak=(data[i+1]);
            i+=1;
            break
            case TYPE_GRIDEYE: //Grideye data
            i+=65;
            break
            case TYPE_PRESSURE: //External Pressure
            var temp=(data[i+1]<<24)|(data[i+2]<<16)|(data[i+3]<<8)|(data[i+4]);
            decoded.pressure=temp/1000;
            i+=4;
            break
            case TYPE_SOUND: //Sound
            decoded.soundPeak=(bytes[i+1]);
            decoded.soundAvg=(bytes[i+2]);
            i+=2;
            break
            case TYPE_PULSE2: //Pulse 2
            decoded.pulse2=(data[i+1]<<8)|(data[i+2]);
            i+=2;
            break
            case TYPE_PULSE2_ABS: //Pulse input 2 absolute value
            decoded.pulseAbs2=(data[i+1]<<24)|(data[i+2]<<16)|(data[i+3]<<8)|(data[i+4]);
            i+=4;
            break
            case TYPE_ANALOG2: //Analog input 2
            decoded.analog2=(data[i+1]<<8)|(data[i+2]);
            i+=2;
            break
            case TYPE_EXT_TEMP2: //External temp 2
            var temp=(data[i+1]<<8)|(data[i+2]);
            temp=bin16dec(temp);
            decoded.externalTemperature2=temp/10;
            i+=2;
            break
            default: //somthing is wrong with data
            i=data.length;
            break;
        }
    }
  return decoded;
}

Thanks laurens, but I am actually looking for the downlink, not the uplink.

Are 0x14 SplPer (period) and 0x1F SendPer (multipler) defined as seconds or minutes?
The Elsys documentation only mentions that they are 4 bytes in length, but no unit is specified.

Hello Guys,
I’m using a TTN gateway that is working well with some devices but I can’t connect a couple of elsys devices ( ELT-Lite and ELT-HP-2).
Screenshot_20181116-170457_Sensor%20settings Screenshot_20181116-170511_Sensor%20settings
I don’t know what I’m doing wrong. People here said that is working but I wasn’t able to find a “howto”. So, it’s very very easy or I’m very stupid (or both).
I found this related pages:

Thanks in advance for any help.

We have many of these Elsys ERS-lite’s working over TTN.

What issue are you running into?

I can’t see traffic on my gateway. I’m assuming that the devices are not connecting.
I’m using a TTN gateway configured with AU band 915Mhz. I have other devices working but with this one I really don’t know how to troubleshoot it.
I triple check DEVEUI/APPKEY/APPEUI are the correct ones.
Just confirming that is not a ERS-Lite is a ELT-Lite (should be the same procedure/configuration).

Hello all, has anyone successed the connection to TTN via gateway configured for AS923? I have tried Multitech Conduit and Dragino LG01 as packet forwarder, but failed.

I believe SplPer is in seconds, as it’s also configurable in seconds via the app, and the configuration value stored in the NFC tag is also in seconds.

Not sure about SendPer yet. On the ERS with CO2 sensor that I just checked (a rev E with firmware 2.2.4), the SendPer and several other *Per multipliers are all set to 1. I assume they just /are/ multipliers.

1 Like

To turn Confirmed Messages off remotely - 3E030A00FE - to Port 6

SplPer (example 1800 seconds) - 3E061400000708FE - to Port 6

They have a nice generator on their site.

Always apply the reboot… I learnt a hard lesson there.haha

Hi

When I follow your guide with my Elsys sensor it does not respond.
It keeps sending at the old interval.

Any idea why this happens?

Did you see the sensor reboot afterwards? How far away from the gateway is it?

No reboot.

There are 3 gateways in reach, with RSSI -118,-87,-60.
The time on air is only 62ms.

I send ‘3E061400000708FE’ to port 6, scheduling: replace, Confirmed not selected.

To confirm these are the ERS-lites? How strange.

I’ll send the command to one of ours now, and show you the traffic.

I am working with ELT-2’s.
The downlink payload format is the same for all models.

image

This is what happens with ours. As you can see the device reboots and re-joins afterwards.

1 Like

Hmmm, interesting - looks like my ERS sensors (ERSgrid / ERSeye) also don’t accept config changes over LoRaWAN.

I tried to reconfigure the SplPer and SendPer with a downlink message to port 6 (including a reboot command, payload created with Elsys downlink generator) but no reboot seen and sensor stays at the old sample & transmit periods.

Last test was against a sensor running firmware 2.2.7. I also tried a confirmed downlink; after that one, the sensor was lost completely, so I’ll have to go out and try to fix it on-site.