Refactor NAM sensor platform (#87048)

* Bump backend library

* Remove AQI_LEVEL_STATE_MAPPING

* Add native_precission

* Update diagnostics fixture

* Use _attr_native_value

* Fix type

* Improve lambda

* Revert native_value property

* native_precision -> suggested_display_precision
This commit is contained in:
Maciej Bieniek 2023-02-07 09:14:20 +01:00 committed by GitHub
parent 73e3b30906
commit 6a3619d9fa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 107 additions and 80 deletions

View file

@ -3,7 +3,7 @@
"name": "Nettigo Air Monitor", "name": "Nettigo Air Monitor",
"documentation": "https://www.home-assistant.io/integrations/nam", "documentation": "https://www.home-assistant.io/integrations/nam",
"codeowners": ["@bieniu"], "codeowners": ["@bieniu"],
"requirements": ["nettigo-air-monitor==1.6.0"], "requirements": ["nettigo-air-monitor==2.0.0"],
"zeroconf": [ "zeroconf": [
{ {
"type": "_http._tcp.local.", "type": "_http._tcp.local.",

View file

@ -1,10 +1,12 @@
"""Support for the Nettigo Air Monitor service.""" """Support for the Nettigo Air Monitor service."""
from __future__ import annotations from __future__ import annotations
from collections.abc import Callable
from dataclasses import dataclass from dataclasses import dataclass
from datetime import datetime, timedelta from datetime import datetime, timedelta
import logging import logging
from typing import cast
from nettigo_air_monitor import NAMSensors
from homeassistant.components.sensor import ( from homeassistant.components.sensor import (
DOMAIN as PLATFORM, DOMAIN as PLATFORM,
@ -71,231 +73,282 @@ PARALLEL_UPDATES = 1
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
AQI_LEVEL_STATE_MAPPING = {
"very low": "very_low", @dataclass
"low": "low", class NAMSensorRequiredKeysMixin:
"medium": "medium", """Class for NAM entity required keys."""
"high": "high",
"very high": "very_high", value: Callable[[NAMSensors], StateType | datetime]
}
@dataclass @dataclass
class NAMSensorEntityDescription(SensorEntityDescription): class NAMSensorEntityDescription(SensorEntityDescription, NAMSensorRequiredKeysMixin):
"""Describes NAM sensor entity.""" """NAM sensor entity description."""
mapping: dict[str, str] | None = None
SENSORS: tuple[NAMSensorEntityDescription, ...] = ( SENSORS: tuple[NAMSensorEntityDescription, ...] = (
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_BME280_HUMIDITY, key=ATTR_BME280_HUMIDITY,
name="BME280 humidity", name="BME280 humidity",
suggested_display_precision=1,
native_unit_of_measurement=PERCENTAGE, native_unit_of_measurement=PERCENTAGE,
device_class=SensorDeviceClass.HUMIDITY, device_class=SensorDeviceClass.HUMIDITY,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.bme280_humidity,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_BME280_PRESSURE, key=ATTR_BME280_PRESSURE,
name="BME280 pressure", name="BME280 pressure",
suggested_display_precision=0,
native_unit_of_measurement=UnitOfPressure.HPA, native_unit_of_measurement=UnitOfPressure.HPA,
device_class=SensorDeviceClass.PRESSURE, device_class=SensorDeviceClass.PRESSURE,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.bme280_pressure,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_BME280_TEMPERATURE, key=ATTR_BME280_TEMPERATURE,
name="BME280 temperature", name="BME280 temperature",
suggested_display_precision=1,
native_unit_of_measurement=UnitOfTemperature.CELSIUS, native_unit_of_measurement=UnitOfTemperature.CELSIUS,
device_class=SensorDeviceClass.TEMPERATURE, device_class=SensorDeviceClass.TEMPERATURE,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.bme280_temperature,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_BMP180_PRESSURE, key=ATTR_BMP180_PRESSURE,
name="BMP180 pressure", name="BMP180 pressure",
suggested_display_precision=0,
native_unit_of_measurement=UnitOfPressure.HPA, native_unit_of_measurement=UnitOfPressure.HPA,
device_class=SensorDeviceClass.PRESSURE, device_class=SensorDeviceClass.PRESSURE,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.bmp180_pressure,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_BMP180_TEMPERATURE, key=ATTR_BMP180_TEMPERATURE,
name="BMP180 temperature", name="BMP180 temperature",
suggested_display_precision=1,
native_unit_of_measurement=UnitOfTemperature.CELSIUS, native_unit_of_measurement=UnitOfTemperature.CELSIUS,
device_class=SensorDeviceClass.TEMPERATURE, device_class=SensorDeviceClass.TEMPERATURE,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.bmp180_temperature,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_BMP280_PRESSURE, key=ATTR_BMP280_PRESSURE,
name="BMP280 pressure", name="BMP280 pressure",
suggested_display_precision=0,
native_unit_of_measurement=UnitOfPressure.HPA, native_unit_of_measurement=UnitOfPressure.HPA,
device_class=SensorDeviceClass.PRESSURE, device_class=SensorDeviceClass.PRESSURE,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.bmp280_pressure,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_BMP280_TEMPERATURE, key=ATTR_BMP280_TEMPERATURE,
name="BMP280 temperature", name="BMP280 temperature",
suggested_display_precision=1,
native_unit_of_measurement=UnitOfTemperature.CELSIUS, native_unit_of_measurement=UnitOfTemperature.CELSIUS,
device_class=SensorDeviceClass.TEMPERATURE, device_class=SensorDeviceClass.TEMPERATURE,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.bmp280_temperature,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_HECA_HUMIDITY, key=ATTR_HECA_HUMIDITY,
name="HECA humidity", name="HECA humidity",
suggested_display_precision=1,
native_unit_of_measurement=PERCENTAGE, native_unit_of_measurement=PERCENTAGE,
device_class=SensorDeviceClass.HUMIDITY, device_class=SensorDeviceClass.HUMIDITY,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.heca_humidity,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_HECA_TEMPERATURE, key=ATTR_HECA_TEMPERATURE,
name="HECA temperature", name="HECA temperature",
suggested_display_precision=1,
native_unit_of_measurement=UnitOfTemperature.CELSIUS, native_unit_of_measurement=UnitOfTemperature.CELSIUS,
device_class=SensorDeviceClass.TEMPERATURE, device_class=SensorDeviceClass.TEMPERATURE,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.heca_temperature,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_MHZ14A_CARBON_DIOXIDE, key=ATTR_MHZ14A_CARBON_DIOXIDE,
name="MH-Z14A carbon dioxide", name="MH-Z14A carbon dioxide",
suggested_display_precision=0,
native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION, native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION,
device_class=SensorDeviceClass.CO2, device_class=SensorDeviceClass.CO2,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.mhz14a_carbon_dioxide,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_PMSX003_CAQI, key=ATTR_PMSX003_CAQI,
name="PMSx003 CAQI", name="PMSx003 CAQI",
icon="mdi:air-filter", icon="mdi:air-filter",
value=lambda sensors: sensors.pms_caqi,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_PMSX003_CAQI_LEVEL, key=ATTR_PMSX003_CAQI_LEVEL,
name="PMSx003 CAQI level", name="PMSx003 CAQI level",
icon="mdi:air-filter", icon="mdi:air-filter",
device_class=SensorDeviceClass.ENUM, device_class=SensorDeviceClass.ENUM,
mapping=AQI_LEVEL_STATE_MAPPING, options=["very_low", "low", "medium", "high", "very_high"],
translation_key="caqi_level", translation_key="caqi_level",
value=lambda sensors: sensors.pms_caqi_level,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_PMSX003_P0, key=ATTR_PMSX003_P0,
name="PMSx003 particulate matter 1.0", name="PMSx003 particulate matter 1.0",
suggested_display_precision=0,
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
device_class=SensorDeviceClass.PM1, device_class=SensorDeviceClass.PM1,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.pms_p0,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_PMSX003_P1, key=ATTR_PMSX003_P1,
name="PMSx003 particulate matter 10", name="PMSx003 particulate matter 10",
suggested_display_precision=0,
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
device_class=SensorDeviceClass.PM10, device_class=SensorDeviceClass.PM10,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.pms_p1,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_PMSX003_P2, key=ATTR_PMSX003_P2,
name="PMSx003 particulate matter 2.5", name="PMSx003 particulate matter 2.5",
suggested_display_precision=0,
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
device_class=SensorDeviceClass.PM25, device_class=SensorDeviceClass.PM25,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.pms_p2,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_SDS011_CAQI, key=ATTR_SDS011_CAQI,
name="SDS011 CAQI", name="SDS011 CAQI",
icon="mdi:air-filter", icon="mdi:air-filter",
value=lambda sensors: sensors.sds011_caqi,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_SDS011_CAQI_LEVEL, key=ATTR_SDS011_CAQI_LEVEL,
name="SDS011 CAQI level", name="SDS011 CAQI level",
icon="mdi:air-filter", icon="mdi:air-filter",
device_class=SensorDeviceClass.ENUM, device_class=SensorDeviceClass.ENUM,
mapping=AQI_LEVEL_STATE_MAPPING, options=["very_low", "low", "medium", "high", "very_high"],
translation_key="caqi_level", translation_key="caqi_level",
value=lambda sensors: sensors.sds011_caqi_level,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_SDS011_P1, key=ATTR_SDS011_P1,
name="SDS011 particulate matter 10", name="SDS011 particulate matter 10",
suggested_display_precision=0,
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
device_class=SensorDeviceClass.PM10, device_class=SensorDeviceClass.PM10,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.sds011_p1,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_SDS011_P2, key=ATTR_SDS011_P2,
name="SDS011 particulate matter 2.5", name="SDS011 particulate matter 2.5",
suggested_display_precision=0,
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
device_class=SensorDeviceClass.PM25, device_class=SensorDeviceClass.PM25,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.sds011_p2,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_SHT3X_HUMIDITY, key=ATTR_SHT3X_HUMIDITY,
name="SHT3X humidity", name="SHT3X humidity",
suggested_display_precision=1,
native_unit_of_measurement=PERCENTAGE, native_unit_of_measurement=PERCENTAGE,
device_class=SensorDeviceClass.HUMIDITY, device_class=SensorDeviceClass.HUMIDITY,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.sht3x_humidity,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_SHT3X_TEMPERATURE, key=ATTR_SHT3X_TEMPERATURE,
name="SHT3X temperature", name="SHT3X temperature",
suggested_display_precision=1,
native_unit_of_measurement=UnitOfTemperature.CELSIUS, native_unit_of_measurement=UnitOfTemperature.CELSIUS,
device_class=SensorDeviceClass.TEMPERATURE, device_class=SensorDeviceClass.TEMPERATURE,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.sht3x_temperature,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_SPS30_CAQI, key=ATTR_SPS30_CAQI,
name="SPS30 CAQI", name="SPS30 CAQI",
icon="mdi:air-filter", icon="mdi:air-filter",
value=lambda sensors: sensors.sps30_caqi,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_SPS30_CAQI_LEVEL, key=ATTR_SPS30_CAQI_LEVEL,
name="SPS30 CAQI level", name="SPS30 CAQI level",
icon="mdi:air-filter", icon="mdi:air-filter",
device_class=SensorDeviceClass.ENUM, device_class=SensorDeviceClass.ENUM,
mapping=AQI_LEVEL_STATE_MAPPING, options=["very_low", "low", "medium", "high", "very_high"],
translation_key="caqi_level", translation_key="caqi_level",
value=lambda sensors: sensors.sps30_caqi_level,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_SPS30_P0, key=ATTR_SPS30_P0,
name="SPS30 particulate matter 1.0", name="SPS30 particulate matter 1.0",
suggested_display_precision=0,
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
device_class=SensorDeviceClass.PM1, device_class=SensorDeviceClass.PM1,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.sps30_p0,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_SPS30_P1, key=ATTR_SPS30_P1,
name="SPS30 particulate matter 10", name="SPS30 particulate matter 10",
suggested_display_precision=0,
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
device_class=SensorDeviceClass.PM10, device_class=SensorDeviceClass.PM10,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.sps30_p1,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_SPS30_P2, key=ATTR_SPS30_P2,
name="SPS30 particulate matter 2.5", name="SPS30 particulate matter 2.5",
suggested_display_precision=0,
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
device_class=SensorDeviceClass.PM25, device_class=SensorDeviceClass.PM25,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.sps30_p2,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_SPS30_P4, key=ATTR_SPS30_P4,
name="SPS30 particulate matter 4.0", name="SPS30 particulate matter 4.0",
suggested_display_precision=0,
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
icon="mdi:molecule", icon="mdi:molecule",
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.sps30_p4,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_DHT22_HUMIDITY, key=ATTR_DHT22_HUMIDITY,
name="DHT22 humidity", name="DHT22 humidity",
suggested_display_precision=1,
native_unit_of_measurement=PERCENTAGE, native_unit_of_measurement=PERCENTAGE,
device_class=SensorDeviceClass.HUMIDITY, device_class=SensorDeviceClass.HUMIDITY,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.dht22_humidity,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_DHT22_TEMPERATURE, key=ATTR_DHT22_TEMPERATURE,
name="DHT22 temperature", name="DHT22 temperature",
suggested_display_precision=1,
native_unit_of_measurement=UnitOfTemperature.CELSIUS, native_unit_of_measurement=UnitOfTemperature.CELSIUS,
device_class=SensorDeviceClass.TEMPERATURE, device_class=SensorDeviceClass.TEMPERATURE,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
value=lambda sensors: sensors.dht22_temperature,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_SIGNAL_STRENGTH, key=ATTR_SIGNAL_STRENGTH,
name="Signal strength", name="Signal strength",
suggested_display_precision=0,
native_unit_of_measurement=SIGNAL_STRENGTH_DECIBELS_MILLIWATT, native_unit_of_measurement=SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
device_class=SensorDeviceClass.SIGNAL_STRENGTH, device_class=SensorDeviceClass.SIGNAL_STRENGTH,
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC, entity_category=EntityCategory.DIAGNOSTIC,
value=lambda sensors: sensors.signal,
), ),
NAMSensorEntityDescription( NAMSensorEntityDescription(
key=ATTR_UPTIME, key=ATTR_UPTIME,
@ -303,6 +356,7 @@ SENSORS: tuple[NAMSensorEntityDescription, ...] = (
device_class=SensorDeviceClass.TIMESTAMP, device_class=SensorDeviceClass.TIMESTAMP,
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
entity_category=EntityCategory.DIAGNOSTIC, entity_category=EntityCategory.DIAGNOSTIC,
value=lambda sensors: utcnow() - timedelta(seconds=sensors.uptime or 0),
), ),
) )
@ -328,13 +382,10 @@ async def async_setup_entry(
) )
ent_reg.async_update_entity(entity_id, new_unique_id=new_unique_id) ent_reg.async_update_entity(entity_id, new_unique_id=new_unique_id)
sensors: list[NAMSensor | NAMSensorUptime] = [] sensors: list[NAMSensor] = []
for description in SENSORS: for description in SENSORS:
if getattr(coordinator.data, description.key) is not None: if getattr(coordinator.data, description.key) is not None:
if description.key == ATTR_UPTIME: sensors.append(NAMSensor(coordinator, description))
sensors.append(NAMSensorUptime(coordinator, description))
else:
sensors.append(NAMSensor(coordinator, description))
async_add_entities(sensors, False) async_add_entities(sensors, False)
@ -356,18 +407,6 @@ class NAMSensor(CoordinatorEntity[NAMDataUpdateCoordinator], SensorEntity):
self._attr_unique_id = f"{coordinator.unique_id}-{description.key}" self._attr_unique_id = f"{coordinator.unique_id}-{description.key}"
self.entity_description = description self.entity_description = description
@property
def native_value(self) -> StateType | datetime:
"""Return the state."""
if self.entity_description.mapping is not None:
return self.entity_description.mapping[
cast(str, getattr(self.coordinator.data, self.entity_description.key))
]
return cast(
StateType, getattr(self.coordinator.data, self.entity_description.key)
)
@property @property
def available(self) -> bool: def available(self) -> bool:
"""Return if entity is available.""" """Return if entity is available."""
@ -382,18 +421,6 @@ class NAMSensor(CoordinatorEntity[NAMDataUpdateCoordinator], SensorEntity):
) )
@property @property
def options(self) -> list[str] | None: def native_value(self) -> StateType | datetime:
"""If the entity description provides a mapping, use that."""
if self.entity_description.mapping:
return list(self.entity_description.mapping.values())
return super().options
class NAMSensorUptime(NAMSensor):
"""Define an Nettigo Air Monitor uptime sensor."""
@property
def native_value(self) -> datetime:
"""Return the state.""" """Return the state."""
uptime_sec = getattr(self.coordinator.data, self.entity_description.key) return self.entity_description.value(self.coordinator.data)
return utcnow() - timedelta(seconds=uptime_sec)

View file

@ -1186,7 +1186,7 @@ netdisco==3.0.0
netmap==0.7.0.2 netmap==0.7.0.2
# homeassistant.components.nam # homeassistant.components.nam
nettigo-air-monitor==1.6.0 nettigo-air-monitor==2.0.0
# homeassistant.components.neurio_energy # homeassistant.components.neurio_energy
neurio==0.3.1 neurio==0.3.1

View file

@ -882,7 +882,7 @@ netdisco==3.0.0
netmap==0.7.0.2 netmap==0.7.0.2
# homeassistant.components.nam # homeassistant.components.nam
nettigo-air-monitor==1.6.0 nettigo-air-monitor==2.0.0
# homeassistant.components.nexia # homeassistant.components.nexia
nexia==2.0.6 nexia==2.0.6

View file

@ -1,33 +1,33 @@
{ {
"bme280_humidity": 45.7, "bme280_humidity": 45.7,
"bme280_pressure": 1011, "bme280_pressure": 1011.012,
"bme280_temperature": 7.6, "bme280_temperature": 7.6,
"bmp180_pressure": 1032, "bmp180_pressure": 1032.012,
"bmp180_temperature": 7.6, "bmp180_temperature": 7.6,
"bmp280_pressure": 1022, "bmp280_pressure": 1022.012,
"bmp280_temperature": 5.6, "bmp280_temperature": 5.6,
"dht22_humidity": 46.2, "dht22_humidity": 46.2,
"dht22_temperature": 6.3, "dht22_temperature": 6.3,
"heca_humidity": 50.0, "heca_humidity": 50.0,
"heca_temperature": 8.0, "heca_temperature": 8.0,
"mhz14a_carbon_dioxide": 865, "mhz14a_carbon_dioxide": 865.0,
"pms_caqi": 19, "pms_caqi": 19,
"pms_caqi_level": "very low", "pms_caqi_level": "very_low",
"pms_p0": 6, "pms_p0": 6.0,
"pms_p1": 10, "pms_p1": 10.0,
"pms_p2": 11, "pms_p2": 11.0,
"sds011_caqi": 19, "sds011_caqi": 19,
"sds011_caqi_level": "very low", "sds011_caqi_level": "very_low",
"sds011_p1": 19, "sds011_p1": 18.6,
"sds011_p2": 11, "sds011_p2": 11.0,
"sht3x_humidity": 34.7, "sht3x_humidity": 34.7,
"sht3x_temperature": 6.3, "sht3x_temperature": 6.3,
"signal": -72, "signal": -72.0,
"sps30_caqi": 54, "sps30_caqi": 54,
"sps30_caqi_level": "medium", "sps30_caqi_level": "medium",
"sps30_p0": 31, "sps30_p0": 31.2,
"sps30_p1": 21, "sps30_p1": 21.2,
"sps30_p2": 34, "sps30_p2": 34.3,
"sps30_p4": 25, "sps30_p4": 24.7,
"uptime": 456987 "uptime": 456987
} }

View file

@ -21,7 +21,7 @@ async def test_async_setup_entry(hass):
state = hass.states.get("sensor.nettigo_air_monitor_sds011_particulate_matter_2_5") state = hass.states.get("sensor.nettigo_air_monitor_sds011_particulate_matter_2_5")
assert state is not None assert state is not None
assert state.state != STATE_UNAVAILABLE assert state.state != STATE_UNAVAILABLE
assert state.state == "11" assert state.state == "11.0"
async def test_config_not_ready(hass): async def test_config_not_ready(hass):

View file

@ -83,7 +83,7 @@ async def test_sensor(hass):
state = hass.states.get("sensor.nettigo_air_monitor_bme280_pressure") state = hass.states.get("sensor.nettigo_air_monitor_bme280_pressure")
assert state assert state
assert state.state == "1011" assert state.state == "1011.012"
assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PRESSURE assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PRESSURE
assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT
assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfPressure.HPA assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfPressure.HPA
@ -105,7 +105,7 @@ async def test_sensor(hass):
state = hass.states.get("sensor.nettigo_air_monitor_bmp180_pressure") state = hass.states.get("sensor.nettigo_air_monitor_bmp180_pressure")
assert state assert state
assert state.state == "1032" assert state.state == "1032.012"
assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PRESSURE assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PRESSURE
assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT
assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfPressure.HPA assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfPressure.HPA
@ -127,7 +127,7 @@ async def test_sensor(hass):
state = hass.states.get("sensor.nettigo_air_monitor_bmp280_pressure") state = hass.states.get("sensor.nettigo_air_monitor_bmp280_pressure")
assert state assert state
assert state.state == "1022" assert state.state == "1022.012"
assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PRESSURE assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PRESSURE
assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT
assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfPressure.HPA assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfPressure.HPA
@ -204,7 +204,7 @@ async def test_sensor(hass):
state = hass.states.get("sensor.nettigo_air_monitor_signal_strength") state = hass.states.get("sensor.nettigo_air_monitor_signal_strength")
assert state assert state
assert state.state == "-72" assert state.state == "-72.0"
assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.SIGNAL_STRENGTH assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.SIGNAL_STRENGTH
assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT
assert ( assert (
@ -258,7 +258,7 @@ async def test_sensor(hass):
state = hass.states.get("sensor.nettigo_air_monitor_pmsx003_particulate_matter_10") state = hass.states.get("sensor.nettigo_air_monitor_pmsx003_particulate_matter_10")
assert state assert state
assert state.state == "10" assert state.state == "10.0"
assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM10 assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM10
assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT
assert ( assert (
@ -274,7 +274,7 @@ async def test_sensor(hass):
state = hass.states.get("sensor.nettigo_air_monitor_pmsx003_particulate_matter_2_5") state = hass.states.get("sensor.nettigo_air_monitor_pmsx003_particulate_matter_2_5")
assert state assert state
assert state.state == "11" assert state.state == "11.0"
assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM25 assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM25
assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT
assert ( assert (
@ -290,7 +290,7 @@ async def test_sensor(hass):
state = hass.states.get("sensor.nettigo_air_monitor_pmsx003_particulate_matter_1_0") state = hass.states.get("sensor.nettigo_air_monitor_pmsx003_particulate_matter_1_0")
assert state assert state
assert state.state == "6" assert state.state == "6.0"
assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM1 assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM1
assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT
assert ( assert (
@ -306,7 +306,7 @@ async def test_sensor(hass):
state = hass.states.get("sensor.nettigo_air_monitor_sds011_particulate_matter_10") state = hass.states.get("sensor.nettigo_air_monitor_sds011_particulate_matter_10")
assert state assert state
assert state.state == "19" assert state.state == "18.6"
assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM10 assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM10
assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT
assert ( assert (
@ -349,7 +349,7 @@ async def test_sensor(hass):
state = hass.states.get("sensor.nettigo_air_monitor_sds011_particulate_matter_2_5") state = hass.states.get("sensor.nettigo_air_monitor_sds011_particulate_matter_2_5")
assert state assert state
assert state.state == "11" assert state.state == "11.0"
assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM25 assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM25
assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT
assert ( assert (
@ -392,7 +392,7 @@ async def test_sensor(hass):
state = hass.states.get("sensor.nettigo_air_monitor_sps30_particulate_matter_1_0") state = hass.states.get("sensor.nettigo_air_monitor_sps30_particulate_matter_1_0")
assert state assert state
assert state.state == "31" assert state.state == "31.2"
assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM1 assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM1
assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT
assert ( assert (
@ -408,7 +408,7 @@ async def test_sensor(hass):
state = hass.states.get("sensor.nettigo_air_monitor_sps30_particulate_matter_10") state = hass.states.get("sensor.nettigo_air_monitor_sps30_particulate_matter_10")
assert state assert state
assert state.state == "21" assert state.state == "21.2"
assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM10 assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM10
assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT
assert ( assert (
@ -422,7 +422,7 @@ async def test_sensor(hass):
state = hass.states.get("sensor.nettigo_air_monitor_sps30_particulate_matter_2_5") state = hass.states.get("sensor.nettigo_air_monitor_sps30_particulate_matter_2_5")
assert state assert state
assert state.state == "34" assert state.state == "34.3"
assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM25 assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM25
assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT
assert ( assert (
@ -438,7 +438,7 @@ async def test_sensor(hass):
state = hass.states.get("sensor.nettigo_air_monitor_sps30_particulate_matter_4_0") state = hass.states.get("sensor.nettigo_air_monitor_sps30_particulate_matter_4_0")
assert state assert state
assert state.state == "25" assert state.state == "24.7"
assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT
assert ( assert (
state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) state.attributes.get(ATTR_UNIT_OF_MEASUREMENT)
@ -454,7 +454,7 @@ async def test_sensor(hass):
state = hass.states.get("sensor.nettigo_air_monitor_mh_z14a_carbon_dioxide") state = hass.states.get("sensor.nettigo_air_monitor_mh_z14a_carbon_dioxide")
assert state assert state
assert state.state == "865" assert state.state == "865.0"
assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.CO2 assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.CO2
assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT
assert ( assert (