Skip to content

Commit 0e70089

Browse files
committed
Change sensitivity_level to int
as the Scan will be sent a number for the level
1 parent 50bb816 commit 0e70089

File tree

2 files changed

+35
-54
lines changed

2 files changed

+35
-54
lines changed

plugwise_usb/nodes/scan.py

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,7 @@
99
import logging
1010
from typing import Any, Final
1111

12-
from ..api import (
13-
MotionConfig,
14-
MotionSensitivity,
15-
MotionState,
16-
NodeEvent,
17-
NodeFeature,
18-
NodeType,
19-
)
12+
from ..api import MotionConfig, MotionState, NodeEvent, NodeFeature, NodeType
2013
from ..connection import StickController
2114
from ..constants import MAX_UINT_2
2215
from ..exceptions import MessageError, NodeError, NodeTimeout
@@ -43,27 +36,32 @@
4336

4437
# region Defaults for Scan Devices
4538

39+
# Sensitivity values for motion sensor configuration
40+
HIGH: Final[str] = "HIGH"
41+
MEDIUM: Final[str] = "MEDIUM"
42+
OFF: Final[str] = "OFF"
43+
MOTION_SENSITIVITY: Final[dict] = {
44+
HIGH: 20, # 0x14
45+
MEDIUM: 30, # 0x1E
46+
OFF: 255, # 0xFF
47+
}
48+
4649
DEFAULT_MOTION_STATE: Final = False
4750

4851
# Time in minutes the motion sensor should not sense motion to
4952
# report "no motion" state [Source: 1min - 4uur]
5053
DEFAULT_RESET_TIMER: Final = 10
5154

5255
# Default sensitivity of the motion sensors
53-
DEFAULT_SENSITIVITY: Final = MotionSensitivity.MEDIUM
56+
DEFAULT_SENSITIVITY = MOTION_SENSITIVITY[MEDIUM]
5457

5558
# Light override
5659
DEFAULT_DAYLIGHT_MODE: Final = False
5760

5861
# Default firmware if not known
5962
DEFAULT_FIRMWARE: Final = datetime(2010, 11, 4, 16, 58, 46, tzinfo=UTC)
6063

61-
# Sensitivity values for motion sensor configuration
62-
SENSITIVITY_MAP: Final = {
63-
MotionSensitivity.HIGH: 20, # 0x14
64-
MotionSensitivity.MEDIUM: 30, # 0x1E
65-
MotionSensitivity.OFF: 255, # 0xFF
66-
}
64+
6765

6866
# Scan Features
6967
SCAN_FEATURES: Final = (
@@ -204,12 +202,12 @@ def _reset_timer_from_cache(self) -> int | None:
204202
return int(reset_timer)
205203
return None
206204

207-
def _sensitivity_level_from_cache(self) -> MotionSensitivity | None:
205+
def _sensitivity_level_from_cache(self) -> str | None:
208206
"""Load sensitivity level from cache."""
209207
if (
210208
sensitivity_level := self._get_cache(CACHE_SCAN_CONFIG_SENSITIVITY)
211209
) is not None:
212-
return MotionSensitivity[sensitivity_level]
210+
return MOTION_SENSITIVITY[sensitivity_level]
213211
return None
214212

215213
def _motion_config_dirty_from_cache(self) -> bool:
@@ -278,7 +276,7 @@ def reset_timer(self) -> int:
278276
return DEFAULT_RESET_TIMER
279277

280278
@property
281-
def sensitivity_level(self) -> MotionSensitivity:
279+
def sensitivity_level(self) -> int:
282280
"""Sensitivity level of motion sensor."""
283281
if self._motion_config.sensitivity_level is not None:
284282
return self._motion_config.sensitivity_level
@@ -330,7 +328,7 @@ async def set_motion_reset_timer(self, minutes: int) -> bool:
330328
await self._scan_configure_update()
331329
return True
332330

333-
async def set_motion_sensitivity_level(self, level: MotionSensitivity) -> bool:
331+
async def set_motion_sensitivity_level(self, level: int) -> bool:
334332
"""Configure the motion sensitivity level."""
335333
_LOGGER.debug(
336334
"set_motion_sensitivity_level | Device %s | %s -> %s",
@@ -445,14 +443,11 @@ async def _configure_scan_task(self) -> bool:
445443
async def scan_configure(self) -> bool:
446444
"""Configure Scan device settings. Returns True if successful."""
447445
# Default to medium
448-
sensitivity_value = SENSITIVITY_MAP.get(
449-
self._motion_config.sensitivity_level, MotionSensitivity.MEDIUM
450-
)
451446
request = ScanConfigureRequest(
452447
self._send,
453448
self._mac_in_bytes,
454449
self._motion_config.reset_timer,
455-
sensitivity_value,
450+
self._motion_config.sensitivity_value,
456451
self._motion_config.daylight_mode,
457452
)
458453
if (response := await request.send()) is None:
@@ -482,7 +477,7 @@ async def _scan_configure_update(self) -> None:
482477
CACHE_SCAN_CONFIG_RESET_TIMER, str(self._motion_config.reset_timer)
483478
)
484479
self._set_cache(
485-
CACHE_SCAN_CONFIG_SENSITIVITY, self._motion_config.sensitivity_level.name
480+
CACHE_SCAN_CONFIG_SENSITIVITY, self._motion_config.sensitivity_level
486481
)
487482
self._set_cache(
488483
CACHE_SCAN_CONFIG_DAYLIGHT_MODE, str(self._motion_config.daylight_mode)

tests/test_usb.py

Lines changed: 16 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1827,10 +1827,7 @@ async def load_callback(event: pw_api.NodeEvent, mac: str) -> None: # type: ign
18271827

18281828
with pytest.raises(pw_exceptions.NodeError):
18291829
assert (
1830-
await test_node.set_motion_sensitivity_level(
1831-
pw_api.MotionSensitivity.HIGH
1832-
)
1833-
is not None
1830+
await test_node.set_motion_sensitivity_level(20) is not None
18341831
)
18351832

18361833
with pytest.raises(pw_exceptions.NodeError):
@@ -1863,10 +1860,7 @@ async def load_callback(event: pw_api.NodeEvent, mac: str) -> None: # type: ign
18631860

18641861
with pytest.raises(pw_exceptions.FeatureError):
18651862
assert (
1866-
await test_node.set_motion_sensitivity_level(
1867-
pw_api.MotionSensitivity.HIGH
1868-
)
1869-
is not None
1863+
await test_node.set_motion_sensitivity_level(20) is not None
18701864
)
18711865

18721866
with pytest.raises(pw_exceptions.FeatureError):
@@ -1895,10 +1889,7 @@ async def load_callback(event: pw_api.NodeEvent, mac: str) -> None: # type: ign
18951889
assert await test_node.set_motion_daylight_mode(True) is not None
18961890
with pytest.raises(NotImplementedError):
18971891
assert (
1898-
await test_node.set_motion_sensitivity_level(
1899-
pw_api.MotionSensitivity.HIGH
1900-
)
1901-
is not None
1892+
await test_node.set_motion_sensitivity_level(20) is not None
19021893
)
19031894
with pytest.raises(NotImplementedError):
19041895
assert await test_node.set_motion_reset_timer(5) is not None
@@ -2117,25 +2108,25 @@ def fake_cache(dummy: object, setting: str) -> str | bool | None: # noqa: PLR09
21172108
if setting == pw_node.CACHE_NODE_INFO_TIMESTAMP:
21182109
return "2024-12-7-1-0-0"
21192110
if setting == pw_sed.CACHE_SED_AWAKE_DURATION:
2120-
return "20"
2111+
return 20
21212112
if setting == pw_sed.CACHE_SED_CLOCK_INTERVAL:
2122-
return "12600"
2113+
return 12600
21232114
if setting == pw_sed.CACHE_SED_CLOCK_SYNC:
21242115
return True
21252116
if setting == pw_sed.CACHE_SED_DIRTY:
21262117
return False
21272118
if setting == pw_sed.CACHE_SED_MAINTENANCE_INTERVAL:
2128-
return "60"
2119+
return 60
21292120
if setting == pw_sed.CACHE_SED_SLEEP_DURATION:
2130-
return "60"
2121+
return 60
21312122
if setting == pw_scan.CACHE_SCAN_MOTION_STATE:
21322123
return False
21332124
if setting == pw_scan.CACHE_SCAN_MOTION_TIMESTAMP:
21342125
return "2024-12-6-1-0-0"
21352126
if setting == pw_scan.CACHE_SCAN_CONFIG_RESET_TIMER:
2136-
return "10"
2127+
return 10
21372128
if setting == pw_scan.CACHE_SCAN_CONFIG_SENSITIVITY:
2138-
return "MEDIUM"
2129+
return 30
21392130
if setting == pw_scan.CACHE_SCAN_CONFIG_DAYLIGHT_MODE:
21402131
return False
21412132
if setting == pw_scan.CACHE_SCAN_CONFIG_DIRTY:
@@ -2237,17 +2228,14 @@ async def load_callback(event: pw_api.NodeEvent, mac: str) -> None: # type: ign
22372228
assert test_scan.motion_config.daylight_mode
22382229

22392230
# test motion sensitivity level
2240-
assert test_scan.sensitivity_level == pw_api.MotionSensitivity.MEDIUM
2231+
assert test_scan.sensitivity_level == 30
22412232
assert (
2242-
test_scan.motion_config.sensitivity_level == pw_api.MotionSensitivity.MEDIUM
2243-
)
2244-
assert not await test_scan.set_motion_sensitivity_level(
2245-
pw_api.MotionSensitivity.MEDIUM
2233+
test_scan.motion_config.sensitivity_level == 30
22462234
)
2235+
assert not await test_scan.set_motion_sensitivity_level(30)
2236+
22472237
assert not test_scan.motion_config.dirty
2248-
assert await test_scan.set_motion_sensitivity_level(
2249-
pw_api.MotionSensitivity.HIGH
2250-
)
2238+
assert await test_scan.set_motion_sensitivity_level(20)
22512239
assert test_scan.motion_config.dirty
22522240
awake_response4 = pw_responses.NodeAwakeResponse()
22532241
awake_response4.deserialize(
@@ -2259,10 +2247,8 @@ async def load_callback(event: pw_api.NodeEvent, mac: str) -> None: # type: ign
22592247
await test_scan._awake_response(awake_response4) # pylint: disable=protected-access
22602248
await asyncio.sleep(0.001) # Ensure time for task to be executed
22612249
assert not test_scan.motion_config.dirty
2262-
assert test_scan.sensitivity_level == pw_api.MotionSensitivity.HIGH
2263-
assert (
2264-
test_scan.motion_config.sensitivity_level == pw_api.MotionSensitivity.HIGH
2265-
)
2250+
assert test_scan.sensitivity_level == 20
2251+
assert test_scan.motion_config.sensitivity_level == 20
22662252

22672253
# scan with cache enabled
22682254
mock_stick_controller.send_response = None

0 commit comments

Comments
 (0)