From 12c067970ac68c6beb092fc57214f689efba409d Mon Sep 17 00:00:00 2001 From: Robert Hillis Date: Sat, 23 Oct 2021 05:44:51 -0400 Subject: [PATCH] Use DeviceInfo Class E (#58230) --- homeassistant/components/eafm/sensor.py | 15 ++++++------- .../components/ecobee/binary_sensor.py | 17 ++++++++------- homeassistant/components/ecobee/climate.py | 16 +++++++------- homeassistant/components/ecobee/humidifier.py | 18 +++++++++------- homeassistant/components/ecobee/sensor.py | 15 ++++++------- homeassistant/components/ecobee/weather.py | 18 +++++++++------- homeassistant/components/econet/__init__.py | 14 ++++++------- homeassistant/components/elgato/light.py | 21 +++++++------------ homeassistant/components/elkm1/__init__.py | 16 +++++++------- homeassistant/components/emonitor/sensor.py | 12 +++++------ .../components/enphase_envoy/sensor.py | 15 ++++++------- .../components/epson/media_player.py | 19 ++++++++++------- homeassistant/components/ezviz/entity.py | 14 ++++++------- 13 files changed, 111 insertions(+), 99 deletions(-) diff --git a/homeassistant/components/eafm/sensor.py b/homeassistant/components/eafm/sensor.py index bc2158e4db8..e5edf8e0b99 100644 --- a/homeassistant/components/eafm/sensor.py +++ b/homeassistant/components/eafm/sensor.py @@ -8,6 +8,7 @@ import async_timeout from homeassistant.components.sensor import SensorEntity from homeassistant.const import ATTR_ATTRIBUTION, LENGTH_METERS from homeassistant.helpers.aiohttp_client import async_get_clientsession +from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.update_coordinator import ( CoordinatorEntity, DataUpdateCoordinator, @@ -121,13 +122,13 @@ class Measurement(CoordinatorEntity, SensorEntity): @property def device_info(self): """Return the device info.""" - return { - "identifiers": {(DOMAIN, "measure-id", self.station_id)}, - "name": self.name, - "manufacturer": "https://environment.data.gov.uk/", - "model": self.parameter_name, - "entry_type": "service", - } + return DeviceInfo( + entry_type="service", + identifiers={(DOMAIN, "measure-id", self.station_id)}, + manufacturer="https://environment.data.gov.uk/", + model=self.parameter_name, + name=self.name, + ) @property def available(self) -> bool: diff --git a/homeassistant/components/ecobee/binary_sensor.py b/homeassistant/components/ecobee/binary_sensor.py index b81a5e6bef6..94c4ade7398 100644 --- a/homeassistant/components/ecobee/binary_sensor.py +++ b/homeassistant/components/ecobee/binary_sensor.py @@ -1,8 +1,11 @@ """Support for Ecobee binary sensors.""" +from __future__ import annotations + from homeassistant.components.binary_sensor import ( DEVICE_CLASS_OCCUPANCY, BinarySensorEntity, ) +from homeassistant.helpers.entity import DeviceInfo from .const import DOMAIN, ECOBEE_MODEL_TO_NAME, MANUFACTURER @@ -49,7 +52,7 @@ class EcobeeBinarySensor(BinarySensorEntity): return f"{thermostat['identifier']}-{sensor['id']}-{self.device_class}" @property - def device_info(self): + def device_info(self) -> DeviceInfo | None: """Return device information for this sensor.""" identifier = None model = None @@ -72,12 +75,12 @@ class EcobeeBinarySensor(BinarySensorEntity): break if identifier is not None: - return { - "identifiers": {(DOMAIN, identifier)}, - "name": self.sensor_name, - "manufacturer": MANUFACTURER, - "model": model, - } + return DeviceInfo( + identifiers={(DOMAIN, identifier)}, + manufacturer=MANUFACTURER, + model=model, + name=self.sensor_name, + ) return None @property diff --git a/homeassistant/components/ecobee/climate.py b/homeassistant/components/ecobee/climate.py index 0e7a5e52fa7..bc5f74c5022 100644 --- a/homeassistant/components/ecobee/climate.py +++ b/homeassistant/components/ecobee/climate.py @@ -38,6 +38,7 @@ from homeassistant.const import ( ) from homeassistant.helpers import entity_platform import homeassistant.helpers.config_validation as cv +from homeassistant.helpers.entity import DeviceInfo from homeassistant.util.temperature import convert from .const import _LOGGER, DOMAIN, ECOBEE_MODEL_TO_NAME, MANUFACTURER @@ -366,20 +367,21 @@ class Thermostat(ClimateEntity): return self.thermostat["identifier"] @property - def device_info(self): + def device_info(self) -> DeviceInfo: """Return device information for this ecobee thermostat.""" + model: str | None try: model = f"{ECOBEE_MODEL_TO_NAME[self.thermostat['modelNumber']]} Thermostat" except KeyError: # Ecobee model is not in our list model = None - return { - "identifiers": {(DOMAIN, self.thermostat["identifier"])}, - "name": self.name, - "manufacturer": MANUFACTURER, - "model": model, - } + return DeviceInfo( + identifiers={(DOMAIN, self.thermostat["identifier"])}, + manufacturer=MANUFACTURER, + model=model, + name=self.name, + ) @property def temperature_unit(self): diff --git a/homeassistant/components/ecobee/humidifier.py b/homeassistant/components/ecobee/humidifier.py index 984609c2f22..b660a75363f 100644 --- a/homeassistant/components/ecobee/humidifier.py +++ b/homeassistant/components/ecobee/humidifier.py @@ -1,4 +1,6 @@ """Support for using humidifier with ecobee thermostats.""" +from __future__ import annotations + from datetime import timedelta from homeassistant.components.humidifier import HumidifierEntity @@ -9,6 +11,7 @@ from homeassistant.components.humidifier.const import ( MODE_AUTO, SUPPORT_MODES, ) +from homeassistant.helpers.entity import DeviceInfo from .const import DOMAIN, ECOBEE_MODEL_TO_NAME, MANUFACTURER @@ -54,20 +57,21 @@ class EcobeeHumidifier(HumidifierEntity): return f"{self.thermostat['identifier']}" @property - def device_info(self): + def device_info(self) -> DeviceInfo: """Return device information for the ecobee humidifier.""" + model: str | None try: model = f"{ECOBEE_MODEL_TO_NAME[self.thermostat['modelNumber']]} Thermostat" except KeyError: # Ecobee model is not in our list model = None - return { - "identifiers": {(DOMAIN, self.thermostat["identifier"])}, - "name": self.name, - "manufacturer": MANUFACTURER, - "model": model, - } + return DeviceInfo( + identifiers={(DOMAIN, self.thermostat["identifier"])}, + manufacturer=MANUFACTURER, + model=model, + name=self.name, + ) @property def available(self): diff --git a/homeassistant/components/ecobee/sensor.py b/homeassistant/components/ecobee/sensor.py index 47e7af66e57..cfdf861e7bc 100644 --- a/homeassistant/components/ecobee/sensor.py +++ b/homeassistant/components/ecobee/sensor.py @@ -14,6 +14,7 @@ from homeassistant.const import ( PERCENTAGE, TEMP_FAHRENHEIT, ) +from homeassistant.helpers.entity import DeviceInfo from .const import DOMAIN, ECOBEE_MODEL_TO_NAME, MANUFACTURER @@ -76,7 +77,7 @@ class EcobeeSensor(SensorEntity): return f"{thermostat['identifier']}-{sensor['id']}-{self.device_class}" @property - def device_info(self): + def device_info(self) -> DeviceInfo | None: """Return device information for this sensor.""" identifier = None model = None @@ -99,12 +100,12 @@ class EcobeeSensor(SensorEntity): break if identifier is not None and model is not None: - return { - "identifiers": {(DOMAIN, identifier)}, - "name": self.sensor_name, - "manufacturer": MANUFACTURER, - "model": model, - } + return DeviceInfo( + identifiers={(DOMAIN, identifier)}, + manufacturer=MANUFACTURER, + model=model, + name=self.sensor_name, + ) return None @property diff --git a/homeassistant/components/ecobee/weather.py b/homeassistant/components/ecobee/weather.py index 8e3de2be90a..aa73bd01c53 100644 --- a/homeassistant/components/ecobee/weather.py +++ b/homeassistant/components/ecobee/weather.py @@ -1,4 +1,6 @@ """Support for displaying weather info from Ecobee API.""" +from __future__ import annotations + from datetime import timedelta from pyecobee.const import ECOBEE_STATE_UNKNOWN @@ -13,6 +15,7 @@ from homeassistant.components.weather import ( WeatherEntity, ) from homeassistant.const import PRESSURE_HPA, PRESSURE_INHG, TEMP_FAHRENHEIT +from homeassistant.helpers.entity import DeviceInfo from homeassistant.util import dt as dt_util from homeassistant.util.pressure import convert as pressure_convert @@ -65,21 +68,22 @@ class EcobeeWeather(WeatherEntity): return self.data.ecobee.get_thermostat(self._index)["identifier"] @property - def device_info(self): + def device_info(self) -> DeviceInfo: """Return device information for the ecobee weather platform.""" thermostat = self.data.ecobee.get_thermostat(self._index) + model: str | None try: model = f"{ECOBEE_MODEL_TO_NAME[thermostat['modelNumber']]} Thermostat" except KeyError: # Ecobee model is not in our list model = None - return { - "identifiers": {(DOMAIN, thermostat["identifier"])}, - "name": self.name, - "manufacturer": MANUFACTURER, - "model": model, - } + return DeviceInfo( + identifiers={(DOMAIN, thermostat["identifier"])}, + manufacturer=MANUFACTURER, + model=model, + name=self.name, + ) @property def condition(self): diff --git a/homeassistant/components/econet/__init__.py b/homeassistant/components/econet/__init__.py index 5a20337e454..8e39a6a6267 100644 --- a/homeassistant/components/econet/__init__.py +++ b/homeassistant/components/econet/__init__.py @@ -16,7 +16,7 @@ from homeassistant.const import CONF_EMAIL, CONF_PASSWORD, TEMP_FAHRENHEIT from homeassistant.core import callback from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers.dispatcher import dispatcher_send -from homeassistant.helpers.entity import Entity +from homeassistant.helpers.entity import DeviceInfo, Entity from homeassistant.helpers.event import async_track_time_interval from .const import API_CLIENT, DOMAIN, EQUIPMENT @@ -128,13 +128,13 @@ class EcoNetEntity(Entity): return self._econet.connected @property - def device_info(self): + def device_info(self) -> DeviceInfo: """Return device registry information for this entity.""" - return { - "identifiers": {(DOMAIN, self._econet.device_id)}, - "manufacturer": "Rheem", - "name": self._econet.device_name, - } + return DeviceInfo( + identifiers={(DOMAIN, self._econet.device_id)}, + manufacturer="Rheem", + name=self._econet.device_name, + ) @property def name(self): diff --git a/homeassistant/components/elgato/light.py b/homeassistant/components/elgato/light.py index 7f7e432c5f0..8ed443b65e1 100644 --- a/homeassistant/components/elgato/light.py +++ b/homeassistant/components/elgato/light.py @@ -16,13 +16,6 @@ from homeassistant.components.light import ( LightEntity, ) from homeassistant.config_entries import ConfigEntry -from homeassistant.const import ( - ATTR_IDENTIFIERS, - ATTR_MANUFACTURER, - ATTR_MODEL, - ATTR_NAME, - ATTR_SW_VERSION, -) from homeassistant.core import HomeAssistant from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity_platform import ( @@ -187,13 +180,13 @@ class ElgatoLight(LightEntity): @property def device_info(self) -> DeviceInfo: """Return device information about this Elgato Light.""" - return { - ATTR_IDENTIFIERS: {(DOMAIN, self._info.serial_number)}, - ATTR_NAME: self._info.product_name, - ATTR_MANUFACTURER: "Elgato", - ATTR_MODEL: self._info.product_name, - ATTR_SW_VERSION: f"{self._info.firmware_version} ({self._info.firmware_build_number})", - } + return DeviceInfo( + identifiers={(DOMAIN, self._info.serial_number)}, + manufacturer="Elgato", + model=self._info.product_name, + name=self._info.product_name, + sw_version=f"{self._info.firmware_version} ({self._info.firmware_build_number})", + ) async def async_identify(self) -> None: """Identify the light, will make it blink.""" diff --git a/homeassistant/components/elkm1/__init__.py b/homeassistant/components/elkm1/__init__.py index 775ac466445..3b59fffe553 100644 --- a/homeassistant/components/elkm1/__init__.py +++ b/homeassistant/components/elkm1/__init__.py @@ -463,15 +463,15 @@ class ElkAttachedEntity(ElkEntity): """An elk entity that is attached to the elk system.""" @property - def device_info(self): + def device_info(self) -> DeviceInfo: """Device info for the underlying ElkM1 system.""" device_name = "ElkM1" if self._prefix: device_name += f" {self._prefix}" - return { - "name": device_name, - "identifiers": {(DOMAIN, f"{self._prefix}_system")}, - "sw_version": self._elk.panel.elkm1_version, - "manufacturer": "ELK Products, Inc.", - "model": "M1", - } + return DeviceInfo( + identifiers={(DOMAIN, f"{self._prefix}_system")}, + manufacturer="ELK Products, Inc.", + model="M1", + name=device_name, + sw_version=self._elk.panel.elkm1_version, + ) diff --git a/homeassistant/components/emonitor/sensor.py b/homeassistant/components/emonitor/sensor.py index 1d699b42473..5d4f1983ac1 100644 --- a/homeassistant/components/emonitor/sensor.py +++ b/homeassistant/components/emonitor/sensor.py @@ -94,9 +94,9 @@ class EmonitorPowerSensor(CoordinatorEntity, SensorEntity): @property def device_info(self) -> DeviceInfo: """Return info about the emonitor device.""" - return { - "name": name_short_mac(self.mac_address[-6:]), - "connections": {(dr.CONNECTION_NETWORK_MAC, self.mac_address)}, - "manufacturer": "Powerhouse Dynamics, Inc.", - "sw_version": self.coordinator.data.hardware.firmware_version, - } + return DeviceInfo( + connections={(dr.CONNECTION_NETWORK_MAC, self.mac_address)}, + manufacturer="Powerhouse Dynamics, Inc.", + name=name_short_mac(self.mac_address[-6:]), + sw_version=self.coordinator.data.hardware.firmware_version, + ) diff --git a/homeassistant/components/enphase_envoy/sensor.py b/homeassistant/components/enphase_envoy/sensor.py index 9bf4073847e..eda3c229255 100644 --- a/homeassistant/components/enphase_envoy/sensor.py +++ b/homeassistant/components/enphase_envoy/sensor.py @@ -15,6 +15,7 @@ from homeassistant.const import ( CONF_USERNAME, ) import homeassistant.helpers.config_validation as cv +from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.update_coordinator import CoordinatorEntity from .const import COORDINATOR, DOMAIN, NAME, SENSORS @@ -169,13 +170,13 @@ class Envoy(CoordinatorEntity, SensorEntity): return None @property - def device_info(self): + def device_info(self) -> DeviceInfo: """Return the device_info of the device.""" if not self._device_serial_number: return None - return { - "identifiers": {(DOMAIN, str(self._device_serial_number))}, - "name": self._device_name, - "model": "Envoy", - "manufacturer": "Enphase", - } + return DeviceInfo( + identifiers={(DOMAIN, str(self._device_serial_number))}, + manufacturer="Enphase", + model="Envoy", + name=self._device_name, + ) diff --git a/homeassistant/components/epson/media_player.py b/homeassistant/components/epson/media_player.py index 1fd0b7f6e70..5223a9663d0 100644 --- a/homeassistant/components/epson/media_player.py +++ b/homeassistant/components/epson/media_player.py @@ -1,4 +1,6 @@ """Support for Epson projector.""" +from __future__ import annotations + import logging from epson_projector.const import ( @@ -39,6 +41,7 @@ from homeassistant.components.media_player.const import ( from homeassistant.const import STATE_OFF, STATE_ON from homeassistant.helpers import entity_platform import homeassistant.helpers.config_validation as cv +from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity_registry import async_get as async_get_entity_registry from .const import ATTR_CMODE, DOMAIN, SERVICE_SELECT_CMODE @@ -137,17 +140,17 @@ class EpsonProjectorMediaPlayer(MediaPlayerEntity): self._state = STATE_OFF @property - def device_info(self): + def device_info(self) -> DeviceInfo | None: """Get attributes about the device.""" if not self._unique_id: return None - return { - "identifiers": {(DOMAIN, self._unique_id)}, - "manufacturer": "Epson", - "name": "Epson projector", - "model": "Epson", - "via_hub": (DOMAIN, self._unique_id), - } + return DeviceInfo( + identifiers={(DOMAIN, self._unique_id)}, + manufacturer="Epson", + model="Epson", + name="Epson projector", + via_device=(DOMAIN, self._unique_id), + ) @property def name(self): diff --git a/homeassistant/components/ezviz/entity.py b/homeassistant/components/ezviz/entity.py index e7aa7d5039a..288c4a5d9eb 100644 --- a/homeassistant/components/ezviz/entity.py +++ b/homeassistant/components/ezviz/entity.py @@ -22,13 +22,13 @@ class EzvizEntity(CoordinatorEntity, Entity): super().__init__(coordinator) self._serial = serial self._camera_name = self.data["name"] - self._attr_device_info: DeviceInfo = { - "identifiers": {(DOMAIN, serial)}, - "name": self.data["name"], - "model": self.data["device_sub_category"], - "manufacturer": MANUFACTURER, - "sw_version": self.data["version"], - } + self._attr_device_info = DeviceInfo( + identifiers={(DOMAIN, serial)}, + manufacturer=MANUFACTURER, + model=self.data["device_sub_category"], + name=self.data["name"], + sw_version=self.data["version"], + ) @property def data(self) -> dict[str, Any]: