From aaae4cfc8f64eefb5313679a6f271e8532c5afa3 Mon Sep 17 00:00:00 2001 From: Maciej Bieniek Date: Thu, 20 May 2021 12:38:46 +0200 Subject: [PATCH] Use constants with TypedDict in Nettigo Air Monitor integration (#50883) * Use constants with TypedDict * Sensor names as consts --- homeassistant/components/nam/air_quality.py | 15 +- homeassistant/components/nam/const.py | 203 +++++++++++--------- homeassistant/components/nam/sensor.py | 15 +- 3 files changed, 133 insertions(+), 100 deletions(-) diff --git a/homeassistant/components/nam/air_quality.py b/homeassistant/components/nam/air_quality.py index c39ad2bea73..163b50148db 100644 --- a/homeassistant/components/nam/air_quality.py +++ b/homeassistant/components/nam/air_quality.py @@ -10,7 +10,14 @@ from homeassistant.helpers.typing import StateType from homeassistant.helpers.update_coordinator import CoordinatorEntity from . import NAMDataUpdateCoordinator -from .const import AIR_QUALITY_SENSORS, DEFAULT_NAME, DOMAIN, SUFFIX_P1, SUFFIX_P2 +from .const import ( + AIR_QUALITY_SENSORS, + ATTR_MHZ14A_CARBON_DIOXIDE, + DEFAULT_NAME, + DOMAIN, + SUFFIX_P1, + SUFFIX_P2, +) PARALLEL_UPDATES = 1 @@ -61,7 +68,9 @@ class NAMAirQuality(CoordinatorEntity, AirQualityEntity): @property def carbon_dioxide(self) -> StateType: """Return the particulate matter 10 level.""" - return round_state(getattr(self.coordinator.data, "conc_co2_ppm", None)) + return round_state( + getattr(self.coordinator.data, ATTR_MHZ14A_CARBON_DIOXIDE, None) + ) @property def unique_id(self) -> str: @@ -82,7 +91,7 @@ class NAMAirQuality(CoordinatorEntity, AirQualityEntity): # sensors. For this reason, we mark entities for which data is missing as # unavailable. return available and bool( - getattr(self.coordinator.data, f"{self.sensor_type}_p2", None) + getattr(self.coordinator.data, f"{self.sensor_type}{SUFFIX_P2}", None) ) diff --git a/homeassistant/components/nam/const.py b/homeassistant/components/nam/const.py index 3800057d5d7..8171914b832 100644 --- a/homeassistant/components/nam/const.py +++ b/homeassistant/components/nam/const.py @@ -5,6 +5,8 @@ from datetime import timedelta from typing import Final from homeassistant.const import ( + ATTR_DEVICE_CLASS, + ATTR_ICON, CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_PRESSURE, @@ -19,6 +21,27 @@ from homeassistant.const import ( from .model import SensorDescription +ATTR_BME280_HUMIDITY: Final = "bme280_humidity" +ATTR_BME280_PRESSURE: Final = "bme280_pressure" +ATTR_BME280_TEMPERATURE: Final = "bme280_temperature" +ATTR_BMP280_PRESSURE: Final = "bmp280_pressure" +ATTR_BMP280_TEMPERATURE: Final = "bmp280_temperature" +ATTR_DHT22_HUMIDITY: Final = "humidity" +ATTR_DHT22_TEMPERATURE: Final = "temperature" +ATTR_HECA_HUMIDITY: Final = "heca_humidity" +ATTR_HECA_TEMPERATURE: Final = "heca_temperature" +ATTR_MHZ14A_CARBON_DIOXIDE: Final = "conc_co2_ppm" +ATTR_SHT3X_HUMIDITY: Final = "sht3x_humidity" +ATTR_SHT3X_TEMPERATURE: Final = "sht3x_temperature" +ATTR_SIGNAL_STRENGTH: Final = "signal" +ATTR_SPS30_P0: Final = "sps30_p0" +ATTR_SPS30_P4: Final = "sps30_p4" +ATTR_UPTIME: Final = "uptime" + +ATTR_ENABLED: Final = "enabled" +ATTR_LABEL: Final = "label" +ATTR_UNIT: Final = "unit" + DEFAULT_NAME: Final = "Nettigo Air Monitor" DEFAULT_UPDATE_INTERVAL: Final = timedelta(minutes=6) DOMAIN: Final = "nam" @@ -30,109 +53,109 @@ SUFFIX_P2: Final = "_p2" AIR_QUALITY_SENSORS: Final[dict[str, str]] = {"sds": "SDS011", "sps30": "SPS30"} SENSORS: Final[dict[str, SensorDescription]] = { - "bme280_humidity": { - "label": f"{DEFAULT_NAME} BME280 Humidity", - "unit": PERCENTAGE, - "device_class": DEVICE_CLASS_HUMIDITY, - "icon": None, - "enabled": True, + ATTR_BME280_HUMIDITY: { + ATTR_LABEL: f"{DEFAULT_NAME} BME280 Humidity", + ATTR_UNIT: PERCENTAGE, + ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY, + ATTR_ICON: None, + ATTR_ENABLED: True, }, - "bme280_pressure": { - "label": f"{DEFAULT_NAME} BME280 Pressure", - "unit": PRESSURE_HPA, - "device_class": DEVICE_CLASS_PRESSURE, - "icon": None, - "enabled": True, + ATTR_BME280_PRESSURE: { + ATTR_LABEL: f"{DEFAULT_NAME} BME280 Pressure", + ATTR_UNIT: PRESSURE_HPA, + ATTR_DEVICE_CLASS: DEVICE_CLASS_PRESSURE, + ATTR_ICON: None, + ATTR_ENABLED: True, }, - "bme280_temperature": { - "label": f"{DEFAULT_NAME} BME280 Temperature", - "unit": TEMP_CELSIUS, - "device_class": DEVICE_CLASS_TEMPERATURE, - "icon": None, - "enabled": True, + ATTR_BME280_TEMPERATURE: { + ATTR_LABEL: f"{DEFAULT_NAME} BME280 Temperature", + ATTR_UNIT: TEMP_CELSIUS, + ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE, + ATTR_ICON: None, + ATTR_ENABLED: True, }, - "bmp280_pressure": { - "label": f"{DEFAULT_NAME} BMP280 Pressure", - "unit": PRESSURE_HPA, - "device_class": DEVICE_CLASS_PRESSURE, - "icon": None, - "enabled": True, + ATTR_BMP280_PRESSURE: { + ATTR_LABEL: f"{DEFAULT_NAME} BMP280 Pressure", + ATTR_UNIT: PRESSURE_HPA, + ATTR_DEVICE_CLASS: DEVICE_CLASS_PRESSURE, + ATTR_ICON: None, + ATTR_ENABLED: True, }, - "bmp280_temperature": { - "label": f"{DEFAULT_NAME} BMP280 Temperature", - "unit": TEMP_CELSIUS, - "device_class": DEVICE_CLASS_TEMPERATURE, - "icon": None, - "enabled": True, + ATTR_BMP280_TEMPERATURE: { + ATTR_LABEL: f"{DEFAULT_NAME} BMP280 Temperature", + ATTR_UNIT: TEMP_CELSIUS, + ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE, + ATTR_ICON: None, + ATTR_ENABLED: True, }, - "heca_humidity": { - "label": f"{DEFAULT_NAME} HECA Humidity", - "unit": PERCENTAGE, - "device_class": DEVICE_CLASS_HUMIDITY, - "icon": None, - "enabled": True, + ATTR_HECA_HUMIDITY: { + ATTR_LABEL: f"{DEFAULT_NAME} HECA Humidity", + ATTR_UNIT: PERCENTAGE, + ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY, + ATTR_ICON: None, + ATTR_ENABLED: True, }, - "heca_temperature": { - "label": f"{DEFAULT_NAME} HECA Temperature", - "unit": TEMP_CELSIUS, - "device_class": DEVICE_CLASS_TEMPERATURE, - "icon": None, - "enabled": True, + ATTR_HECA_TEMPERATURE: { + ATTR_LABEL: f"{DEFAULT_NAME} HECA Temperature", + ATTR_UNIT: TEMP_CELSIUS, + ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE, + ATTR_ICON: None, + ATTR_ENABLED: True, }, - "sht3x_humidity": { - "label": f"{DEFAULT_NAME} SHT3X Humidity", - "unit": PERCENTAGE, - "device_class": DEVICE_CLASS_HUMIDITY, - "icon": None, - "enabled": True, + ATTR_SHT3X_HUMIDITY: { + ATTR_LABEL: f"{DEFAULT_NAME} SHT3X Humidity", + ATTR_UNIT: PERCENTAGE, + ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY, + ATTR_ICON: None, + ATTR_ENABLED: True, }, - "sht3x_temperature": { - "label": f"{DEFAULT_NAME} SHT3X Temperature", - "unit": TEMP_CELSIUS, - "device_class": DEVICE_CLASS_TEMPERATURE, - "icon": None, - "enabled": True, + ATTR_SHT3X_TEMPERATURE: { + ATTR_LABEL: f"{DEFAULT_NAME} SHT3X Temperature", + ATTR_UNIT: TEMP_CELSIUS, + ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE, + ATTR_ICON: None, + ATTR_ENABLED: True, }, - "sps30_p0": { - "label": f"{DEFAULT_NAME} SPS30 Particulate Matter 1.0", - "unit": CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, - "device_class": None, - "icon": "mdi:blur", - "enabled": True, + ATTR_SPS30_P0: { + ATTR_LABEL: f"{DEFAULT_NAME} SPS30 Particulate Matter 1.0", + ATTR_UNIT: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, + ATTR_DEVICE_CLASS: None, + ATTR_ICON: "mdi:blur", + ATTR_ENABLED: True, }, - "sps30_p4": { - "label": f"{DEFAULT_NAME} SPS30 Particulate Matter 4.0", - "unit": CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, - "device_class": None, - "icon": "mdi:blur", - "enabled": True, + ATTR_SPS30_P4: { + ATTR_LABEL: f"{DEFAULT_NAME} SPS30 Particulate Matter 4.0", + ATTR_UNIT: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, + ATTR_DEVICE_CLASS: None, + ATTR_ICON: "mdi:blur", + ATTR_ENABLED: True, }, - "humidity": { - "label": f"{DEFAULT_NAME} DHT22 Humidity", - "unit": PERCENTAGE, - "device_class": DEVICE_CLASS_HUMIDITY, - "icon": None, - "enabled": True, + ATTR_DHT22_HUMIDITY: { + ATTR_LABEL: f"{DEFAULT_NAME} DHT22 Humidity", + ATTR_UNIT: PERCENTAGE, + ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY, + ATTR_ICON: None, + ATTR_ENABLED: True, }, - "signal": { - "label": f"{DEFAULT_NAME} Signal Strength", - "unit": SIGNAL_STRENGTH_DECIBELS_MILLIWATT, - "device_class": DEVICE_CLASS_SIGNAL_STRENGTH, - "icon": None, - "enabled": False, + ATTR_DHT22_TEMPERATURE: { + ATTR_LABEL: f"{DEFAULT_NAME} DHT22 Temperature", + ATTR_UNIT: TEMP_CELSIUS, + ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE, + ATTR_ICON: None, + ATTR_ENABLED: True, }, - "temperature": { - "label": f"{DEFAULT_NAME} DHT22 Temperature", - "unit": TEMP_CELSIUS, - "device_class": DEVICE_CLASS_TEMPERATURE, - "icon": None, - "enabled": True, + ATTR_SIGNAL_STRENGTH: { + ATTR_LABEL: f"{DEFAULT_NAME} Signal Strength", + ATTR_UNIT: SIGNAL_STRENGTH_DECIBELS_MILLIWATT, + ATTR_DEVICE_CLASS: DEVICE_CLASS_SIGNAL_STRENGTH, + ATTR_ICON: None, + ATTR_ENABLED: False, }, - "uptime": { - "label": f"{DEFAULT_NAME} Uptime", - "unit": None, - "device_class": DEVICE_CLASS_TIMESTAMP, - "icon": None, - "enabled": False, + ATTR_UPTIME: { + ATTR_LABEL: f"{DEFAULT_NAME} Uptime", + ATTR_UNIT: None, + ATTR_DEVICE_CLASS: DEVICE_CLASS_TIMESTAMP, + ATTR_ICON: None, + ATTR_ENABLED: False, }, } diff --git a/homeassistant/components/nam/sensor.py b/homeassistant/components/nam/sensor.py index 026e40483bd..2774d87f2d3 100644 --- a/homeassistant/components/nam/sensor.py +++ b/homeassistant/components/nam/sensor.py @@ -6,6 +6,7 @@ from typing import Any from homeassistant.components.sensor import SensorEntity from homeassistant.config_entries import ConfigEntry +from homeassistant.const import ATTR_DEVICE_CLASS, ATTR_ICON from homeassistant.core import HomeAssistant from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback @@ -13,7 +14,7 @@ from homeassistant.helpers.update_coordinator import CoordinatorEntity from homeassistant.util.dt import utcnow from . import NAMDataUpdateCoordinator -from .const import DOMAIN, SENSORS +from .const import ATTR_ENABLED, ATTR_LABEL, ATTR_UNIT, ATTR_UPTIME, DOMAIN, SENSORS PARALLEL_UPDATES = 1 @@ -27,7 +28,7 @@ async def async_setup_entry( sensors: list[NAMSensor | NAMSensorUptime] = [] for sensor in SENSORS: if sensor in coordinator.data: - if sensor == "uptime": + if sensor == ATTR_UPTIME: sensors.append(NAMSensorUptime(coordinator, sensor)) else: sensors.append(NAMSensor(coordinator, sensor)) @@ -49,7 +50,7 @@ class NAMSensor(CoordinatorEntity, SensorEntity): @property def name(self) -> str: """Return the name.""" - return self._description["label"] + return self._description[ATTR_LABEL] @property def state(self) -> Any: @@ -59,22 +60,22 @@ class NAMSensor(CoordinatorEntity, SensorEntity): @property def unit_of_measurement(self) -> str | None: """Return the unit the value is expressed in.""" - return self._description["unit"] + return self._description[ATTR_UNIT] @property def device_class(self) -> str | None: """Return the class of this sensor.""" - return self._description["device_class"] + return self._description[ATTR_DEVICE_CLASS] @property def icon(self) -> str | None: """Return the icon.""" - return self._description["icon"] + return self._description[ATTR_ICON] @property def entity_registry_enabled_default(self) -> bool: """Return if the entity should be enabled when first added to the entity registry.""" - return self._description["enabled"] + return self._description[ATTR_ENABLED] @property def unique_id(self) -> str: