From 63d42c07eb3c21f752031c95918b72f631c8e4b2 Mon Sep 17 00:00:00 2001 From: YunHorn Technology Date: Fri, 26 Jul 2024 14:04:22 +0800 Subject: [PATCH] revised decoder for chirpstack --- AS923_HK_DECODER.js | 114 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 110 insertions(+), 4 deletions(-) diff --git a/AS923_HK_DECODER.js b/AS923_HK_DECODER.js index ced6d05..aa41973 100644 --- a/AS923_HK_DECODER.js +++ b/AS923_HK_DECODER.js @@ -6,8 +6,93 @@ // for Yunhorn SmarToilets STS-O7 Occupancy/Fall Detection/Over stay sensor function Decode(fPort, data, variables) { var data = {}; - if ((fPort === 17) || (fPort === 19) || (fPort === 21)) { - data.BoardLED = bytes[0] & 0x7F; + if ((fPort === 10)) { // STS_O2_O6 V3 version 2023,pixel-network version + switch (bytes[0]) { + case 0x00: + data.LEDcolor = "Dark"; + break; + case 0x01: + data.LEDcolor = "Green"; + data.cubicleOccupyStatus = "Vacant"; + break; + case 0x02: + data.LEDcolor = "Red"; + data.cubicleOccupyStatus = "Occupied"; + break; + case 0x03: + data.LEDcolor = "Blue"; + data.cubicleOccupyStatus = "Maintenance"; + break; + case 0x04: + data.LEDcolor = "Yellow"; + data.cubicleOccupyStatus = "TBD"; + break; + case 0x05: + data.LEDcolor = "Pink"; + data.cubicleOccupyStatus = "TBD"; + break; + case 0x06: + data.LEDcolor = "Cyan"; + data.cubicleOccupyStatus = "TBD"; + break; + case 0x07: + data.LEDcolor = "White"; + data.cubicleOccupyStatus = "TBD"; + break; + case 0x08: + data.LEDcolor = "Red_Blue"; + data.cubicleOccupyStatus = "EMERGENCY"; + break; + case 0x23: + data.LEDcolor = "Red_Blue"; + data.cubicleOccupyStatus = "EMERGENCY"; + break; + case 0x20: + data.LEDcolor = "Red_Flash"; + data.cubicleOccupyStatus = "EMERGENCY"; + break; + default: + data.LEDcolor = "TBD_COLOR"; + data.cubicleOccupyStatus = "TBD_status"; + break; + } + + switch (bytes[1]) { + case 0x0: + data.workmode = "Network_mode"; + break; + case 0x01: + data.workmode = "Wired_Mode"; + break; + case 0x02: + data.workmode = "Hall_element_mode"; + break; + case 0x03: + data.workmode = "MotionDetect_mode"; + break; + case 0x04: + data.workmode = "Dual_mode"; + break; + case 0x05: + data.workmode = "Uni_Mode"; + break; + default: + data.workmode = "Unknown Mode"; + break; + } + // select only one below + // For NC(Normal Closed states + data.Sensor1_Door_Contact_Open = bytes[2] === 0 ? "Door Closed" : "Door Open"; + + // For NC(Normal Closed states + //data.Sensor1_Door_Contact_Open = bytes[3]===1?"Door Closed":"Door Open"; + + data.Sensor2_Motion_Detected = bytes[3] === 0 ? "No Motion" : "Motion Detected"; + + return { "Yunhorn_SmarToilets_data": data }; + } + else if ((fPort === 17) || (fPort === 19) || (fPort === 21)) { + data.BoardLED = ((bytes[0] & 0x7F) === 0x01) ? "ON" : "OFF"; switch (bytes[1]) { case 0x00: data.LEDcolor = "Dark"; @@ -103,6 +188,7 @@ function Decode(fPort, data, variables) { data.MotionLevel = (bytes[9] << 8 | bytes[10]); data.Unconcious_State = (bytes[11] == 0) ? "False" : "True"; + switch (bytes[12]) { case 0x0: data.Fall_Down_Detected_State = "Presence_Normal"; @@ -122,18 +208,38 @@ function Decode(fPort, data, variables) { case 0x05: data.Fall_Down_Detected_State = "Presence_Stay_Still"; break; + default: + data.Fall_Down_Detected_State = "Presence_Normal"; + break; } data.OverStay_Detected_State = (bytes[13] == 0x0) ? "False" : "True"; data.OverStay_Duration_in_Seconds = (bytes[14] << 8 | bytes[15]); data.No_Movement_Duration_in_Seconds = (bytes[16] << 8 | bytes[17]); data.Unconcious_Duration_in_Seconds = (bytes[16] << 8 | bytes[17]); + data.Fall_Down_Speed_in_m_per_s = (bytes[18]); + data.Fall_Down_Gravity_in_g = (bytes[19]); + data.SOS_PushDown_Stamp = (bytes[20] << 24 | bytes[21] << 16 | bytes[22] << 8 | bytes[23]); + var sos_start = new Date(1000 * data.SOS_PushDown_Stamp); + data.SOS_ReleaseUP_Stamp = (bytes[24] << 24 | bytes[25] << 16 | bytes[26] << 8 | bytes[27]); + var sos_stop = new Date(1000 * data.SOS_ReleaseUP_Stamp); + data.SOS_PushDown_Time = "[" + sos_start.getDate() + "." + (sos_start.getMonth() + 1) + "." + (sos_start.getFullYear()) + "] " + sos_start.getHours() + ":" + sos_start.getMinutes() + ":" + sos_start.getSeconds(); + data.SOS_ReleaseUP_Time = "[" + sos_stop.getDate() + "." + (sos_stop.getMonth() + 1) + "." + (sos_stop.getFullYear()) + "] " + sos_stop.getHours() + ":" + sos_stop.getMinutes() + ":" + sos_stop.getSeconds(); + + data.Fall_Down_Stamp = (bytes[28] << 24 | bytes[29] << 16 | bytes[30] << 8 | bytes[31]); + var fall_start = new Date(1000 * data.Fall_Down_Stamp); + data.Fall_RiseUp_Stamp = (bytes[32] << 24 | bytes[33] << 16 | bytes[34] << 8 | bytes[35]); + var fall_stop = new Date(1000 * data.Fall_RiseUp_Stamp); + data.Fall_Down_Time = "[" + fall_start.getDate() + "." + (fall_start.getMonth() + 1) + "." + (fall_start.getFullYear()) + "] " + fall_start.getHours() + ":" + fall_start.getMinutes() + ":" + fall_start.getSeconds(); + data.Fall_RiseUp_Time = "[" + fall_stop.getDate() + "." + (fall_stop.getMonth() + 1) + "." + (fall_stop.getFullYear()) + "] " + fall_stop.getHours() + ":" + fall_stop.getMinutes() + ":" + fall_stop.getSeconds(); + } return { "Yunhorn_SmarToilets_data": data }; } // Heart Beat - else if ((fPort === 20) || (fPort === 18)) { + else if ((fPort === 20) || (fPort === 18) || (fPort === 5)) { var data = {}; - data.led_state = (bytes[0] & 0x7f) === 0 ? "Off" : "On"; + //data.led_state=(bytes[0] & 0x7f) === 0 ? "Off" : "On"; + data.BoardLED = ((bytes[0] & 0x7F) === 0x01) ? "ON" : "OFF"; data.battery_level = bytes[1] + " %"; return { "Yunhorn_SmarToilets_data": data }; }