1
0
mirror of https://github.com/home-assistant/core.git synced 2026-05-08 17:49:37 +01:00

dwd_weather_warnings: Filter expired warnings (#163096)

This commit is contained in:
Felix Eckhofer
2026-02-25 18:16:44 +01:00
committed by GitHub
parent ef7cccbe3f
commit 2fccbd6e47
2 changed files with 79 additions and 2 deletions
@@ -11,6 +11,7 @@ Wetterwarnungen (Stufe 1)
from __future__ import annotations
from datetime import UTC, datetime
from typing import Any
from homeassistant.components.sensor import SensorEntity, SensorEntityDescription
@@ -95,13 +96,25 @@ class DwdWeatherWarningsSensor(
entry_type=DeviceEntryType.SERVICE,
)
def _filter_expired_warnings(
self, warnings: list[dict[str, Any]] | None
) -> list[dict[str, Any]]:
if warnings is None:
return []
now = datetime.now(UTC)
return [warning for warning in warnings if warning[API_ATTR_WARNING_END] > now]
@property
def native_value(self) -> int | None:
"""Return the state of the sensor."""
if self.entity_description.key == CURRENT_WARNING_SENSOR:
return self.coordinator.api.current_warning_level
warnings = self.coordinator.api.current_warnings
else:
warnings = self.coordinator.api.expected_warnings
return self.coordinator.api.expected_warning_level
warnings = self._filter_expired_warnings(warnings)
return max((w.get(API_ATTR_WARNING_LEVEL, 0) for w in warnings), default=0)
@property
def extra_state_attributes(self) -> dict[str, Any]:
@@ -117,6 +130,7 @@ class DwdWeatherWarningsSensor(
else:
searched_warnings = self.coordinator.api.expected_warnings
searched_warnings = self._filter_expired_warnings(searched_warnings)
data[ATTR_WARNING_COUNT] = len(searched_warnings)
for i, warning in enumerate(searched_warnings, 1):
@@ -1,9 +1,23 @@
"""Tests for Deutscher Wetterdienst (DWD) Weather Warnings integration."""
from datetime import UTC, datetime, timedelta
from unittest.mock import MagicMock
from homeassistant.components.dwd_weather_warnings.const import (
API_ATTR_WARNING_COLOR,
API_ATTR_WARNING_DESCRIPTION,
API_ATTR_WARNING_END,
API_ATTR_WARNING_HEADLINE,
API_ATTR_WARNING_INSTRUCTION,
API_ATTR_WARNING_LEVEL,
API_ATTR_WARNING_NAME,
API_ATTR_WARNING_PARAMETERS,
API_ATTR_WARNING_START,
API_ATTR_WARNING_TYPE,
ATTR_WARNING_COUNT,
CONF_REGION_DEVICE_TRACKER,
CONF_REGION_IDENTIFIER,
CURRENT_WARNING_SENSOR,
DOMAIN,
)
from homeassistant.components.dwd_weather_warnings.coordinator import (
@@ -20,6 +34,22 @@ from . import init_integration
from tests.common import MockConfigEntry
def _warning(level: int, end_time: datetime) -> dict[str, object]:
"""Return a warning payload for tests."""
return {
API_ATTR_WARNING_NAME: f"Warning {level}",
API_ATTR_WARNING_TYPE: level,
API_ATTR_WARNING_LEVEL: level,
API_ATTR_WARNING_HEADLINE: f"Headline {level}",
API_ATTR_WARNING_DESCRIPTION: "Description",
API_ATTR_WARNING_INSTRUCTION: "Instruction",
API_ATTR_WARNING_START: end_time - timedelta(hours=1),
API_ATTR_WARNING_END: end_time,
API_ATTR_WARNING_PARAMETERS: {},
API_ATTR_WARNING_COLOR: "#ffffff",
}
async def test_load_unload_entry(
hass: HomeAssistant,
mock_identifier_entry: MockConfigEntry,
@@ -136,3 +166,36 @@ async def test_load_valid_device_tracker(
assert mock_tracker_entry.state is ConfigEntryState.LOADED
assert isinstance(mock_tracker_entry.runtime_data, DwdWeatherWarningsCoordinator)
async def test_filter_expired_warnings(
hass: HomeAssistant, entity_registry: er.EntityRegistry, mock_dwdwfsapi: MagicMock
) -> None:
"""Test expired-warning filtering."""
now = datetime.now(UTC)
mock_dwdwfsapi.data_valid = True
mock_dwdwfsapi.warncell_id = "803000000"
mock_dwdwfsapi.warncell_name = "Test region"
mock_dwdwfsapi.current_warnings = [
_warning(4, now - timedelta(minutes=30)),
_warning(2, now + timedelta(minutes=30)),
]
mock_dwdwfsapi.expected_warnings = []
entry = MockConfigEntry(
domain=DOMAIN,
data={CONF_REGION_IDENTIFIER: "803000000"},
unique_id="803000000",
)
await init_integration(hass, entry)
entity_id = entity_registry.async_get_entity_id(
"sensor", DOMAIN, f"{entry.unique_id}-{CURRENT_WARNING_SENSOR}"
)
assert entity_id is not None
state = hass.states.get(entity_id)
assert state is not None
assert state.state == "2"
assert state.attributes[ATTR_WARNING_COUNT] == 1
assert "warning_2" not in state.attributes