From 7ae942a62b38bf854b1c0decb7fb795bc8d1010c Mon Sep 17 00:00:00 2001
From: Maximilian <43999966+DeerMaximum@users.noreply.github.com>
Date: Sun, 2 Oct 2022 06:22:18 +0200
Subject: [PATCH] Fix nina warning state (#76354)
* Fix warning state
* Improve data handling
* Remove duplicate code
---
homeassistant/components/nina/__init__.py | 57 ++++++++++---------
.../components/nina/binary_sensor.py | 31 +++++-----
.../nina/fixtures/sample_warning_details.json | 47 +++++++++++++++
.../nina/fixtures/sample_warnings.json | 24 ++++++++
4 files changed, 118 insertions(+), 41 deletions(-)
diff --git a/homeassistant/components/nina/__init__.py b/homeassistant/components/nina/__init__.py
index 17e0280ca50..75ec2cdfe94 100644
--- a/homeassistant/components/nina/__init__.py
+++ b/homeassistant/components/nina/__init__.py
@@ -1,6 +1,7 @@
"""The Nina integration."""
from __future__ import annotations
+from dataclasses import dataclass
from typing import Any
from async_timeout import timeout
@@ -12,21 +13,7 @@ from homeassistant.core import HomeAssistant
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
-from .const import (
- _LOGGER,
- ATTR_DESCRIPTION,
- ATTR_EXPIRES,
- ATTR_HEADLINE,
- ATTR_ID,
- ATTR_SENDER,
- ATTR_SENT,
- ATTR_SEVERITY,
- ATTR_START,
- CONF_FILTER_CORONA,
- CONF_REGIONS,
- DOMAIN,
- SCAN_INTERVAL,
-)
+from .const import _LOGGER, CONF_FILTER_CORONA, CONF_REGIONS, DOMAIN, SCAN_INTERVAL
PLATFORMS: list[str] = [Platform.BINARY_SENSOR]
@@ -61,6 +48,21 @@ async def _async_update_listener(hass: HomeAssistant, entry: ConfigEntry) -> Non
await hass.config_entries.async_reload(entry.entry_id)
+@dataclass
+class NinaWarningData:
+ """Class to hold the warning data."""
+
+ id: str
+ headline: str
+ description: str
+ sender: str
+ severity: str
+ sent: str
+ start: str
+ expires: str
+ is_valid: bool
+
+
class NINADataUpdateCoordinator(DataUpdateCoordinator):
"""Class to manage fetching NINA data API."""
@@ -93,23 +95,24 @@ class NINADataUpdateCoordinator(DataUpdateCoordinator):
return_data: dict[str, Any] = {}
for region_id, raw_warnings in self._nina.warnings.items():
- warnings_for_regions: list[Any] = []
+ warnings_for_regions: list[NinaWarningData] = []
for raw_warn in raw_warnings:
if "corona" in raw_warn.headline.lower() and self.corona_filter:
continue
- warn_obj: dict[str, Any] = {
- ATTR_ID: raw_warn.id,
- ATTR_HEADLINE: raw_warn.headline,
- ATTR_DESCRIPTION: raw_warn.description,
- ATTR_SENDER: raw_warn.sender,
- ATTR_SEVERITY: raw_warn.severity,
- ATTR_SENT: raw_warn.sent or "",
- ATTR_START: raw_warn.start or "",
- ATTR_EXPIRES: raw_warn.expires or "",
- }
- warnings_for_regions.append(warn_obj)
+ warning_data: NinaWarningData = NinaWarningData(
+ raw_warn.id,
+ raw_warn.headline,
+ raw_warn.description,
+ raw_warn.sender,
+ raw_warn.severity,
+ raw_warn.sent or "",
+ raw_warn.start or "",
+ raw_warn.expires or "",
+ raw_warn.isValid(),
+ )
+ warnings_for_regions.append(warning_data)
return_data[region_id] = warnings_for_regions
diff --git a/homeassistant/components/nina/binary_sensor.py b/homeassistant/components/nina/binary_sensor.py
index 29f985df618..4cbb3b6887a 100644
--- a/homeassistant/components/nina/binary_sensor.py
+++ b/homeassistant/components/nina/binary_sensor.py
@@ -12,7 +12,7 @@ from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity
-from . import NINADataUpdateCoordinator
+from . import NINADataUpdateCoordinator, NinaWarningData
from .const import (
ATTR_DESCRIPTION,
ATTR_EXPIRES,
@@ -72,25 +72,28 @@ class NINAMessage(CoordinatorEntity[NINADataUpdateCoordinator], BinarySensorEnti
@property
def is_on(self) -> bool:
"""Return the state of the sensor."""
- return len(self.coordinator.data[self._region]) > self._warning_index
+ if not len(self.coordinator.data[self._region]) > self._warning_index:
+ return False
+
+ data: NinaWarningData = self.coordinator.data[self._region][self._warning_index]
+
+ return data.is_valid
@property
def extra_state_attributes(self) -> dict[str, Any]:
"""Return extra attributes of the sensor."""
- if (
- not len(self.coordinator.data[self._region]) > self._warning_index
- ) or not self.is_on:
+ if not self.is_on:
return {}
- data: dict[str, Any] = self.coordinator.data[self._region][self._warning_index]
+ data: NinaWarningData = self.coordinator.data[self._region][self._warning_index]
return {
- ATTR_HEADLINE: data[ATTR_HEADLINE],
- ATTR_DESCRIPTION: data[ATTR_DESCRIPTION],
- ATTR_SENDER: data[ATTR_SENDER],
- ATTR_SEVERITY: data[ATTR_SEVERITY],
- ATTR_ID: data[ATTR_ID],
- ATTR_SENT: data[ATTR_SENT],
- ATTR_START: data[ATTR_START],
- ATTR_EXPIRES: data[ATTR_EXPIRES],
+ ATTR_HEADLINE: data.headline,
+ ATTR_DESCRIPTION: data.description,
+ ATTR_SENDER: data.sender,
+ ATTR_SEVERITY: data.severity,
+ ATTR_ID: data.id,
+ ATTR_SENT: data.sent,
+ ATTR_START: data.start,
+ ATTR_EXPIRES: data.expires,
}
diff --git a/tests/components/nina/fixtures/sample_warning_details.json b/tests/components/nina/fixtures/sample_warning_details.json
index f9da183c553..aa176b2199e 100644
--- a/tests/components/nina/fixtures/sample_warning_details.json
+++ b/tests/components/nina/fixtures/sample_warning_details.json
@@ -157,5 +157,52 @@
]
}
]
+ },
+ "biw.BIWAPP-69634": {
+ "identifier": "biw.BIWAPP-69634",
+ "sender": "CAP@biwapp.de",
+ "sent": "1999-08-07T10:59:00+02:00",
+ "status": "Actual",
+ "msgType": "Alert",
+ "scope": "Public",
+ "code": ["DVN:2", "BIWAPP"],
+ "info": [
+ {
+ "language": "DE",
+ "category": ["Other"],
+ "event": "4",
+ "urgency": "Unknown",
+ "severity": "Minor",
+ "certainty": "Unknown",
+ "expires": "2002-08-07T10:59:00+02:00",
+ "headline": "Geflügelpest im Landkreis Cuxhaven - Teile des Landkreises Osterholz zur Überwachungszone erklärt",
+ "description": "In Beverstedt im Landkreis Cuxhaven ist am 20. Juli 2022 in einer Geflügelhaltung der Ausbruch der Geflügelpest (Vogelgrippe, Aviäre Influenza) amtlich festgestellt worden. Durch die geografische Nähe des Ausbruchsbetriebes zum Gebiet des Landkreises Osterholz musste das Veterinäramt des Landkreises zum Schutz vor einer Ausbreitung der Geflügelpest auch für sein Gebiet ein Restriktionsgebiet festlegen. Rund um den Ausbruchsort wurde eine Überwachungszone ausgewiesen. Eine entsprechende Tierseuchenbehördliche Allgemeinverfügung wurde vom Landkreis Osterholz erlassen und tritt am 23.07.2022 in Kraft.
Die Überwachungszone mit einem Radius von mindestens zehn Kilometern um den Ausbruchsbetrieb erstreckt sich im Landkreis Osterholz innerhalb der Samtgemeinde Hambergen auf die Mitgliedsgemeinden Axstedt, Holste und Lübberstedt. Die vorgenannten Gemeinden sind vollständig zur Überwachungszone erklärt worden. Der genaue Grenzverlauf des Gebietes kann auch der interaktiven Karte im Internet entnommen werden.
In der Überwachungszone liegen im Landkreis Osterholz rund 70 Geflügelhaltungen mit einem Gesamtbestand von rund 1.800 Tieren. Sie alle unterliegen mit der Allgemeinverfügung der sogenannten amtlichen Beobachtung. Für die Betriebe sind die Biosicherheitsmaßnahmen einzuhalten. Dazu zählen insbesondere Hygienemaßnahmen im laufenden Betrieb und eine ordnungsgemäße Schadnagerbekämpfung.
Das Verbringen von Vögeln, Fleisch von Geflügel, Eiern und sonstige Nebenprodukte von Geflügel in und aus Betrieben in der Überwachungszone ist verboten. Auch Geflügeltransporte sind in der Überwachungszone verboten. Jeder Verdacht der Erkrankung auf Geflügelpest ist zudem dem Veterinäramt des Landkreises Osterholz unter der E-Mail-Adresse veterinaeramt@landkreis-osterholz.de sofort zu melden. Alle Hinweise, die innerhalb der Überwachungszone zu beachten sind, sind unter www.landkreis-osterholz.de/gefluegelpest zusammengefasst dargestellt.
Die Veterinärbehörde weist zudem darauf hin, dass sämtliche Geflügelhaltungen – Hühner, Enten, Gänse, Fasane, Perlhühner, Rebhühner, Truthühner, Wachteln oder Laufvögel – der zuständigen Behörde angezeigt werden müssen. Wer dies bisher noch nicht gemacht hat und über keine Registriernummer für seinen Geflügelbestand verfügt, sollte die Meldung über das Veterinäramt umgehend nachholen.
Das Beobachtungsgebiet kann frühestens 30 Tage nach der Grobreinigung des Ausbruchsbetriebes wieder aufgehoben werden. Hierüber wird der Landkreis Osterholz informieren.
Die Allgemeinverfügung, eine Übersicht zur Überwachungszone und weitere Hinweise sind auf der Internetseite unter www.landkreis-osterholz.de/gefluegelpest zu finden.",
+ "parameter": [
+ {
+ "valueName": "sender_langname",
+ "value": "Landkreis Osterholz"
+ },
+ {
+ "valueName": "PHGEM",
+ "value": "740+10,770,792,817,100001"
+ },
+ {
+ "valueName": "GRID",
+ "value": "101346,101954+7,102566+9,103177+13,103774,103790+13,104387+1,104403+13,105000+1,105016+15,105612+2,105630+15,106225+2,106241+18,106838+2,106853+18,107451+1,107464+22,108064+9,108075+23,108677+34,109290+34,109903+35,110516+35,111129+35,111742+35,112355,112357+34,112971+33,113587+30,114200+30,114814,114818+26,115432,115436+22,116050+21,116669+15,117283+5,117290+7,117897+3,117904+6,500001"
+ }
+ ],
+ "area": [
+ {
+ "areaDesc": "Axstedt, Gnarrenburg, Grasberg, Hagen im Bremischen, Hambergen, Hepstedt, Holste, Lilienthal, Lübberstedt, Osterholz-Scharmbeck, Ritterhude, Schwanewede, Vollersode, Worpswede",
+ "geocode": [
+ {
+ "valueName": "AreaId",
+ "value": "0"
+ }
+ ]
+ }
+ ]
+ }
+ ]
}
}
diff --git a/tests/components/nina/fixtures/sample_warnings.json b/tests/components/nina/fixtures/sample_warnings.json
index 0a41611b7ee..12d78b03cce 100644
--- a/tests/components/nina/fixtures/sample_warnings.json
+++ b/tests/components/nina/fixtures/sample_warnings.json
@@ -40,5 +40,29 @@
"onset": "2021-11-01T05:20:00+01:00",
"sent": "2021-10-11T05:20:00+01:00",
"expires": "3021-11-22T05:19:00+01:00"
+ },
+ {
+ "id": "biw.BIWAPP-69634",
+ "payload": {
+ "version": 2,
+ "type": "ALERT",
+ "id": "biw.BIWAPP-69634",
+ "hash": "fdbafb6b164f549ff60b9adfa5b1c707069cdd178bf55f025066f319451660ad",
+ "data": {
+ "headline": "Geflügelpest im Landkreis Cuxhaven - Teile des Landkreises Osterholz zur Überwachungszone erklärt",
+ "provider": "BIWAPP",
+ "severity": "Minor",
+ "msgType": "Alert",
+ "area": {
+ "type": "GRID",
+ "data": "101346,101954+7,102566+9,103177+13,103774,103790+13,104387+1,104403+13,105000+1,105016+15,105612+2,105630+15,106225+2,106241+18,106838+2,106853+18,107451+1,107464+22,108064+9,108075+23,108677+34,109290+34,109903+35,110516+35,111129+35,111742+35,112355,112357+34,112971+33,113587+30,114200+30,114814,114818+26,115432,115436+22,116050+21,116669+15,117283+5,117290+7,117897+3,117904+6,500001"
+ }
+ }
+ },
+ "i18nTitle": {
+ "de": "Geflügelpest im Landkreis Cuxhaven - Teile des Landkreises Osterholz zur Überwachungszone erklärt"
+ },
+ "sent": "1999-08-07T10:59:00+02:00",
+ "expires": "2002-08-07T10:59:00+02:00"
}
]