diff --git a/homeassistant/components/rainmachine/sensor.py b/homeassistant/components/rainmachine/sensor.py index 87feb85046d..808c6a06bc2 100644 --- a/homeassistant/components/rainmachine/sensor.py +++ b/homeassistant/components/rainmachine/sensor.py @@ -5,7 +5,11 @@ from regenmaschine.controller import Controller from homeassistant.components.sensor import SensorEntity from homeassistant.config_entries import ConfigEntry -from homeassistant.const import TEMP_CELSIUS, VOLUME_CUBIC_METERS +from homeassistant.const import ( + DEVICE_CLASS_TEMPERATURE, + TEMP_CELSIUS, + VOLUME_CUBIC_METERS, +) from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.update_coordinator import DataUpdateCoordinator @@ -62,7 +66,7 @@ SENSORS = { "Freeze Protect Temperature", "mdi:thermometer", TEMP_CELSIUS, - "temperature", + DEVICE_CLASS_TEMPERATURE, True, DATA_RESTRICTIONS_UNIVERSAL, ), diff --git a/homeassistant/components/repetier/__init__.py b/homeassistant/components/repetier/__init__.py index c104fc447e2..08306396e96 100644 --- a/homeassistant/components/repetier/__init__.py +++ b/homeassistant/components/repetier/__init__.py @@ -12,6 +12,7 @@ from homeassistant.const import ( CONF_NAME, CONF_PORT, CONF_SENSORS, + DEVICE_CLASS_TEMPERATURE, PERCENTAGE, TEMP_CELSIUS, ) @@ -110,23 +111,31 @@ def has_all_unique_names(value): SENSOR_TYPES = { # Type, Unit, Icon, post - "bed_temperature": ["temperature", TEMP_CELSIUS, "mdi:thermometer", "_bed_"], + "bed_temperature": [ + "temperature", + TEMP_CELSIUS, + None, + "_bed_", + DEVICE_CLASS_TEMPERATURE, + ], "extruder_temperature": [ "temperature", TEMP_CELSIUS, - "mdi:thermometer", + None, "_extruder_", + DEVICE_CLASS_TEMPERATURE, ], "chamber_temperature": [ "temperature", TEMP_CELSIUS, - "mdi:thermometer", + None, "_chamber_", + DEVICE_CLASS_TEMPERATURE, ], - "current_state": ["state", None, "mdi:printer-3d", ""], - "current_job": ["progress", PERCENTAGE, "mdi:file-percent", "_current_job"], - "job_end": ["progress", None, "mdi:clock-end", "_job_end"], - "job_start": ["progress", None, "mdi:clock-start", "_job_start"], + "current_state": ["state", None, "mdi:printer-3d", "", None], + "current_job": ["progress", PERCENTAGE, "mdi:file-percent", "_current_job", None], + "job_end": ["progress", None, "mdi:clock-end", "_job_end", None], + "job_start": ["progress", None, "mdi:clock-start", "_job_start", None], } SENSOR_SCHEMA = vol.Schema( diff --git a/homeassistant/components/repetier/sensor.py b/homeassistant/components/repetier/sensor.py index 77a3c51e9cf..46818095647 100644 --- a/homeassistant/components/repetier/sensor.py +++ b/homeassistant/components/repetier/sensor.py @@ -59,6 +59,7 @@ class RepetierSensor(SensorEntity): self._printer_id = printer_id self._sensor_type = sensor_type self._state = None + self._attr_device_class = SENSOR_TYPES[self._sensor_type][4] @property def available(self) -> bool: diff --git a/homeassistant/components/sensehat/sensor.py b/homeassistant/components/sensehat/sensor.py index 6ba00baae77..379301b0fa7 100644 --- a/homeassistant/components/sensehat/sensor.py +++ b/homeassistant/components/sensehat/sensor.py @@ -10,6 +10,7 @@ from homeassistant.components.sensor import PLATFORM_SCHEMA, SensorEntity from homeassistant.const import ( CONF_DISPLAY_OPTIONS, CONF_NAME, + DEVICE_CLASS_TEMPERATURE, PERCENTAGE, TEMP_CELSIUS, ) @@ -24,9 +25,9 @@ CONF_IS_HAT_ATTACHED = "is_hat_attached" MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=60) SENSOR_TYPES = { - "temperature": ["temperature", TEMP_CELSIUS], - "humidity": ["humidity", PERCENTAGE], - "pressure": ["pressure", "mb"], + "temperature": ["temperature", TEMP_CELSIUS, DEVICE_CLASS_TEMPERATURE], + "humidity": ["humidity", PERCENTAGE, None], + "pressure": ["pressure", "mb", None], } PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( @@ -77,6 +78,7 @@ class SenseHatSensor(SensorEntity): self._unit_of_measurement = SENSOR_TYPES[sensor_types][1] self.type = sensor_types self._state = None + self._attr_device_class = SENSOR_TYPES[sensor_types][2] @property def name(self): diff --git a/homeassistant/components/sht31/sensor.py b/homeassistant/components/sht31/sensor.py index 65ebbf0d882..a894623db47 100644 --- a/homeassistant/components/sht31/sensor.py +++ b/homeassistant/components/sht31/sensor.py @@ -11,6 +11,7 @@ from homeassistant.components.sensor import PLATFORM_SCHEMA, SensorEntity from homeassistant.const import ( CONF_MONITORED_CONDITIONS, CONF_NAME, + DEVICE_CLASS_TEMPERATURE, PERCENTAGE, PRECISION_TENTHS, TEMP_CELSIUS, @@ -119,6 +120,8 @@ class SHTSensor(SensorEntity): class SHTSensorTemperature(SHTSensor): """Representation of a temperature sensor.""" + _attr_device_class = DEVICE_CLASS_TEMPERATURE + @property def unit_of_measurement(self): """Return the unit of measurement.""" diff --git a/homeassistant/components/skybeacon/sensor.py b/homeassistant/components/skybeacon/sensor.py index fd707f9dd96..5b6eae96a7e 100644 --- a/homeassistant/components/skybeacon/sensor.py +++ b/homeassistant/components/skybeacon/sensor.py @@ -12,6 +12,7 @@ from homeassistant.components.sensor import PLATFORM_SCHEMA, SensorEntity from homeassistant.const import ( CONF_MAC, CONF_NAME, + DEVICE_CLASS_TEMPERATURE, EVENT_HOMEASSISTANT_STOP, PERCENTAGE, STATE_UNKNOWN, @@ -90,6 +91,7 @@ class SkybeaconHumid(SensorEntity): class SkybeaconTemp(SensorEntity): """Representation of a Skybeacon temperature sensor.""" + _attr_device_class = DEVICE_CLASS_TEMPERATURE _attr_unit_of_measurement = TEMP_CELSIUS def __init__(self, name, mon): diff --git a/homeassistant/components/solaredge_local/sensor.py b/homeassistant/components/solaredge_local/sensor.py index 441a1c39e08..920cbb564f8 100644 --- a/homeassistant/components/solaredge_local/sensor.py +++ b/homeassistant/components/solaredge_local/sensor.py @@ -13,6 +13,7 @@ from homeassistant.components.sensor import PLATFORM_SCHEMA, SensorEntity from homeassistant.const import ( CONF_IP_ADDRESS, CONF_NAME, + DEVICE_CLASS_TEMPERATURE, ELECTRICAL_CURRENT_AMPERE, ENERGY_WATT_HOUR, FREQUENCY_HERTZ, @@ -51,6 +52,7 @@ SENSOR_TYPES = { FREQUENCY_HERTZ, "mdi:current-ac", None, + None, ], "current_power": [ "currentPower", @@ -58,6 +60,7 @@ SENSOR_TYPES = { POWER_WATT, "mdi:solar-power", None, + None, ], "energy_this_month": [ "energyThisMonth", @@ -65,6 +68,7 @@ SENSOR_TYPES = { ENERGY_WATT_HOUR, "mdi:solar-power", None, + None, ], "energy_this_year": [ "energyThisYear", @@ -72,6 +76,7 @@ SENSOR_TYPES = { ENERGY_WATT_HOUR, "mdi:solar-power", None, + None, ], "energy_today": [ "energyToday", @@ -79,13 +84,15 @@ SENSOR_TYPES = { ENERGY_WATT_HOUR, "mdi:solar-power", None, + None, ], "inverter_temperature": [ "invertertemperature", "Inverter Temperature", TEMP_CELSIUS, - "mdi:thermometer", + None, "operating_mode", + DEVICE_CLASS_TEMPERATURE, ], "lifetime_energy": [ "energyTotal", @@ -93,6 +100,7 @@ SENSOR_TYPES = { ENERGY_WATT_HOUR, "mdi:solar-power", None, + None, ], "optimizer_connected": [ "optimizers", @@ -100,6 +108,7 @@ SENSOR_TYPES = { "optimizers", "mdi:solar-panel", "optimizers_connected", + None, ], "optimizer_current": [ "optimizercurrent", @@ -107,6 +116,7 @@ SENSOR_TYPES = { ELECTRICAL_CURRENT_AMPERE, "mdi:solar-panel", None, + None, ], "optimizer_power": [ "optimizerpower", @@ -114,6 +124,7 @@ SENSOR_TYPES = { POWER_WATT, "mdi:solar-panel", None, + None, ], "optimizer_temperature": [ "optimizertemperature", @@ -121,6 +132,7 @@ SENSOR_TYPES = { TEMP_CELSIUS, "mdi:solar-panel", None, + DEVICE_CLASS_TEMPERATURE, ], "optimizer_voltage": [ "optimizervoltage", @@ -128,6 +140,7 @@ SENSOR_TYPES = { VOLT, "mdi:solar-panel", None, + None, ], } @@ -170,7 +183,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): TEMP_FAHRENHEIT, "mdi:thermometer", "operating_mode", - None, + DEVICE_CLASS_TEMPERATURE, ] try: @@ -181,6 +194,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): POWER_WATT, "mdi:arrow-collapse-down", None, + None, ] sensors["import_meter_reading"] = [ "totalEnergyimport", @@ -188,6 +202,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): ENERGY_WATT_HOUR, "mdi:counter", None, + None, ] except IndexError: _LOGGER.debug("Import meter sensors are not created") @@ -200,6 +215,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): POWER_WATT, "mdi:arrow-expand-up", None, + None, ] sensors["export_meter_reading"] = [ "totalEnergyexport", @@ -207,6 +223,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): ENERGY_WATT_HOUR, "mdi:counter", None, + None, ] except IndexError: _LOGGER.debug("Export meter sensors are not created") @@ -225,6 +242,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): sensor_info[2], sensor_info[3], sensor_info[4], + sensor_info[5], ) entities.append(sensor) @@ -234,7 +252,9 @@ def setup_platform(hass, config, add_entities, discovery_info=None): class SolarEdgeSensor(SensorEntity): """Representation of an SolarEdge Monitoring API sensor.""" - def __init__(self, platform_name, data, json_key, name, unit, icon, attr): + def __init__( + self, platform_name, data, json_key, name, unit, icon, attr, device_class + ): """Initialize the sensor.""" self._platform_name = platform_name self._data = data @@ -245,6 +265,7 @@ class SolarEdgeSensor(SensorEntity): self._unit_of_measurement = unit self._icon = icon self._attr = attr + self._attr_device_class = device_class @property def name(self): diff --git a/homeassistant/components/tellstick/sensor.py b/homeassistant/components/tellstick/sensor.py index f58c5916bfb..5be89216365 100644 --- a/homeassistant/components/tellstick/sensor.py +++ b/homeassistant/components/tellstick/sensor.py @@ -11,6 +11,8 @@ from homeassistant.const import ( CONF_ID, CONF_NAME, CONF_PROTOCOL, + DEVICE_CLASS_HUMIDITY, + DEVICE_CLASS_TEMPERATURE, PERCENTAGE, TEMP_CELSIUS, ) @@ -18,7 +20,9 @@ import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) -DatatypeDescription = namedtuple("DatatypeDescription", ["name", "unit"]) +DatatypeDescription = namedtuple( + "DatatypeDescription", ["name", "unit", "device_class"] +) CONF_DATATYPE_MASK = "datatype_mask" CONF_ONLY_NAMED = "only_named" @@ -58,20 +62,28 @@ def setup_platform(hass, config, add_entities, discovery_info=None): sensor_value_descriptions = { tellcore_constants.TELLSTICK_TEMPERATURE: DatatypeDescription( - "temperature", config.get(CONF_TEMPERATURE_SCALE) + "temperature", config.get(CONF_TEMPERATURE_SCALE), DEVICE_CLASS_TEMPERATURE ), tellcore_constants.TELLSTICK_HUMIDITY: DatatypeDescription( - "humidity", PERCENTAGE + "humidity", + PERCENTAGE, + DEVICE_CLASS_HUMIDITY, + ), + tellcore_constants.TELLSTICK_RAINRATE: DatatypeDescription( + "rain rate", "", None + ), + tellcore_constants.TELLSTICK_RAINTOTAL: DatatypeDescription( + "rain total", "", None ), - tellcore_constants.TELLSTICK_RAINRATE: DatatypeDescription("rain rate", ""), - tellcore_constants.TELLSTICK_RAINTOTAL: DatatypeDescription("rain total", ""), tellcore_constants.TELLSTICK_WINDDIRECTION: DatatypeDescription( - "wind direction", "" + "wind direction", "", None ), tellcore_constants.TELLSTICK_WINDAVERAGE: DatatypeDescription( - "wind average", "" + "wind average", "", None + ), + tellcore_constants.TELLSTICK_WINDGUST: DatatypeDescription( + "wind gust", "", None ), - tellcore_constants.TELLSTICK_WINDGUST: DatatypeDescription("wind gust", ""), } try: diff --git a/homeassistant/components/xbee/sensor.py b/homeassistant/components/xbee/sensor.py index 18e4b0c7aa1..b1d5ece7d57 100644 --- a/homeassistant/components/xbee/sensor.py +++ b/homeassistant/components/xbee/sensor.py @@ -6,7 +6,7 @@ import voluptuous as vol from xbee_helper.exceptions import ZigBeeException, ZigBeeTxFailure from homeassistant.components.sensor import SensorEntity -from homeassistant.const import CONF_TYPE, TEMP_CELSIUS +from homeassistant.const import CONF_TYPE, DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS from . import DOMAIN, PLATFORM_SCHEMA, XBeeAnalogIn, XBeeAnalogInConfig, XBeeConfig @@ -46,6 +46,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): class XBeeTemperatureSensor(SensorEntity): """Representation of XBee Pro temperature sensor.""" + _attr_device_class = DEVICE_CLASS_TEMPERATURE _attr_unit_of_measurement = TEMP_CELSIUS def __init__(self, config, device): diff --git a/homeassistant/components/zamg/sensor.py b/homeassistant/components/zamg/sensor.py index 9731e033972..b35f675440e 100644 --- a/homeassistant/components/zamg/sensor.py +++ b/homeassistant/components/zamg/sensor.py @@ -19,6 +19,7 @@ from homeassistant.const import ( CONF_MONITORED_CONDITIONS, CONF_NAME, DEGREE, + DEVICE_CLASS_TEMPERATURE, LENGTH_METERS, PERCENTAGE, PRESSURE_HPA, @@ -43,43 +44,65 @@ MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=10) VIENNA_TIME_ZONE = dt_util.get_time_zone("Europe/Vienna") SENSOR_TYPES = { - "pressure": ("Pressure", PRESSURE_HPA, "LDstat hPa", float), - "pressure_sealevel": ("Pressure at Sea Level", PRESSURE_HPA, "LDred hPa", float), - "humidity": ("Humidity", PERCENTAGE, "RF %", int), + "pressure": ("Pressure", PRESSURE_HPA, None, "LDstat hPa", float), + "pressure_sealevel": ( + "Pressure at Sea Level", + PRESSURE_HPA, + None, + "LDred hPa", + float, + ), + "humidity": ("Humidity", PERCENTAGE, None, "RF %", int), "wind_speed": ( "Wind Speed", SPEED_KILOMETERS_PER_HOUR, + None, f"WG {SPEED_KILOMETERS_PER_HOUR}", float, ), - "wind_bearing": ("Wind Bearing", DEGREE, f"WR {DEGREE}", int), + "wind_bearing": ("Wind Bearing", DEGREE, None, f"WR {DEGREE}", int), "wind_max_speed": ( "Top Wind Speed", + None, SPEED_KILOMETERS_PER_HOUR, f"WSG {SPEED_KILOMETERS_PER_HOUR}", float, ), - "wind_max_bearing": ("Top Wind Bearing", DEGREE, f"WSR {DEGREE}", int), - "sun_last_hour": ("Sun Last Hour", PERCENTAGE, f"SO {PERCENTAGE}", int), - "temperature": ("Temperature", TEMP_CELSIUS, f"T {TEMP_CELSIUS}", float), + "wind_max_bearing": ("Top Wind Bearing", DEGREE, None, f"WSR {DEGREE}", int), + "sun_last_hour": ("Sun Last Hour", PERCENTAGE, None, f"SO {PERCENTAGE}", int), + "temperature": ( + "Temperature", + TEMP_CELSIUS, + DEVICE_CLASS_TEMPERATURE, + f"T {TEMP_CELSIUS}", + float, + ), "precipitation": ( "Precipitation", + None, f"l/{AREA_SQUARE_METERS}", f"N l/{AREA_SQUARE_METERS}", float, ), - "dewpoint": ("Dew Point", TEMP_CELSIUS, f"TP {TEMP_CELSIUS}", float), + "dewpoint": ( + "Dew Point", + TEMP_CELSIUS, + DEVICE_CLASS_TEMPERATURE, + f"TP {TEMP_CELSIUS}", + float, + ), # The following probably not useful for general consumption, # but we need them to fill in internal attributes - "station_name": ("Station Name", None, "Name", str), + "station_name": ("Station Name", None, None, "Name", str), "station_elevation": ( "Station Elevation", LENGTH_METERS, + None, f"Höhe {LENGTH_METERS}", int, ), - "update_date": ("Update Date", None, "Datum", str), - "update_time": ("Update Time", None, "Zeit", str), + "update_date": ("Update Date", None, None, "Datum", str), + "update_time": ("Update Time", None, None, "Zeit", str), } PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend( @@ -140,6 +163,7 @@ class ZamgSensor(SensorEntity): self.probe = probe self.client_name = name self.variable = variable + self._attr_device_class = SENSOR_TYPES[variable][2] @property def name(self): @@ -217,6 +241,7 @@ class ZamgData: api_fields = { col_heading: (standard_name, dtype) for standard_name, ( + _, _, _, col_heading, diff --git a/homeassistant/components/zwave/sensor.py b/homeassistant/components/zwave/sensor.py index a3183ba8927..d973e52ff92 100644 --- a/homeassistant/components/zwave/sensor.py +++ b/homeassistant/components/zwave/sensor.py @@ -1,6 +1,6 @@ """Support for Z-Wave sensors.""" from homeassistant.components.sensor import DEVICE_CLASS_BATTERY, DOMAIN, SensorEntity -from homeassistant.const import TEMP_CELSIUS, TEMP_FAHRENHEIT +from homeassistant.const import DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS, TEMP_FAHRENHEIT from homeassistant.core import callback from homeassistant.helpers.dispatcher import async_dispatcher_connect @@ -79,6 +79,13 @@ class ZWaveMultilevelSensor(ZWaveSensor): return self._state + @property + def device_class(self): + """Return the class of this device.""" + if self._units in ["C", "F"]: + return DEVICE_CLASS_TEMPERATURE + return None + @property def unit_of_measurement(self): """Return the unit the value is expressed in."""