1010from homeassistant .const import EntityCategory
1111from homeassistant .core import HomeAssistant
1212from homeassistant .helpers .entity_platform import AddConfigEntryEntitiesCallback
13+ from roborock .devices .traits .v1 .home import HomeTrait
14+ from roborock .devices .traits .v1 .map_content import MapContent
15+ from homeassistant .exceptions import HomeAssistantError
1316
1417_LOGGER = logging .getLogger (__name__ )
1518
@@ -24,17 +27,17 @@ async def async_setup_entry(
2427 """Set up Roborock image platform."""
2528
2629 async_add_entities (
27- (
28- RoborockMap (
29- config_entry ,
30- f" { coord . duid_slug } _custom_map_ { map_info . name } " ,
31- coord ,
32- map_info .flag ,
33- map_info .name ,
34- )
35- for coord in config_entry .runtime_data
36- for map_info in coord .maps . values ()
37- ),
30+ RoborockMap (
31+ config_entry ,
32+ f" { coord . duid_slug } _custom_map_ { map_info . name } " ,
33+ coord ,
34+ coord . properties_api . home ,
35+ map_info .map_flag ,
36+ map_info .name ,
37+ )
38+ for coord in config_entry .runtime_data
39+ if coord .properties_api . home is not None
40+ for map_info in ( coord . properties_api . home . home_map_info or {}). values ()
3841 )
3942
4043
@@ -50,55 +53,73 @@ def __init__(
5053 config_entry : ConfigEntry ,
5154 unique_id : str ,
5255 coordinator : RoborockDataUpdateCoordinator ,
56+ home_trait : HomeTrait ,
5357 map_flag : int ,
5458 map_name : str ,
5559 ) -> None :
5660 """Initialize a Roborock map."""
5761 RoborockCoordinatedEntityV1 .__init__ (self , unique_id , coordinator )
5862 ImageEntity .__init__ (self , coordinator .hass )
5963 self .config_entry = config_entry
64+ if not map_name :
65+ map_name = f"Map { map_flag } "
6066 self ._attr_name = map_name + "_custom"
6167 self .map_flag = map_flag
68+ self ._home_trait = home_trait
69+
6270 self .cached_map = b""
6371 self ._attr_entity_category = EntityCategory .DIAGNOSTIC
6472
6573 @property
6674 def is_selected (self ) -> bool :
6775 """Return if this map is the currently selected map."""
68- return self .map_flag == self .coordinator .current_map
76+ return self .map_flag == self .coordinator .properties_api .maps .current_map
77+
78+ @property
79+ def _map_content (self ) -> MapContent | None :
80+ if self ._home_trait .home_map_content and (
81+ map_content := self ._home_trait .home_map_content .get (self .map_flag )
82+ ):
83+ return map_content
84+ return None
6985
7086 async def async_added_to_hass (self ) -> None :
7187 """When entity is added to hass load any previously cached maps from disk."""
7288 await super ().async_added_to_hass ()
73- self ._attr_image_last_updated = self .coordinator .maps [
74- self .map_flag
75- ].last_updated
89+ self ._attr_image_last_updated = self .coordinator .last_home_update
7690 self .async_write_ha_state ()
7791
7892 def _handle_coordinator_update (self ) -> None :
7993 # If the coordinator has updated the map, we can update the image.
80- self ._attr_image_last_updated = self .coordinator .maps [
81- self .map_flag
82- ].last_updated
94+ if (map_content := self ._map_content ) is None :
95+ return
96+ if self .cached_map != map_content .image_content :
97+ self .cached_map = map_content .image_content
98+ self ._attr_image_last_updated = self .coordinator .last_home_update
8399
84100 super ()._handle_coordinator_update ()
85101
86102 async def async_image (self ) -> bytes | None :
87103 """Get the cached image."""
88- return self .coordinator .maps [self .map_flag ].image
104+ if (map_content := self ._map_content ) is None :
105+ raise HomeAssistantError ("Map flag not found in coordinator maps" )
106+ return map_content .image_content
89107
90108 @property
91109 def extra_state_attributes (self ):
92- map_data = self .coordinator .maps [self .map_flag ].map_data
110+ if (map_content := self ._map_content ) is None :
111+ raise HomeAssistantError ("Map flag not found in coordinator maps" )
112+
113+ map_data = map_content .map_data
93114 if map_data is None :
94115 return {}
95- for room in map_data .rooms .values ():
96- room .name = self .coordinator .maps [self .map_flag ].rooms .get (room .number )
116+ if map_data .rooms is not None :
117+ for room in map_data .rooms .values ():
118+ name = map_data .rooms .get (room .number )
119+ room .name = name .name if name else "Unknown"
97120
98121 return {
99- "calibration_points" : self .coordinator .maps [
100- self .map_flag
101- ].map_data .calibration (),
122+ "calibration_points" : map_data .calibration (),
102123 "rooms" : map_data .rooms ,
103124 "zones" : map_data .zones ,
104125 }
0 commit comments