diff --git a/homeassistant/components/airvisual_pro/__init__.py b/homeassistant/components/airvisual_pro/__init__.py index b146651b6e6..5bbbb0e895d 100644 --- a/homeassistant/components/airvisual_pro/__init__.py +++ b/homeassistant/components/airvisual_pro/__init__.py @@ -60,6 +60,10 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Get data from the device.""" try: data = await node.async_get_latest_measurements() + data["history"] = {} + if data["settings"].get("follow_mode") == "device": + history = await node.async_get_history(include_trends=False) + data["history"] = history.get("measurements", [])[-1] except InvalidAuthenticationError as err: raise ConfigEntryAuthFailed("Invalid Samba password") from err except NodeConnectionError as err: diff --git a/homeassistant/components/airvisual_pro/sensor.py b/homeassistant/components/airvisual_pro/sensor.py index 5f64e38c4a3..69fbd1a128a 100644 --- a/homeassistant/components/airvisual_pro/sensor.py +++ b/homeassistant/components/airvisual_pro/sensor.py @@ -30,7 +30,9 @@ from .const import DOMAIN class AirVisualProMeasurementKeyMixin: """Define an entity description mixin to include a measurement key.""" - value_fn: Callable[[dict[str, Any], dict[str, Any], dict[str, Any]], float | int] + value_fn: Callable[ + [dict[str, Any], dict[str, Any], dict[str, Any], dict[str, Any]], float | int + ] @dataclass @@ -45,29 +47,42 @@ SENSOR_DESCRIPTIONS = ( key="air_quality_index", device_class=SensorDeviceClass.AQI, state_class=SensorStateClass.MEASUREMENT, - value_fn=lambda settings, status, measurements: measurements[ + value_fn=lambda settings, status, measurements, history: measurements[ async_get_aqi_locale(settings) ], ), + AirVisualProMeasurementDescription( + key="outdoor_air_quality_index", + device_class=SensorDeviceClass.AQI, + state_class=SensorStateClass.MEASUREMENT, + value_fn=lambda settings, status, measurements, history: int( + history.get( + f'Outdoor {"AQI(US)" if settings["is_aqi_usa"] else "AQI(CN)"}', -1 + ) + ), + translation_key="outdoor_air_quality_index", + ), AirVisualProMeasurementDescription( key="battery_level", device_class=SensorDeviceClass.BATTERY, entity_category=EntityCategory.DIAGNOSTIC, native_unit_of_measurement=PERCENTAGE, - value_fn=lambda settings, status, measurements: status["battery"], + value_fn=lambda settings, status, measurements, history: status["battery"], ), AirVisualProMeasurementDescription( key="carbon_dioxide", device_class=SensorDeviceClass.CO2, native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION, state_class=SensorStateClass.MEASUREMENT, - value_fn=lambda settings, status, measurements: measurements["co2"], + value_fn=lambda settings, status, measurements, history: measurements["co2"], ), AirVisualProMeasurementDescription( key="humidity", device_class=SensorDeviceClass.HUMIDITY, native_unit_of_measurement=PERCENTAGE, - value_fn=lambda settings, status, measurements: measurements["humidity"], + value_fn=lambda settings, status, measurements, history: measurements[ + "humidity" + ], ), AirVisualProMeasurementDescription( key="particulate_matter_0_1", @@ -75,7 +90,7 @@ SENSOR_DESCRIPTIONS = ( device_class=SensorDeviceClass.PM1, native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, state_class=SensorStateClass.MEASUREMENT, - value_fn=lambda settings, status, measurements: measurements["pm0_1"], + value_fn=lambda settings, status, measurements, history: measurements["pm0_1"], ), AirVisualProMeasurementDescription( key="particulate_matter_1_0", @@ -83,28 +98,30 @@ SENSOR_DESCRIPTIONS = ( device_class=SensorDeviceClass.PM10, native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, state_class=SensorStateClass.MEASUREMENT, - value_fn=lambda settings, status, measurements: measurements["pm1_0"], + value_fn=lambda settings, status, measurements, history: measurements["pm1_0"], ), AirVisualProMeasurementDescription( key="particulate_matter_2_5", device_class=SensorDeviceClass.PM25, native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, state_class=SensorStateClass.MEASUREMENT, - value_fn=lambda settings, status, measurements: measurements["pm2_5"], + value_fn=lambda settings, status, measurements, history: measurements["pm2_5"], ), AirVisualProMeasurementDescription( key="temperature", device_class=SensorDeviceClass.TEMPERATURE, native_unit_of_measurement=UnitOfTemperature.CELSIUS, state_class=SensorStateClass.MEASUREMENT, - value_fn=lambda settings, status, measurements: measurements["temperature_C"], + value_fn=lambda settings, status, measurements, history: measurements[ + "temperature_C" + ], ), AirVisualProMeasurementDescription( key="voc", device_class=SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS, native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, state_class=SensorStateClass.MEASUREMENT, - value_fn=lambda settings, status, measurements: measurements["voc"], + value_fn=lambda settings, status, measurements, history: measurements["voc"], ), ) @@ -143,4 +160,5 @@ class AirVisualProSensor(AirVisualProEntity, SensorEntity): self.coordinator.data["settings"], self.coordinator.data["status"], self.coordinator.data["measurements"], + self.coordinator.data["history"], ) diff --git a/homeassistant/components/airvisual_pro/strings.json b/homeassistant/components/airvisual_pro/strings.json index f06f120885e..04801c8fa0e 100644 --- a/homeassistant/components/airvisual_pro/strings.json +++ b/homeassistant/components/airvisual_pro/strings.json @@ -24,5 +24,12 @@ "already_configured": "[%key:common::config_flow::abort::already_configured_device%]", "reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]" } + }, + "entity": { + "sensor": { + "outdoor_air_quality_index": { + "name": "Outdoor air quality index" + } + } } } diff --git a/tests/components/airvisual_pro/test_diagnostics.py b/tests/components/airvisual_pro/test_diagnostics.py index 7f953946b69..5141782e574 100644 --- a/tests/components/airvisual_pro/test_diagnostics.py +++ b/tests/components/airvisual_pro/test_diagnostics.py @@ -33,6 +33,7 @@ async def test_entry_diagnostics( "time": "16:00:44", "timestamp": "1665072044", }, + "history": {}, "measurements": { "co2": "472", "humidity": "57",