Skip to content

Commit 3703942

Browse files
authored
Fix node state and values (#69)
1 parent cbb54de commit 3703942

File tree

2 files changed

+20
-40
lines changed

2 files changed

+20
-40
lines changed

zwave_js_server/model/node.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ def status(self) -> int:
9999
@property
100100
def ready(self) -> Optional[bool]:
101101
"""Return the ready."""
102-
return self.data.get("ready") # TODO: I can't find ready in the docs.
102+
return self.data.get("ready")
103103

104104
@property
105105
def device_class(self) -> DeviceClass:
@@ -314,6 +314,13 @@ def handle_interview_failed(self, event: Event) -> None:
314314

315315
def handle_ready(self, event: Event) -> None:
316316
"""Process a node ready event."""
317+
# the event contains a full dump of the node
318+
self.data.update(event.data["nodeState"])
319+
# update/add values
320+
for value_state in event.data["nodeState"]["values"]:
321+
value_id = get_value_id(self, value_state)
322+
value = self.values.get(value_id, Value(self, value_state))
323+
value.update(value_state)
317324

318325
def handle_value_added(self, event: Event) -> None:
319326
"""Process a node value added event."""
@@ -324,27 +331,20 @@ def handle_value_updated(self, event: Event) -> None:
324331
"""Process a node value updated event."""
325332
value = self.values.get(get_value_id(self, event.data["args"]))
326333
if value is None:
327-
# TODO decide how to handle value updated for unknown values
328-
print()
329-
print(
330-
"Value updated for unknown value",
331-
get_value_id(self, event.data["args"]),
332-
)
333-
print("Available value IDs", ", ".join(self.values))
334-
print()
335-
value = Value(self, event.data["args"])
336-
self.values[value.value_id] = value
334+
# received update for unknown value
335+
# should not happen but just in case, treat like added value
336+
self.handle_value_added(event)
337337
else:
338338
value.receive_event(event)
339-
event.data["value"] = value
339+
event.data["value"] = value
340340

341341
def handle_value_removed(self, event: Event) -> None:
342342
"""Process a node value removed event."""
343343
event.data["value"] = self.values.pop(get_value_id(self, event.data["args"]))
344344

345345
def handle_value_notification(self, event: Event) -> None:
346346
"""Process a node value notification event."""
347-
event.data["notification"] = ValueNotification.from_event(event)
347+
event.data["notification"] = ValueNotification(self, event.data["args"])
348348

349349
def handle_metadata_updated(self, event: Event) -> None:
350350
"""Process a node metadata updated event."""

zwave_js_server/model/value.py

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
"""Provide a model for the Z-Wave JS value."""
2-
from dataclasses import dataclass
32
from typing import TYPE_CHECKING, Any, Dict, Optional, TypedDict, Union
43

54
from ..event import Event
@@ -178,36 +177,17 @@ def receive_event(self, event: Event) -> None:
178177
self.data.update(event.data["args"])
179178
self._value = event.data["args"].get("newValue")
180179

180+
def update(self, data: ValueDataType) -> None:
181+
"""Update data."""
182+
self.data.update(data)
183+
self._value = data.get("value")
184+
181185

182-
@dataclass
183-
class ValueNotification:
186+
class ValueNotification(Value):
184187
"""
185188
Model for a Value Nofification message.
186189
187190
https://zwave-js.github.io/node-zwave-js/#/api/node?id=quotvalue-notificationquot
188191
"""
189192

190-
command_class_name: str
191-
command_class: int
192-
endpoint: int
193-
property: str
194-
value: Any
195-
property_name: str
196-
metadata: Optional[ValueMetadata] = None
197-
198-
@classmethod
199-
def from_event(cls, event: Event) -> "ValueNotification":
200-
"""Parse event message into ValueNotification."""
201-
return cls(
202-
command_class_name=event.data["args"]["commandClassName"],
203-
command_class=event.data["args"]["commandClass"],
204-
endpoint=event.data["args"]["endpoint"],
205-
property=event.data["args"]["property"],
206-
value=event.data["args"].get("value"),
207-
property_name=event.data["args"]["propertyName"],
208-
metadata=ValueMetadata(
209-
event.data["args"]["metadata"]
210-
if "metadata" in event.data["args"]
211-
else None
212-
),
213-
)
193+
# format is the same as a Value message, subclassed for easier identifying and future use

0 commit comments

Comments
 (0)