@@ -292,11 +292,16 @@ def _async_handle_traits(self, event_message: EventMessage) -> None:
292292 traits = event_message .resource_update_traits
293293 if not traits :
294294 return
295- _LOGGER .debug ("Trait update %s" , traits )
296295 # Parse the traits using a separate object, then overwrite
297296 # each present field with an updated copy of the original trait with
298297 # the new fields merged in.
298+ _LOGGER .debug ("Trait update %s" , traits )
299299 parsed_traits = TraitTypes .parse_trait_object ({TRAITS : traits })
300+ self ._async_update_traits (parsed_traits , event_message .timestamp )
301+
302+ def _async_update_traits (
303+ self , parsed_traits : TraitTypes , timestamp : datetime .datetime
304+ ) -> None :
300305 for trait_field in fields (parsed_traits ):
301306 if (
302307 (alias := trait_field .metadata .get ("alias" )) is None
@@ -308,9 +313,9 @@ def _async_handle_traits(self, event_message: EventMessage) -> None:
308313 if (
309314 self ._trait_event_ts
310315 and (ts := self ._trait_event_ts .get (trait_field .name ))
311- and ts > event_message . timestamp
316+ and ts > timestamp
312317 ):
313- _LOGGER .debug ("Discarding stale update (%s)" , event_message . timestamp )
318+ _LOGGER .debug ("Discarding stale update (%s)" , timestamp )
314319 continue
315320
316321 # Only merge updates into existing models, updating the existing
@@ -320,7 +325,14 @@ def _async_handle_traits(self, event_message: EventMessage) -> None:
320325 for k , v in asdict (new ).items ():
321326 if v is not None :
322327 setattr (existing , k , v )
323- self ._trait_event_ts [trait_field .name ] = event_message .timestamp
328+ self ._trait_event_ts [trait_field .name ] = timestamp
329+
330+ def merge_from_update (self , new_device : Device ) -> None :
331+ """Merge fields from an updated device object.
332+
333+ This is used when refreshing the device list from the API.
334+ """
335+ self ._async_update_traits (new_device , datetime .datetime .utcnow ())
324336
325337 @property
326338 def event_media_manager (self ) -> EventMediaManager :
0 commit comments