From b2c398955d461bca374b3cd6e5f1b902fc696259 Mon Sep 17 00:00:00 2001 From: samuelbles07 Date: Wed, 26 Aug 2026 23:52:56 +0700 Subject: [PATCH] feat(airgradient): add measurement interval select --- homeassistant/components/airgradient/const.py | 2 + .../components/airgradient/select.py | 13 ++++ .../components/airgradient/strings.json | 12 ++++ .../airgradient/snapshots/test_select.ambr | 69 +++++++++++++++++++ tests/components/airgradient/test_select.py | 6 ++ 5 files changed, 102 insertions(+) diff --git a/homeassistant/components/airgradient/const.py b/homeassistant/components/airgradient/const.py index 23e45576f0408d..599448dd322d69 100644 --- a/homeassistant/components/airgradient/const.py +++ b/homeassistant/components/airgradient/const.py @@ -25,6 +25,7 @@ LED_BAR_MODE = "led_bar_mode" LED_BAR_BRIGHTNESS = "led_bar_brightness" DISPLAY_BRIGHTNESS = "display_brightness" +MEASUREMENT_INTERVAL = "measurement_interval" GPS_MODE = "gps_mode" FRONT_LED_BRIGHTNESS = "front_led_brightness" BACK_LED_BRIGHTNESS = "back_led_brightness" @@ -62,6 +63,7 @@ class ModelCapabilities: TVOC_LEARNING_OFFSET, PM_STANDARD_CONFIG, TEMPERATURE_UNIT, + MEASUREMENT_INTERVAL, GPS_MODE, FRONT_LED_BRIGHTNESS, BACK_LED_BRIGHTNESS, diff --git a/homeassistant/components/airgradient/select.py b/homeassistant/components/airgradient/select.py index 46cd991b1d48d8..c54e96c466f9bc 100644 --- a/homeassistant/components/airgradient/select.py +++ b/homeassistant/components/airgradient/select.py @@ -97,6 +97,8 @@ class AirGradientSelectEntityDescription(SelectEntityDescription): "720", ] +MEASUREMENT_INTERVAL_OPTIONS = ["3", "10", "30", "60", "300", "900", "3600"] + ABC_DAYS = [ "1", "7", @@ -161,6 +163,17 @@ def _get_led_level(value: int | None, options: list[str]) -> str | None: ) GO_SELECT_ENTITIES: tuple[AirGradientSelectEntityDescription, ...] = ( + AirGradientSelectEntityDescription( + key="measurement_interval", + translation_key="measurement_interval", + options=MEASUREMENT_INTERVAL_OPTIONS, + entity_category=EntityCategory.CONFIG, + config_key="measurement_interval", + value_fn=lambda config: _get_value( + config.measurement_interval, MEASUREMENT_INTERVAL_OPTIONS + ), + set_value_fn=lambda client, value: client.set_measurement_interval(int(value)), + ), AirGradientSelectEntityDescription( key="gps_mode", translation_key="gps_mode", diff --git a/homeassistant/components/airgradient/strings.json b/homeassistant/components/airgradient/strings.json index e3a1b848369ba4..34dc0b995da30c 100644 --- a/homeassistant/components/airgradient/strings.json +++ b/homeassistant/components/airgradient/strings.json @@ -111,6 +111,18 @@ "pm": "Particulate matter" } }, + "measurement_interval": { + "name": "Measurement interval", + "state": { + "3": "3 seconds", + "10": "10 seconds", + "30": "30 seconds", + "60": "1 minute", + "300": "5 minutes", + "900": "15 minutes", + "3600": "1 hour" + } + }, "nox_index_learning_time_offset": { "name": "NOx index learning offset", "state": { diff --git a/tests/components/airgradient/snapshots/test_select.ambr b/tests/components/airgradient/snapshots/test_select.ambr index d19b12fb626d6e..2c6cffa0a3e7f4 100644 --- a/tests/components/airgradient/snapshots/test_select.ambr +++ b/tests/components/airgradient/snapshots/test_select.ambr @@ -1127,6 +1127,75 @@ 'state': 'tracking', }) # --- +# name: test_v1_entities[select.airgradient_measurement_interval-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + : list([ + '3', + '10', + '30', + '60', + '300', + '900', + '3600', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'select', + 'entity_category': , + 'entity_id': 'select.airgradient_measurement_interval', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Measurement interval', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Measurement interval', + 'platform': 'airgradient', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'measurement_interval', + 'unique_id': '84fce612f5b8-measurement_interval', + 'unit_of_measurement': None, + }) +# --- +# name: test_v1_entities[select.airgradient_measurement_interval-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + : 'Airgradient Measurement interval', + : list([ + '3', + '10', + '30', + '60', + '300', + '900', + '3600', + ]), + }), + 'context': , + 'entity_id': 'select.airgradient_measurement_interval', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '10', + }) +# --- # name: test_v1_entities[select.airgradient_nox_index_learning_offset-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ diff --git a/tests/components/airgradient/test_select.py b/tests/components/airgradient/test_select.py index 4fb232bdb8f712..92dfa8a0e4d88c 100644 --- a/tests/components/airgradient/test_select.py +++ b/tests/components/airgradient/test_select.py @@ -203,6 +203,12 @@ async def test_v1_entities( "set_co2_automatic_baseline_calibration", 0, ), + ( + "select.airgradient_measurement_interval", + "300", + "set_measurement_interval", + 300, + ), ], ) async def test_v1_select_writes(