From a6617752ff3c0ba1aacb71da1b308e8ce5e9b28c Mon Sep 17 00:00:00 2001 From: YunHorn Technology Date: Tue, 30 Jul 2024 19:03:46 +0800 Subject: [PATCH] --- revised for hall3/hall4 --- AS923_HK_DECODER.js | 29 +++++++++++++--------- Core/Inc/main.h | 13 +++++++--- Core/Inc/yunhorn_sts_prd_conf.h | 2 +- Core/Inc/yunhorn_sts_sensors.h | 8 ++++--- Core/Src/gpio.c | 11 +++++---- Core/Src/stm32wlxx_it.c | 25 ++++++++++++++++--- Core/Src/sts_lamp_bar.c | 1 + Core/Src/yunhorn_sts_presence_rss.c | 6 ++--- Core/Src/yunhorn_sts_process.c | 36 +++++++++++++++++++++++----- LoRaWAN/App/lora_app.c | 37 ++++++++++++++++++++++------- readme.txt | 4 ++-- 11 files changed, 127 insertions(+), 45 deletions(-) diff --git a/AS923_HK_DECODER.js b/AS923_HK_DECODER.js index aa41973..6f1dba4 100644 --- a/AS923_HK_DECODER.js +++ b/AS923_HK_DECODER.js @@ -172,9 +172,9 @@ function Decode(fPort, data, variables) { // For NC(Normal Closed states //data.Sensor1_Door_Contact_Open = bytes[3]===1?"Door Closed":"Door Open"; + data.Sensor2_Emergency_Button = bytes[4] === 0 ? "Alarm Push Down" : "No Alarm, Released"; + data.Sensor3_Motion_Detected = bytes[5] === 0 ? "No Motion" : "Motion Detected"; - data.Sensor2_Motion_Detected = bytes[4] === 0 ? "No Motion" : "Motion Detected"; - data.Sensor3_Emergency_Button = bytes[5] === 0 ? "Alarm Push Down" : "No Alarm, Released"; data.length = bytes.length if (data.length === 9) { data.Over_stay_state = (bytes[6] === 0) ? "False" : "True"; @@ -219,19 +219,26 @@ function Decode(fPort, data, variables) { 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); + if (data.SOS_PushDown_Stamp != 0) { + var sos_start = new Date(1000 * data.SOS_PushDown_Stamp); + data.SOS_PushDown_Time = "[" + sos_start.getDate() + "." + (sos_start.getMonth() + 1) + "." + (sos_start.getFullYear()) + "] " + sos_start.getHours() + ":" + sos_start.getMinutes() + ":" + sos_start.getSeconds(); + } else data.SOS_PushDown_Time = "N/A"; 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(); + if (data.SOS_ReleaseUP_Stamp != 0) { + var sos_stop = new Date(1000 * data.SOS_ReleaseUP_Stamp); + data.SOS_ReleaseUP_Time = "[" + sos_stop.getDate() + "." + (sos_stop.getMonth() + 1) + "." + (sos_stop.getFullYear()) + "] " + sos_stop.getHours() + ":" + sos_stop.getMinutes() + ":" + sos_stop.getSeconds(); + } else data.SOS_ReleaseUP_Time = "N/A"; 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); + if (data.Fall_Down_Stamp != 0) { + var fall_start = new Date(1000 * data.Fall_Down_Stamp); + data.Fall_Down_Time = "[" + fall_start.getDate() + "." + (fall_start.getMonth() + 1) + "." + (fall_start.getFullYear()) + "] " + fall_start.getHours() + ":" + fall_start.getMinutes() + ":" + fall_start.getSeconds(); + } else data.Fall_RiseUp_Stamp = "N/A"; 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(); - + if (data.Fall_RiseUp_Stamp != 0) { + var fall_stop = new Date(1000 * data.Fall_RiseUp_Stamp); + data.Fall_RiseUp_Time = "[" + fall_stop.getDate() + "." + (fall_stop.getMonth() + 1) + "." + (fall_stop.getFullYear()) + "] " + fall_stop.getHours() + ":" + fall_stop.getMinutes() + ":" + fall_stop.getSeconds(); + } else data.Fall_RiseUp_Time = "N/A"; } return { "Yunhorn_SmarToilets_data": data }; } diff --git a/Core/Inc/main.h b/Core/Inc/main.h index 9483552..d59d327 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -99,15 +99,22 @@ void Error_Handler(void); #define HALL2_GPIO_Port GPIOA #define HALL2_EXTI_IRQn EXTI1_IRQn -#define HALL3_Pin GPIO_PIN_8 // ALARM RESET PIN +#define HALL3_Pin GPIO_PIN_9 // ALARM MUTE PIN #define HALL3_GPIO_Port GPIOA #define HALL3_EXTI_IRQn EXTI9_5_IRQn -#define ALARM_RESET_Pin HALL3_Pin +#define HALL4_Pin GPIO_PIN_10 // ALARM RESET PIN +#define HALL4_GPIO_Port GPIOA +#define HALL4_EXTI_IRQn EXTI15_10_IRQn + +#define ALARM_MUTE_Pin HALL3_Pin // ALARM MUTE BUTTON +#define ALARM_RESET_Pin HALL4_Pin // ALARM RESET BUTTON + #define HALL1_STATE HAL_GPIO_ReadPin(HALL1_GPIO_Port, HALL1_Pin) //DOOR CONTACT #define HALL2_STATE HAL_GPIO_ReadPin(HALL2_GPIO_Port, HALL2_Pin) //SOS BUTTON -#define HALL3_STATE HAL_GPIO_ReadPin(HALL3_GPIO_Port, HALL3_Pin) //ALARM RESET BUTTON +#define HALL3_STATE HAL_GPIO_ReadPin(HALL3_GPIO_Port, HALL3_Pin) //ALARM MUTE BUTTON +#define HALL4_STATE HAL_GPIO_ReadPin(HALL4_GPIO_Port, HALL4_Pin) //ALARM RESET BUTTON #else #define BUT1_Pin GPIO_PIN_0 diff --git a/Core/Inc/yunhorn_sts_prd_conf.h b/Core/Inc/yunhorn_sts_prd_conf.h index bc59c99..55fd30e 100644 --- a/Core/Inc/yunhorn_sts_prd_conf.h +++ b/Core/Inc/yunhorn_sts_prd_conf.h @@ -239,7 +239,7 @@ #define MajorVer 24U #define MinorVer 07U -#define SubMinorVer 26U +#define SubMinorVer 30U #define FirmwareVersion 3U #define YUNHORN_STS_MAX_NVM_CFG_SIZE 64U diff --git a/Core/Inc/yunhorn_sts_sensors.h b/Core/Inc/yunhorn_sts_sensors.h index 8ebbf36..ec541c8 100644 --- a/Core/Inc/yunhorn_sts_sensors.h +++ b/Core/Inc/yunhorn_sts_sensors.h @@ -679,10 +679,12 @@ void STS_YunhornSTSEventP8_Process(void); void OnSensor1StateChanged(void); void OnSensor2StateChanged(void); void OnSensor3StateChanged(void); -void OnSensor3AStateChanged(void); -void OnSensor3BStateChanged(void); -void OnSensor3CStateChanged(void); void OnSensor4StateChanged(void); + +void OnSensorRSS3AStateChanged(void); +void OnSensorRSS3BStateChanged(void); +void OnSensorRSS3CStateChanged(void); + uint32_t STS_Get_Date_Time_Stamp(void);//uint32_t *time_stamp, uint8_t *datetimestamp); void STS_SENSOR_MEMS_Reset(uint8_t cnt); diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c index b9bdfb9..ad7ea4d 100644 --- a/Core/Src/gpio.c +++ b/Core/Src/gpio.c @@ -88,11 +88,11 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(A111_SENSOR_INTERRUPT_GPIO_Port, &GPIO_InitStruct); -#ifdef STS_O7 - GPIO_InitStruct.Pin = HALL1_Pin|HALL2_Pin|HALL3_Pin; +#if defined(STS_O7)||defined(STS_O6)||defined(STS_O2) + GPIO_InitStruct.Pin = HALL1_Pin|HALL2_Pin|HALL3_Pin|HALL4_Pin; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; GPIO_InitStruct.Pull = GPIO_PULLUP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); #else /*Configure GPIO pins : PAPin PAPin */ @@ -116,7 +116,7 @@ void MX_GPIO_Init(void) HAL_GPIO_Init(BUT3_GPIO_Port, &GPIO_InitStruct); #endif -#ifdef STS_O7 +#if defined(STS_O7)||defined(STS_O6)||defined(STS_O2) HAL_NVIC_SetPriority(HALL1_EXTI_IRQn, 15, 0); HAL_NVIC_EnableIRQ(HALL1_EXTI_IRQn); @@ -126,6 +126,9 @@ void MX_GPIO_Init(void) HAL_NVIC_SetPriority(HALL3_EXTI_IRQn, 15, 0); HAL_NVIC_EnableIRQ(HALL3_EXTI_IRQn); + HAL_NVIC_SetPriority(HALL4_EXTI_IRQn, 15, 0); + HAL_NVIC_EnableIRQ(HALL4_EXTI_IRQn); + HAL_NVIC_SetPriority(A111_SENSOR_INTERRUPT_EXTI_IRQn, 0, 0); HAL_NVIC_EnableIRQ(A111_SENSOR_INTERRUPT_EXTI_IRQn); diff --git a/Core/Src/stm32wlxx_it.c b/Core/Src/stm32wlxx_it.c index 4046de7..8f8d6fd 100644 --- a/Core/Src/stm32wlxx_it.c +++ b/Core/Src/stm32wlxx_it.c @@ -231,7 +231,7 @@ void EXTI0_IRQHandler(void) /* USER CODE BEGIN EXTI0_IRQn 0 */ /* USER CODE END EXTI0_IRQn 0 */ -#ifdef STS_O7 +#if defined(STS_O7)||defined(STS_O6)||defined(STS_O2) //sts_reed_hall_1_changed = 1; HAL_GPIO_EXTI_IRQHandler(HALL1_Pin); #else @@ -251,7 +251,7 @@ void EXTI1_IRQHandler(void) /* USER CODE BEGIN EXTI1_IRQn 0 */ /* USER CODE END EXTI1_IRQn 0 */ -#ifdef STS_O7 +#if defined(STS_O7)||defined(STS_O6)||defined(STS_O2) //sts_reed_hall_2_changed = 1; HAL_GPIO_EXTI_IRQHandler(HALL2_Pin); #else @@ -365,7 +365,26 @@ void EXTI9_5_IRQHandler(void) /* USER CODE END EXTI9_5_IRQn 0 */ - HAL_GPIO_EXTI_IRQHandler(HALL2_Pin); + HAL_GPIO_EXTI_IRQHandler(HALL3_Pin); // GPIOA -9 + + /* USER CODE BEGIN EXTI9_5_IRQn 1 */ +#ifdef RM2 + HAL_GPIO_EXTI_IRQHandler(A111_SENSOR_INTERRUPT_Pin); +#endif + /* USER CODE END EXTI9_5_IRQn 1 */ +} + +/** + * @brief This function handles EXTI Lines [15:10] Interrupt. + */ + +void EXTI15_10_IRQHandler(void) +{ + /* USER CODE BEGIN EXTI9_5_IRQn 0 */ + + /* USER CODE END EXTI9_5_IRQn 0 */ + + HAL_GPIO_EXTI_IRQHandler(HALL4_Pin); // GPIOA -10 /* USER CODE BEGIN EXTI9_5_IRQn 1 */ #ifdef RM2 diff --git a/Core/Src/sts_lamp_bar.c b/Core/Src/sts_lamp_bar.c index d8c73f0..197ac3d 100644 --- a/Core/Src/sts_lamp_bar.c +++ b/Core/Src/sts_lamp_bar.c @@ -63,6 +63,7 @@ extern volatile uint8_t sts_occupancy_status; extern volatile uint8_t sts_reed_hall_result, sts_emergency_button_pushed; // inital 0 = close volatile uint8_t sts_hall1_read=STS_Status_Door_Open,sts_hall2_read=STS_Status_SOS_Release; // Above hall1_read == reed_hall_result, hall2_read == emergency_button +volatile uint8_t sts_hall3_read=STS_Status_Door_Open,sts_hall4_read=STS_Status_SOS_Release; extern volatile uint8_t sts_reed_hall_1_result, sts_reed_hall_2_result; extern volatile uint8_t sts_tof_result_changed_flag; diff --git a/Core/Src/yunhorn_sts_presence_rss.c b/Core/Src/yunhorn_sts_presence_rss.c index 884e182..d582dae 100644 --- a/Core/Src/yunhorn_sts_presence_rss.c +++ b/Core/Src/yunhorn_sts_presence_rss.c @@ -531,13 +531,13 @@ int sts_presence_rss_fall_rise_detection(void) if (motion_detected_count++ == 10) { motion_detected_count=0; } else { - OnSensor3CStateChanged(); + OnSensorRSS3CStateChanged(); } sts_rss_result = (average_result > 3)? 1: 0; if (sts_rss_result) { LED1_ON; - OnSensor3AStateChanged(); + OnSensorRSS3AStateChanged(); } else { LED1_OFF; @@ -550,7 +550,7 @@ int sts_presence_rss_fall_rise_detection(void) if (sts_fall_rising_detected_result) { LED1_ON; - OnSensor3BStateChanged(); + OnSensorRSS3BStateChanged(); } else { LED1_OFF; diff --git a/Core/Src/yunhorn_sts_process.c b/Core/Src/yunhorn_sts_process.c index 8bb89e6..05426fa 100644 --- a/Core/Src/yunhorn_sts_process.c +++ b/Core/Src/yunhorn_sts_process.c @@ -39,7 +39,14 @@ extern volatile sts_cfg_nvm_t sts_cfg_nvm; extern volatile uint8_t sts_ac_code[20]; +#if defined(STS_O7) +volatile uint8_t sts_work_mode = STS_UNI_MODE; +#elif defined(STS_O6) volatile uint8_t sts_work_mode = STS_DUAL_MODE; +#elif defined(STS_O2) +volatile uint8_t sts_work_mode = STS_RSS_MODE; +#endif + volatile uint8_t sts_service_mask=0; volatile uint32_t rfac_timer; volatile uint8_t sensor_data_ready=0; @@ -48,8 +55,9 @@ volatile STS_PRESENCE_SENSOR_Event_Status_t sts_o7_event_status; // GPIO reed hall pin extern volatile uint8_t sts_reed_hall_result; volatile uint8_t last_sts_reed_hall_result; -extern volatile uint8_t sts_hall1_read,sts_hall2_read, sts_hall3_read; -volatile uint8_t sts_reed_hall_1_result=STS_Status_Door_Open,sts_reed_hall_2_result=STS_Status_SOS_Release, last_sts_reed_hall_1_result=STS_Status_Door_Open, last_sts_reed_hall_2_result=STS_Status_SOS_Release,sts_reed_hall_3_result=STS_Status_Door_Open, last_sts_reed_hall_3_result=STS_Status_Door_Open; +extern volatile uint8_t sts_hall1_read,sts_hall2_read, sts_hall3_read, sts_hall4_read; +volatile uint8_t sts_reed_hall_1_result=STS_Status_Door_Open,sts_reed_hall_2_result=STS_Status_SOS_Release, last_sts_reed_hall_1_result=STS_Status_Door_Open, last_sts_reed_hall_2_result=STS_Status_SOS_Release; +volatile uint8_t sts_reed_hall_3_result=STS_Status_Door_Open, last_sts_reed_hall_3_result=STS_Status_Door_Open, sts_reed_hall_4_result=STS_Status_Door_Open, last_sts_reed_hall_4_result=STS_Status_Door_Open; volatile uint8_t sts_soap_level_state; @@ -227,6 +235,9 @@ void STS_YunhornSTSEventP1_Process(void) sts_reed_hall_3_result = HALL3_STATE;// sts_hall3_read; last_sts_reed_hall_3_result = sts_reed_hall_3_result; + sts_reed_hall_4_result = HALL4_STATE;// sts_hall3_read; + last_sts_reed_hall_4_result = sts_reed_hall_4_result; + STS_Combined_Status_Processing(); } @@ -1066,7 +1077,7 @@ void OnSensor2StateChanged(void) } /* motion sensor RSS ON-OFF */ -void OnSensor3StateChanged(void) +void OnSensorRSS3StateChanged(void) { SysTime_t sensor_event_time = SysTimeGetMcuTime(); #if 0 @@ -1093,7 +1104,7 @@ void OnSensor3StateChanged(void) } /* motion sensor A: Motion/No-Motion Detection, Unconscious Detection */ -void OnSensor3AStateChanged(void) +void OnSensorRSS3AStateChanged(void) { SysTime_t sensor_event_time = SysTimeGetMcuTime(); #if 0 @@ -1119,7 +1130,7 @@ void OnSensor3AStateChanged(void) } /* motion sensor B, Fall Detection suggestionF */ -void OnSensor3BStateChanged(void) +void OnSensorRSS3BStateChanged(void) { SysTime_t sensor_event_time = SysTimeGetMcuTime(); uint32_t time_stamp=STS_Get_Date_Time_Stamp(); @@ -1172,7 +1183,7 @@ void OnSensor3BStateChanged(void) } /* motion sensor C: Over stay detection */ -void OnSensor3CStateChanged(void) +void OnSensorRSS3CStateChanged(void) { SysTime_t sensor_event_time = SysTimeGetMcuTime(); #if 0 @@ -1197,6 +1208,19 @@ void OnSensor3CStateChanged(void) } +void OnSensor3StateChanged(void) +{ +#if 0 + SysTime_t sensor_event_time = SysTimeGetMcuTime(); + // reserved... to be finalized 2024-06-03 + + if (sts_xxx_result) + sts_o7_sensorData.event_sensor4_start_time = sensor_event_time.Seconds; + else + sts_o7_sensorData.event_sensor4_stop_time = sensor_event_time.Seconds; +#endif +} + void OnSensor4StateChanged(void) { #if 0 diff --git a/LoRaWAN/App/lora_app.c b/LoRaWAN/App/lora_app.c index bb101b9..912a8e1 100644 --- a/LoRaWAN/App/lora_app.c +++ b/LoRaWAN/App/lora_app.c @@ -53,8 +53,8 @@ extern volatile uint32_t rfac_timer; volatile uint8_t sts_ac_code[YUNHORN_STS_AC_CODE_SIZE]={0x0}; extern hmac_result_t hmac_result; -extern volatile uint8_t sts_hall1_read, sts_hall2_read; -volatile uint8_t last_sts_hall1_read=STS_Status_Door_Open, last_sts_hall2_read=STS_Status_SOS_Release, last_sts_hall3_read=STS_Status_Door_Open; +extern volatile uint8_t sts_hall1_read, sts_hall2_read, sts_hall3_read, sts_hall4_read; +volatile uint8_t last_sts_hall1_read=STS_Status_Door_Open, last_sts_hall2_read=STS_Status_SOS_Release, last_sts_hall3_read=STS_Status_Door_Open, last_sts_hall4_read=STS_Status_Door_Open ; volatile uint8_t sts_reed_hall_result =0, sts_emergency_button_pushed=0; // inital 0 = close extern volatile uint8_t sts_work_mode, sts_cloud_netcolor, sts_lamp_bar_color, sts_status_color; @@ -750,13 +750,13 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) } break; - case ALARM_RESET_Pin: - sts_hall2_read = HALL2_STATE; + case HALL3_Pin: + sts_hall3_read = HALL3_STATE; HAL_Delay(30); //de-bouncing - if (sts_hall2_read == HALL2_STATE) + if (sts_hall3_read == HALL3_STATE) { - APP_LOG(TS_OFF, VLEVEL_L, "\n\n SOS Button Read = %02x --%s\r\n", sts_hall2_read, sts_sos_status_code[sts_hall2_read]); - OnSensor2StateChanged(); + APP_LOG(TS_OFF, VLEVEL_L, "\n\n ALARM MUTE Button Read = %02x --%s\r\n", sts_hall3_read, sts_sos_status_code[sts_hall3_read]); + OnSensor3StateChanged(); //sensor_data_ready =1; //UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventP1), CFG_SEQ_Prio_0); { @@ -764,7 +764,25 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); } - last_sts_hall2_read = sts_hall2_read; + last_sts_hall3_read = sts_hall3_read; + } + break; + + case HALL4_Pin: + sts_hall4_read = HALL4_STATE; + HAL_Delay(30); //de-bouncing + if (sts_hall4_read == HALL4_STATE) + { + APP_LOG(TS_OFF, VLEVEL_L, "\n\n ALARM RESET Button Read = %02x --%s\r\n", sts_hall4_read, sts_sos_status_code[sts_hall4_read]); + OnSensor4StateChanged(); + //sensor_data_ready =1; + //UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventP1), CFG_SEQ_Prio_0); + { + STS_YunhornSTSEventP1_Process(); + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); + + } + last_sts_hall4_read = sts_hall4_read; } break; @@ -784,10 +802,11 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) case BUT2_Pin: UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaStopJoinEvent), CFG_SEQ_Prio_0); break; -#endif + case BUT3_Pin: UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaStoreContextEvent), CFG_SEQ_Prio_0); break; +#endif default: break; } diff --git a/readme.txt b/readme.txt index 3d1698e..514af8c 100644 --- a/readme.txt +++ b/readme.txt @@ -43,7 +43,7 @@ STS_O7 For Occupancy sensors 2024-06-06 before STS_FALL_DETECTION_MODE change 2024-06-17 good for sensor 1 and sensor 2 start stop timer freezed for now 2024-06-26 RTM for pixel-network STS_RSS_MODE = 3 P113 switch -****************************************************************************** - +2024-07-30 revert back ...not good for alarm so far +***************************************************************************** */