diff --git a/homeassistant/components/netatmo/button.py b/homeassistant/components/netatmo/button.py index cf06cbe366a2..72a6b1056425 100644 --- a/homeassistant/components/netatmo/button.py +++ b/homeassistant/components/netatmo/button.py @@ -12,6 +12,7 @@ from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from .const import CONF_URL_CONTROL, NETATMO_CREATE_BUTTON from .data_handler import HOME, SIGNAL_NAME, NetatmoConfigEntry, NetatmoDevice from .entity import NetatmoModuleEntity +from .helper import device_type_to_str _LOGGER = logging.getLogger(__name__) @@ -55,9 +56,7 @@ class NetatmoCoverPreferredPositionButton(NetatmoModuleEntity, ButtonEntity): }, ] ) - self._attr_unique_id = ( - f"{self.device.entity_id}-{self.device_type}-preferred_position" - ) + self._attr_unique_id = f"{self.device.entity_id}-{device_type_to_str(self.device_type)}-preferred_position" @callback def async_update_callback(self) -> None: diff --git a/homeassistant/components/netatmo/camera.py b/homeassistant/components/netatmo/camera.py index 9c2ff7fb7ca9..6e19d674346f 100644 --- a/homeassistant/components/netatmo/camera.py +++ b/homeassistant/components/netatmo/camera.py @@ -42,6 +42,7 @@ from .const import ( ) from .data_handler import EVENT, HOME, SIGNAL_NAME, NetatmoConfigEntry, NetatmoDevice from .entity import NetatmoModuleEntity +from .helper import device_type_to_str _LOGGER = logging.getLogger(__name__) @@ -102,7 +103,9 @@ class NetatmoCamera(NetatmoModuleEntity, Camera): Camera.__init__(self) super().__init__(netatmo_device) - self._attr_unique_id = f"{netatmo_device.device.entity_id}-{self.device_type}" + self._attr_unique_id = ( + f"{netatmo_device.device.entity_id}-{device_type_to_str(self.device_type)}" + ) self._light_state = None self._publishers.extend( diff --git a/homeassistant/components/netatmo/climate.py b/homeassistant/components/netatmo/climate.py index f89d7f1b79f9..f15c5515f5da 100644 --- a/homeassistant/components/netatmo/climate.py +++ b/homeassistant/components/netatmo/climate.py @@ -54,6 +54,7 @@ from .const import ( ) from .data_handler import HOME, SIGNAL_NAME, NetatmoConfigEntry, NetatmoRoom from .entity import NetatmoRoomEntity +from .helper import device_type_to_str _LOGGER = logging.getLogger(__name__) @@ -219,7 +220,9 @@ class NetatmoThermostat(NetatmoRoomEntity, ClimateEntity): if self.device_type is NA_THERM: self._attr_hvac_modes.append(HVACMode.OFF) - self._attr_unique_id = f"{self.device.entity_id}-{self.device_type}" + self._attr_unique_id = ( + f"{self.device.entity_id}-{device_type_to_str(self.device_type)}" + ) async def async_added_to_hass(self) -> None: """Entity created.""" diff --git a/homeassistant/components/netatmo/cover.py b/homeassistant/components/netatmo/cover.py index 7d4ee1ed535f..35d55edcef31 100644 --- a/homeassistant/components/netatmo/cover.py +++ b/homeassistant/components/netatmo/cover.py @@ -18,6 +18,7 @@ from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from .const import CONF_URL_CONTROL, NETATMO_CREATE_COVER from .data_handler import HOME, SIGNAL_NAME, NetatmoConfigEntry, NetatmoDevice from .entity import NetatmoModuleEntity +from .helper import device_type_to_str _LOGGER = logging.getLogger(__name__) @@ -70,7 +71,9 @@ class NetatmoCover(NetatmoModuleEntity, CoverEntity): }, ] ) - self._attr_unique_id = f"{self.device.entity_id}-{self.device_type}" + self._attr_unique_id = ( + f"{self.device.entity_id}-{device_type_to_str(self.device_type)}" + ) async def async_close_cover(self, **kwargs: Any) -> None: """Close the cover.""" diff --git a/homeassistant/components/netatmo/fan.py b/homeassistant/components/netatmo/fan.py index 4075af13c2b4..6c9665ca475f 100644 --- a/homeassistant/components/netatmo/fan.py +++ b/homeassistant/components/netatmo/fan.py @@ -13,6 +13,7 @@ from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from .const import CONF_URL_CONTROL, NETATMO_CREATE_FAN from .data_handler import HOME, SIGNAL_NAME, NetatmoConfigEntry, NetatmoDevice from .entity import NetatmoModuleEntity +from .helper import device_type_to_str _LOGGER = logging.getLogger(__name__) @@ -62,7 +63,9 @@ class NetatmoFan(NetatmoModuleEntity, FanEntity): ] ) - self._attr_unique_id = f"{self.device.entity_id}-{self.device_type}" + self._attr_unique_id = ( + f"{self.device.entity_id}-{device_type_to_str(self.device_type)}" + ) async def async_set_preset_mode(self, preset_mode: str) -> None: """Set the preset mode of the fan.""" diff --git a/homeassistant/components/netatmo/helper.py b/homeassistant/components/netatmo/helper.py index d3a07cd6b3db..b1b305e6709c 100644 --- a/homeassistant/components/netatmo/helper.py +++ b/homeassistant/components/netatmo/helper.py @@ -3,6 +3,16 @@ from dataclasses import dataclass from uuid import UUID, uuid4 +from pyatmo.modules.device_types import DeviceType as NetatmoDeviceType + + +def device_type_to_str(device_type: NetatmoDeviceType) -> str: + """Convert a device type to a string. + + Used to generate backwards compatible unique ids. + """ + return f"{type(device_type).__name__}.{device_type}" + @dataclass class NetatmoArea: diff --git a/homeassistant/components/netatmo/manifest.json b/homeassistant/components/netatmo/manifest.json index aeb4ffa0c55e..6d6aea230f18 100644 --- a/homeassistant/components/netatmo/manifest.json +++ b/homeassistant/components/netatmo/manifest.json @@ -12,5 +12,5 @@ "integration_type": "hub", "iot_class": "cloud_polling", "loggers": ["pyatmo"], - "requirements": ["pyatmo==9.2.3"] + "requirements": ["pyatmo==9.4.0"] } diff --git a/homeassistant/components/netatmo/switch.py b/homeassistant/components/netatmo/switch.py index 31102211b769..0c0a1570a7fd 100644 --- a/homeassistant/components/netatmo/switch.py +++ b/homeassistant/components/netatmo/switch.py @@ -13,6 +13,7 @@ from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from .const import CONF_URL_CONTROL, NETATMO_CREATE_SWITCH from .data_handler import HOME, SIGNAL_NAME, NetatmoConfigEntry, NetatmoDevice from .entity import NetatmoModuleEntity +from .helper import device_type_to_str _LOGGER = logging.getLogger(__name__) @@ -58,7 +59,9 @@ class NetatmoSwitch(NetatmoModuleEntity, SwitchEntity): }, ] ) - self._attr_unique_id = f"{self.device.entity_id}-{self.device_type}" + self._attr_unique_id = ( + f"{self.device.entity_id}-{device_type_to_str(self.device_type)}" + ) self._attr_is_on = self.device.on @callback diff --git a/requirements_all.txt b/requirements_all.txt index 54765b415d46..5bd38f7ebb1f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1990,7 +1990,7 @@ pyaprilaire==0.9.1 pyatag==0.3.5.3 # homeassistant.components.netatmo -pyatmo==9.2.3 +pyatmo==9.4.0 # homeassistant.components.apple_tv pyatv==0.17.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 261f0c6d11b9..7c25e24afe57 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1727,7 +1727,7 @@ pyaprilaire==0.9.1 pyatag==0.3.5.3 # homeassistant.components.netatmo -pyatmo==9.2.3 +pyatmo==9.4.0 # homeassistant.components.apple_tv pyatv==0.17.0 diff --git a/tests/components/netatmo/snapshots/test_camera.ambr b/tests/components/netatmo/snapshots/test_camera.ambr index 72fb74ea051b..b6d06ddfdea1 100644 --- a/tests/components/netatmo/snapshots/test_camera.ambr +++ b/tests/components/netatmo/snapshots/test_camera.ambr @@ -174,7 +174,7 @@ 'entity_picture': '/api/camera_proxy/camera.netatmo_doorbell?token=1caab5c3b3', 'friendly_name': 'Netatmo-Doorbell', 'id': '12:34:56:10:f1:66', - 'is_local': None, + 'is_local': False, 'light_state': None, 'local_url': None, 'monitoring': True, diff --git a/tests/components/netatmo/snapshots/test_diagnostics.ambr b/tests/components/netatmo/snapshots/test_diagnostics.ambr index 3a66aa84c414..829ffc342915 100644 --- a/tests/components/netatmo/snapshots/test_diagnostics.ambr +++ b/tests/components/netatmo/snapshots/test_diagnostics.ambr @@ -581,6 +581,7 @@ 'access_camera', 'access_doorbell', 'access_presence', + 'access_camerapro', 'read_bubendorff', 'read_bfi', 'read_camera', @@ -595,6 +596,7 @@ 'read_smokedetector', 'read_station', 'read_thermostat', + 'read_camerapro', 'write_bubendorff', 'write_bfi', 'write_camera', @@ -604,6 +606,7 @@ 'write_presence', 'write_smarther', 'write_thermostat', + 'write_camerapro', ]), 'type': 'Bearer', }),