revised decoder for chirpstack

This commit is contained in:
Yunhorn 2024-07-26 14:04:22 +08:00
parent 6d2522c203
commit 63d42c07eb
1 changed files with 110 additions and 4 deletions

View File

@ -6,8 +6,93 @@
// for Yunhorn SmarToilets STS-O7 Occupancy/Fall Detection/Over stay sensor // for Yunhorn SmarToilets STS-O7 Occupancy/Fall Detection/Over stay sensor
function Decode(fPort, data, variables) { function Decode(fPort, data, variables) {
var data = {}; var data = {};
if ((fPort === 17) || (fPort === 19) || (fPort === 21)) { if ((fPort === 10)) { // STS_O2_O6 V3 version 2023,pixel-network version
data.BoardLED = bytes[0] & 0x7F; 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]) { switch (bytes[1]) {
case 0x00: case 0x00:
data.LEDcolor = "Dark"; data.LEDcolor = "Dark";
@ -103,6 +188,7 @@ function Decode(fPort, data, variables) {
data.MotionLevel = (bytes[9] << 8 | bytes[10]); data.MotionLevel = (bytes[9] << 8 | bytes[10]);
data.Unconcious_State = (bytes[11] == 0) ? "False" : "True"; data.Unconcious_State = (bytes[11] == 0) ? "False" : "True";
switch (bytes[12]) { switch (bytes[12]) {
case 0x0: case 0x0:
data.Fall_Down_Detected_State = "Presence_Normal"; data.Fall_Down_Detected_State = "Presence_Normal";
@ -122,18 +208,38 @@ function Decode(fPort, data, variables) {
case 0x05: case 0x05:
data.Fall_Down_Detected_State = "Presence_Stay_Still"; data.Fall_Down_Detected_State = "Presence_Stay_Still";
break; break;
default:
data.Fall_Down_Detected_State = "Presence_Normal";
break;
} }
data.OverStay_Detected_State = (bytes[13] == 0x0) ? "False" : "True"; data.OverStay_Detected_State = (bytes[13] == 0x0) ? "False" : "True";
data.OverStay_Duration_in_Seconds = (bytes[14] << 8 | bytes[15]); data.OverStay_Duration_in_Seconds = (bytes[14] << 8 | bytes[15]);
data.No_Movement_Duration_in_Seconds = (bytes[16] << 8 | bytes[17]); data.No_Movement_Duration_in_Seconds = (bytes[16] << 8 | bytes[17]);
data.Unconcious_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 }; return { "Yunhorn_SmarToilets_data": data };
} }
// Heart Beat // Heart Beat
else if ((fPort === 20) || (fPort === 18)) { else if ((fPort === 20) || (fPort === 18) || (fPort === 5)) {
var data = {}; 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] + " %"; data.battery_level = bytes[1] + " %";
return { "Yunhorn_SmarToilets_data": data }; return { "Yunhorn_SmarToilets_data": data };
} }