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).
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.
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.
This is what happens with ours. As you can see the device reboots and re-joins afterwards.
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.
When I manually send a downlink message to my Elsys ELT2 through TTN it almost never works.
However, when I send a downlink message through AWS IoT Core MQTT client with the options:
{
"port": 6,
"confirmed": false,
"payload_raw": "AQIDBA=="
}
‘confirmed’ = false it always works.
It seems like TTN will always send downlink messages as confirmed even when you have not selected the option.
Strange.
Never run into any of these problems - configured many an Elsys and Zane products over the air with no issues.
Are your gateways 100% transmitting the packet?