From e1c2e8a659e057351d9cc86e369af35be3200c61 Mon Sep 17 00:00:00 2001 From: Jules Dejaeghere Date: Sun, 25 Feb 2024 14:19:49 +0100 Subject: [PATCH] Fix language setting causing sensor to fail. Fix #10 --- custom_components/irm_kmi/binary_sensor.py | 2 +- custom_components/irm_kmi/coordinator.py | 6 ++--- tests/test_binary_sensor.py | 26 ++++++++++++++++++++++ 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/custom_components/irm_kmi/binary_sensor.py b/custom_components/irm_kmi/binary_sensor.py index 1e490d3..531b549 100644 --- a/custom_components/irm_kmi/binary_sensor.py +++ b/custom_components/irm_kmi/binary_sensor.py @@ -65,6 +65,6 @@ class IrmKmiWarning(CoordinatorEntity, BinarySensorEntity): warning['is_active'] = warning.get('starts_at') < now < warning.get('ends_at') attrs["active_warnings_friendly_names"] = ", ".join([warning['friendly_name'] for warning in attrs['warnings'] - if warning['is_active']]) + if warning['is_active'] and warning['friendly_name'] != '']) return attrs diff --git a/custom_components/irm_kmi/coordinator.py b/custom_components/irm_kmi/coordinator.py index f1b8de0..07cbfc9 100644 --- a/custom_components/irm_kmi/coordinator.py +++ b/custom_components/irm_kmi/coordinator.py @@ -56,7 +56,6 @@ class IrmKmiCoordinator(DataUpdateCoordinator): """ if (zone := self.hass.states.get(self._zone)) is None: raise UpdateFailed(f"Zone '{self._zone}' not found") - try: # Note: asyncio.TimeoutError and aiohttp.ClientError are already # handled by the data update coordinator. @@ -371,13 +370,14 @@ class IrmKmiCoordinator(DataUpdateCoordinator): except TypeError: level = None + lang = self.hass.config.language if self.hass.config.language in LANGS else 'en' result.append( WarningData( slug=SLUG_MAP.get(warning_id, 'unknown'), id=warning_id, level=level, - friendly_name=data.get('warningType', {}).get('name', {}).get(self.hass.config.language), - text=data.get('text', {}).get(self.hass.config.language), + friendly_name=data.get('warningType', {}).get('name', {}).get(lang, ''), + text=data.get('text', {}).get(lang, ''), starts_at=start, ends_at=end ) diff --git a/tests/test_binary_sensor.py b/tests/test_binary_sensor.py index 7f320a6..a003c61 100644 --- a/tests/test_binary_sensor.py +++ b/tests/test_binary_sensor.py @@ -30,3 +30,29 @@ async def test_warning_data( assert w['is_active'] assert warning.extra_state_attributes['active_warnings_friendly_names'] == "Fog, Ice or snow" + + +@freeze_time(datetime.fromisoformat('2024-01-12T07:55:00+01:00')) +async def test_warning_data( + hass: HomeAssistant, + mock_config_entry: MockConfigEntry +) -> None: + # When language is unknown, default to english setting + hass.config.language = "foo" + + api_data = get_api_data("be_forecast_warning.json") + coordinator = IrmKmiCoordinator(hass, mock_config_entry) + + result = coordinator.warnings_from_data(api_data.get('for', {}).get('warning')) + + coordinator.data = {'warnings': result} + warning = IrmKmiWarning(coordinator, mock_config_entry) + warning.hass = hass + + assert warning.is_on + assert len(warning.extra_state_attributes['warnings']) == 2 + + for w in warning.extra_state_attributes['warnings']: + assert w['is_active'] + + assert warning.extra_state_attributes['active_warnings_friendly_names'] == "Fog, Ice or snow"