From 122d66ce5f34cc7819d3f3b17c3d3bb65065cbb7 Mon Sep 17 00:00:00 2001 From: "IoTThinks.com" Date: Wed, 7 Jun 2023 16:23:33 +0700 Subject: [PATCH] Add files via upload --- Codec/Dragino-LAQ4.txt | 54 +++++++++++ Codec/Dragino-LGT92.txt | 104 ++++++++++++++++++++ Codec/Dragino-LSN50v2.txt | 154 ++++++++++++++++++++++++++++++ Codec/Dragino-LT-22222-L.txt | 179 +++++++++++++++++++++++++++++++++++ Codec/Dragino-RS485-BL.txt | 32 +++++++ Codec/Dragino-RS485-LN.txt | 126 ++++++++++++++++++++++++ 6 files changed, 649 insertions(+) create mode 100644 Codec/Dragino-LAQ4.txt create mode 100644 Codec/Dragino-LGT92.txt create mode 100644 Codec/Dragino-LSN50v2.txt create mode 100644 Codec/Dragino-LT-22222-L.txt create mode 100644 Codec/Dragino-RS485-BL.txt create mode 100644 Codec/Dragino-RS485-LN.txt diff --git a/Codec/Dragino-LAQ4.txt b/Codec/Dragino-LAQ4.txt new file mode 100644 index 0000000..461da6f --- /dev/null +++ b/Codec/Dragino-LAQ4.txt @@ -0,0 +1,54 @@ +// Decode uplink function. +// +// Input is an object with the following fields: +// - bytes = Byte array containing the uplink payload, e.g. [255, 230, 255, 0] +// - fPort = Uplink fPort. +// - variables = Object containing the configured device variables. +// +// Output must be an object with the following fields: +// - data = Object representing the decoded payload. +function decodeUplink(input) { + var bytes=input.bytes; + + if(bytes.length != 11) + { + return {"data": {}}; + } + + var mode=(bytes[2] & 0x7C)>>2; + var data = {}; + data.Bat_V=(bytes[0]<<8 | bytes[1])/1000 + 0.267; + if(mode==1) + { + data.Work_mode="CO2"; + data.Alarm_status=(bytes[2] & 0x01)? "TRUE":"FALSE"; + data.TVOC_ppb= bytes[3]<<8 | bytes[4]; + data.CO2_ppm= bytes[5]<<8 | bytes[6]; + data.TempC_SHT=parseFloat(((bytes[7]<<24>>16 | bytes[8])/10).toFixed(2)); + data.Hum_SHT=parseFloat(((bytes[9]<<8 | bytes[10])/10).toFixed(1)); + } + else if(mode==31) + { + data.Work_mode="ALARM"; + data.SHTEMPMIN= bytes[3]<<24>>24; + data.SHTEMPMAX= bytes[4]<<24>>24; + data.SHTHUMMIN= bytes[5]; + data.SHTHUMMAX= bytes[6]; + data.CO2MIN= bytes[7]<<8 | bytes[8]; + data.CO2MAX= bytes[9]<<8 | bytes[10]; + } + + return {"data": data}; +} + +// Encode downlink function. +// +// Input is an object with the following fields: +// - data = Object representing the payload that must be encoded. +// - variables = Object containing the configured device variables. +// +// Output must be an object with the following fields: +// - bytes = Byte array containing the downlink payload. +function encodeDownlink(input) { + return { bytes: []}; +} \ No newline at end of file diff --git a/Codec/Dragino-LGT92.txt b/Codec/Dragino-LGT92.txt new file mode 100644 index 0000000..b74d3e7 --- /dev/null +++ b/Codec/Dragino-LGT92.txt @@ -0,0 +1,104 @@ +// Decode uplink function. +// +// Input is an object with the following fields: +// - bytes = Byte array containing the uplink payload, e.g. [255, 230, 255, 0] +// - fPort = Uplink fPort. +// - variables = Object containing the configured device variables. +// +// Output must be an object with the following fields: +// - data = Object representing the decoded payload. +function decodeUplink(input) { + var bytes=input.bytes; + + var latitude;//gps latitude,units: ° + latitude=(bytes[0]<<24 | bytes[1]<<16 | bytes[2]<<8 | bytes[3])/1000000;//gps latitude,units: ° + + var longitude; + longitude=(bytes[4]<<24 | bytes[5]<<16 | bytes[6]<<8 | bytes[7])/1000000;//gps longitude,units: ° + + var alarm=(bytes[8] & 0x40)?"TRUE":"FALSE";//Alarm status + var batV=(((bytes[8] & 0x3f) <<8) | bytes[9])/1000;//Battery,units:V + + var motion_mode; + if((bytes[10] & 0xC0)==0x40) + { + motion_mode="Move"; + } + else if((bytes[10] & 0xC0) ==0x80) + { + motion_mode="Collide"; + } + else if((bytes[10] & 0xC0) ==0xC0) + { + motion_mode="User"; + } + else + { + motion_mode="Disable"; + } //mode of motion + + + var led_updown=(bytes[10] & 0x20)?"ON":"OFF";//LED status for position,uplink and downlink + var Firmware = 160+(bytes[10] & 0x1f); // Firmware version; 5 bits + + /* AT+SGM=0 to enable. Longer message + var roll=(bytes[11]<<24>>16 | bytes[12])/100;//roll,units: ° + var pitch=(bytes[13]<<24>>16 | bytes[14])/100; //pitch,units: ° + var hdop = 0; + + if(bytes[15] > 0) + { + hdop =bytes[15]/100; //hdop,units: ° + } + else + { + hdop =bytes[15]; + } + + var altitude =(bytes[16]<<24>>16 | bytes[17]) / 100; //Altitude,units: ° + */ + + if (latitude != 0 || longitude != 0) { + return {"data": { + Latitude: latitude, + Longitude: longitude, + // Roll: roll, + // Pitch:pitch, + BatV:batV, + ALARM_status:alarm, + MD:motion_mode, + LON:led_updown, + FW:Firmware //, + // HDOP:hdop, + // Altitude:altitude + }}; + } + else { + return {"data": { + // Ignore GPS(0,0) + // Latitude: latitude, + // Longitude: longitude, + // Roll: roll, + // Pitch:pitch, + BatV:batV, + ALARM_status:alarm, + MD:motion_mode, + LON:led_updown, + FW:Firmware// , + // HDOP:hdop + // Altitude:altitude + }}; + } +} + +// Encode downlink function. +// +// Input is an object with the following fields: +// - data = Object representing the payload that must be encoded. +// - variables = Object containing the configured device variables. +// +// Output must be an object with the following fields: +// - bytes = Byte array containing the downlink payload. +function encodeDownlink(input) { + return {bytes: []}; +} \ No newline at end of file diff --git a/Codec/Dragino-LSN50v2.txt b/Codec/Dragino-LSN50v2.txt new file mode 100644 index 0000000..6a6037d --- /dev/null +++ b/Codec/Dragino-LSN50v2.txt @@ -0,0 +1,154 @@ +// Decode uplink function. +// +// Input is an object with the following fields: +// - bytes = Byte array containing the uplink payload, e.g. [255, 230, 255, 0] +// - fPort = Uplink fPort. +// - variables = Object containing the configured device variables. +// +// Output must be an object with the following fields: +// - data = Object representing the decoded payload. +function decodeUplink(input) { + var bytes=input.bytes; + + var data={ + //Work mode + Work_mode: + { + "0":"IIC", + "1":"Distance", + "2":"3ADC", + "3":"3DS18B20", + "4":"Weight", + "5":"Count" + }[(bytes[6] & 0x7C)>>2], + + //Battery,units:V + BatV: + { + "0": (bytes[0]<<8 | bytes[1])/1000, + "1": (bytes[0]<<8 | bytes[1])/1000, + "2": bytes[11]/10, + "3": (bytes[0]<<8 | bytes[1])/1000, + "4": (bytes[0]<<8 | bytes[1])/1000, + "5": (bytes[0]<<8 | bytes[1])/1000, + }[(bytes[6] & 0x7C)>>2] + 0.267, + + //DS18B20,PB3,units:â„? + TempC1: + { + "0": ((bytes[2]<<24>>16 | bytes[3])/10).toFixed(2), + "1": ((bytes[2]<<24>>16 | bytes[3])/10).toFixed(2), + "3": ((bytes[2]<<24>>16 | bytes[3])/10).toFixed(2), + "4": ((bytes[2]<<24>>16 | bytes[3])/10).toFixed(2), + "5": ((bytes[2]<<24>>16 | bytes[3])/10).toFixed(2), + }[(bytes[6] & 0x7C)>>2], + + //ADC Channel 0,PA0,units:V + ADC_CH0V: + { + "0":(bytes[4]<<8 | bytes[5])/1000, + "1":(bytes[4]<<8 | bytes[5])/1000, + "2": (bytes[0]<<8 | bytes[1])/1000, + "3":(bytes[4]<<8 | bytes[5])/1000, + "4":(bytes[4]<<8 | bytes[5])/1000, + "5":(bytes[4]<<8 | bytes[5])/1000, + }[(bytes[6] & 0x7C)>>2], + + //Digital Input Status,PA12 + Digital_IStatus: + { + "0":(bytes[6] & 0x02)? "H":"L", + "1":(bytes[6] & 0x02)? "H":"L", + "2":(bytes[6] & 0x02)? "H":"L", + "3":(bytes[6] & 0x02)? "H":"L", + "4":(bytes[6] & 0x02)? "H":"L", + "5":(bytes[6] & 0x02)? "H":"L", + }[(bytes[6] & 0x7C)>>2], + + //GPIO_MODE_IT_FALLING,PB14 + EXTI_Trigger: + { + "0":(bytes[6] & 0x01)? "TRUE":"FALSE", + "1":(bytes[6] & 0x01)? "TRUE":"FALSE", + "2":(bytes[6] & 0x01)? "TRUE":"FALSE", + "3":(bytes[6] & 0x01)? "TRUE":"FALSE", + "4":(bytes[6] & 0x01)? "TRUE":"FALSE", + }[(bytes[6] & 0x7C)>>2], + + //Status of door sensor,PB14 + Door_status: + { + "0": (bytes[6] & 0x80)? "CLOSE":"OPEN", + "1": (bytes[6] & 0x80)? "CLOSE":"OPEN", + "2": (bytes[6] & 0x80)? "CLOSE":"OPEN", + "3": (bytes[6] & 0x80)? "CLOSE":"OPEN", + "4": (bytes[6] & 0x80)? "CLOSE":"OPEN", + }[(bytes[6] & 0x7C)>>2], + + //SHT2X,SHT3X temperature,PB6,PB7,units:â„? + TempC_SHT: + { + "0":((bytes[7]<<24>>16 | bytes[8])/10).toFixed(2), + "2":((bytes[7]<<24>>16 | bytes[8])/10).toFixed(2), + }[(bytes[6] & 0x7C)>>2], + //SHT2X,SHT3X Humidity,PB6,PB7,units:% + Hum_SHT: + { + "0": ((bytes[9]<<8 | bytes[10])/10) .toFixed(1), + "2": ((bytes[9]<<8 | bytes[10])/10) .toFixed(1), + }[(bytes[6] & 0x7C)>>2], + + //Distance,PA11,PB12,units:cm; + Distance: + { + "1":((bytes[7]<<8 | bytes[8])/10) .toFixed(1), + }[(bytes[6] & 0x7C)>>2], + + //ADC Channel 1,PA1,units:V + ADC_CH1V: + { + "2":(bytes[2]<<8 | bytes[3])/1000, + }[(bytes[6] & 0x7C)>>2], + //ADC Channel 4,PA4,units:V + ADC_CH4V: + { + "2":(bytes[4]<<8 | bytes[5])/1000, + }[(bytes[6] & 0x7C)>>2], + + //DS18B20,PA9,units:â„? + TempC2: + { + "3":((bytes[7]<<24>>16 | bytes[8])/10).toFixed(2), + }[(bytes[6] & 0x7C)>>2], + //DS18B20,PA10,units:â„? + TempC3: + { + "3":((bytes[9]<<24>>16 | bytes[10])/10).toFixed(2), + }[(bytes[6] & 0x7C)>>2], + + //Weight,PA11,PB12,units:g; + Weight: + { + "4":(bytes[7]<<24>>16 | bytes[8]), + }[(bytes[6] & 0x7C)>>2], + + //interrupt count + Count: + { + "5":(bytes[7]<<24 | bytes[8]<<16 | bytes[9]<<8 | bytes[10]), + }[(bytes[6] & 0x7C)>>2], + } + return {"data": data}; +} + +// Encode downlink function. +// +// Input is an object with the following fields: +// - data = Object representing the payload that must be encoded. +// - variables = Object containing the configured device variables. +// +// Output must be an object with the following fields: +// - bytes = Byte array containing the downlink payload. +function encodeDownlink(input) { + return {bytes: []}; +} \ No newline at end of file diff --git a/Codec/Dragino-LT-22222-L.txt b/Codec/Dragino-LT-22222-L.txt new file mode 100644 index 0000000..fb8c8fc --- /dev/null +++ b/Codec/Dragino-LT-22222-L.txt @@ -0,0 +1,179 @@ +// Decode uplink function. +// +// Input is an object with the following fields: +// - bytes = Byte array containing the uplink payload, e.g. [255, 230, 255, 0] +// - fPort = Uplink fPort. +// - variables = Object containing the configured device variables. +// +// Output must be an object with the following fields: +// - data = Object representing the decoded payload. +function decodeUplink(input) { + var bytes=input.bytes; + + if(bytes.length != 11) { + return {"data": {}}; + } + + //Payload Formats of LT33222 or LT22222 Deceive + var hardware= (bytes[10] & 0xC0)>>6; + var mode0= bytes[10] & 0xff; + var mode= bytes[10] & 0x3f; + var decode = {}; + + if(hardware=='0') + { + decode.Hardware_mode="LT33222"; + decode.DO3_status=(bytes[8] &0x04)? false:true; // "L":"H"; + if(mode0=='1') + { + decode.DI3_status= (bytes[8] &0x20)? true:false; // "H":"L"; + } + } + else if(hardware=='1') + { + decode.Hardware_mode= "LT22222"; + } + + if(mode!=6) + { + decode.DO1_status= (bytes[8] &0x01)? true:false; // "L":"H"; + decode.DO2_status= (bytes[8] &0x02)? true:false; // "L":"H"; + decode.RO1_status= (bytes[8] &0x80)? true:false; // "ON":"OFF"; + decode.RO2_status= (bytes[8] &0x40)? true:false; // "ON":"OFF"; + if(mode!=1) + { + if(mode!=5) + { + decode.Count1_times= (bytes[0]<<24 | bytes[1]<<16 | bytes[2]<<8 | bytes[3]); + } + decode.First_status= (bytes[8] &0x20)? true:false; // "Yes":"No"; + } + } + + if(mode=='1') + { + decode.Work_mode= "2ACI+2AVI"; + decode.AVI1_V= parseFloat(((bytes[0]<<24>>16 | bytes[1])/1000).toFixed(3)); + decode.AVI2_V= parseFloat(((bytes[2]<<24>>16 | bytes[3])/1000).toFixed(3)); + decode.ACI1_mA= parseFloat(((bytes[4]<<24>>16 | bytes[5])/1000).toFixed(3)); + decode.ACI2_mA= parseFloat(((bytes[6]<<24>>16 | bytes[7])/1000).toFixed(3)); + decode.DI1_status= (bytes[8] &0x08)? true:false; // "H":"L"; + decode.DI2_status= (bytes[8] &0x10)? true:false; // "H":"L" + } + else if(mode=='2') + { + decode.Work_mode= "Count mode 1"; + decode.Count2_times= (bytes[4]<<24 | bytes[5]<<16 | bytes[6]<<8 | bytes[7]); + } + else if(mode=='3') + { + decode.Work_mode= "2ACI+1Count"; + decode.ACI1_mA= parseFloat(((bytes[4]<<24>>16 | bytes[5])/1000).toFixed(3)); + decode.ACI2_mA= parseFloat(((bytes[6]<<24>>16 | bytes[7])/1000).toFixed(3)); + } + else if(mode=='4') + { + decode.Work_mode= "Count mode 2"; + decode.Acount_times= (bytes[4]<<24 | bytes[5]<<16 | bytes[6]<<8 | bytes[7]); + } + else if(mode=='5') + { + decode.Work_mode= " 1ACI+2AVI+1Count"; + decode.AVI1_V= parseFloat(((bytes[0]<<24>>16 | bytes[1])/1000).toFixed(3)); + decode.AVI2_V= parseFloat(((bytes[2]<<24>>16 | bytes[3])/1000).toFixed(3)); + decode.ACI1_mA= parseFloat(((bytes[4]<<24>>16 | bytes[5])/1000).toFixed(3)); + decode.Count1_times= bytes[6]<<8 | bytes[7]; + } + else if(mode=='6') + { + decode.Work_mode= "Exit mode"; + decode.Mode_status= bytes[9] ? "True":"False"; + decode.AV1L_flag= (bytes[0] &0x80)? true: false; // "True":"False"; + decode.AV1H_flag= (bytes[0] &0x40)? true: false; // "True":"False"; + decode.AV2L_flag= (bytes[0] &0x20)? true: false; // "True":"False"; + decode.AV2H_flag= (bytes[0] &0x10)? true: false; // "True":"False"; + decode.AC1L_flag= (bytes[0] &0x08)? true: false; // "True":"False"; + decode.AC1H_flag= (bytes[0] &0x04)? true: false; // "True":"False"; + decode.AC2L_flag= (bytes[0] &0x02)? true: false; // "True":"False"; + decode.AC2H_flag= (bytes[0] &0x01)? true: false; // "True":"False"; + decode.AV1L_status= (bytes[1] &0x80)? true: false; // "True":"False"; + decode.AV1H_status= (bytes[1] &0x40)? true: false; // "True":"False"; + decode.AV2L_status= (bytes[1] &0x20)? true: false; // "True":"False"; + decode.AV2H_status= (bytes[1] &0x10)? true: false; // "True":"False"; + decode.AC1L_status= (bytes[1] &0x08)? true: false; // "True":"False"; + decode.AC1H_status= (bytes[1] &0x04)? true: false; // "True":"False"; + decode.AC2L_status= (bytes[1] &0x02)? true: false; // "True":"False"; + decode.AC2H_status= (bytes[1] &0x01)? true: false; // "True":"False"; + decode.DI2_status= (bytes[2] &0x08)? true: false; // "True":"False"; + decode.DI2_flag= (bytes[2] &0x04)? true: false; // "True":"False"; + decode.DI1_status= (bytes[2] &0x02)? true: false; // "True":"False"; + decode.DI1_flag= (bytes[2] &0x01)? true: false; // "True":"False"; + } + + return {"data": decode}; +} + +// Encode downlink function. +// +// Input is an object with the following fields: +// - data = Object representing the payload that must be encoded. +// - variables = Object containing the configured device variables. +// +// Output must be an object with the following fields: +// - bytes = Byte array containing the downlink payload. +function encodeDownlink(input) { + var obj=input.data; + + // 11: No action, 00: Off, 01: On + if(obj["method"] === "setRO1Value") + { + if(obj["params"]) + { + return {bytes: [0x03,0x01,0x11]}; // On + // return [0x05,0x01,0x12,0x07,0xD0]; // On 2s and back to original state, 0x07D0 = 2000ms = 2s + // return [0x05,0x00,0x12,0x07,0xD0]; // On 2s and back to inverter state, 0x07D0 = 2000ms = 2s + } + else + { + return {bytes: [0x03,0x00,0x11]}; // Off + // return [0x05,0x01,0x02,0x07,0xD0]; // On 2s and back to original state, 0x07D0 = 2000ms = 2s + } + } + else if(obj["method"] === "setRO2Value") + { + if(obj["params"]) + { + return {bytes: [0x03,0x11,0x01]}; // On + // return [0x05,0x01,0x21,0x07,0xD0]; // On 2s and back to original state, 0x07D0 = 2000ms = 2s + } + else + { + return {bytes: [0x03,0x11,0x00]}; // Off + // return [0x05,0x01,0x20,0x07,0xD0]; // On 2s and back to original state, 0x07D0 = 2000ms = 2s + } + } + else if(obj["method"] === "setDO1Value") + { + if(obj["params"]) + { + return {bytes: [0x02,0x01,0x11,0x11]}; // On + } + else + { + return {bytes: [0x02,0x00,0x11,0x11]}; // Off + } + } + else if(obj["method"] === "setDO2Value") + { + if(obj["params"]) + { + return {bytes: [0x02,0x11,0x01,0x11]}; // On + } + else + { + return {bytes: [0x02,0x11,0x00,0x11]}; // Off + } + } + // Should not reach here + return {bytes: []}; +} \ No newline at end of file diff --git a/Codec/Dragino-RS485-BL.txt b/Codec/Dragino-RS485-BL.txt new file mode 100644 index 0000000..bc9e171 --- /dev/null +++ b/Codec/Dragino-RS485-BL.txt @@ -0,0 +1,32 @@ +// Decode uplink function. +// +// Input is an object with the following fields: +// - bytes = Byte array containing the uplink payload, e.g. [255, 230, 255, 0] +// - fPort = Uplink fPort. +// - variables = Object containing the configured device variables. +// +// Output must be an object with the following fields: +// - data = Object representing the decoded payload. +function decodeUplink(input) { + var bytes = input.bytes; + + var BatV = (bytes[0] << 8 | bytes[1]) / 1000 + 0.277; + var PayVER = bytes[2]; + // If AT+DATAUP=1, PayloadCount=1 byte, payload#=1 byte + var Temp = (bytes[3] << 8 | bytes[4]) / 10; + var Humid = (bytes[5] << 8 | bytes[6]) / 10; + + return {"data": {"BatV":BatV, "PayVER":PayVER, "Temp":Temp, "Humid":Humid}}; +} + +// Encode downlink function. +// +// Input is an object with the following fields: +// - data = Object representing the payload that must be encoded. +// - variables = Object containing the configured device variables. +// +// Output must be an object with the following fields: +// - bytes = Byte array containing the downlink payload. +function encodeDownlink(input) { + return {bytes: []}; +} \ No newline at end of file diff --git a/Codec/Dragino-RS485-LN.txt b/Codec/Dragino-RS485-LN.txt new file mode 100644 index 0000000..1989135 --- /dev/null +++ b/Codec/Dragino-RS485-LN.txt @@ -0,0 +1,126 @@ +// Decode uplink function. +// +// Input is an object with the following fields: +// - bytes = Byte array containing the uplink payload, e.g. [255, 230, 255, 0] +// - fPort = Uplink fPort. +// - variables = Object containing the configured device variables. +// +// Output must be an object with the following fields: +// - data = Object representing the decoded payload. +function decodeUplink(input) { + var bytes=input.bytes; + + //Payload Formats of RS485_LN Deceive, for TTN/ChirpStack + if(bytes.length > 6) // Telemetry, by right should check by fport + { + // uplink from RS485 has payload version at bytes[0] + var cs_temp = (bytes[1] << 8 | bytes[2]) / 10; + + // Javascript does not support binary 0bxxxx + var cs_al1_status = (bytes[3] & 0x04)? true : false; // 0b0100 + var cs_al2_status = (bytes[3] & 0x08)? true : false; // 0b1000 + + // For Temperature and Humid of SHT20 + var cs_temp_sht20 = (bytes[4] << 8 | bytes[5]) / 10 - 2.9; // To offset down 2.9 degree + var cs_humid_sht20 = (bytes[6] << 8 | bytes[7]) / 10; + + // Voltage and current + var cs_voltage = (bytes[8] << 8 | bytes[9]) / 10; + var cs_current = (bytes[10] << 8 | bytes[11]) / 100; + var cs_kW = cs_voltage * cs_current / 1000; + + // kWh + var cs_exportKWh = (bytes[12] << 24 | bytes[13] << 16 | bytes[14] << 8 | bytes[15]) / 100; + var cs_importKWh = (bytes[16] << 24 | bytes[17] << 16 | bytes[18] << 8 | bytes[19]) / 100; + var cs_totalKWh = cs_exportKWh + cs_importKWh; + + return { data: {"cs_temp":cs_temp, "cs_al1_status":cs_al1_status, "cs_al2_status":cs_al2_status, + "cs_temp_sht20":cs_temp_sht20, "cs_humid_sht20":cs_humid_sht20, + "cs_voltage":cs_voltage, "cs_current":cs_current, "cs_kW":cs_kW, + "cs_exportKWh":cs_exportKWh, "cs_importKWh":cs_importKWh, "cs_totalKWh":cs_totalKWh} + }; + } + else if(bytes.length == 6) // return from RPC commands + { + // Uplink from RPC response does not have payload version at bytes[0] + // AL1: On OK [0x01,0x06,0x20,0x01,0x03,0xe8] + if(bytes[0] == 0x01 && bytes[1] == 0x06 && bytes[2] == 0x20 && + bytes[3] == 0x01 && bytes[4] == 0x03 && bytes[5] == 0xe8) + { + return { data: {"cs_al1_status": true}}; + } + // AL1: Off OK [0x01,0x06,0x20,0x01,0x00,0x00] + else if(bytes[0] == 0x01 && bytes[1] == 0x06 && bytes[2] == 0x20 && + bytes[3] == 0x01 && bytes[4] == 0x00 && bytes[5] == 0x00) + { + return { data: {"cs_al1_status": false}}; + } + // AL2: On OK [0x01,0x06,0x20,0x03,0x03,0xe8] + if(bytes[0] == 0x01 && bytes[1] == 0x06 && bytes[2] == 0x20 && + bytes[3] == 0x03 && bytes[4] == 0x03 && bytes[5] == 0xe8) + { + return { data: {"cs_al2_status": true}}; + } + // AL2: Off OK [0x01,0x06,0x20,0x03,0x00,0x00] + else if(bytes[0] == 0x01 && bytes[1] == 0x06 && bytes[2] == 0x20 && + bytes[3] == 0x03 && bytes[4] == 0x00 && bytes[5] == 0x00) + { + return { data: {"cs_al2_status": false}}; + } + else return { data: {"byte0": bytes[0], "byte1": bytes[1], "byte2": bytes[2], + "byte3": bytes[3], "byte4": bytes[4], "byte5": bytes[5]}}; + } + else // Unknown + { + return {data: {}}; + } +} + +// Encode downlink function. +// +// Input is an object with the following fields: +// - data = Object representing the payload that must be encoded. +// - variables = Object containing the configured device variables. +// +// Output must be an object with the following fields: +// - bytes = Byte array containing the downlink payload. +function encodeDownlink(input) { + var obj=input.data; + if(obj["method"] === "setAL1Value") + { + if(obj["params"]) + { + // return [0xa8,0x01,0x06,0x01,0x06,0x20,0x01,0x03,0xe8,0x00]; // On + return { bytes: [0xa8,0x01,0x06,0x01,0x06,0x20,0x01,0x03,0xe8,0x06]}; // On, to return 6-byte uplink + } + else + { + // return [0xa8,0x01,0x06,0x01,0x06,0x20,0x01,0x00,0x00,0x00]; // Off + return {bytes: [0xa8,0x01,0x06,0x01,0x06,0x20,0x01,0x00,0x00,0x06]}; // Off, to return 6-byte uplink + } + } + else if(obj["method"] === "setAL2Value") + { + if(obj["params"]) + { + // a801060106200303e806 + // qAEGAQYgAwPoBg== + // return [0xa8,0x01,0x06,0x01,0x06,0x20,0x03,0x03,0xe8,0x00]; // On + return {bytes: [0xa8,0x01,0x06,0x01,0x06,0x20,0x03,0x03,0xe8,0x06]}; // On, to return 6-byte uplink + } + else + { + // a8010601062003000006 + // qAEGAQYgAwAABg== + // return [0xa8,0x01,0x06,0x01,0x06,0x20,0x03,0x00,0x00,0x00]; // Off + return {bytes: [0xa8,0x01,0x06,0x01,0x06,0x20,0x03,0x00,0x00,0x06]}; // Off, to return 6-byte uplink + } + } + else if(obj["method"] === "getAL1Value" || obj["method"] === "getAL2Value") + { + return {bytes: [0x08,0xff]}; // To uplink all at+command immediately + } + + // Should not reach here + return {bytes: []}; +} \ No newline at end of file