Use DeviceInfo Class E (#58230)

This commit is contained in:
Robert Hillis 2021-10-23 05:44:51 -04:00 committed by GitHub
parent 137d41d8b4
commit 12c067970a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 111 additions and 99 deletions

View file

@ -8,6 +8,7 @@ import async_timeout
from homeassistant.components.sensor import SensorEntity from homeassistant.components.sensor import SensorEntity
from homeassistant.const import ATTR_ATTRIBUTION, LENGTH_METERS from homeassistant.const import ATTR_ATTRIBUTION, LENGTH_METERS
from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.update_coordinator import ( from homeassistant.helpers.update_coordinator import (
CoordinatorEntity, CoordinatorEntity,
DataUpdateCoordinator, DataUpdateCoordinator,
@ -121,13 +122,13 @@ class Measurement(CoordinatorEntity, SensorEntity):
@property @property
def device_info(self): def device_info(self):
"""Return the device info.""" """Return the device info."""
return { return DeviceInfo(
"identifiers": {(DOMAIN, "measure-id", self.station_id)}, entry_type="service",
"name": self.name, identifiers={(DOMAIN, "measure-id", self.station_id)},
"manufacturer": "https://environment.data.gov.uk/", manufacturer="https://environment.data.gov.uk/",
"model": self.parameter_name, model=self.parameter_name,
"entry_type": "service", name=self.name,
} )
@property @property
def available(self) -> bool: def available(self) -> bool:

View file

@ -1,8 +1,11 @@
"""Support for Ecobee binary sensors.""" """Support for Ecobee binary sensors."""
from __future__ import annotations
from homeassistant.components.binary_sensor import ( from homeassistant.components.binary_sensor import (
DEVICE_CLASS_OCCUPANCY, DEVICE_CLASS_OCCUPANCY,
BinarySensorEntity, BinarySensorEntity,
) )
from homeassistant.helpers.entity import DeviceInfo
from .const import DOMAIN, ECOBEE_MODEL_TO_NAME, MANUFACTURER 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}" return f"{thermostat['identifier']}-{sensor['id']}-{self.device_class}"
@property @property
def device_info(self): def device_info(self) -> DeviceInfo | None:
"""Return device information for this sensor.""" """Return device information for this sensor."""
identifier = None identifier = None
model = None model = None
@ -72,12 +75,12 @@ class EcobeeBinarySensor(BinarySensorEntity):
break break
if identifier is not None: if identifier is not None:
return { return DeviceInfo(
"identifiers": {(DOMAIN, identifier)}, identifiers={(DOMAIN, identifier)},
"name": self.sensor_name, manufacturer=MANUFACTURER,
"manufacturer": MANUFACTURER, model=model,
"model": model, name=self.sensor_name,
} )
return None return None
@property @property

View file

@ -38,6 +38,7 @@ from homeassistant.const import (
) )
from homeassistant.helpers import entity_platform from homeassistant.helpers import entity_platform
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity import DeviceInfo
from homeassistant.util.temperature import convert from homeassistant.util.temperature import convert
from .const import _LOGGER, DOMAIN, ECOBEE_MODEL_TO_NAME, MANUFACTURER from .const import _LOGGER, DOMAIN, ECOBEE_MODEL_TO_NAME, MANUFACTURER
@ -366,20 +367,21 @@ class Thermostat(ClimateEntity):
return self.thermostat["identifier"] return self.thermostat["identifier"]
@property @property
def device_info(self): def device_info(self) -> DeviceInfo:
"""Return device information for this ecobee thermostat.""" """Return device information for this ecobee thermostat."""
model: str | None
try: try:
model = f"{ECOBEE_MODEL_TO_NAME[self.thermostat['modelNumber']]} Thermostat" model = f"{ECOBEE_MODEL_TO_NAME[self.thermostat['modelNumber']]} Thermostat"
except KeyError: except KeyError:
# Ecobee model is not in our list # Ecobee model is not in our list
model = None model = None
return { return DeviceInfo(
"identifiers": {(DOMAIN, self.thermostat["identifier"])}, identifiers={(DOMAIN, self.thermostat["identifier"])},
"name": self.name, manufacturer=MANUFACTURER,
"manufacturer": MANUFACTURER, model=model,
"model": model, name=self.name,
} )
@property @property
def temperature_unit(self): def temperature_unit(self):

View file

@ -1,4 +1,6 @@
"""Support for using humidifier with ecobee thermostats.""" """Support for using humidifier with ecobee thermostats."""
from __future__ import annotations
from datetime import timedelta from datetime import timedelta
from homeassistant.components.humidifier import HumidifierEntity from homeassistant.components.humidifier import HumidifierEntity
@ -9,6 +11,7 @@ from homeassistant.components.humidifier.const import (
MODE_AUTO, MODE_AUTO,
SUPPORT_MODES, SUPPORT_MODES,
) )
from homeassistant.helpers.entity import DeviceInfo
from .const import DOMAIN, ECOBEE_MODEL_TO_NAME, MANUFACTURER from .const import DOMAIN, ECOBEE_MODEL_TO_NAME, MANUFACTURER
@ -54,20 +57,21 @@ class EcobeeHumidifier(HumidifierEntity):
return f"{self.thermostat['identifier']}" return f"{self.thermostat['identifier']}"
@property @property
def device_info(self): def device_info(self) -> DeviceInfo:
"""Return device information for the ecobee humidifier.""" """Return device information for the ecobee humidifier."""
model: str | None
try: try:
model = f"{ECOBEE_MODEL_TO_NAME[self.thermostat['modelNumber']]} Thermostat" model = f"{ECOBEE_MODEL_TO_NAME[self.thermostat['modelNumber']]} Thermostat"
except KeyError: except KeyError:
# Ecobee model is not in our list # Ecobee model is not in our list
model = None model = None
return { return DeviceInfo(
"identifiers": {(DOMAIN, self.thermostat["identifier"])}, identifiers={(DOMAIN, self.thermostat["identifier"])},
"name": self.name, manufacturer=MANUFACTURER,
"manufacturer": MANUFACTURER, model=model,
"model": model, name=self.name,
} )
@property @property
def available(self): def available(self):

View file

@ -14,6 +14,7 @@ from homeassistant.const import (
PERCENTAGE, PERCENTAGE,
TEMP_FAHRENHEIT, TEMP_FAHRENHEIT,
) )
from homeassistant.helpers.entity import DeviceInfo
from .const import DOMAIN, ECOBEE_MODEL_TO_NAME, MANUFACTURER 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}" return f"{thermostat['identifier']}-{sensor['id']}-{self.device_class}"
@property @property
def device_info(self): def device_info(self) -> DeviceInfo | None:
"""Return device information for this sensor.""" """Return device information for this sensor."""
identifier = None identifier = None
model = None model = None
@ -99,12 +100,12 @@ class EcobeeSensor(SensorEntity):
break break
if identifier is not None and model is not None: if identifier is not None and model is not None:
return { return DeviceInfo(
"identifiers": {(DOMAIN, identifier)}, identifiers={(DOMAIN, identifier)},
"name": self.sensor_name, manufacturer=MANUFACTURER,
"manufacturer": MANUFACTURER, model=model,
"model": model, name=self.sensor_name,
} )
return None return None
@property @property

View file

@ -1,4 +1,6 @@
"""Support for displaying weather info from Ecobee API.""" """Support for displaying weather info from Ecobee API."""
from __future__ import annotations
from datetime import timedelta from datetime import timedelta
from pyecobee.const import ECOBEE_STATE_UNKNOWN from pyecobee.const import ECOBEE_STATE_UNKNOWN
@ -13,6 +15,7 @@ from homeassistant.components.weather import (
WeatherEntity, WeatherEntity,
) )
from homeassistant.const import PRESSURE_HPA, PRESSURE_INHG, TEMP_FAHRENHEIT 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 import dt as dt_util
from homeassistant.util.pressure import convert as pressure_convert 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"] return self.data.ecobee.get_thermostat(self._index)["identifier"]
@property @property
def device_info(self): def device_info(self) -> DeviceInfo:
"""Return device information for the ecobee weather platform.""" """Return device information for the ecobee weather platform."""
thermostat = self.data.ecobee.get_thermostat(self._index) thermostat = self.data.ecobee.get_thermostat(self._index)
model: str | None
try: try:
model = f"{ECOBEE_MODEL_TO_NAME[thermostat['modelNumber']]} Thermostat" model = f"{ECOBEE_MODEL_TO_NAME[thermostat['modelNumber']]} Thermostat"
except KeyError: except KeyError:
# Ecobee model is not in our list # Ecobee model is not in our list
model = None model = None
return { return DeviceInfo(
"identifiers": {(DOMAIN, thermostat["identifier"])}, identifiers={(DOMAIN, thermostat["identifier"])},
"name": self.name, manufacturer=MANUFACTURER,
"manufacturer": MANUFACTURER, model=model,
"model": model, name=self.name,
} )
@property @property
def condition(self): def condition(self):

View file

@ -16,7 +16,7 @@ from homeassistant.const import CONF_EMAIL, CONF_PASSWORD, TEMP_FAHRENHEIT
from homeassistant.core import callback from homeassistant.core import callback
from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.exceptions import ConfigEntryNotReady
from homeassistant.helpers.dispatcher import dispatcher_send 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 homeassistant.helpers.event import async_track_time_interval
from .const import API_CLIENT, DOMAIN, EQUIPMENT from .const import API_CLIENT, DOMAIN, EQUIPMENT
@ -128,13 +128,13 @@ class EcoNetEntity(Entity):
return self._econet.connected return self._econet.connected
@property @property
def device_info(self): def device_info(self) -> DeviceInfo:
"""Return device registry information for this entity.""" """Return device registry information for this entity."""
return { return DeviceInfo(
"identifiers": {(DOMAIN, self._econet.device_id)}, identifiers={(DOMAIN, self._econet.device_id)},
"manufacturer": "Rheem", manufacturer="Rheem",
"name": self._econet.device_name, name=self._econet.device_name,
} )
@property @property
def name(self): def name(self):

View file

@ -16,13 +16,6 @@ from homeassistant.components.light import (
LightEntity, LightEntity,
) )
from homeassistant.config_entries import ConfigEntry 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.core import HomeAssistant
from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import ( from homeassistant.helpers.entity_platform import (
@ -187,13 +180,13 @@ class ElgatoLight(LightEntity):
@property @property
def device_info(self) -> DeviceInfo: def device_info(self) -> DeviceInfo:
"""Return device information about this Elgato Light.""" """Return device information about this Elgato Light."""
return { return DeviceInfo(
ATTR_IDENTIFIERS: {(DOMAIN, self._info.serial_number)}, identifiers={(DOMAIN, self._info.serial_number)},
ATTR_NAME: self._info.product_name, manufacturer="Elgato",
ATTR_MANUFACTURER: "Elgato", model=self._info.product_name,
ATTR_MODEL: self._info.product_name, name=self._info.product_name,
ATTR_SW_VERSION: f"{self._info.firmware_version} ({self._info.firmware_build_number})", sw_version=f"{self._info.firmware_version} ({self._info.firmware_build_number})",
} )
async def async_identify(self) -> None: async def async_identify(self) -> None:
"""Identify the light, will make it blink.""" """Identify the light, will make it blink."""

View file

@ -463,15 +463,15 @@ class ElkAttachedEntity(ElkEntity):
"""An elk entity that is attached to the elk system.""" """An elk entity that is attached to the elk system."""
@property @property
def device_info(self): def device_info(self) -> DeviceInfo:
"""Device info for the underlying ElkM1 system.""" """Device info for the underlying ElkM1 system."""
device_name = "ElkM1" device_name = "ElkM1"
if self._prefix: if self._prefix:
device_name += f" {self._prefix}" device_name += f" {self._prefix}"
return { return DeviceInfo(
"name": device_name, identifiers={(DOMAIN, f"{self._prefix}_system")},
"identifiers": {(DOMAIN, f"{self._prefix}_system")}, manufacturer="ELK Products, Inc.",
"sw_version": self._elk.panel.elkm1_version, model="M1",
"manufacturer": "ELK Products, Inc.", name=device_name,
"model": "M1", sw_version=self._elk.panel.elkm1_version,
} )

View file

@ -94,9 +94,9 @@ class EmonitorPowerSensor(CoordinatorEntity, SensorEntity):
@property @property
def device_info(self) -> DeviceInfo: def device_info(self) -> DeviceInfo:
"""Return info about the emonitor device.""" """Return info about the emonitor device."""
return { return DeviceInfo(
"name": name_short_mac(self.mac_address[-6:]), connections={(dr.CONNECTION_NETWORK_MAC, self.mac_address)},
"connections": {(dr.CONNECTION_NETWORK_MAC, self.mac_address)}, manufacturer="Powerhouse Dynamics, Inc.",
"manufacturer": "Powerhouse Dynamics, Inc.", name=name_short_mac(self.mac_address[-6:]),
"sw_version": self.coordinator.data.hardware.firmware_version, sw_version=self.coordinator.data.hardware.firmware_version,
} )

View file

@ -15,6 +15,7 @@ from homeassistant.const import (
CONF_USERNAME, CONF_USERNAME,
) )
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.update_coordinator import CoordinatorEntity from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import COORDINATOR, DOMAIN, NAME, SENSORS from .const import COORDINATOR, DOMAIN, NAME, SENSORS
@ -169,13 +170,13 @@ class Envoy(CoordinatorEntity, SensorEntity):
return None return None
@property @property
def device_info(self): def device_info(self) -> DeviceInfo:
"""Return the device_info of the device.""" """Return the device_info of the device."""
if not self._device_serial_number: if not self._device_serial_number:
return None return None
return { return DeviceInfo(
"identifiers": {(DOMAIN, str(self._device_serial_number))}, identifiers={(DOMAIN, str(self._device_serial_number))},
"name": self._device_name, manufacturer="Enphase",
"model": "Envoy", model="Envoy",
"manufacturer": "Enphase", name=self._device_name,
} )

View file

@ -1,4 +1,6 @@
"""Support for Epson projector.""" """Support for Epson projector."""
from __future__ import annotations
import logging import logging
from epson_projector.const import ( 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.const import STATE_OFF, STATE_ON
from homeassistant.helpers import entity_platform from homeassistant.helpers import entity_platform
import homeassistant.helpers.config_validation as cv 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 homeassistant.helpers.entity_registry import async_get as async_get_entity_registry
from .const import ATTR_CMODE, DOMAIN, SERVICE_SELECT_CMODE from .const import ATTR_CMODE, DOMAIN, SERVICE_SELECT_CMODE
@ -137,17 +140,17 @@ class EpsonProjectorMediaPlayer(MediaPlayerEntity):
self._state = STATE_OFF self._state = STATE_OFF
@property @property
def device_info(self): def device_info(self) -> DeviceInfo | None:
"""Get attributes about the device.""" """Get attributes about the device."""
if not self._unique_id: if not self._unique_id:
return None return None
return { return DeviceInfo(
"identifiers": {(DOMAIN, self._unique_id)}, identifiers={(DOMAIN, self._unique_id)},
"manufacturer": "Epson", manufacturer="Epson",
"name": "Epson projector", model="Epson",
"model": "Epson", name="Epson projector",
"via_hub": (DOMAIN, self._unique_id), via_device=(DOMAIN, self._unique_id),
} )
@property @property
def name(self): def name(self):

View file

@ -22,13 +22,13 @@ class EzvizEntity(CoordinatorEntity, Entity):
super().__init__(coordinator) super().__init__(coordinator)
self._serial = serial self._serial = serial
self._camera_name = self.data["name"] self._camera_name = self.data["name"]
self._attr_device_info: DeviceInfo = { self._attr_device_info = DeviceInfo(
"identifiers": {(DOMAIN, serial)}, identifiers={(DOMAIN, serial)},
"name": self.data["name"], manufacturer=MANUFACTURER,
"model": self.data["device_sub_category"], model=self.data["device_sub_category"],
"manufacturer": MANUFACTURER, name=self.data["name"],
"sw_version": self.data["version"], sw_version=self.data["version"],
} )
@property @property
def data(self) -> dict[str, Any]: def data(self) -> dict[str, Any]: