From 187194008b8f1776a0969ff49ebf48ff0388ff42 Mon Sep 17 00:00:00 2001 From: Yoshio HANAWA Date: Sun, 7 Dec 2025 10:34:10 +0900 Subject: [PATCH] feat(presence sensor): add duration parsing and fix lightLevel mask - Parse `duration` from manufacturer data bytes 8-9 (big-endian). - Expand `lightLevel` bitmask from 0x0F to 0x1F to support observed values > 15 (e.g., 20). - Update unit tests to reflect these changes. --- switchbot/adv_parsers/presence_sensor.py | 4 +++- tests/test_adv_parser.py | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/switchbot/adv_parsers/presence_sensor.py b/switchbot/adv_parsers/presence_sensor.py index e638ff54..b44832fd 100644 --- a/switchbot/adv_parsers/presence_sensor.py +++ b/switchbot/adv_parsers/presence_sensor.py @@ -21,15 +21,17 @@ def process_presence_sensor( motion_detected = bool(mfr_data[7] & 0x40) battery_bits = (mfr_data[7] >> 2) & 0x03 battery_range = BATTERY_LEVEL_MAP.get(battery_bits, "Unknown") + duration = (mfr_data[8] << 8) + mfr_data[9] trigger_flag = mfr_data[10] led_state = bool(mfr_data[11] & 0x80) - light_level = mfr_data[11] & 0x0F + light_level = mfr_data[11] & 0x1F result = { "sequence_number": seq_number, "adaptive_state": adaptive_state, "motion_detected": motion_detected, "battery_range": battery_range, + "duration": duration, "trigger_flag": trigger_flag, "led_state": led_state, "lightLevel": light_level, diff --git a/tests/test_adv_parser.py b/tests/test_adv_parser.py index 6f6b3c84..cb89f5a5 100644 --- a/tests/test_adv_parser.py +++ b/tests/test_adv_parser.py @@ -3508,6 +3508,7 @@ def test_humidifer_with_empty_data() -> None: "adaptive_state": True, "battery": 100, "battery_range": ">=60%", + "duration": 1110, "led_state": True, "lightLevel": 12, "motion_detected": True, @@ -3805,6 +3806,7 @@ def test_adv_active(test_case: AdvTestCase) -> None: { "adaptive_state": True, "battery_range": ">=60%", + "duration": 1110, "led_state": True, "lightLevel": 12, "motion_detected": True,