Skip to content

Commit c2a3b4f

Browse files
authored
Get last seen even if its not part of statistics (#911)
* Get last seen even if its not part of statistics * Revert broken part of change * Only convert last seen to datetime once * Move where datetime conversion happens * Small improvement * Add coverage * Test last seen in statistics
1 parent 2a71612 commit c2a3b4f

File tree

3 files changed

+17
-5
lines changed

3 files changed

+17
-5
lines changed

test/fixtures/lock_schlage_be469_state.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
}
4343
},
4444
"label": "BE469",
45+
"lastSeen": "2023-07-18T15:42:34.701Z",
4546
"neighbors": [1, 2, 3, 4, 13],
4647
"interviewAttempts": 1,
4748
"endpoints": [

test/model/test_node.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,14 @@ def test_from_state(client):
189189
assert node.last_seen == datetime(2023, 7, 18, 15, 42, 34, 701000, UTC)
190190

191191

192+
async def test_last_seen(lock_schlage_be469):
193+
"""Test last seen property."""
194+
assert lock_schlage_be469.last_seen == datetime(
195+
2023, 7, 18, 15, 42, 34, 701000, UTC
196+
)
197+
assert lock_schlage_be469.last_seen == lock_schlage_be469.statistics.last_seen
198+
199+
192200
async def test_highest_security_value(lock_schlage_be469, ring_keypad):
193201
"""Test the highest_security_class property."""
194202
assert lock_schlage_be469.highest_security_class == SecurityClass.S0_LEGACY

zwave_js_server/model/node/__init__.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ def __init__(self, client: Client, data: NodeDataType) -> None:
115115
client, data.get("statistics", DEFAULT_NODE_STATISTICS)
116116
)
117117
self._firmware_update_progress: NodeFirmwareUpdateProgress | None = None
118+
self._last_seen: datetime | None = None
118119
self.values: dict[str, ConfigurationValue | Value] = {}
119120
self.endpoints: dict[int, Endpoint] = {}
120121
self.status_event = asyncio.Event()
@@ -359,9 +360,7 @@ def keep_awake(self) -> bool:
359360
@property
360361
def last_seen(self) -> datetime | None:
361362
"""Return when the node was last seen."""
362-
if last_seen := self.data.get("lastSeen"):
363-
return datetime.fromisoformat(last_seen)
364-
return None
363+
return self._last_seen
365364

366365
@property
367366
def default_volume(self) -> int | float | None:
@@ -380,6 +379,10 @@ def update(self, data: NodeDataType) -> None:
380379
self._statistics = NodeStatistics(
381380
self.client, self.data.get("statistics", DEFAULT_NODE_STATISTICS)
382381
)
382+
if last_seen := data.get("lastSeen"):
383+
self._last_seen = datetime.fromisoformat(last_seen)
384+
if not self._statistics.last_seen:
385+
self._statistics.last_seen = self.last_seen
383386

384387
new_values_data = {
385388
_get_value_id_str_from_dict(self, val): val
@@ -1119,5 +1122,5 @@ def handle_statistics_updated(self, event: Event) -> None:
11191122
event.data["statistics_updated"] = self._statistics = NodeStatistics(
11201123
self.client, statistics
11211124
)
1122-
if last_seen := statistics.get("lastSeen"):
1123-
self.data["lastSeen"] = last_seen
1125+
if self._statistics.last_seen:
1126+
self._last_seen = self._statistics.last_seen

0 commit comments

Comments
 (0)