revised decoder for matrix 0 map

This commit is contained in:
Yunhorn 2025-05-19 12:42:18 +08:00
parent 6fb2656e32
commit c77bfc5067
1 changed files with 238 additions and 345 deletions

View File

@ -4,12 +4,21 @@
// - variables contains the device variables e.g. {"calibration": "3.5"} (both the key / value are of type string) // - variables contains the device variables e.g. {"calibration": "3.5"} (both the key / value are of type string)
// The function must return an object, e.g. {"temperature": 22.5} // The function must return an object, e.g. {"temperature": 22.5}
// //
// Yunhorn SmarToilets Sensor R20241126A01 // Yunhorn SmarToilets Sensor R20250519R01
// //
function Decode(fPort, data, variables) { function Decode(fPort, data, variables) {
var data = {}; var data = {};
data.length = bytes.length; data.length = bytes.length;
var code2color = { "0": "Dark", "1": "Green", "2": "Red", "3": "Blue", "4": "Yellow", "5": "Pink", "6": "Cyan", "7": "White" };
var code2workmode = { "0": "Network_mode", "1": "Wired_mode", "2": "Hall_element_mode", "3": "Motion_detect_mode", "4": "Dual_mode", "5": "Uni_mode" };
var code2state = { "0": "Not Occupied", "1": "Normal:Green", "2": "Warning:Yellow", "3": "Emegency:Red" };
var code2fallstate = { "0": "Presence_Normal", "1": " Presence_Fall_Down", "2": " Presence_Rising_Up", "3": " Presence_LayDown", "4": " Presence_Unconcious", "5": " Presence_Stay_Still" };
var movecode2state = { "0": " :Not Occupied", "1": " :Normal:Green", "2": " :Warning:Yellow", "3": " :Emegency:Red" };
var fallcode2state = { "0": " Not Occupied", "1": " Normal:Green", "2": " Warning:Yellow", "3": " :Emegency:Red" };
var occupancycode2state = { "0": " :Not Occupied", "1": " :Normal Occupancy:Green", "2": " :Over Time Warning:Yellow", "3": " :Over Time Emegency:Red" };
var soscode2state = { "0": " :Normal: Released ", "1": " :Emegency:SOS Pushdown" };
switch (fPort) { switch (fPort) {
// RESPOND PORT --- bottom of swith fport // RESPOND PORT --- bottom of swith fport
// case 1: // case 1:
@ -105,79 +114,20 @@ function Decode(fPort, data, variables) {
// STS_O2_O6 V3 version 2023,pixel-network version // STS_O2_O6 V3 version 2023,pixel-network version
case 10: case 10:
switch (bytes[0]) { data.LEDcolor = code2color[bytes[0]];
case 0x00: data.workmode = code2workmode[bytes[1]];
data.LEDcolor = "Dark"; data.Sensor1_Door_Contact_Open = bytes[2] === 0 ? "Door Closed" : "Door Open";
break; if (bytes[1] == 0x03) {
case 0x01: data.Sensor3_RSS_Motion = (bytes[3] === 1) ? "1:Motion Detected" : "0: Motion less";
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]) { return { "Yunhorn_SmarToilets_data": data };
case 0x0:
data.workmode = "Network_mode";
break; break;
case 0x01: case 17:
data.workmode = "Wired_Mode"; data.LEDcolor = code2color[bytes[0]];
break; data.cubicleOccupyStatus = code2state[bytes[3]];
case 0x02: data.workmode = code2workmode[bytes[1]];
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 // select only one below
// For NC (Normal Closed states) // For NC (Normal Closed states)
@ -187,9 +137,13 @@ function Decode(fPort, data, variables) {
// data.Sensor1_Door_Contact_Open = bytes[3]===1?"Door Closed":"Door Open"; // data.Sensor1_Door_Contact_Open = bytes[3]===1?"Door Closed":"Door Open";
if (bytes[1] == 0x02) //Hall_element_mode if (bytes[1] == 0x02) //Hall_element_mode
{ {
data.Sensor2_SOS_Pushed = bytes[3] === 0 ? "PushDown" : "RelaseUP"; data.Sensor2_SOS_Pushed = bytes[2] === 0 ? "PushDown" : "RelaseUP";
} else if (bytes[1] > 0x02) { } else if (bytes[1] > 0x02) {
data.Sensor2_Motion_Detected = bytes[3] === 0 ? "No Motion" : "Motion Detected"; data.Sensor1_Door_Contact = (bytes[2] === 1) ? "1:Door Open" : "0:Door Closed";
data.Sensor2_SOS_Button = (bytes[3] === 1) ? "1:SOS Released" : "0: SOS Push Down";
data.Sensor3_RSS_Motion = (bytes[4] === 1) ? "1:Motion Detected" : "0: Motion less";
data.OverStay_state = bytes[5];
data.OverStay_duration = (bytes[6] << 8 | bytes[7]) / 60 + " Min";
} }
return { "Yunhorn_SmarToilets_data": data }; return { "Yunhorn_SmarToilets_data": data };
@ -238,6 +192,9 @@ function Decode(fPort, data, variables) {
data.Battery_Level = bytes[4] + " %"; data.Battery_Level = bytes[4] + " %";
data.Payload_Size = bytes[5]; data.Payload_Size = bytes[5];
data.Presence_State = (bytes[6] == 1) ? "Occupied" : "Vacant"; data.Presence_State = (bytes[6] == 1) ? "Occupied" : "Vacant";
data.Motion_state_PIR = (bytes[7] == 1) ? "Motion" : "Motionless"; v
data.Lamp_bar_color_code = bytes[8];
data.Presence_Distance_cm = bytes[9] * 10 + " cm";
return { "Yunhorn_SmarToilets_data": data }; return { "Yunhorn_SmarToilets_data": data };
break; break;
@ -275,86 +232,72 @@ function Decode(fPort, data, variables) {
break; break;
// Heart-beat for STS-O6 occupancy sensor
case 17:
// STS-O7 Fall detection sensor
case 19: case 19:
data.header_board_led = bytes[0] & 0x7f;
data.header_mtm1 = bytes[1];
data.header_mtm2 = bytes[2];
data.header_fw = bytes[3];
data.header_battery_level = bytes[4] + " %";
data.payload_size = bytes[5];
data.payload_type = bytes[6];
switch (bytes[6]) // fall/movement/occupancy/sos status
{
case 0x01:
data.fhmos_state_fall = bytes[7] + fallcode2state[bytes[7]];
data.fhmos_state_human_movement = bytes[8] + movecode2state[bytes[8]];
data.fhmos_state_occupancy = bytes[9] + occupancycode2state[bytes[9]];
data.fhmos_state_sosbutton = bytes[10] + soscode2state[bytes[10]];
data.lamp_bar_color = bytes[11] + " - LampBar Color: " + code2color[bytes[11]];
data.sensor1_state = bytes[12] + " - Door: " + ((bytes[12] == 1) ? "Open" : "Closed");
data.sensor2_state = bytes[13] + " - TOF: " + code2state[bytes[13]];;
data.sensor3_PIR_state = bytes[14] + " - PIR: " + ((bytes[14] == 1) ? "Motion" : "No Motion");
break;
case 0x02: // fall gesture map
data.fhmos_gesture_head_height_cm = bytes[7];
data.fhmos_gesture_head_x_y = bytes[8];
data.fhmos_gesture_map1 = String.fromCharCode(bytes[9]);
data.fhmos_gesture_map2 = String.fromCharCode(bytes[10]);
data.fhmos_gesture_map3 = String.fromCharCode(bytes[11]);
data.fhmos_gesture_map4 = String.fromCharCode(bytes[12]);
data.fhmos_gesture_map5 = String.fromCharCode(bytes[13]);
data.fhmos_gesture_map6 = String.fromCharCode(bytes[14]);
data.fhmos_gesture_map7 = String.fromCharCode(bytes[15]);
data.fhmos_gesture_map8 = String.fromCharCode(bytes[16]);
var my_time_zone = 8 * 60 * 60; // (8*60*60)
data.fhmos_fall_event_utc_time = bytes[17] << 24 | bytes[18] << 16 | bytes[19] << 8 | bytes[20];
data.fhmos_fall_event_time = data.fhmos_fall_event_utc_time + my_time_zone;
var dev_date = new Date(data.fhmos_fall_event_time * 1000);
data.fhmos_fall_event_time_stamp = dev_date.getHours() + ":" + dev_date.getMinutes();
data.fhmos_fall_event_date_stamp = dev_date.getDate() + "." + (dev_date.getMonth() + 1) + "." + dev_date.getFullYear();
break;
case 0x03: // Background mask off map
data.fhmos_gesture_map1 = String.fromCharCode(bytes[7]);
data.fhmos_gesture_map2 = String.fromCharCode(bytes[8]);
data.fhmos_gesture_map3 = String.fromCharCode(bytes[9]);
data.fhmos_gesture_map4 = String.fromCharCode(bytes[10]);
data.fhmos_gesture_map5 = String.fromCharCode(bytes[11]);
data.fhmos_gesture_map6 = String.fromCharCode(bytes[12]);
data.fhmos_gesture_map7 = String.fromCharCode(bytes[13]);
data.fhmos_gesture_map8 = String.fromCharCode(bytes[14]);
break;
}
return { "Yunhorn_SmarToilets_data": data };
break;
// Heart-beat for STS-O6 occupancy sensor
// case 17:
// STS-O7 Fall detection sensor
case 21: case 21:
{ {
data.BoardLED = ((bytes[0] & 0x7F) === 0x01) ? "ON" : "OFF"; data.BoardLED = ((bytes[0] & 0x7F) === 0x01) ? "ON" : "OFF";
switch (bytes[1]) { data.LEDcolor = code2color[bytes[1]];
case 0x00: data.cubicleOccupyStatus = code2state[bytes[1]];
data.LEDcolor = "Dark"; data.workmode = code2state[bytes[2]];
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[2]) {
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 // select only one below
// For NC(Normal Closed states // For NC(Normal Closed states
data.Sensor1_Door_Contact_Open = bytes[3] === 0 ? "Door Closed" : "Door Open"; data.Sensor1_Door_Contact_Open = bytes[3] === 0 ? "Door Closed" : "Door Open";
@ -376,32 +319,8 @@ function Decode(fPort, data, variables) {
data.Sensor5_ALARM_RESET = (bytes[7] === 0) ? "Down RESET" : "NO Reset"; data.Sensor5_ALARM_RESET = (bytes[7] === 0) ? "Down RESET" : "NO Reset";
data.Distance_in_mm = (bytes[8] << 8 | bytes[9]); data.Distance_in_mm = (bytes[8] << 8 | bytes[9]);
data.MotionLevel = (bytes[10] << 8 | bytes[11]); data.MotionLevel = (bytes[10] << 8 | bytes[11]);
data.Unconcious_State = (bytes[12] == 0) ? "False" : "True"; data.Unconcious_State = (bytes[12] == 0) ? "False" : "True";
data.Fall_Down_Detected_State = code2fallstate[bytes[13]];
switch (bytes[13]) {
case 0x0:
data.Fall_Down_Detected_State = "Presence_Normal";
break;
case 0x01:
data.Fall_Down_Detected_State = "Presence_Fall_Down";
break;
case 0x02:
data.Fall_Down_Detected_State = "Presence_Rising_Up";
break;
case 0x03:
data.Fall_Down_Detected_State = "Presence_LayDown";
break;
case 0x04:
data.Fall_Down_Detected_State = "Presence_Unconcious";
break;
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[14] == 0x0) ? "False" : "True"; data.OverStay_Detected_State = (bytes[14] == 0x0) ? "False" : "True";
data.OverStay_Duration_in_Seconds = (bytes[15] << 8 | bytes[16]); data.OverStay_Duration_in_Seconds = (bytes[15] << 8 | bytes[16]);
data.No_Movement_Duration_in_Seconds = (bytes[17] << 8 | bytes[18]); data.No_Movement_Duration_in_Seconds = (bytes[17] << 8 | bytes[18]);
@ -466,8 +385,8 @@ function Decode(fPort, data, variables) {
data.HW_Code = bytes[3]; data.HW_Code = bytes[3];
data.Battery_Level = bytes[4] + " %"; data.Battery_Level = bytes[4] + " %";
data.Payload_Size = bytes[5]; data.Payload_Size = bytes[5];
data.Weight_g = (bytes[6] << 8 | bytes[7]); data.Weight_g = (bytes[6] << 24 | bytes[7]) << 16 | bytes[8] << 8 + bytes[9] + bytes[10];
data.Tare_g = (bytes[8] << 8 | bytes[9]); data.Weight_g = (bytes[6] << 24 | bytes[7]) << bytes[8] + bytes[9];
return { "Yunhorn_SmarToilets_data": data }; return { "Yunhorn_SmarToilets_data": data };
break; break;
@ -567,8 +486,19 @@ function Decode(fPort, data, variables) {
break; break;
// STS-E2 PTAQ, ODOR LEVEL Sensor // STS-E2 PTAQ, ODOR LEVEL Sensor 9-in-1
case 101: case 101:
data.Temperature = ((bytes[0] & 0x01) ? "+" : "-") + (bytes[1] + (bytes[2] / 100)) + " C";
data.Humidity = (bytes[3] + (bytes[4] / 100)) + " %RH";
data.NH3 = (bytes[5] + (bytes[6] / 100)) + " ppm";
data.H2S = (bytes[7] + bytes[8] / 100) + " ppm";
data.CH2O = (bytes[9] + (bytes[10] / 100)) + " ug/m3";
data.CO2 = (bytes[11] << 8 | bytes[12]) + " ppm";
data.TVOC = (bytes[13] << 8 | bytes[14]) + " ppm";
data.PM2_5 = ((bytes[15] << 8) | bytes[16]) + " ug/m3";
data.PM10 = ((bytes[17] << 8) | bytes[18]) + " ug/m3";
data.O3 = ((bytes[19] << 8) | bytes[20]) + " ppb";
return { "Yunhorn_SmarToilets_data": data };
break; break;
@ -630,10 +560,30 @@ function Decode(fPort, data, variables) {
return { "Yunhorn_SmarToilets_data": data }; return { "Yunhorn_SmarToilets_data": data };
break; break;
// TIME SYNC PORT
case 202:
data.TimeSyncReq = "True";
return { "Yunhorn_SmarToilets_data": data };
break;
// respond port // respond port
case 1: case 1:
switch (bytes[0]) { switch (bytes[0]) {
//AC CODE RESPONSE
case 0x41:
if ((bytes[1] == 0x43) && (data.length == 22))
data.RFAC_RESULT = "SUCCESS";
break;
// RSS background center distance and motion noise 'B'
case 0x42:
if ((bytes[6] == 0x04)) {
data.background_result = "Motion Noise Measured";
data.background_distance_center = (bytes[7] << 8 | bytes[8]) + " mm";
data.background_motion_noise = (bytes[9] << 8 | bytes[10]) + " score";
}
break;
// NVM config 'C' // NVM config 'C'
case 0x43: case 0x43:
// report current nvm config // report current nvm config
@ -666,8 +616,8 @@ function Decode(fPort, data, variables) {
data.rss_output_time_const = bytes[27] * 0.1; data.rss_output_time_const = bytes[27] * 0.1;
data.rss_downsampling_factor = bytes[28]; data.rss_downsampling_factor = bytes[28];
data.rss_power_saving_mode_active = bytes[29]; data.rss_power_saving_mode_active = bytes[29];
data.rss_reserve02 = bytes[30]; data.rss_cfg_update_flag = bytes[30];
data.rss_reserve03 = bytes[31]; data.rss_bg_noise_score = bytes[31] * 10;
data.rss_reserve04 = bytes[32]; data.rss_reserve04 = bytes[32];
data.reserve2 = bytes[33]; data.reserve2 = bytes[33];
data.reserve3 = bytes[34]; data.reserve3 = bytes[34];
@ -702,7 +652,21 @@ function Decode(fPort, data, variables) {
data.Distance_unit = "mm"; data.Distance_unit = "mm";
break; break;
// G Fall down Gesture bitmap REPORT
case 0x47:
data.head_level_cm = bytes[7];
data.head_coordination = "X: " + bytes[8] / 8 + " Y:" + bytes[8] % 8;
data.matrix0 = bytes2matrix(11, bytes);
data.matrix1 = bytes2matrix(12, bytes);
data.matrix2 = bytes2matrix(13, bytes);
data.matrix3 = bytes2matrix(14, bytes);
data.matrix4 = bytes2matrix(15, bytes);
data.matrix5 = bytes2matrix(16, bytes);
data.matrix6 = bytes2matrix(17, bytes);
data.matrix7 = bytes2matrix(18, bytes);
return
break;
// LoRa Class 'L' // LoRa Class 'L'
case 0x4c: case 0x4c:
// LoRaWAN Class A/B/C // LoRaWAN Class A/B/C
@ -742,31 +706,15 @@ function Decode(fPort, data, variables) {
case 4: case 4:
if ((data.length === 4) && (bytes[1] === 0x31) && (bytes[2] === 0x31)) { if ((data.length === 4) && (bytes[1] === 0x31) && (bytes[2] === 0x31)) {
data.Work_Mode_Switch = "OK"; data.Work_Mode_Switch = "OK";
switch (bytes[3] - 0x30) { data.workmode = code2workmode[bytes[3] - 0x30];
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;
}
} }
break;
case 6:
data.P_cmd = "Change Lamp Bar color config";
data.workmode = code2workmode[bytes[3] - 0x30];
data.color_occupy = code2color[bytes[4] - 0x30];
data.color_vacant = code2color[bytes[5] - 0x30];
break; break;
case 7: case 7:
if (bytes[3] === 0x46) { if (bytes[3] === 0x46) {
@ -842,13 +790,18 @@ function Decode(fPort, data, variables) {
// Self-Test function 'S' // Self-Test function 'S'
case 0x53: case 0x53:
if ((bytes[1] == 0x54) && (bytes[2] == 0x53)) {
data.Yunhorn_PRD = "True";
data.PRD_String = String.fromCharCode(bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6]);
} else {
// SELF TEST FUNCTION // SELF TEST FUNCTION
data.mtm_code1 = bytes[1]; data.mtm_code1 = bytes[1];
data.mtm_code2 = bytes[2]; data.mtm_code2 = bytes[2];
data.sts_verion = bytes[3]; data.sts_verion = bytes[3];
data.sts_hw_ver = bytes[4]; data.sts_hw_ver = bytes[4];
data.battery_level = bytes[5]; data.battery_level = bytes[5];
if ((bytes[6] === 0x0C)) { // report sensor install height and bitmap if ((bytes[6] === 0x0C) || (bytes[6] === 0x04)) { // report sensor install height and bitmap
data.sts_sensor_chip_model_type_ID = (bytes[7] << 8 | bytes[8]); data.sts_sensor_chip_model_type_ID = (bytes[7] << 8 | bytes[8]);
if ((bytes[7] === 0xF0) && (bytes[8] === 0x0C)) { if ((bytes[7] === 0xF0) && (bytes[8] === 0x0C)) {
data.sts_sensor_chip_model_type = "VL53L8X"; data.sts_sensor_chip_model_type = "VL53L8X";
@ -863,90 +816,24 @@ function Decode(fPort, data, variables) {
data.sts_sensor_install_height = (bytes[9] << 8 | bytes[10]); data.sts_sensor_install_height = (bytes[9] << 8 | bytes[10]);
data.sts_sensor_install_height_unit = "mm"; data.sts_sensor_install_height_unit = "mm";
//data.maskoff_bitmap= String.fromCharCode(bytes[11])+String.fromCharCode(bytes[12])+String.fromCharCode(bytes[13])+String.fromCharCode(bytes[14])+String.fromCharCode(bytes[15])+String.fromCharCode(bytes[16])+String.fromCharCode(bytes[17])+String.fromCharCode(bytes[18]); //data.maskoff_bitmap= String.fromCharCode(bytes[11])+String.fromCharCode(bytes[12])+String.fromCharCode(bytes[13])+String.fromCharCode(bytes[14])+String.fromCharCode(bytes[15])+String.fromCharCode(bytes[16])+String.fromCharCode(bytes[17])+String.fromCharCode(bytes[18]);
if (bytes[6] === 0x0c) {
var mmm = bytes[11]; data.matrix0 = bytes2matrix(11, bytes);
var con = 0x30; data.matrix1 = bytes2matrix(12, bytes);
var matrix0 = " [ "; data.matrix2 = bytes2matrix(13, bytes);
for (i = 0; i < 8; i++) { data.matrix3 = bytes2matrix(14, bytes);
con += ((mmm >> i) & 0x01); data.matrix4 = bytes2matrix(15, bytes);
matrix0 += (String.fromCharCode(con) + "__"); data.matrix5 = bytes2matrix(16, bytes);
con = 0x30; data.matrix6 = bytes2matrix(17, bytes);
data.matrix7 = bytes2matrix(18, bytes);
} }
data.matrix01 = matrix0;
mmm = bytes[12];
var con = 0x30;
var matrix0 = " [ ";
for (i = 0; i < 8; i++) {
con += ((mmm >> i) & 0x01);
matrix0 += (String.fromCharCode(con) + "__");
con = 0x30;
}
data.matrix02 = matrix0;
mmm = bytes[13];
var con = 0x30;
var matrix0 = " [ ";
for (i = 0; i < 8; i++) {
con += ((mmm >> i) & 0x01);
matrix0 += (String.fromCharCode(con) + "__");
con = 0x30;
}
data.matrix03 = matrix0;
mmm = bytes[14];
var con = 0x30;
var matrix0 = " [ ";
for (i = 0; i < 8; i++) {
con += ((mmm >> i) & 0x01);
matrix0 += (String.fromCharCode(con) + "__");
con = 0x30;
}
data.matrix04 = matrix0;
mmm = bytes[15];
var con = 0x30;
var matrix0 = " [ ";
for (i = 0; i < 8; i++) {
con += ((mmm >> i) & 0x01);
matrix0 += (String.fromCharCode(con) + "__");
con = 0x30;
}
data.matrix05 = matrix0;
mmm = bytes[16];
var con = 0x30;
var matrix0 = " [ ";
for (i = 0; i < 8; i++) {
con += ((mmm >> i) & 0x01);
matrix0 += (String.fromCharCode(con) + "__");
con = 0x30;
}
data.matrix06 = matrix0;
mmm = bytes[17];
var con = 0x30;
var matrix0 = " [ ";
for (i = 0; i < 8; i++) {
con += ((mmm >> i) & 0x01);
matrix0 += (String.fromCharCode(con) + "__");
con = 0x30;
}
data.matrix07 = matrix0;
mmm = bytes[18];
var con = 0x30;
var matrix0 = " [ ";
for (i = 0; i < 8; i++) {
con += ((mmm >> i) & 0x01);
matrix0 += (String.fromCharCode(con) + "__");
con = 0x30;
}
data.matrix08 = matrix0;
} }
else if ((bytes[6] === 0x58)) { else if ((bytes[6] === 0x58)) {
data.sts_Test_Result = "### Motion Sensor Not Detected ###"; data.sts_Test_Result = "### Motion Sensor Not Detected ###";
} else if ((bytes[6] === 0x0E)) //result length, 10 rss bytes, 4 distance bytes } else if ((bytes[6] === 0x78)) {
data.sts_Test_Result = "### Motion Sensor Detected, Yet Not Stable ###";
} else if ((bytes[6] === 0x12)) //result length=18, 12 rss bytes, 2 distance bytes 2 range bytes, 2 motion noise
{ {
data.sts_Test_Result = "Motion Sensor Test Result:"; data.sts_Test_Result = "Motion Sensor Test Result:";
data.sts_test_result_length = bytes[6]; data.sts_test_result_length = bytes[6];
@ -960,7 +847,12 @@ function Decode(fPort, data, variables) {
data.sts_rss_sub_code8 = bytes[14]; data.sts_rss_sub_code8 = bytes[14];
data.sts_rss_sub_code9 = bytes[15]; data.sts_rss_sub_code9 = bytes[15];
data.sts_rss_sub_code10 = bytes[16]; data.sts_rss_sub_code10 = bytes[16];
data.sts_sensor_install_height = String.fromCharCode(bytes[17]) + String.fromCharCode(bytes[18]) + String.fromCharCode(bytes[19]) + String.fromCharCode(bytes[20]) + " mm"; data.sts_rss_sub_code11 = bytes[17];
data.sts_rss_sub_code12 = bytes[18];
data.sts_sensor_install_height = (bytes[19] << 8 | bytes[20]) + " mm";
data.sts_rss_background_range_center = (bytes[21] << 8 | bytes[22]) + " mm";
data.sts_rss_background_motion_noise = (bytes[23] << 8 | bytes[24]) + " score";
}
} }
break; break;
@ -1018,8 +910,17 @@ function Decode(fPort, data, variables) {
data.Heart_Beat_interval = (bytes[2] - 0x30) * 10 + (bytes[3] - 0x30); data.Heart_Beat_interval = (bytes[2] - 0x30) * 10 + (bytes[3] - 0x30);
data.Heart_Beat_interval_unit = String.fromCharCode(bytes[4]); data.Heart_Beat_interval_unit = String.fromCharCode(bytes[4]);
// if sts_mtm1 == O6/O7 ....TODO XXXX // if sts_mtm1 == O6/O7 ....TODO XXXX
// data.Wakeup_sampling_interval = (bytes[2]-0x30)*10 + (bytes[3]-0x30); if (bytes[4] == 0x4C) {
// data.Unit = String.fromCharCode(bytes[4]); data.Wakeup_sampling_interval = 100 * ((bytes[2] - 0x30) * 10 + (bytes[3] - 0x30));
data.Unit = "ms";
}
break;
// YWABB
case 0x57: // W
data.RSS_Sliding_Win_CFG = "true";
data.RSS_Slid_Win_Threshold = (bytes[2] - 0x30);
data.RSS_Slid_Win_Length = (bytes[3] - 0x30) * 10 + (bytes[4] - 0x30);
break; break;
} }
@ -1045,29 +946,8 @@ function Decode(fPort, data, variables) {
} else { } else {
if ((bytes[0] === 0x50) && (bytes[1] === 0x31) && (bytes[2] === 0x31)) { if ((bytes[0] === 0x50) && (bytes[1] === 0x31) && (bytes[2] === 0x31)) {
data.Work_Mode_Switch = "OK"; data.Work_Mode_Switch = "OK";
switch (bytes[3] - 0x30) { data.workmode = code2workmode[bytes[3] - 0x30];
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;
}
} else if ((bytes[0] === 0x59) && (bytes[1] === 0x44)) //Duration interval } else if ((bytes[0] === 0x59) && (bytes[1] === 0x44)) //Duration interval
{ {
data.Uplink_interval = (bytes[2] - 0x30) * 10 + (bytes[3] - 0x30); data.Uplink_interval = (bytes[2] - 0x30) * 10 + (bytes[3] - 0x30);
@ -1123,8 +1003,8 @@ function Decode(fPort, data, variables) {
data.rss_output_time_const = bytes[27] * 0.1; data.rss_output_time_const = bytes[27] * 0.1;
data.rss_downsampling_factor = bytes[28]; data.rss_downsampling_factor = bytes[28];
data.rss_power_saving_mode_active = bytes[29]; data.rss_power_saving_mode_active = bytes[29];
data.rss_reserve02 = bytes[30]; data.rss_cfg_update_flag = bytes[30];
data.rss_reserve03 = bytes[31]; data.rss_bg_motion_noise = bytes[31] * 10;
data.rss_reserve04 = bytes[32]; data.rss_reserve04 = bytes[32];
data.reserve2 = bytes[33]; data.reserve2 = bytes[33];
data.reserve3 = bytes[34]; data.reserve3 = bytes[34];
@ -1154,6 +1034,19 @@ function Decode(fPort, data, variables) {
} }
function bytes2matrix(i, bytes) {
var mmm = bytes[i];
var con = 0x30;
var matrix0 = " [ ";
for (cc = 0; cc < 8; cc++) {
con += ((mmm >> cc) & 0x01);
matrix0 += (String.fromCharCode(con) + "__");
con = 0x30;
}
return matrix0;
}
// //
// Yunhorn SmarToilets Sensor Decoder // Yunhorn SmarToilets Sensor Decoder
// //