Uplink Decoder:
// 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: // - output = Object representing the decoded payload. function decodeUplink(input) { return { data: Decode(input.fPort, input.bytes, input.variables) }; } function get_user_mode(input) { var user_mode = input[9] & 0x7; switch (user_mode) { case 0: return "Valve_Position"; case 1: return "RESERVED"; case 2: return "SP_Ambient_Temperature"; case 3: return "Detecting_Opening_Point"; case 4: return "Slow_Harvesting"; case 5: return "Temperature_Drop"; case 6: return "Freeze_Protect"; case 7: return "Forced_Heating"; default: return "Unknown Operating Mode"; } } function get_user_value(input) { var user_mode = get_user_mode(input); switch (user_mode) { case "Valve_Position": case "Freeze_Protect": case "Forced_Heating": return input[10]; case "SP_Ambient_Temperature": return input[10] * 0.5; case "Detecting_Opening_Point": case "Slow_Harvesting": return input[10] * 0.25; default: return "Invalid User Mode"; } } function decode_port_1(input) { var output = { Current_Valve_Position: input[0], Flow_Sensor_Raw: input[1] * 0.5, Flow_Temperature: input[2] * 0.5, Ambient_Sensor_Raw: input[3] * 0.25, Ambient_Temperature: input[4] * 0.25, Temperature_Drop_Detection: input[5] >> 7 & 0x01, Energy_Storage: input[5] >> 6 & 0x01, Harvesting_Active: input[5] >> 5 & 0x01, Ambient_Sensor_Failure: input[5] >> 4 & 0x01, Flow_Sensor_Failure: input[5] >> 3 & 0x01, Radio_Communication_Error: input[5] >> 2 & 0x01, Received_Signal_Strength: input[5] >> 1 & 0x01, Motor_Error: input[5] >> 0 & 0x01, Storage_Voltage: Number((input[6] * 0.02).toFixed(2)), Average_Current_Consumed: input[7] * 10, Average_Current_Generated: input[8] * 10, Operating_Condition: input[9] >> 7 & 0x01, Storage_Fully_Charged: input[9] >> 6 & 0x01, Zero_Error: input[9] >> 5 & 0x01, Calibration_OK: input[9] >> 4 & 0x01, } output.User_Mode = get_user_mode(input); output.User_Value = get_user_value(input); if (input.length == 12) { utmp = input[11] * 0.25; output.Used_Temperature = utmp; } return output; } function Decode(fPort, bytes) { var output = {}; switch (fPort) { case 1: output = decode_port_1(bytes); break; default: return { errors: ['unknown FPort'], }; } return output; }
Downlink Encoder:
// Encode downlink function. // // Input is an object with the following fields: // - output = 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 encoded = []; if ("Valve_Position" in input.data) { var new_vp = input.data.Valve_Position; encoded = [new_vp, 0x00, 0x26, 0x00, 0x00, 0x00]; } if ("Set_Point_Ambient_Temperature" in input.data) { var new_spt = (input.data.Set_Point_Ambient_Temperature) * 2; encoded = [new_spt, 0x00, 0x26, 0x08, 0x00, 0x00]; } return { bytes: encoded }; }
Downlink Encoder Example:
{"Set_Point_Ambient_Temperature":22} {"Valve_Position":100}