Skip to content

Commit 6eb50d9

Browse files
authored
Merge pull request #203 from plugwise/improve-async
Output node_info.version as recognizable data
2 parents cb985f4 + d56f2fe commit 6eb50d9

File tree

5 files changed

+50
-41
lines changed

5 files changed

+50
-41
lines changed

plugwise_usb/constants.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -58,26 +58,26 @@
5858
"038500": "Stick",
5959
"070085": "Stick",
6060
"120002": "Stick Legrand",
61-
"120041": "Circle+ Legrand type E",
62-
"120000": "Circle+ Legrand type F",
63-
"090000": "Circle+ type B",
64-
"090007": "Circle+ type B",
65-
"090088": "Circle+ type E",
66-
"070073": "Circle+ type F",
67-
"090048": "Circle+ type G",
61+
"120041": "Circle + Legrand type E",
62+
"120000": "Circle + Legrand type F",
63+
"090000": "Circle + type B",
64+
"090007": "Circle + type B",
65+
"090088": "Circle + type E",
66+
"070073": "Circle + type F",
67+
"090048": "Circle + type G",
68+
"090188": "Stealth +",
6869
"120049": "Stealth M+",
69-
"090188": "Stealth+",
70+
"120029": "Stealth Legrand",
71+
"100025": "Circle",
7072
"120040": "Circle Legrand type E",
7173
"120001": "Circle Legrand type F",
7274
"090079": "Circle type B",
7375
"090087": "Circle type E",
7476
"070140": "Circle type F",
7577
"090093": "Circle type G",
76-
"100025": "Circle",
77-
"120048": "Stealth M",
78-
"120029": "Stealth Legrand",
7978
"090011": "Stealth",
8079
"001200": "Stealth",
80+
"120048": "Stealth M",
8181
"080007": "Scan",
8282
"110028": "Scan Legrand",
8383
"070030": "Sense",

plugwise_usb/helpers/util.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,21 @@ def validate_mac(mac: str) -> bool:
2121
return True
2222

2323

24-
def version_to_model(version: str | None) -> str:
24+
def version_to_model(version: str | None) -> tuple[str|None, str]:
2525
"""Translate hardware_version to device type."""
2626
if version is None:
27-
return "Unknown"
27+
return (None, "Unknown")
28+
local_version = version
2829
model = HW_MODELS.get(version)
2930
if model is None:
30-
model = HW_MODELS.get(version[4:10])
31+
local_version = version[4:10]
32+
model = HW_MODELS.get(local_version)
3133
if model is None:
3234
# Try again with reversed order
33-
model = HW_MODELS.get(version[-2:] + version[-4:-2] + version[-6:-4])
35+
local_version = version[-2:] + version[-4:-2] + version[-6:-4]
36+
model = HW_MODELS.get(local_version)
3437

35-
return model if model is not None else "Unknown"
38+
return (local_version, model) if model is not None else (None, "Unknown")
3639

3740

3841
# octals (and hex) type as int according to

plugwise_usb/nodes/node.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -499,20 +499,26 @@ async def update_node_details(
499499
complete = False
500500
else:
501501
if self._node_info.version != hardware:
502-
self._node_info.version = hardware
503502
# Generate modelname based on hardware version
504-
model_info = version_to_model(hardware).split(" ")
503+
hardware, model_info = version_to_model(hardware)
504+
model_info = model_info.split(" ")
505505
self._node_info.model = model_info[0]
506+
# Handle + devices
507+
if len(model_info) > 1 and "+" in model_info[1]:
508+
self._node_info.model = model_info[0] + " " + model_info[1]
509+
model_info[0] = self._node_info.model
510+
model_info.pop(1)
511+
512+
self._node_info.version = hardware
506513
if self._node_info.model == "Unknown":
507514
_LOGGER.warning(
508515
"Failed to detect hardware model for %s based on '%s'",
509516
self.mac,
510517
hardware,
511518
)
519+
self._node_info.model_type = None
512520
if len(model_info) > 1:
513521
self._node_info.model_type = " ".join(model_info[1:])
514-
else:
515-
self._node_info.model_type = ""
516522
if self._node_info.model is not None:
517523
self._node_info.name = f"{model_info[0]} {self._node_info.mac[-5:]}"
518524
self._set_cache(CACHE_HARDWARE, hardware)

tests/stick_test_data.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
+ b"00044280" # log address 20
4848
+ b"01" # relay
4949
+ b"01" # hz
50-
+ b"000000730007" # hw_ver
50+
+ b"000000730007" # hw_ver
5151
+ b"4E0843A9" # fw_ver
5252
+ b"01", # node_type (Circle+)
5353
),
@@ -445,7 +445,7 @@
445445
+ b"000442C0" # log address 44000
446446
+ b"01" # relay
447447
+ b"01" # hz
448-
+ b"000000070140" # hw_ver
448+
+ b"000007014000" # hw_ver
449449
+ b"4E0844C2" # fw_ver
450450
+ b"02", # node_type (Circle)
451451
),
@@ -458,7 +458,7 @@
458458
+ b"00044300" # log address
459459
+ b"01" # relay
460460
+ b"01" # hz
461-
+ b"000000090011" # hw_ver
461+
+ b"000009001100" # hw_ver
462462
+ b"4EB28FD5" # fw_ver
463463
+ b"09", # node_type (Stealth - Legrand)
464464
),
@@ -495,7 +495,7 @@
495495
+ b"00044340" # log address
496496
+ b"01" # relay
497497
+ b"01" # hz
498-
+ b"000000070073" # hw_ver
498+
+ b"000007007300" # hw_ver
499499
+ b"4DCCDB7B" # fw_ver
500500
+ b"02", # node_type (Circle)
501501
),
@@ -508,7 +508,7 @@
508508
+ b"000443C0" # log address
509509
+ b"01" # relay
510510
+ b"01" # hz
511-
+ b"000000070073" # hw_ver
511+
+ b"000007007300" # hw_ver
512512
+ b"4E0844C2" # fw_ver
513513
+ b"02", # node_type (Circle)
514514
),
@@ -654,7 +654,7 @@
654654
+ b"00000000" # log address
655655
+ b"00" # relay
656656
+ b"01" # hz
657-
+ b"000000070008" # hw_ver
657+
+ b"000008000700" # hw_ver
658658
+ b"4E084590" # fw_ver
659659
+ b"06", # node_type (Scan)
660660
),

tests/test_usb.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -586,9 +586,9 @@ async def test_stick_node_discovered_subscription(
586586
assert stick.nodes["5555555555555555"].node_info.firmware == dt(
587587
2011, 6, 27, 8, 55, 44, tzinfo=UTC
588588
)
589-
assert stick.nodes["5555555555555555"].node_info.version == "000000070008"
589+
assert stick.nodes["5555555555555555"].node_info.version == "080007"
590590
assert stick.nodes["5555555555555555"].node_info.model == "Scan"
591-
assert stick.nodes["5555555555555555"].node_info.model_type == ""
591+
assert stick.nodes["5555555555555555"].node_info.model_type == None
592592
assert stick.nodes["5555555555555555"].available
593593
assert stick.nodes["5555555555555555"].node_info.is_battery_powered
594594
assert sorted(stick.nodes["5555555555555555"].features) == sorted(
@@ -1466,7 +1466,7 @@ async def test_creating_request_messages(self) -> None:
14661466

14671467
@pytest.mark.asyncio
14681468
async def test_stick_network_down(self, monkeypatch: pytest.MonkeyPatch) -> None:
1469-
"""Testing timeout circle+ discovery."""
1469+
"""Testing timeout Circle + discovery."""
14701470
mock_serial = MockSerial(
14711471
{
14721472
b"\x05\x05\x03\x03000AB43C\r\n": (
@@ -2393,14 +2393,14 @@ async def test_node_discovery_and_load(
23932393
assert len(stick.nodes) == 6
23942394

23952395
assert stick.nodes["0098765432101234"].is_loaded
2396-
assert stick.nodes["0098765432101234"].name == "Circle+ 01234"
2396+
assert stick.nodes["0098765432101234"].name == "Circle + 01234"
23972397
assert stick.nodes["0098765432101234"].node_info.firmware == dt(
23982398
2011, 6, 27, 8, 47, 37, tzinfo=UTC
23992399
)
2400-
assert stick.nodes["0098765432101234"].node_info.version == "000000730007"
2401-
assert stick.nodes["0098765432101234"].node_info.model == "Circle+"
2400+
assert stick.nodes["0098765432101234"].node_info.version == "070073"
2401+
assert stick.nodes["0098765432101234"].node_info.model == "Circle +"
24022402
assert stick.nodes["0098765432101234"].node_info.model_type == "type F"
2403-
assert stick.nodes["0098765432101234"].node_info.name == "Circle+ 01234"
2403+
assert stick.nodes["0098765432101234"].node_info.name == "Circle + 01234"
24042404
assert stick.nodes["0098765432101234"].available
24052405
assert not stick.nodes["0098765432101234"].node_info.is_battery_powered
24062406
assert not stick.nodes["0098765432101234"].is_battery_powered
@@ -2472,8 +2472,8 @@ async def test_node_discovery_and_load(
24722472
assert state[pw_api.NodeFeature.INFO].firmware == dt(
24732473
2011, 6, 27, 8, 47, 37, tzinfo=UTC
24742474
)
2475-
assert state[pw_api.NodeFeature.INFO].name == "Circle+ 01234"
2476-
assert state[pw_api.NodeFeature.INFO].model == "Circle+"
2475+
assert state[pw_api.NodeFeature.INFO].name == "Circle + 01234"
2476+
assert state[pw_api.NodeFeature.INFO].model == "Circle +"
24772477
assert state[pw_api.NodeFeature.INFO].model_type == "type F"
24782478
assert state[pw_api.NodeFeature.INFO].node_type == pw_api.NodeType.CIRCLE_PLUS
24792479
assert (
@@ -2482,7 +2482,7 @@ async def test_node_discovery_and_load(
24822482
)
24832483
== get_state_timestamp
24842484
)
2485-
assert state[pw_api.NodeFeature.INFO].version == "000000730007"
2485+
assert state[pw_api.NodeFeature.INFO].version == "070073"
24862486

24872487
assert state[pw_api.NodeFeature.RELAY].state
24882488

@@ -2495,7 +2495,7 @@ async def test_node_discovery_and_load(
24952495
assert state[pw_api.NodeFeature.INFO].mac == "1111111111111111"
24962496
assert state[pw_api.NodeFeature.INFO].zigbee_address == 0
24972497
assert not state[pw_api.NodeFeature.INFO].is_battery_powered
2498-
assert state[pw_api.NodeFeature.INFO].version == "000000070140"
2498+
assert state[pw_api.NodeFeature.INFO].version == "070140"
24992499
assert state[pw_api.NodeFeature.INFO].node_type == pw_api.NodeType.CIRCLE
25002500
assert (
25012501
state[pw_api.NodeFeature.INFO].timestamp.replace(
@@ -2529,9 +2529,9 @@ async def test_node_discovery_and_load(
25292529
assert stick.nodes["5555555555555555"].node_info.firmware == dt(
25302530
2011, 6, 27, 8, 55, 44, tzinfo=UTC
25312531
)
2532-
assert stick.nodes["5555555555555555"].node_info.version == "000000070008"
2532+
assert stick.nodes["5555555555555555"].node_info.version == "080007"
25332533
assert stick.nodes["5555555555555555"].node_info.model == "Scan"
2534-
assert stick.nodes["5555555555555555"].node_info.model_type == ""
2534+
assert stick.nodes["5555555555555555"].node_info.model_type == None
25352535
assert stick.nodes["5555555555555555"].available
25362536
assert stick.nodes["5555555555555555"].node_info.is_battery_powered
25372537
assert sorted(stick.nodes["5555555555555555"].features) == sorted(
@@ -2594,9 +2594,9 @@ async def test_node_discovery_and_load(
25942594
assert stick.nodes["8888888888888888"].node_info.firmware == dt(
25952595
2011, 6, 27, 9, 4, 10, tzinfo=UTC
25962596
)
2597-
assert stick.nodes["8888888888888888"].node_info.version == "000007005100"
2597+
assert stick.nodes["8888888888888888"].node_info.version == "070051"
25982598
assert stick.nodes["8888888888888888"].node_info.model == "Switch"
2599-
assert stick.nodes["8888888888888888"].node_info.model_type == ""
2599+
assert stick.nodes["8888888888888888"].node_info.model_type == None
26002600
assert stick.nodes["8888888888888888"].available
26012601
assert stick.nodes["8888888888888888"].node_info.is_battery_powered
26022602
assert sorted(stick.nodes["8888888888888888"].features) == sorted(

0 commit comments

Comments
 (0)