From 258b388f4104908ebba2074eb62695705712c244 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Mon, 31 May 2021 10:50:11 +0200 Subject: [PATCH] Collection of changing entity properties to class attributes (#51248) * Collection of changing entity properties to class attributes * Apply suggestions from code review Co-authored-by: Erik Montnemery Co-authored-by: Erik Montnemery --- .../components/advantage_air/binary_sensor.py | 21 ++---- .../components/advantage_air/sensor.py | 21 ++---- homeassistant/components/aten_pe/switch.py | 7 +- homeassistant/components/co2signal/sensor.py | 13 +--- .../components/deconz/binary_sensor.py | 7 +- homeassistant/components/deconz/climate.py | 6 +- homeassistant/components/delijn/sensor.py | 7 +- homeassistant/components/emonitor/sensor.py | 13 +--- .../homekit_controller/binary_sensor.py | 36 +++------- .../components/homekit_controller/sensor.py | 65 +++++-------------- homeassistant/components/homematic/cover.py | 7 +- .../components/ign_sismologia/geo_location.py | 7 +- .../keenetic_ndms2/binary_sensor.py | 13 +--- .../components/lutron/binary_sensor.py | 7 +- homeassistant/components/nmbs/sensor.py | 7 +- homeassistant/components/shelly/cover.py | 7 +- .../components/sighthound/image_processing.py | 7 +- .../components/smart_meter_texas/sensor.py | 7 +- .../components/smarttub/binary_sensor.py | 21 ++---- homeassistant/components/soma/sensor.py | 11 +--- homeassistant/components/somfy/sensor.py | 13 +--- .../components/syncthru/binary_sensor.py | 14 ++-- homeassistant/components/tradfri/sensor.py | 13 +--- .../components/trafikverket_train/sensor.py | 7 +- homeassistant/components/upcloud/__init__.py | 7 +- .../components/vultr/binary_sensor.py | 7 +- homeassistant/components/wsdot/sensor.py | 14 ++-- homeassistant/components/xbee/__init__.py | 7 +- homeassistant/components/xbee/sensor.py | 7 +- .../components/xiaomi_miio/sensor.py | 13 +--- .../components/xiaomi_miio/switch.py | 7 +- homeassistant/components/zha/cover.py | 12 +--- 32 files changed, 106 insertions(+), 305 deletions(-) diff --git a/homeassistant/components/advantage_air/binary_sensor.py b/homeassistant/components/advantage_air/binary_sensor.py index f7b295c9634..fba90148788 100644 --- a/homeassistant/components/advantage_air/binary_sensor.py +++ b/homeassistant/components/advantage_air/binary_sensor.py @@ -33,6 +33,8 @@ async def async_setup_entry(hass, config_entry, async_add_entities): class AdvantageAirZoneFilter(AdvantageAirEntity, BinarySensorEntity): """Advantage Air Filter.""" + _attr_device_class = DEVICE_CLASS_PROBLEM + @property def name(self): """Return the name.""" @@ -43,11 +45,6 @@ class AdvantageAirZoneFilter(AdvantageAirEntity, BinarySensorEntity): """Return a unique id.""" return f'{self.coordinator.data["system"]["rid"]}-{self.ac_key}-filter' - @property - def device_class(self): - """Return the device class of the vent.""" - return DEVICE_CLASS_PROBLEM - @property def is_on(self): """Return if filter needs cleaning.""" @@ -57,6 +54,8 @@ class AdvantageAirZoneFilter(AdvantageAirEntity, BinarySensorEntity): class AdvantageAirZoneMotion(AdvantageAirEntity, BinarySensorEntity): """Advantage Air Zone Motion.""" + _attr_device_class = DEVICE_CLASS_MOTION + @property def name(self): """Return the name.""" @@ -67,11 +66,6 @@ class AdvantageAirZoneMotion(AdvantageAirEntity, BinarySensorEntity): """Return a unique id.""" return f'{self.coordinator.data["system"]["rid"]}-{self.ac_key}-{self.zone_key}-motion' - @property - def device_class(self): - """Return the device class of the vent.""" - return DEVICE_CLASS_MOTION - @property def is_on(self): """Return if motion is detect.""" @@ -81,6 +75,8 @@ class AdvantageAirZoneMotion(AdvantageAirEntity, BinarySensorEntity): class AdvantageAirZoneMyZone(AdvantageAirEntity, BinarySensorEntity): """Advantage Air Zone MyZone.""" + _attr_entity_registry_enabled_default = False + @property def name(self): """Return the name.""" @@ -95,8 +91,3 @@ class AdvantageAirZoneMyZone(AdvantageAirEntity, BinarySensorEntity): def is_on(self): """Return if this zone is the myZone.""" return self._zone["number"] == self._ac["myZone"] - - @property - def entity_registry_enabled_default(self): - """Return false to disable this entity by default.""" - return False diff --git a/homeassistant/components/advantage_air/sensor.py b/homeassistant/components/advantage_air/sensor.py index 8f027b1bdaf..8c6834ac76e 100644 --- a/homeassistant/components/advantage_air/sensor.py +++ b/homeassistant/components/advantage_air/sensor.py @@ -44,6 +44,8 @@ async def async_setup_entry(hass, config_entry, async_add_entities): class AdvantageAirTimeTo(AdvantageAirEntity, SensorEntity): """Representation of Advantage Air timer control.""" + _attr_unit_of_measurement = ADVANTAGE_AIR_SET_COUNTDOWN_UNIT + def __init__(self, instance, ac_key, action): """Initialize the Advantage Air timer control.""" super().__init__(instance, ac_key) @@ -65,11 +67,6 @@ class AdvantageAirTimeTo(AdvantageAirEntity, SensorEntity): """Return the current value.""" return self._ac[self._time_key] - @property - def unit_of_measurement(self): - """Return the unit of measurement.""" - return ADVANTAGE_AIR_SET_COUNTDOWN_UNIT - @property def icon(self): """Return a representative icon of the timer.""" @@ -86,6 +83,8 @@ class AdvantageAirTimeTo(AdvantageAirEntity, SensorEntity): class AdvantageAirZoneVent(AdvantageAirEntity, SensorEntity): """Representation of Advantage Air Zone Vent Sensor.""" + _attr_unit_of_measurement = PERCENTAGE + @property def name(self): """Return the name.""" @@ -103,11 +102,6 @@ class AdvantageAirZoneVent(AdvantageAirEntity, SensorEntity): return self._zone["value"] return 0 - @property - def unit_of_measurement(self): - """Return the percent sign.""" - return PERCENTAGE - @property def icon(self): """Return a representative icon.""" @@ -119,6 +113,8 @@ class AdvantageAirZoneVent(AdvantageAirEntity, SensorEntity): class AdvantageAirZoneSignal(AdvantageAirEntity, SensorEntity): """Representation of Advantage Air Zone wireless signal sensor.""" + _attr_unit_of_measurement = PERCENTAGE + @property def name(self): """Return the name.""" @@ -134,11 +130,6 @@ class AdvantageAirZoneSignal(AdvantageAirEntity, SensorEntity): """Return the current value of the wireless signal.""" return self._zone["rssi"] - @property - def unit_of_measurement(self): - """Return the percent sign.""" - return PERCENTAGE - @property def icon(self): """Return a representative icon.""" diff --git a/homeassistant/components/aten_pe/switch.py b/homeassistant/components/aten_pe/switch.py index 1bf54085064..43146938961 100644 --- a/homeassistant/components/aten_pe/switch.py +++ b/homeassistant/components/aten_pe/switch.py @@ -67,6 +67,8 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= class AtenSwitch(SwitchEntity): """Represents an ATEN PE switch.""" + _attr_device_class = DEVICE_CLASS_OUTLET + def __init__(self, device, mac, outlet, name): """Initialize an ATEN PE switch.""" self._device = device @@ -86,11 +88,6 @@ class AtenSwitch(SwitchEntity): """Return the name of the entity.""" return self._name - @property - def device_class(self) -> str: - """Return the class of this device, from component DEVICE_CLASSES.""" - return DEVICE_CLASS_OUTLET - @property def is_on(self) -> bool: """Return True if entity is on.""" diff --git a/homeassistant/components/co2signal/sensor.py b/homeassistant/components/co2signal/sensor.py index c7d2a64d6b0..980ffa8549b 100644 --- a/homeassistant/components/co2signal/sensor.py +++ b/homeassistant/components/co2signal/sensor.py @@ -54,6 +54,9 @@ def setup_platform(hass, config, add_entities, discovery_info=None): class CO2Sensor(SensorEntity): """Implementation of the CO2Signal sensor.""" + _attr_icon = "mdi:molecule-co2" + _attr_unit_of_measurement = CO2_INTENSITY_UNIT + def __init__(self, token, country_code, lat, lon): """Initialize the sensor.""" self._token = token @@ -74,21 +77,11 @@ class CO2Sensor(SensorEntity): """Return the name of the sensor.""" return self._friendly_name - @property - def icon(self): - """Icon to use in the frontend, if any.""" - return "mdi:molecule-co2" - @property def state(self): """Return the state of the device.""" return self._data - @property - def unit_of_measurement(self): - """Return the unit of measurement of this entity, if any.""" - return CO2_INTENSITY_UNIT - @property def extra_state_attributes(self): """Return the state attributes of the last update.""" diff --git a/homeassistant/components/deconz/binary_sensor.py b/homeassistant/components/deconz/binary_sensor.py index de23d06e7db..b19301aa113 100644 --- a/homeassistant/components/deconz/binary_sensor.py +++ b/homeassistant/components/deconz/binary_sensor.py @@ -127,6 +127,8 @@ class DeconzTampering(DeconzDevice, BinarySensorEntity): TYPE = DOMAIN + _attr_device_class = DEVICE_CLASS_PROBLEM + @property def unique_id(self) -> str: """Return a unique identifier for this device.""" @@ -148,8 +150,3 @@ class DeconzTampering(DeconzDevice, BinarySensorEntity): def name(self) -> str: """Return the name of the sensor.""" return f"{self._device.name} Tampered" - - @property - def device_class(self) -> str: - """Return the class of the sensor.""" - return DEVICE_CLASS_PROBLEM diff --git a/homeassistant/components/deconz/climate.py b/homeassistant/components/deconz/climate.py index 1ef881e9c90..db68843080a 100644 --- a/homeassistant/components/deconz/climate.py +++ b/homeassistant/components/deconz/climate.py @@ -110,6 +110,7 @@ class DeconzThermostat(DeconzDevice, ClimateEntity): """Representation of a deCONZ thermostat.""" TYPE = DOMAIN + _attr_temperature_unit = TEMP_CELSIUS def __init__(self, device, gateway): """Set up thermostat device.""" @@ -238,11 +239,6 @@ class DeconzThermostat(DeconzDevice, ClimateEntity): await self._device.async_set_config(data) - @property - def temperature_unit(self): - """Return the unit of measurement.""" - return TEMP_CELSIUS - @property def extra_state_attributes(self): """Return the state attributes of the thermostat.""" diff --git a/homeassistant/components/delijn/sensor.py b/homeassistant/components/delijn/sensor.py index cff93c89954..b105ff5ff7b 100644 --- a/homeassistant/components/delijn/sensor.py +++ b/homeassistant/components/delijn/sensor.py @@ -60,6 +60,8 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= class DeLijnPublicTransportSensor(SensorEntity): """Representation of a Ruter sensor.""" + _attr_device_class = DEVICE_CLASS_TIMESTAMP + def __init__(self, line): """Initialize the sensor.""" self.line = line @@ -104,11 +106,6 @@ class DeLijnPublicTransportSensor(SensorEntity): """Return True if entity is available.""" return self._available - @property - def device_class(self): - """Return the device class.""" - return DEVICE_CLASS_TIMESTAMP - @property def name(self): """Return the name of the sensor.""" diff --git a/homeassistant/components/emonitor/sensor.py b/homeassistant/components/emonitor/sensor.py index 2b9d715ba51..1dca3f2d89d 100644 --- a/homeassistant/components/emonitor/sensor.py +++ b/homeassistant/components/emonitor/sensor.py @@ -37,6 +37,9 @@ async def async_setup_entry(hass, config_entry, async_add_entities): class EmonitorPowerSensor(CoordinatorEntity, SensorEntity): """Representation of an Emonitor power sensor entity.""" + _attr_device_class = DEVICE_CLASS_POWER + _attr_unit_of_measurement = POWER_WATT + def __init__(self, coordinator: DataUpdateCoordinator, channel_number: int) -> None: """Initialize the channel sensor.""" self.channel_number = channel_number @@ -62,16 +65,6 @@ class EmonitorPowerSensor(CoordinatorEntity, SensorEntity): """Name of the sensor.""" return self.channel_data.label - @property - def unit_of_measurement(self) -> str: - """Return the unit of measurement.""" - return POWER_WATT - - @property - def device_class(self) -> str: - """Device class of the sensor.""" - return DEVICE_CLASS_POWER - def _paired_attr(self, attr_name: str) -> float: """Cumulative attributes for channel and paired channel.""" attr_val = getattr(self.channel_data, attr_name) diff --git a/homeassistant/components/homekit_controller/binary_sensor.py b/homeassistant/components/homekit_controller/binary_sensor.py index 537e9c2a698..64257c47f47 100644 --- a/homeassistant/components/homekit_controller/binary_sensor.py +++ b/homeassistant/components/homekit_controller/binary_sensor.py @@ -19,15 +19,12 @@ from . import KNOWN_DEVICES, HomeKitEntity class HomeKitMotionSensor(HomeKitEntity, BinarySensorEntity): """Representation of a Homekit motion sensor.""" + _attr_device_class = DEVICE_CLASS_MOTION + def get_characteristic_types(self): """Define the homekit characteristics the entity is tracking.""" return [CharacteristicsTypes.MOTION_DETECTED] - @property - def device_class(self): - """Define this binary_sensor as a motion sensor.""" - return DEVICE_CLASS_MOTION - @property def is_on(self): """Has motion been detected.""" @@ -37,15 +34,12 @@ class HomeKitMotionSensor(HomeKitEntity, BinarySensorEntity): class HomeKitContactSensor(HomeKitEntity, BinarySensorEntity): """Representation of a Homekit contact sensor.""" + _attr_device_class = DEVICE_CLASS_OPENING + def get_characteristic_types(self): """Define the homekit characteristics the entity is tracking.""" return [CharacteristicsTypes.CONTACT_STATE] - @property - def device_class(self): - """Define this binary_sensor as a opening sensor.""" - return DEVICE_CLASS_OPENING - @property def is_on(self): """Return true if the binary sensor is on/open.""" @@ -55,10 +49,7 @@ class HomeKitContactSensor(HomeKitEntity, BinarySensorEntity): class HomeKitSmokeSensor(HomeKitEntity, BinarySensorEntity): """Representation of a Homekit smoke sensor.""" - @property - def device_class(self) -> str: - """Return the class of this sensor.""" - return DEVICE_CLASS_SMOKE + _attr_device_class = DEVICE_CLASS_SMOKE def get_characteristic_types(self): """Define the homekit characteristics the entity is tracking.""" @@ -73,10 +64,7 @@ class HomeKitSmokeSensor(HomeKitEntity, BinarySensorEntity): class HomeKitCarbonMonoxideSensor(HomeKitEntity, BinarySensorEntity): """Representation of a Homekit BO sensor.""" - @property - def device_class(self) -> str: - """Return the class of this sensor.""" - return DEVICE_CLASS_GAS + _attr_device_class = DEVICE_CLASS_GAS def get_characteristic_types(self): """Define the homekit characteristics the entity is tracking.""" @@ -91,10 +79,7 @@ class HomeKitCarbonMonoxideSensor(HomeKitEntity, BinarySensorEntity): class HomeKitOccupancySensor(HomeKitEntity, BinarySensorEntity): """Representation of a Homekit occupancy sensor.""" - @property - def device_class(self) -> str: - """Return the class of this sensor.""" - return DEVICE_CLASS_OCCUPANCY + _attr_device_class = DEVICE_CLASS_OCCUPANCY def get_characteristic_types(self): """Define the homekit characteristics the entity is tracking.""" @@ -109,15 +94,12 @@ class HomeKitOccupancySensor(HomeKitEntity, BinarySensorEntity): class HomeKitLeakSensor(HomeKitEntity, BinarySensorEntity): """Representation of a Homekit leak sensor.""" + _attr_device_class = DEVICE_CLASS_MOISTURE + def get_characteristic_types(self): """Define the homekit characteristics the entity is tracking.""" return [CharacteristicsTypes.LEAK_DETECTED] - @property - def device_class(self): - """Define this binary_sensor as a leak sensor.""" - return DEVICE_CLASS_MOISTURE - @property def is_on(self): """Return true if a leak is detected from the binary sensor.""" diff --git a/homeassistant/components/homekit_controller/sensor.py b/homeassistant/components/homekit_controller/sensor.py index 2ae264fabb9..0aa8d24da38 100644 --- a/homeassistant/components/homekit_controller/sensor.py +++ b/homeassistant/components/homekit_controller/sensor.py @@ -43,15 +43,13 @@ SIMPLE_SENSOR = { class HomeKitHumiditySensor(HomeKitEntity, SensorEntity): """Representation of a Homekit humidity sensor.""" + _attr_device_class = DEVICE_CLASS_HUMIDITY + _attr_unit_of_measurement = PERCENTAGE + def get_characteristic_types(self): """Define the homekit characteristics the entity is tracking.""" return [CharacteristicsTypes.RELATIVE_HUMIDITY_CURRENT] - @property - def device_class(self) -> str: - """Return the device class of the sensor.""" - return DEVICE_CLASS_HUMIDITY - @property def name(self): """Return the name of the device.""" @@ -62,11 +60,6 @@ class HomeKitHumiditySensor(HomeKitEntity, SensorEntity): """Return the sensor icon.""" return HUMIDITY_ICON - @property - def unit_of_measurement(self): - """Return units for the sensor.""" - return PERCENTAGE - @property def state(self): """Return the current humidity.""" @@ -76,15 +69,13 @@ class HomeKitHumiditySensor(HomeKitEntity, SensorEntity): class HomeKitTemperatureSensor(HomeKitEntity, SensorEntity): """Representation of a Homekit temperature sensor.""" + _attr_device_class = DEVICE_CLASS_TEMPERATURE + _attr_unit_of_measurement = TEMP_CELSIUS + def get_characteristic_types(self): """Define the homekit characteristics the entity is tracking.""" return [CharacteristicsTypes.TEMPERATURE_CURRENT] - @property - def device_class(self) -> str: - """Return the device class of the sensor.""" - return DEVICE_CLASS_TEMPERATURE - @property def name(self): """Return the name of the device.""" @@ -95,11 +86,6 @@ class HomeKitTemperatureSensor(HomeKitEntity, SensorEntity): """Return the sensor icon.""" return TEMP_C_ICON - @property - def unit_of_measurement(self): - """Return units for the sensor.""" - return TEMP_CELSIUS - @property def state(self): """Return the current temperature in Celsius.""" @@ -109,15 +95,13 @@ class HomeKitTemperatureSensor(HomeKitEntity, SensorEntity): class HomeKitLightSensor(HomeKitEntity, SensorEntity): """Representation of a Homekit light level sensor.""" + _attr_device_class = DEVICE_CLASS_ILLUMINANCE + _attr_unit_of_measurement = LIGHT_LUX + def get_characteristic_types(self): """Define the homekit characteristics the entity is tracking.""" return [CharacteristicsTypes.LIGHT_LEVEL_CURRENT] - @property - def device_class(self) -> str: - """Return the device class of the sensor.""" - return DEVICE_CLASS_ILLUMINANCE - @property def name(self): """Return the name of the device.""" @@ -128,11 +112,6 @@ class HomeKitLightSensor(HomeKitEntity, SensorEntity): """Return the sensor icon.""" return BRIGHTNESS_ICON - @property - def unit_of_measurement(self): - """Return units for the sensor.""" - return LIGHT_LUX - @property def state(self): """Return the current light level in lux.""" @@ -142,6 +121,9 @@ class HomeKitLightSensor(HomeKitEntity, SensorEntity): class HomeKitCarbonDioxideSensor(HomeKitEntity, SensorEntity): """Representation of a Homekit Carbon Dioxide sensor.""" + _attr_icon = CO2_ICON + _attr_unit_of_measurement = CONCENTRATION_PARTS_PER_MILLION + def get_characteristic_types(self): """Define the homekit characteristics the entity is tracking.""" return [CharacteristicsTypes.CARBON_DIOXIDE_LEVEL] @@ -151,16 +133,6 @@ class HomeKitCarbonDioxideSensor(HomeKitEntity, SensorEntity): """Return the name of the device.""" return f"{super().name} CO2" - @property - def icon(self): - """Return the sensor icon.""" - return CO2_ICON - - @property - def unit_of_measurement(self): - """Return units for the sensor.""" - return CONCENTRATION_PARTS_PER_MILLION - @property def state(self): """Return the current CO2 level in ppm.""" @@ -170,6 +142,9 @@ class HomeKitCarbonDioxideSensor(HomeKitEntity, SensorEntity): class HomeKitBatterySensor(HomeKitEntity, SensorEntity): """Representation of a Homekit battery sensor.""" + _attr_device_class = DEVICE_CLASS_BATTERY + _attr_unit_of_measurement = PERCENTAGE + def get_characteristic_types(self): """Define the homekit characteristics the entity is tracking.""" return [ @@ -178,11 +153,6 @@ class HomeKitBatterySensor(HomeKitEntity, SensorEntity): CharacteristicsTypes.CHARGING_STATE, ] - @property - def device_class(self) -> str: - """Return the device class of the sensor.""" - return DEVICE_CLASS_BATTERY - @property def name(self): """Return the name of the device.""" @@ -210,11 +180,6 @@ class HomeKitBatterySensor(HomeKitEntity, SensorEntity): return icon - @property - def unit_of_measurement(self): - """Return units for the sensor.""" - return PERCENTAGE - @property def is_low_battery(self): """Return true if battery level is low.""" diff --git a/homeassistant/components/homematic/cover.py b/homeassistant/components/homematic/cover.py index e9f2943b53b..deed671931f 100644 --- a/homeassistant/components/homematic/cover.py +++ b/homeassistant/components/homematic/cover.py @@ -112,6 +112,8 @@ class HMCover(HMDevice, CoverEntity): class HMGarage(HMCover): """Represents a Homematic Garage cover. Homematic garage covers do not support position attributes.""" + _attr_device_class = DEVICE_CLASS_GARAGE + @property def current_cover_position(self): """ @@ -127,11 +129,6 @@ class HMGarage(HMCover): """Return whether the cover is closed.""" return self._hmdevice.is_closed(self._hm_get_state()) - @property - def device_class(self): - """Return the device class.""" - return DEVICE_CLASS_GARAGE - def _init_data_struct(self): """Generate a data dictionary (self._data) from metadata.""" self._state = "DOOR_STATE" diff --git a/homeassistant/components/ign_sismologia/geo_location.py b/homeassistant/components/ign_sismologia/geo_location.py index 314a7bdea31..2ef9cbf4eeb 100644 --- a/homeassistant/components/ign_sismologia/geo_location.py +++ b/homeassistant/components/ign_sismologia/geo_location.py @@ -132,6 +132,8 @@ class IgnSismologiaFeedEntityManager: class IgnSismologiaLocationEvent(GeolocationEvent): """This represents an external event with IGN Sismologia feed data.""" + _attr_unit_of_measurement = LENGTH_KILOMETERS + def __init__(self, feed_manager, external_id): """Initialize entity with data from feed entry.""" self._feed_manager = feed_manager @@ -233,11 +235,6 @@ class IgnSismologiaLocationEvent(GeolocationEvent): """Return longitude value of this external event.""" return self._longitude - @property - def unit_of_measurement(self): - """Return the unit of measurement.""" - return LENGTH_KILOMETERS - @property def extra_state_attributes(self): """Return the device state attributes.""" diff --git a/homeassistant/components/keenetic_ndms2/binary_sensor.py b/homeassistant/components/keenetic_ndms2/binary_sensor.py index ed366bd7402..e8f7df02489 100644 --- a/homeassistant/components/keenetic_ndms2/binary_sensor.py +++ b/homeassistant/components/keenetic_ndms2/binary_sensor.py @@ -27,6 +27,9 @@ async def async_setup_entry( class RouterOnlineBinarySensor(BinarySensorEntity): """Representation router connection status.""" + _attr_device_class = DEVICE_CLASS_CONNECTIVITY + _attr_should_poll = False + def __init__(self, router: KeeneticRouter) -> None: """Initialize the APCUPSd binary device.""" self._router = router @@ -46,16 +49,6 @@ class RouterOnlineBinarySensor(BinarySensorEntity): """Return true if the UPS is online, else false.""" return self._router.available - @property - def device_class(self): - """Return the class of this device, from component DEVICE_CLASSES.""" - return DEVICE_CLASS_CONNECTIVITY - - @property - def should_poll(self) -> bool: - """Return False since entity pushes its state to HA.""" - return False - @property def device_info(self): """Return a client description for device registry.""" diff --git a/homeassistant/components/lutron/binary_sensor.py b/homeassistant/components/lutron/binary_sensor.py index 6fb394d333c..db5aa5dcccc 100644 --- a/homeassistant/components/lutron/binary_sensor.py +++ b/homeassistant/components/lutron/binary_sensor.py @@ -29,17 +29,14 @@ class LutronOccupancySensor(LutronDevice, BinarySensorEntity): reported as a single occupancy group. """ + _attr_device_class = DEVICE_CLASS_OCCUPANCY + @property def is_on(self): """Return true if the binary sensor is on.""" # Error cases will end up treated as unoccupied. return self._lutron_device.state == OccupancyGroup.State.OCCUPIED - @property - def device_class(self): - """Return that this is an occupancy sensor.""" - return DEVICE_CLASS_OCCUPANCY - @property def name(self): """Return the name of the device.""" diff --git a/homeassistant/components/nmbs/sensor.py b/homeassistant/components/nmbs/sensor.py index 58ad547eaec..26f7dbd2c8a 100644 --- a/homeassistant/components/nmbs/sensor.py +++ b/homeassistant/components/nmbs/sensor.py @@ -166,6 +166,8 @@ class NMBSLiveBoard(SensorEntity): class NMBSSensor(SensorEntity): """Get the the total travel time for a given connection.""" + _attr_unit_of_measurement = TIME_MINUTES + def __init__( self, api_client, name, show_on_map, station_from, station_to, excl_vias ): @@ -185,11 +187,6 @@ class NMBSSensor(SensorEntity): """Return the name of the sensor.""" return self._name - @property - def unit_of_measurement(self): - """Return the unit of measurement.""" - return TIME_MINUTES - @property def icon(self): """Return the sensor default icon or an alert icon if any delay.""" diff --git a/homeassistant/components/shelly/cover.py b/homeassistant/components/shelly/cover.py index 18f13479c30..dc2dba654f3 100644 --- a/homeassistant/components/shelly/cover.py +++ b/homeassistant/components/shelly/cover.py @@ -31,6 +31,8 @@ async def async_setup_entry(hass, config_entry, async_add_entities): class ShellyCover(ShellyBlockEntity, CoverEntity): """Switch that controls a cover block on Shelly devices.""" + _attr_device_class = DEVICE_CLASS_SHUTTER + def __init__(self, wrapper: ShellyDeviceWrapper, block: Block) -> None: """Initialize light.""" super().__init__(wrapper, block) @@ -76,11 +78,6 @@ class ShellyCover(ShellyBlockEntity, CoverEntity): """Flag supported features.""" return self._supported_features - @property - def device_class(self) -> str: - """Return the class of the device.""" - return DEVICE_CLASS_SHUTTER - async def async_close_cover(self, **kwargs): """Close cover.""" self.control_result = await self.set_state(go="close") diff --git a/homeassistant/components/sighthound/image_processing.py b/homeassistant/components/sighthound/image_processing.py index fa636eb757f..e31b30f1174 100644 --- a/homeassistant/components/sighthound/image_processing.py +++ b/homeassistant/components/sighthound/image_processing.py @@ -75,6 +75,8 @@ def setup_platform(hass, config, add_entities, discovery_info=None): class SighthoundEntity(ImageProcessingEntity): """Create a sighthound entity.""" + _attr_unit_of_measurement = ATTR_PEOPLE + def __init__( self, api, camera_entity, name, save_file_folder, save_timestamped_file ): @@ -164,11 +166,6 @@ class SighthoundEntity(ImageProcessingEntity): """Return the state of the entity.""" return self._state - @property - def unit_of_measurement(self): - """Return the unit of measurement.""" - return ATTR_PEOPLE - @property def extra_state_attributes(self): """Return the attributes.""" diff --git a/homeassistant/components/smart_meter_texas/sensor.py b/homeassistant/components/smart_meter_texas/sensor.py index 13e93fe362b..f63edcce0fc 100644 --- a/homeassistant/components/smart_meter_texas/sensor.py +++ b/homeassistant/components/smart_meter_texas/sensor.py @@ -33,6 +33,8 @@ async def async_setup_entry(hass, config_entry, async_add_entities): class SmartMeterTexasSensor(CoordinatorEntity, RestoreEntity, SensorEntity): """Representation of an Smart Meter Texas sensor.""" + _attr_unit_of_measurement = ENERGY_KILO_WATT_HOUR + def __init__(self, meter: Meter, coordinator: DataUpdateCoordinator) -> None: """Initialize the sensor.""" super().__init__(coordinator) @@ -40,11 +42,6 @@ class SmartMeterTexasSensor(CoordinatorEntity, RestoreEntity, SensorEntity): self._state = None self._available = False - @property - def unit_of_measurement(self): - """Return the unit of measurement.""" - return ENERGY_KILO_WATT_HOUR - @property def name(self): """Device Name.""" diff --git a/homeassistant/components/smarttub/binary_sensor.py b/homeassistant/components/smarttub/binary_sensor.py index 76cbd21f946..331c0b7e3d7 100644 --- a/homeassistant/components/smarttub/binary_sensor.py +++ b/homeassistant/components/smarttub/binary_sensor.py @@ -63,6 +63,8 @@ async def async_setup_entry(hass, entry, async_add_entities): class SmartTubOnline(SmartTubSensorBase, BinarySensorEntity): """A binary sensor indicating whether the spa is currently online (connected to the cloud).""" + _attr_device_class = DEVICE_CLASS_CONNECTIVITY + def __init__(self, coordinator, spa): """Initialize the entity.""" super().__init__(coordinator, spa, "Online", "online") @@ -80,15 +82,12 @@ class SmartTubOnline(SmartTubSensorBase, BinarySensorEntity): """Return true if the binary sensor is on.""" return self._state is True - @property - def device_class(self) -> str: - """Return the device class for this entity.""" - return DEVICE_CLASS_CONNECTIVITY - class SmartTubReminder(SmartTubEntity, BinarySensorEntity): """Reminders for maintenance actions.""" + _attr_device_class = DEVICE_CLASS_PROBLEM + def __init__(self, coordinator, spa, reminder): """Initialize the entity.""" super().__init__( @@ -120,11 +119,6 @@ class SmartTubReminder(SmartTubEntity, BinarySensorEntity): ATTR_REMINDER_SNOOZED: self.reminder.snoozed, } - @property - def device_class(self) -> str: - """Return the device class for this entity.""" - return DEVICE_CLASS_PROBLEM - async def async_snooze(self, days): """Snooze this reminder for the specified number of days.""" await self.reminder.snooze(days) @@ -137,6 +131,8 @@ class SmartTubError(SmartTubEntity, BinarySensorEntity): There may be 0 or more errors. If there are >0, we show the first one. """ + _attr_device_class = DEVICE_CLASS_PROBLEM + def __init__(self, coordinator, spa): """Initialize the entity.""" super().__init__( @@ -175,8 +171,3 @@ class SmartTubError(SmartTubEntity, BinarySensorEntity): ATTR_CREATED_AT: error.created_at.isoformat(), ATTR_UPDATED_AT: error.updated_at.isoformat(), } - - @property - def device_class(self) -> str: - """Return the device class for this entity.""" - return DEVICE_CLASS_PROBLEM diff --git a/homeassistant/components/soma/sensor.py b/homeassistant/components/soma/sensor.py index 436a92a1087..4df12c9f8f5 100644 --- a/homeassistant/components/soma/sensor.py +++ b/homeassistant/components/soma/sensor.py @@ -29,10 +29,8 @@ async def async_setup_entry(hass, config_entry, async_add_entities): class SomaSensor(SomaEntity, SensorEntity): """Representation of a Soma cover device.""" - @property - def device_class(self): - """Return the class of this device, from component DEVICE_CLASSES.""" - return DEVICE_CLASS_BATTERY + _attr_device_class = DEVICE_CLASS_BATTERY + _attr_unit_of_measurement = PERCENTAGE @property def name(self): @@ -44,11 +42,6 @@ class SomaSensor(SomaEntity, SensorEntity): """Return the state of the entity.""" return self.battery_state - @property - def unit_of_measurement(self): - """Return the unit of measurement this sensor expresses itself in.""" - return PERCENTAGE - @Throttle(MIN_TIME_BETWEEN_UPDATES) async def async_update(self): """Update the sensor with the latest data.""" diff --git a/homeassistant/components/somfy/sensor.py b/homeassistant/components/somfy/sensor.py index 34283a1271c..312c425cf87 100644 --- a/homeassistant/components/somfy/sensor.py +++ b/homeassistant/components/somfy/sensor.py @@ -30,6 +30,9 @@ async def async_setup_entry(hass, config_entry, async_add_entities): class SomfyThermostatBatterySensor(SomfyEntity, SensorEntity): """Representation of a Somfy thermostat battery.""" + _attr_device_class = DEVICE_CLASS_BATTERY + _attr_unit_of_measurement = PERCENTAGE + def __init__(self, coordinator, device_id, api): """Initialize the Somfy device.""" super().__init__(coordinator, device_id, api) @@ -44,13 +47,3 @@ class SomfyThermostatBatterySensor(SomfyEntity, SensorEntity): def state(self) -> int: """Return the state of the sensor.""" return self._climate.get_battery() - - @property - def device_class(self) -> str: - """Return the device class of the sensor.""" - return DEVICE_CLASS_BATTERY - - @property - def unit_of_measurement(self) -> str: - """Return the unit of measurement of the sensor.""" - return PERCENTAGE diff --git a/homeassistant/components/syncthru/binary_sensor.py b/homeassistant/components/syncthru/binary_sensor.py index 66bf76b31a5..7c4bd6fa8d1 100644 --- a/homeassistant/components/syncthru/binary_sensor.py +++ b/homeassistant/components/syncthru/binary_sensor.py @@ -75,16 +75,13 @@ class SyncThruBinarySensor(CoordinatorEntity, BinarySensorEntity): class SyncThruOnlineSensor(SyncThruBinarySensor): """Implementation of a sensor that checks whether is turned on/online.""" + _attr_device_class = DEVICE_CLASS_CONNECTIVITY + def __init__(self, syncthru, name): """Initialize the sensor.""" super().__init__(syncthru, name) self._id_suffix = "_online" - @property - def device_class(self): - """Class of the sensor.""" - return DEVICE_CLASS_CONNECTIVITY - @property def is_on(self): """Set the state to whether the printer is online.""" @@ -94,16 +91,13 @@ class SyncThruOnlineSensor(SyncThruBinarySensor): class SyncThruProblemSensor(SyncThruBinarySensor): """Implementation of a sensor that checks whether the printer works correctly.""" + _attr_device_class = DEVICE_CLASS_PROBLEM + def __init__(self, syncthru, name): """Initialize the sensor.""" super().__init__(syncthru, name) self._id_suffix = "_problem" - @property - def device_class(self): - """Class of the sensor.""" - return DEVICE_CLASS_PROBLEM - @property def is_on(self): """Set the state to whether there is a problem with the printer.""" diff --git a/homeassistant/components/tradfri/sensor.py b/homeassistant/components/tradfri/sensor.py index 455ca69147d..1f028849d32 100644 --- a/homeassistant/components/tradfri/sensor.py +++ b/homeassistant/components/tradfri/sensor.py @@ -29,22 +29,15 @@ async def async_setup_entry(hass, config_entry, async_add_entities): class TradfriSensor(TradfriBaseDevice, SensorEntity): """The platform class required by Home Assistant.""" + _attr_device_class = DEVICE_CLASS_BATTERY + _attr_unit_of_measurement = PERCENTAGE + def __init__(self, device, api, gateway_id): """Initialize the device.""" super().__init__(device, api, gateway_id) self._unique_id = f"{gateway_id}-{device.id}" - @property - def device_class(self): - """Return the devices' state attributes.""" - return DEVICE_CLASS_BATTERY - @property def state(self): """Return the current state of the device.""" return self._device.device_info.battery_level - - @property - def unit_of_measurement(self): - """Return the unit_of_measurement of the device.""" - return PERCENTAGE diff --git a/homeassistant/components/trafikverket_train/sensor.py b/homeassistant/components/trafikverket_train/sensor.py index 37e3bd52cdc..5e541045266 100644 --- a/homeassistant/components/trafikverket_train/sensor.py +++ b/homeassistant/components/trafikverket_train/sensor.py @@ -118,6 +118,8 @@ def next_departuredate(departure): class TrainSensor(SensorEntity): """Contains data about a train depature.""" + _attr_device_class = DEVICE_CLASS_TIMESTAMP + def __init__(self, train_api, name, from_station, to_station, weekday, time): """Initialize the sensor.""" self._train_api = train_api @@ -176,11 +178,6 @@ class TrainSensor(SensorEntity): ATTR_DEVIATIONS: deviations, } - @property - def device_class(self): - """Return the device class.""" - return DEVICE_CLASS_TIMESTAMP - @property def name(self): """Return the name of the sensor.""" diff --git a/homeassistant/components/upcloud/__init__.py b/homeassistant/components/upcloud/__init__.py index 57267c92cf7..925d41a3252 100644 --- a/homeassistant/components/upcloud/__init__.py +++ b/homeassistant/components/upcloud/__init__.py @@ -240,6 +240,8 @@ async def async_unload_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> class UpCloudServerEntity(CoordinatorEntity): """Entity class for UpCloud servers.""" + _attr_device_class = DEFAULT_COMPONENT_DEVICE_CLASS + def __init__( self, coordinator: DataUpdateCoordinator[dict[str, upcloud_api.Server]], @@ -284,11 +286,6 @@ class UpCloudServerEntity(CoordinatorEntity): """Return true if the server is on.""" return self.state == STATE_ON - @property - def device_class(self) -> str: - """Return the class of this server.""" - return DEFAULT_COMPONENT_DEVICE_CLASS - @property def extra_state_attributes(self) -> dict[str, Any]: """Return the state attributes of the UpCloud server.""" diff --git a/homeassistant/components/vultr/binary_sensor.py b/homeassistant/components/vultr/binary_sensor.py index c62d5136aa6..f5f03c62872 100644 --- a/homeassistant/components/vultr/binary_sensor.py +++ b/homeassistant/components/vultr/binary_sensor.py @@ -54,6 +54,8 @@ def setup_platform(hass, config, add_entities, discovery_info=None): class VultrBinarySensor(BinarySensorEntity): """Representation of a Vultr subscription sensor.""" + _attr_device_class = DEFAULT_DEVICE_CLASS + def __init__(self, vultr, subscription, name): """Initialize a new Vultr binary sensor.""" self._vultr = vultr @@ -80,11 +82,6 @@ class VultrBinarySensor(BinarySensorEntity): """Return true if the binary sensor is on.""" return self.data["power_status"] == "running" - @property - def device_class(self): - """Return the class of this sensor.""" - return DEFAULT_DEVICE_CLASS - @property def extra_state_attributes(self): """Return the state attributes of the Vultr subscription.""" diff --git a/homeassistant/components/wsdot/sensor.py b/homeassistant/components/wsdot/sensor.py index 9e4d957d028..8b45326cdbd 100644 --- a/homeassistant/components/wsdot/sensor.py +++ b/homeassistant/components/wsdot/sensor.py @@ -73,6 +73,8 @@ class WashingtonStateTransportSensor(SensorEntity): can read them and make them available. """ + _attr_icon = ICON + def __init__(self, name, access_code): """Initialize the sensor.""" self._data = {} @@ -90,15 +92,12 @@ class WashingtonStateTransportSensor(SensorEntity): """Return the state of the sensor.""" return self._state - @property - def icon(self): - """Icon to use in the frontend, if any.""" - return ICON - class WashingtonStateTravelTimeSensor(WashingtonStateTransportSensor): """Travel time sensor from WSDOT.""" + _attr_unit_of_measurement = TIME_MINUTES + def __init__(self, name, access_code, travel_time_id): """Construct a travel time sensor.""" self._travel_time_id = travel_time_id @@ -135,11 +134,6 @@ class WashingtonStateTravelTimeSensor(WashingtonStateTransportSensor): ) return attrs - @property - def unit_of_measurement(self): - """Return the unit this state is expressed in.""" - return TIME_MINUTES - def _parse_wsdot_timestamp(timestamp): """Convert WSDOT timestamp to datetime.""" diff --git a/homeassistant/components/xbee/__init__.py b/homeassistant/components/xbee/__init__.py index 58ce7587070..13cd4217b4d 100644 --- a/homeassistant/components/xbee/__init__.py +++ b/homeassistant/components/xbee/__init__.py @@ -369,6 +369,8 @@ class XBeeDigitalOut(XBeeDigitalIn): class XBeeAnalogIn(SensorEntity): """Representation of a GPIO pin configured as an analog input.""" + _attr_unit_of_measurement = PERCENTAGE + def __init__(self, config, device): """Initialize the XBee analog in device.""" self._config = config @@ -418,11 +420,6 @@ class XBeeAnalogIn(SensorEntity): """Return the state of the entity.""" return self._value - @property - def unit_of_measurement(self): - """Return the unit this state is expressed in.""" - return PERCENTAGE - def update(self): """Get the latest reading from the ADC.""" try: diff --git a/homeassistant/components/xbee/sensor.py b/homeassistant/components/xbee/sensor.py index 78cfe964277..18e4b0c7aa1 100644 --- a/homeassistant/components/xbee/sensor.py +++ b/homeassistant/components/xbee/sensor.py @@ -46,6 +46,8 @@ def setup_platform(hass, config, add_entities, discovery_info=None): class XBeeTemperatureSensor(SensorEntity): """Representation of XBee Pro temperature sensor.""" + _attr_unit_of_measurement = TEMP_CELSIUS + def __init__(self, config, device): """Initialize the sensor.""" self._config = config @@ -62,11 +64,6 @@ class XBeeTemperatureSensor(SensorEntity): """Return the state of the sensor.""" return self._temp - @property - def unit_of_measurement(self): - """Return the unit of measurement the value is expressed in.""" - return TEMP_CELSIUS - def update(self): """Get the latest data.""" try: diff --git a/homeassistant/components/xiaomi_miio/sensor.py b/homeassistant/components/xiaomi_miio/sensor.py index 16ca4d3e7ec..5d271a772b9 100644 --- a/homeassistant/components/xiaomi_miio/sensor.py +++ b/homeassistant/components/xiaomi_miio/sensor.py @@ -273,6 +273,9 @@ class XiaomiGatewaySensor(XiaomiGatewayDevice, SensorEntity): class XiaomiGatewayIlluminanceSensor(SensorEntity): """Representation of the gateway device's illuminance sensor.""" + _attr_device_class = DEVICE_CLASS_ILLUMINANCE + _attr_unit_of_measurement = UNIT_LUMEN + def __init__(self, gateway_device, gateway_name, gateway_device_id): """Initialize the entity.""" self._gateway = gateway_device @@ -302,16 +305,6 @@ class XiaomiGatewayIlluminanceSensor(SensorEntity): """Return true when state is known.""" return self._available - @property - def unit_of_measurement(self): - """Return the unit of measurement of this entity.""" - return UNIT_LUMEN - - @property - def device_class(self): - """Return the device class of this entity.""" - return DEVICE_CLASS_ILLUMINANCE - @property def state(self): """Return the state of the device.""" diff --git a/homeassistant/components/xiaomi_miio/switch.py b/homeassistant/components/xiaomi_miio/switch.py index 09a9786c372..ace0e52eaea 100644 --- a/homeassistant/components/xiaomi_miio/switch.py +++ b/homeassistant/components/xiaomi_miio/switch.py @@ -262,6 +262,8 @@ async def async_setup_entry(hass, config_entry, async_add_entities): class XiaomiGatewaySwitch(XiaomiGatewayDevice, SwitchEntity): """Representation of a XiaomiGatewaySwitch.""" + _attr_device_class = DEVICE_CLASS_SWITCH + def __init__(self, coordinator, sub_device, entry, variable): """Initialize the XiaomiSensor.""" super().__init__(coordinator, sub_device, entry) @@ -270,11 +272,6 @@ class XiaomiGatewaySwitch(XiaomiGatewayDevice, SwitchEntity): self._unique_id = f"{sub_device.sid}-ch{self._channel}" self._name = f"{sub_device.name} ch{self._channel} ({sub_device.sid})" - @property - def device_class(self): - """Return the device class of this entity.""" - return DEVICE_CLASS_SWITCH - @property def is_on(self): """Return true if switch is on.""" diff --git a/homeassistant/components/zha/cover.py b/homeassistant/components/zha/cover.py index 35080c56921..71c5dcca908 100644 --- a/homeassistant/components/zha/cover.py +++ b/homeassistant/components/zha/cover.py @@ -177,6 +177,8 @@ class ZhaCover(ZhaEntity, CoverEntity): class Shade(ZhaEntity, CoverEntity): """ZHA Shade.""" + _attr_device_class = DEVICE_CLASS_SHADE + def __init__( self, unique_id: str, @@ -199,11 +201,6 @@ class Shade(ZhaEntity, CoverEntity): """ return self._position - @property - def device_class(self) -> str | None: - """Return the class of this device, from component DEVICE_CLASSES.""" - return DEVICE_CLASS_SHADE - @property def is_closed(self) -> bool | None: """Return True if shade is closed.""" @@ -289,10 +286,7 @@ class Shade(ZhaEntity, CoverEntity): class KeenVent(Shade): """Keen vent cover.""" - @property - def device_class(self) -> str | None: - """Return the class of this device, from component DEVICE_CLASSES.""" - return DEVICE_CLASS_DAMPER + _attr_device_class = DEVICE_CLASS_DAMPER async def async_open_cover(self, **kwargs): """Open the cover."""