Skip to content

Commit 9813d3e

Browse files
authored
Add support for 2025.12.0
1 parent c05872c commit 9813d3e

3 files changed

Lines changed: 48 additions & 27 deletions

File tree

custom_components/roborock_custom_map/image.py

Lines changed: 46 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
from homeassistant.const import EntityCategory
1111
from homeassistant.core import HomeAssistant
1212
from 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
}

custom_components/roborock_custom_map/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@
88
"iot_class": "local_polling",
99
"issue_tracker": "https://github.com/Lash-L/RoborockCustomMap/issues",
1010
"requirements": [],
11-
"version": "0.1.1"
11+
"version": "0.1.2"
1212
}

hacs.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
22
"name": "Roborock Custom Map",
3-
"homeassistant": "2025.4.0b0"
3+
"homeassistant": "2025.12.0"
44
}

0 commit comments

Comments
 (0)