From 194f3366ce47adcff2da00dafa650bddccbae7bf Mon Sep 17 00:00:00 2001 From: Maciej Bieniek Date: Sat, 20 Apr 2024 12:34:27 +0200 Subject: [PATCH] Use snapshot testing in NAM sensor and diagnostics (#115877) * Use snapshot testing in NAM diagnostics * Use snapshot testing in NAM sensor * Add NAM data fixture --------- Co-authored-by: Maciej Bieniek <478555+bieniu@users.noreply.github.com> --- tests/components/nam/__init__.py | 35 +- .../nam/fixtures/diagnostics_data.json | 33 - tests/components/nam/fixtures/nam_data.json | 30 + .../nam/snapshots/test_diagnostics.ambr | 41 + .../components/nam/snapshots/test_sensor.ambr | 1714 +++++++++++++++++ tests/components/nam/test_diagnostics.py | 12 +- tests/components/nam/test_sensor.py | 474 +---- 7 files changed, 1820 insertions(+), 519 deletions(-) delete mode 100644 tests/components/nam/fixtures/diagnostics_data.json create mode 100644 tests/components/nam/fixtures/nam_data.json create mode 100644 tests/components/nam/snapshots/test_diagnostics.ambr create mode 100644 tests/components/nam/snapshots/test_sensor.ambr diff --git a/tests/components/nam/__init__.py b/tests/components/nam/__init__.py index 0484fc12bd6..9b254de452c 100644 --- a/tests/components/nam/__init__.py +++ b/tests/components/nam/__init__.py @@ -4,44 +4,13 @@ from unittest.mock import AsyncMock, Mock, patch from homeassistant.components.nam.const import DOMAIN -from tests.common import MockConfigEntry +from tests.common import MockConfigEntry, load_json_object_fixture INCOMPLETE_NAM_DATA = { "software_version": "NAMF-2020-36", "sensordatavalues": [], } -nam_data = { - "software_version": "NAMF-2020-36", - "uptime": "456987", - "sensordatavalues": [ - {"value_type": "PMS_P0", "value": "6.00"}, - {"value_type": "PMS_P1", "value": "10.00"}, - {"value_type": "PMS_P2", "value": "11.00"}, - {"value_type": "SDS_P1", "value": "18.65"}, - {"value_type": "SDS_P2", "value": "11.03"}, - {"value_type": "SPS30_P0", "value": "31.23"}, - {"value_type": "SPS30_P1", "value": "21.23"}, - {"value_type": "SPS30_P2", "value": "34.32"}, - {"value_type": "SPS30_P4", "value": "24.72"}, - {"value_type": "conc_co2_ppm", "value": "865"}, - {"value_type": "BME280_temperature", "value": "7.56"}, - {"value_type": "BME280_humidity", "value": "45.69"}, - {"value_type": "BME280_pressure", "value": "101101.17"}, - {"value_type": "BMP_temperature", "value": "7.56"}, - {"value_type": "BMP_pressure", "value": "103201.18"}, - {"value_type": "BMP280_temperature", "value": "5.56"}, - {"value_type": "BMP280_pressure", "value": "102201.18"}, - {"value_type": "SHT3X_temperature", "value": "6.28"}, - {"value_type": "SHT3X_humidity", "value": "34.69"}, - {"value_type": "humidity", "value": "46.23"}, - {"value_type": "temperature", "value": "6.26"}, - {"value_type": "HECA_temperature", "value": "7.95"}, - {"value_type": "HECA_humidity", "value": "49.97"}, - {"value_type": "signal", "value": "-72"}, - ], -} - async def init_integration(hass, co2_sensor=True) -> MockConfigEntry: """Set up the Nettigo Air Monitor integration in Home Assistant.""" @@ -52,6 +21,8 @@ async def init_integration(hass, co2_sensor=True) -> MockConfigEntry: data={"host": "10.10.2.3"}, ) + nam_data = load_json_object_fixture("nam/nam_data.json") + if not co2_sensor: # Remove conc_co2_ppm value nam_data["sensordatavalues"].pop(6) diff --git a/tests/components/nam/fixtures/diagnostics_data.json b/tests/components/nam/fixtures/diagnostics_data.json deleted file mode 100644 index a384e8cd386..00000000000 --- a/tests/components/nam/fixtures/diagnostics_data.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "bme280_humidity": 45.7, - "bme280_pressure": 1011.012, - "bme280_temperature": 7.6, - "bmp180_pressure": 1032.012, - "bmp180_temperature": 7.6, - "bmp280_pressure": 1022.012, - "bmp280_temperature": 5.6, - "dht22_humidity": 46.2, - "dht22_temperature": 6.3, - "heca_humidity": 50.0, - "heca_temperature": 8.0, - "mhz14a_carbon_dioxide": 865.0, - "pms_caqi": 19, - "pms_caqi_level": "very_low", - "pms_p0": 6.0, - "pms_p1": 10.0, - "pms_p2": 11.0, - "sds011_caqi": 19, - "sds011_caqi_level": "very_low", - "sds011_p1": 18.6, - "sds011_p2": 11.0, - "sht3x_humidity": 34.7, - "sht3x_temperature": 6.3, - "signal": -72.0, - "sps30_caqi": 54, - "sps30_caqi_level": "medium", - "sps30_p0": 31.2, - "sps30_p1": 21.2, - "sps30_p2": 34.3, - "sps30_p4": 24.7, - "uptime": 456987 -} diff --git a/tests/components/nam/fixtures/nam_data.json b/tests/components/nam/fixtures/nam_data.json new file mode 100644 index 00000000000..93a33d4a552 --- /dev/null +++ b/tests/components/nam/fixtures/nam_data.json @@ -0,0 +1,30 @@ +{ + "software_version": "NAMF-2020-36", + "uptime": "456987", + "sensordatavalues": [ + { "value_type": "PMS_P0", "value": "6.00" }, + { "value_type": "PMS_P1", "value": "10.00" }, + { "value_type": "PMS_P2", "value": "11.00" }, + { "value_type": "SDS_P1", "value": "18.65" }, + { "value_type": "SDS_P2", "value": "11.03" }, + { "value_type": "SPS30_P0", "value": "31.23" }, + { "value_type": "SPS30_P1", "value": "21.23" }, + { "value_type": "SPS30_P2", "value": "34.32" }, + { "value_type": "SPS30_P4", "value": "24.72" }, + { "value_type": "conc_co2_ppm", "value": "865" }, + { "value_type": "BME280_temperature", "value": "7.56" }, + { "value_type": "BME280_humidity", "value": "45.69" }, + { "value_type": "BME280_pressure", "value": "101101.17" }, + { "value_type": "BMP_temperature", "value": "7.56" }, + { "value_type": "BMP_pressure", "value": "103201.18" }, + { "value_type": "BMP280_temperature", "value": "5.56" }, + { "value_type": "BMP280_pressure", "value": "102201.18" }, + { "value_type": "SHT3X_temperature", "value": "6.28" }, + { "value_type": "SHT3X_humidity", "value": "34.69" }, + { "value_type": "humidity", "value": "46.23" }, + { "value_type": "temperature", "value": "6.26" }, + { "value_type": "HECA_temperature", "value": "7.95" }, + { "value_type": "HECA_humidity", "value": "49.97" }, + { "value_type": "signal", "value": "-72" } + ] +} diff --git a/tests/components/nam/snapshots/test_diagnostics.ambr b/tests/components/nam/snapshots/test_diagnostics.ambr new file mode 100644 index 00000000000..2ebc0246090 --- /dev/null +++ b/tests/components/nam/snapshots/test_diagnostics.ambr @@ -0,0 +1,41 @@ +# serializer version: 1 +# name: test_entry_diagnostics + dict({ + 'data': dict({ + 'bme280_humidity': 45.7, + 'bme280_pressure': 1011.012, + 'bme280_temperature': 7.6, + 'bmp180_pressure': 1032.012, + 'bmp180_temperature': 7.6, + 'bmp280_pressure': 1022.012, + 'bmp280_temperature': 5.6, + 'dht22_humidity': 46.2, + 'dht22_temperature': 6.3, + 'heca_humidity': 50.0, + 'heca_temperature': 8.0, + 'mhz14a_carbon_dioxide': 865.0, + 'pms_caqi': 19, + 'pms_caqi_level': 'very_low', + 'pms_p0': 6.0, + 'pms_p1': 10.0, + 'pms_p2': 11.0, + 'sds011_caqi': 19, + 'sds011_caqi_level': 'very_low', + 'sds011_p1': 18.6, + 'sds011_p2': 11.0, + 'sht3x_humidity': 34.7, + 'sht3x_temperature': 6.3, + 'signal': -72.0, + 'sps30_caqi': 54, + 'sps30_caqi_level': 'medium', + 'sps30_p0': 31.2, + 'sps30_p1': 21.2, + 'sps30_p2': 34.3, + 'sps30_p4': 24.7, + 'uptime': 456987, + }), + 'info': dict({ + 'host': '10.10.2.3', + }), + }) +# --- diff --git a/tests/components/nam/snapshots/test_sensor.ambr b/tests/components/nam/snapshots/test_sensor.ambr new file mode 100644 index 00000000000..bbc655ecbb6 --- /dev/null +++ b/tests/components/nam/snapshots/test_sensor.ambr @@ -0,0 +1,1714 @@ +# serializer version: 1 +# name: test_sensor[button.nettigo_air_monitor_restart-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'button', + 'entity_category': , + 'entity_id': 'button.nettigo_air_monitor_restart', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Restart', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': None, + 'unique_id': 'aa:bb:cc:dd:ee:ff-restart', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensor[button.nettigo_air_monitor_restart-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'restart', + 'friendly_name': 'Nettigo Air Monitor Restart', + }), + 'context': , + 'entity_id': 'button.nettigo_air_monitor_restart', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_bme280_humidity-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_bme280_humidity', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 1, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'BME280 humidity', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'bme280_humidity', + 'unique_id': 'aa:bb:cc:dd:ee:ff-bme280_humidity', + 'unit_of_measurement': '%', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_bme280_humidity-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'humidity', + 'friendly_name': 'Nettigo Air Monitor BME280 humidity', + 'state_class': , + 'unit_of_measurement': '%', + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_bme280_humidity', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '45.7', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_bme280_pressure-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_bme280_pressure', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'BME280 pressure', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'bme280_pressure', + 'unique_id': 'aa:bb:cc:dd:ee:ff-bme280_pressure', + 'unit_of_measurement': , + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_bme280_pressure-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'pressure', + 'friendly_name': 'Nettigo Air Monitor BME280 pressure', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_bme280_pressure', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '1011.012', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_bme280_temperature-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_bme280_temperature', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 1, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'BME280 temperature', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'bme280_temperature', + 'unique_id': 'aa:bb:cc:dd:ee:ff-bme280_temperature', + 'unit_of_measurement': , + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_bme280_temperature-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'temperature', + 'friendly_name': 'Nettigo Air Monitor BME280 temperature', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_bme280_temperature', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '7.6', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_bmp180_pressure-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_bmp180_pressure', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'BMP180 pressure', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'bmp180_pressure', + 'unique_id': 'aa:bb:cc:dd:ee:ff-bmp180_pressure', + 'unit_of_measurement': , + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_bmp180_pressure-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'pressure', + 'friendly_name': 'Nettigo Air Monitor BMP180 pressure', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_bmp180_pressure', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '1032.012', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_bmp180_temperature-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_bmp180_temperature', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 1, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'BMP180 temperature', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'bmp180_temperature', + 'unique_id': 'aa:bb:cc:dd:ee:ff-bmp180_temperature', + 'unit_of_measurement': , + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_bmp180_temperature-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'temperature', + 'friendly_name': 'Nettigo Air Monitor BMP180 temperature', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_bmp180_temperature', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '7.6', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_bmp280_pressure-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_bmp280_pressure', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'BMP280 pressure', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'bmp280_pressure', + 'unique_id': 'aa:bb:cc:dd:ee:ff-bmp280_pressure', + 'unit_of_measurement': , + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_bmp280_pressure-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'pressure', + 'friendly_name': 'Nettigo Air Monitor BMP280 pressure', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_bmp280_pressure', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '1022.012', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_bmp280_temperature-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_bmp280_temperature', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 1, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'BMP280 temperature', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'bmp280_temperature', + 'unique_id': 'aa:bb:cc:dd:ee:ff-bmp280_temperature', + 'unit_of_measurement': , + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_bmp280_temperature-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'temperature', + 'friendly_name': 'Nettigo Air Monitor BMP280 temperature', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_bmp280_temperature', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '5.6', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_dht22_humidity-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_dht22_humidity', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 1, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'DHT22 humidity', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'dht22_humidity', + 'unique_id': 'aa:bb:cc:dd:ee:ff-dht22_humidity', + 'unit_of_measurement': '%', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_dht22_humidity-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'humidity', + 'friendly_name': 'Nettigo Air Monitor DHT22 humidity', + 'state_class': , + 'unit_of_measurement': '%', + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_dht22_humidity', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '46.2', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_dht22_temperature-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_dht22_temperature', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 1, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'DHT22 temperature', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'dht22_temperature', + 'unique_id': 'aa:bb:cc:dd:ee:ff-dht22_temperature', + 'unit_of_measurement': , + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_dht22_temperature-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'temperature', + 'friendly_name': 'Nettigo Air Monitor DHT22 temperature', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_dht22_temperature', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '6.3', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_heca_humidity-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_heca_humidity', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 1, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'HECA humidity', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'heca_humidity', + 'unique_id': 'aa:bb:cc:dd:ee:ff-heca_humidity', + 'unit_of_measurement': '%', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_heca_humidity-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'humidity', + 'friendly_name': 'Nettigo Air Monitor HECA humidity', + 'state_class': , + 'unit_of_measurement': '%', + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_heca_humidity', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '50.0', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_heca_temperature-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_heca_temperature', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 1, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'HECA temperature', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'heca_temperature', + 'unique_id': 'aa:bb:cc:dd:ee:ff-heca_temperature', + 'unit_of_measurement': , + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_heca_temperature-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'temperature', + 'friendly_name': 'Nettigo Air Monitor HECA temperature', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_heca_temperature', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '8.0', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_last_restart-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.nettigo_air_monitor_last_restart', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Last restart', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'last_restart', + 'unique_id': 'aa:bb:cc:dd:ee:ff-uptime', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_last_restart-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'timestamp', + 'friendly_name': 'Nettigo Air Monitor Last restart', + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_last_restart', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '2024-04-15T05:03:33+00:00', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_mh_z14a_carbon_dioxide-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_mh_z14a_carbon_dioxide', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'MH-Z14A carbon dioxide', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'mhz14a_carbon_dioxide', + 'unique_id': 'aa:bb:cc:dd:ee:ff-mhz14a_carbon_dioxide', + 'unit_of_measurement': 'ppm', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_mh_z14a_carbon_dioxide-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'carbon_dioxide', + 'friendly_name': 'Nettigo Air Monitor MH-Z14A carbon dioxide', + 'state_class': , + 'unit_of_measurement': 'ppm', + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_mh_z14a_carbon_dioxide', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '865.0', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_pmsx003_common_air_quality_index-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_pmsx003_common_air_quality_index', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'PMSx003 common air quality index', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'pmsx003_caqi', + 'unique_id': 'aa:bb:cc:dd:ee:ff-pms_caqi', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_pmsx003_common_air_quality_index-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Nettigo Air Monitor PMSx003 common air quality index', + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_pmsx003_common_air_quality_index', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '19', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_pmsx003_common_air_quality_index_level-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'very_low', + 'low', + 'medium', + 'high', + 'very_high', + ]), + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_pmsx003_common_air_quality_index_level', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'PMSx003 common air quality index level', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'pmsx003_caqi_level', + 'unique_id': 'aa:bb:cc:dd:ee:ff-pms_caqi_level', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_pmsx003_common_air_quality_index_level-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'enum', + 'friendly_name': 'Nettigo Air Monitor PMSx003 common air quality index level', + 'options': list([ + 'very_low', + 'low', + 'medium', + 'high', + 'very_high', + ]), + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_pmsx003_common_air_quality_index_level', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'very_low', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_pmsx003_pm1-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_pmsx003_pm1', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'PMSx003 PM1', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'pmsx003_pm1', + 'unique_id': 'aa:bb:cc:dd:ee:ff-pms_p0', + 'unit_of_measurement': 'µg/m³', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_pmsx003_pm1-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'pm1', + 'friendly_name': 'Nettigo Air Monitor PMSx003 PM1', + 'state_class': , + 'unit_of_measurement': 'µg/m³', + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_pmsx003_pm1', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '6.0', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_pmsx003_pm10-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_pmsx003_pm10', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'PMSx003 PM10', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'pmsx003_pm10', + 'unique_id': 'aa:bb:cc:dd:ee:ff-pms_p1', + 'unit_of_measurement': 'µg/m³', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_pmsx003_pm10-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'pm10', + 'friendly_name': 'Nettigo Air Monitor PMSx003 PM10', + 'state_class': , + 'unit_of_measurement': 'µg/m³', + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_pmsx003_pm10', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '10.0', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_pmsx003_pm2_5-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_pmsx003_pm2_5', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'PMSx003 PM2.5', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'pmsx003_pm25', + 'unique_id': 'aa:bb:cc:dd:ee:ff-pms_p2', + 'unit_of_measurement': 'µg/m³', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_pmsx003_pm2_5-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'pm25', + 'friendly_name': 'Nettigo Air Monitor PMSx003 PM2.5', + 'state_class': , + 'unit_of_measurement': 'µg/m³', + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_pmsx003_pm2_5', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '11.0', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sds011_common_air_quality_index-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_sds011_common_air_quality_index', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'SDS011 common air quality index', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'sds011_caqi', + 'unique_id': 'aa:bb:cc:dd:ee:ff-sds011_caqi', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sds011_common_air_quality_index-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Nettigo Air Monitor SDS011 common air quality index', + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_sds011_common_air_quality_index', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '19', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sds011_common_air_quality_index_level-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'very_low', + 'low', + 'medium', + 'high', + 'very_high', + ]), + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_sds011_common_air_quality_index_level', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'SDS011 common air quality index level', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'sds011_caqi_level', + 'unique_id': 'aa:bb:cc:dd:ee:ff-sds011_caqi_level', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sds011_common_air_quality_index_level-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'enum', + 'friendly_name': 'Nettigo Air Monitor SDS011 common air quality index level', + 'options': list([ + 'very_low', + 'low', + 'medium', + 'high', + 'very_high', + ]), + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_sds011_common_air_quality_index_level', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'very_low', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sds011_pm10-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_sds011_pm10', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'SDS011 PM10', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'sds011_pm10', + 'unique_id': 'aa:bb:cc:dd:ee:ff-sds011_p1', + 'unit_of_measurement': 'µg/m³', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sds011_pm10-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'pm10', + 'friendly_name': 'Nettigo Air Monitor SDS011 PM10', + 'state_class': , + 'unit_of_measurement': 'µg/m³', + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_sds011_pm10', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '18.6', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sds011_pm2_5-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_sds011_pm2_5', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'SDS011 PM2.5', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'sds011_pm25', + 'unique_id': 'aa:bb:cc:dd:ee:ff-sds011_p2', + 'unit_of_measurement': 'µg/m³', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sds011_pm2_5-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'pm25', + 'friendly_name': 'Nettigo Air Monitor SDS011 PM2.5', + 'state_class': , + 'unit_of_measurement': 'µg/m³', + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_sds011_pm2_5', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '11.0', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sht3x_humidity-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_sht3x_humidity', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 1, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'SHT3X humidity', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'sht3x_humidity', + 'unique_id': 'aa:bb:cc:dd:ee:ff-sht3x_humidity', + 'unit_of_measurement': '%', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sht3x_humidity-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'humidity', + 'friendly_name': 'Nettigo Air Monitor SHT3X humidity', + 'state_class': , + 'unit_of_measurement': '%', + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_sht3x_humidity', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '34.7', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sht3x_temperature-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_sht3x_temperature', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 1, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'SHT3X temperature', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'sht3x_temperature', + 'unique_id': 'aa:bb:cc:dd:ee:ff-sht3x_temperature', + 'unit_of_measurement': , + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sht3x_temperature-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'temperature', + 'friendly_name': 'Nettigo Air Monitor SHT3X temperature', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_sht3x_temperature', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '6.3', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_signal_strength-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.nettigo_air_monitor_signal_strength', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Signal strength', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': None, + 'unique_id': 'aa:bb:cc:dd:ee:ff-signal', + 'unit_of_measurement': 'dBm', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_signal_strength-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'signal_strength', + 'friendly_name': 'Nettigo Air Monitor Signal strength', + 'state_class': , + 'unit_of_measurement': 'dBm', + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_signal_strength', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '-72.0', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sps30_common_air_quality_index-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_sps30_common_air_quality_index', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'SPS30 common air quality index', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'sps30_caqi', + 'unique_id': 'aa:bb:cc:dd:ee:ff-sps30_caqi', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sps30_common_air_quality_index-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Nettigo Air Monitor SPS30 common air quality index', + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_sps30_common_air_quality_index', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '54', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sps30_common_air_quality_index_level-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'very_low', + 'low', + 'medium', + 'high', + 'very_high', + ]), + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_sps30_common_air_quality_index_level', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'SPS30 common air quality index level', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'sps30_caqi_level', + 'unique_id': 'aa:bb:cc:dd:ee:ff-sps30_caqi_level', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sps30_common_air_quality_index_level-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'enum', + 'friendly_name': 'Nettigo Air Monitor SPS30 common air quality index level', + 'options': list([ + 'very_low', + 'low', + 'medium', + 'high', + 'very_high', + ]), + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_sps30_common_air_quality_index_level', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'medium', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sps30_pm1-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_sps30_pm1', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'SPS30 PM1', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'sps30_pm1', + 'unique_id': 'aa:bb:cc:dd:ee:ff-sps30_p0', + 'unit_of_measurement': 'µg/m³', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sps30_pm1-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'pm1', + 'friendly_name': 'Nettigo Air Monitor SPS30 PM1', + 'state_class': , + 'unit_of_measurement': 'µg/m³', + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_sps30_pm1', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '31.2', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sps30_pm10-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_sps30_pm10', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'SPS30 PM10', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'sps30_pm10', + 'unique_id': 'aa:bb:cc:dd:ee:ff-sps30_p1', + 'unit_of_measurement': 'µg/m³', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sps30_pm10-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'pm10', + 'friendly_name': 'Nettigo Air Monitor SPS30 PM10', + 'state_class': , + 'unit_of_measurement': 'µg/m³', + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_sps30_pm10', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '21.2', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sps30_pm2_5-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_sps30_pm2_5', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'SPS30 PM2.5', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'sps30_pm25', + 'unique_id': 'aa:bb:cc:dd:ee:ff-sps30_p2', + 'unit_of_measurement': 'µg/m³', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sps30_pm2_5-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'pm25', + 'friendly_name': 'Nettigo Air Monitor SPS30 PM2.5', + 'state_class': , + 'unit_of_measurement': 'µg/m³', + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_sps30_pm2_5', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '34.3', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sps30_pm4-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.nettigo_air_monitor_sps30_pm4', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'SPS30 PM4', + 'platform': 'nam', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'sps30_pm4', + 'unique_id': 'aa:bb:cc:dd:ee:ff-sps30_p4', + 'unit_of_measurement': 'µg/m³', + }) +# --- +# name: test_sensor[sensor.nettigo_air_monitor_sps30_pm4-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Nettigo Air Monitor SPS30 PM4', + 'state_class': , + 'unit_of_measurement': 'µg/m³', + }), + 'context': , + 'entity_id': 'sensor.nettigo_air_monitor_sps30_pm4', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '24.7', + }) +# --- diff --git a/tests/components/nam/test_diagnostics.py b/tests/components/nam/test_diagnostics.py index 9d13121392f..7ed49a37e0a 100644 --- a/tests/components/nam/test_diagnostics.py +++ b/tests/components/nam/test_diagnostics.py @@ -1,25 +1,23 @@ """Test NAM diagnostics.""" -import json +from syrupy import SnapshotAssertion from homeassistant.core import HomeAssistant from . import init_integration -from tests.common import load_fixture from tests.components.diagnostics import get_diagnostics_for_config_entry from tests.typing import ClientSessionGenerator async def test_entry_diagnostics( - hass: HomeAssistant, hass_client: ClientSessionGenerator + hass: HomeAssistant, + hass_client: ClientSessionGenerator, + snapshot: SnapshotAssertion, ) -> None: """Test config entry diagnostics.""" entry = await init_integration(hass) - diagnostics_data = json.loads(load_fixture("diagnostics_data.json", "nam")) - result = await get_diagnostics_for_config_entry(hass, hass_client, entry) - assert result["info"] == {"host": "10.10.2.3"} - assert result["data"] == diagnostics_data + assert result == snapshot diff --git a/tests/components/nam/test_sensor.py b/tests/components/nam/test_sensor.py index c88a34ae497..5254c444434 100644 --- a/tests/components/nam/test_sensor.py +++ b/tests/components/nam/test_sensor.py @@ -3,27 +3,18 @@ from datetime import timedelta from unittest.mock import AsyncMock, Mock, patch +from freezegun.api import FrozenDateTimeFactory from nettigo_air_monitor import ApiError +from syrupy import SnapshotAssertion from homeassistant.components.nam.const import DOMAIN -from homeassistant.components.sensor import ( - ATTR_OPTIONS, - ATTR_STATE_CLASS, - DOMAIN as SENSOR_DOMAIN, - SensorDeviceClass, - SensorStateClass, -) +from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN, SensorDeviceClass from homeassistant.const import ( ATTR_DEVICE_CLASS, ATTR_ENTITY_ID, - ATTR_ICON, ATTR_UNIT_OF_MEASUREMENT, - CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, - CONCENTRATION_PARTS_PER_MILLION, - PERCENTAGE, - SIGNAL_STRENGTH_DECIBELS_MILLIWATT, STATE_UNAVAILABLE, - UnitOfPressure, + Platform, UnitOfTemperature, ) from homeassistant.core import HomeAssistant @@ -31,447 +22,32 @@ from homeassistant.helpers import entity_registry as er from homeassistant.setup import async_setup_component from homeassistant.util.dt import utcnow -from . import INCOMPLETE_NAM_DATA, init_integration, nam_data +from . import INCOMPLETE_NAM_DATA, init_integration -from tests.common import async_fire_time_changed +from tests.common import async_fire_time_changed, load_json_object_fixture -async def test_sensor(hass: HomeAssistant, entity_registry: er.EntityRegistry) -> None: +async def test_sensor( + hass: HomeAssistant, + entity_registry_enabled_by_default: None, + entity_registry: er.EntityRegistry, + snapshot: SnapshotAssertion, + freezer: FrozenDateTimeFactory, +) -> None: """Test states of the air_quality.""" - entity_registry.async_get_or_create( - SENSOR_DOMAIN, - DOMAIN, - "aa:bb:cc:dd:ee:ff-signal", - suggested_object_id="nettigo_air_monitor_signal_strength", - disabled_by=None, - ) + hass.config.set_time_zone("UTC") + freezer.move_to("2024-04-20 12:00:00+00:00") - entity_registry.async_get_or_create( - SENSOR_DOMAIN, - DOMAIN, - "aa:bb:cc:dd:ee:ff-uptime", - suggested_object_id="nettigo_air_monitor_uptime", - disabled_by=None, - ) + with patch("homeassistant.components.nam.PLATFORMS", [Platform.SENSOR]): + entry = await init_integration(hass) - # Patch return value from utcnow, with offset to make sure the patch is correct - now = utcnow() - timedelta(hours=1) - with patch("homeassistant.components.nam.sensor.utcnow", return_value=now): - await init_integration(hass) + entity_entries = er.async_entries_for_config_entry(entity_registry, entry.entry_id) - state = hass.states.get("sensor.nettigo_air_monitor_bme280_humidity") - assert state - assert state.state == "45.7" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.HUMIDITY - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PERCENTAGE - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_bme280_humidity") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-bme280_humidity" - - state = hass.states.get("sensor.nettigo_air_monitor_bme280_temperature") - assert state - assert state.state == "7.6" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.TEMPERATURE - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfTemperature.CELSIUS - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_bme280_temperature") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-bme280_temperature" - - state = hass.states.get("sensor.nettigo_air_monitor_bme280_pressure") - assert state - assert state.state == "1011.012" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PRESSURE - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfPressure.HPA - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_bme280_pressure") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-bme280_pressure" - - state = hass.states.get("sensor.nettigo_air_monitor_bmp180_temperature") - assert state - assert state.state == "7.6" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.TEMPERATURE - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfTemperature.CELSIUS - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_bmp180_temperature") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-bmp180_temperature" - - state = hass.states.get("sensor.nettigo_air_monitor_bmp180_pressure") - assert state - assert state.state == "1032.012" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PRESSURE - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfPressure.HPA - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_bmp180_pressure") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-bmp180_pressure" - - state = hass.states.get("sensor.nettigo_air_monitor_bmp280_temperature") - assert state - assert state.state == "5.6" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.TEMPERATURE - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfTemperature.CELSIUS - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_bmp280_temperature") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-bmp280_temperature" - - state = hass.states.get("sensor.nettigo_air_monitor_bmp280_pressure") - assert state - assert state.state == "1022.012" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PRESSURE - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfPressure.HPA - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_bmp280_pressure") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-bmp280_pressure" - - state = hass.states.get("sensor.nettigo_air_monitor_sht3x_humidity") - assert state - assert state.state == "34.7" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.HUMIDITY - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PERCENTAGE - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_sht3x_humidity") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-sht3x_humidity" - - state = hass.states.get("sensor.nettigo_air_monitor_sht3x_temperature") - assert state - assert state.state == "6.3" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.TEMPERATURE - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfTemperature.CELSIUS - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_sht3x_temperature") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-sht3x_temperature" - - state = hass.states.get("sensor.nettigo_air_monitor_dht22_humidity") - assert state - assert state.state == "46.2" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.HUMIDITY - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PERCENTAGE - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_dht22_humidity") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-dht22_humidity" - - state = hass.states.get("sensor.nettigo_air_monitor_dht22_temperature") - assert state - assert state.state == "6.3" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.TEMPERATURE - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfTemperature.CELSIUS - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_dht22_temperature") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-dht22_temperature" - - state = hass.states.get("sensor.nettigo_air_monitor_heca_humidity") - assert state - assert state.state == "50.0" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.HUMIDITY - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PERCENTAGE - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_heca_humidity") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-heca_humidity" - - state = hass.states.get("sensor.nettigo_air_monitor_heca_temperature") - assert state - assert state.state == "8.0" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.TEMPERATURE - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfTemperature.CELSIUS - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_heca_temperature") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-heca_temperature" - - state = hass.states.get("sensor.nettigo_air_monitor_signal_strength") - assert state - assert state.state == "-72.0" - 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_UNIT_OF_MEASUREMENT) - == SIGNAL_STRENGTH_DECIBELS_MILLIWATT - ) - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_signal_strength") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-signal" - - state = hass.states.get("sensor.nettigo_air_monitor_uptime") - assert state - assert ( - state.state - == (now - timedelta(seconds=456987)).replace(microsecond=0).isoformat() - ) - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.TIMESTAMP - assert state.attributes.get(ATTR_STATE_CLASS) is None - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_uptime") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-uptime" - - state = hass.states.get( - "sensor.nettigo_air_monitor_pmsx003_common_air_quality_index_level" - ) - assert state - assert state.state == "very_low" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.ENUM - assert state.attributes.get(ATTR_OPTIONS) == [ - "very_low", - "low", - "medium", - "high", - "very_high", - ] - assert state.attributes.get(ATTR_ICON) is None - - entry = entity_registry.async_get( - "sensor.nettigo_air_monitor_pmsx003_common_air_quality_index_level" - ) - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-pms_caqi_level" - assert entry.translation_key == "pmsx003_caqi_level" - - state = hass.states.get( - "sensor.nettigo_air_monitor_pmsx003_common_air_quality_index" - ) - assert state - assert state.state == "19" - assert state.attributes.get(ATTR_ICON) is None - - entry = entity_registry.async_get( - "sensor.nettigo_air_monitor_pmsx003_common_air_quality_index" - ) - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-pms_caqi" - - state = hass.states.get("sensor.nettigo_air_monitor_pmsx003_pm10") - assert state - assert state.state == "10.0" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM10 - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert ( - state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) - == CONCENTRATION_MICROGRAMS_PER_CUBIC_METER - ) - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_pmsx003_pm10") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-pms_p1" - - state = hass.states.get("sensor.nettigo_air_monitor_pmsx003_pm2_5") - assert state - assert state.state == "11.0" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM25 - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert ( - state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) - == CONCENTRATION_MICROGRAMS_PER_CUBIC_METER - ) - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_pmsx003_pm2_5") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-pms_p2" - - state = hass.states.get("sensor.nettigo_air_monitor_pmsx003_pm1") - assert state - assert state.state == "6.0" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM1 - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert ( - state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) - == CONCENTRATION_MICROGRAMS_PER_CUBIC_METER - ) - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_pmsx003_pm1") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-pms_p0" - - state = hass.states.get("sensor.nettigo_air_monitor_sds011_pm10") - assert state - assert state.state == "18.6" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM10 - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert ( - state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) - == CONCENTRATION_MICROGRAMS_PER_CUBIC_METER - ) - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_sds011_pm10") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-sds011_p1" - - state = hass.states.get( - "sensor.nettigo_air_monitor_sds011_common_air_quality_index" - ) - assert state - assert state.state == "19" - assert state.attributes.get(ATTR_ICON) is None - - entry = entity_registry.async_get( - "sensor.nettigo_air_monitor_sds011_common_air_quality_index" - ) - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-sds011_caqi" - - state = hass.states.get( - "sensor.nettigo_air_monitor_sds011_common_air_quality_index_level" - ) - assert state - assert state.state == "very_low" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.ENUM - assert state.attributes.get(ATTR_OPTIONS) == [ - "very_low", - "low", - "medium", - "high", - "very_high", - ] - assert state.attributes.get(ATTR_ICON) is None - - entry = entity_registry.async_get( - "sensor.nettigo_air_monitor_sds011_common_air_quality_index_level" - ) - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-sds011_caqi_level" - assert entry.translation_key == "sds011_caqi_level" - - state = hass.states.get("sensor.nettigo_air_monitor_sds011_pm2_5") - assert state - assert state.state == "11.0" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM25 - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert ( - state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) - == CONCENTRATION_MICROGRAMS_PER_CUBIC_METER - ) - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_sds011_pm2_5") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-sds011_p2" - - state = hass.states.get("sensor.nettigo_air_monitor_sps30_common_air_quality_index") - assert state - assert state.state == "54" - assert state.attributes.get(ATTR_ICON) is None - - entry = entity_registry.async_get( - "sensor.nettigo_air_monitor_sps30_common_air_quality_index" - ) - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-sps30_caqi" - - state = hass.states.get( - "sensor.nettigo_air_monitor_sps30_common_air_quality_index_level" - ) - assert state - assert state.state == "medium" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.ENUM - assert state.attributes.get(ATTR_OPTIONS) == [ - "very_low", - "low", - "medium", - "high", - "very_high", - ] - assert state.attributes.get(ATTR_ICON) is None - - entry = entity_registry.async_get( - "sensor.nettigo_air_monitor_sps30_common_air_quality_index_level" - ) - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-sps30_caqi_level" - assert entry.translation_key == "sps30_caqi_level" - - state = hass.states.get("sensor.nettigo_air_monitor_sps30_pm1") - assert state - assert state.state == "31.2" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM1 - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert ( - state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) - == CONCENTRATION_MICROGRAMS_PER_CUBIC_METER - ) - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_sps30_pm1") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-sps30_p0" - - state = hass.states.get("sensor.nettigo_air_monitor_sps30_pm10") - assert state - assert state.state == "21.2" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM10 - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert ( - state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) - == CONCENTRATION_MICROGRAMS_PER_CUBIC_METER - ) - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_sps30_pm10") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-sps30_p1" - - state = hass.states.get("sensor.nettigo_air_monitor_sps30_pm2_5") - assert state - assert state.state == "34.3" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PM25 - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert ( - state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) - == CONCENTRATION_MICROGRAMS_PER_CUBIC_METER - ) - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_sps30_pm2_5") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-sps30_p2" - - state = hass.states.get("sensor.nettigo_air_monitor_sps30_pm4") - assert state - assert state.state == "24.7" - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert ( - state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) - == CONCENTRATION_MICROGRAMS_PER_CUBIC_METER - ) - assert state.attributes.get(ATTR_ICON) is None - - entry = entity_registry.async_get("sensor.nettigo_air_monitor_sps30_pm4") - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-sps30_p4" - - state = hass.states.get("sensor.nettigo_air_monitor_mh_z14a_carbon_dioxide") - assert state - assert state.state == "865.0" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.CO2 - assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.MEASUREMENT - assert ( - state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) - == CONCENTRATION_PARTS_PER_MILLION - ) - entry = entity_registry.async_get( - "sensor.nettigo_air_monitor_mh_z14a_carbon_dioxide" - ) - assert entry - assert entry.unique_id == "aa:bb:cc:dd:ee:ff-mhz14a_carbon_dioxide" + assert entity_entries + for entity_entry in entity_entries: + assert entity_entry == snapshot(name=f"{entity_entry.entity_id}-entry") + assert (state := hass.states.get(entity_entry.entity_id)) + assert state == snapshot(name=f"{entity_entry.entity_id}-state") async def test_sensor_disabled( @@ -524,6 +100,8 @@ async def test_incompleta_data_after_device_restart(hass: HomeAssistant) -> None async def test_availability(hass: HomeAssistant) -> None: """Ensure that we mark the entities unavailable correctly when device causes an error.""" + nam_data = load_json_object_fixture("nam/nam_data.json") + await init_integration(hass) state = hass.states.get("sensor.nettigo_air_monitor_bme280_temperature") @@ -566,6 +144,8 @@ async def test_availability(hass: HomeAssistant) -> None: async def test_manual_update_entity(hass: HomeAssistant) -> None: """Test manual update entity via service homeasasistant/update_entity.""" + nam_data = load_json_object_fixture("nam/nam_data.json") + await init_integration(hass) await async_setup_component(hass, "homeassistant", {})