diff --git a/homeassistant/components/husqvarna_automower/sensor.py b/homeassistant/components/husqvarna_automower/sensor.py index 0e3e6771cec..ed80366c648 100644 --- a/homeassistant/components/husqvarna_automower/sensor.py +++ b/homeassistant/components/husqvarna_automower/sensor.py @@ -7,7 +7,12 @@ import logging from typing import TYPE_CHECKING, Any from zoneinfo import ZoneInfo -from aioautomower.model import MowerAttributes, MowerModes, RestrictedReasons +from aioautomower.model import ( + MowerAttributes, + MowerModes, + MowerStates, + RestrictedReasons, +) from aioautomower.utils import naive_to_aware from homeassistant.components.sensor import ( @@ -82,6 +87,9 @@ ERROR_KEY_LIST = [ "docking_sensor_defect", "electronic_problem", "empty_battery", + MowerStates.ERROR.lower(), + MowerStates.ERROR_AT_POWER_UP.lower(), + MowerStates.FATAL_ERROR.lower(), "folding_cutting_deck_sensor_defect", "folding_sensor_activated", "geofence_problem", @@ -176,6 +184,12 @@ ERROR_KEY_LIST = [ "zone_generator_problem", ] +ERROR_STATES = { + MowerStates.ERROR, + MowerStates.ERROR_AT_POWER_UP, + MowerStates.FATAL_ERROR, +} + RESTRICTED_REASONS: list = [ RestrictedReasons.ALL_WORK_AREAS_COMPLETED.lower(), RestrictedReasons.DAILY_LIMIT.lower(), @@ -225,6 +239,16 @@ def _get_current_work_area_dict(data: MowerAttributes) -> Mapping[str, Any]: return {ATTR_WORK_AREA_ID_ASSIGNMENT: data.work_area_dict} +@callback +def _get_error_string(data: MowerAttributes) -> str: + """Return the error key, if not provided the mower state or `no error`.""" + if data.mower.error_key is not None: + return data.mower.error_key + if data.mower.state in ERROR_STATES: + return data.mower.state.lower() + return "no_error" + + @dataclass(frozen=True, kw_only=True) class AutomowerSensorEntityDescription(SensorEntityDescription): """Describes Automower sensor entity.""" @@ -351,9 +375,7 @@ SENSOR_TYPES: tuple[AutomowerSensorEntityDescription, ...] = ( translation_key="error", device_class=SensorDeviceClass.ENUM, option_fn=lambda data: ERROR_KEY_LIST, - value_fn=lambda data: ( - "no_error" if data.mower.error_key is None else data.mower.error_key - ), + value_fn=_get_error_string, ), AutomowerSensorEntityDescription( key="restricted_reason", diff --git a/homeassistant/components/husqvarna_automower/strings.json b/homeassistant/components/husqvarna_automower/strings.json index 5930a04376d..baeba4684ac 100644 --- a/homeassistant/components/husqvarna_automower/strings.json +++ b/homeassistant/components/husqvarna_automower/strings.json @@ -118,6 +118,9 @@ "docking_sensor_defect": "Docking sensor defect", "electronic_problem": "Electronic problem", "empty_battery": "Empty battery", + "error": "Error", + "error_at_power_up": "Error at power up", + "fatal_error": "Fatal error", "folding_cutting_deck_sensor_defect": "Folding cutting deck sensor defect", "folding_sensor_activated": "Folding sensor activated", "geofence_problem": "Geofence problem", diff --git a/tests/components/husqvarna_automower/snapshots/test_sensor.ambr b/tests/components/husqvarna_automower/snapshots/test_sensor.ambr index 13f602b902c..c090b835ae3 100644 --- a/tests/components/husqvarna_automower/snapshots/test_sensor.ambr +++ b/tests/components/husqvarna_automower/snapshots/test_sensor.ambr @@ -162,6 +162,9 @@ 'docking_sensor_defect', 'electronic_problem', 'empty_battery', + 'error', + 'error_at_power_up', + 'fatal_error', 'folding_cutting_deck_sensor_defect', 'folding_sensor_activated', 'geofence_problem', @@ -340,6 +343,9 @@ 'docking_sensor_defect', 'electronic_problem', 'empty_battery', + 'error', + 'error_at_power_up', + 'fatal_error', 'folding_cutting_deck_sensor_defect', 'folding_sensor_activated', 'geofence_problem', @@ -1165,6 +1171,9 @@ 'docking_sensor_defect', 'electronic_problem', 'empty_battery', + 'error', + 'error_at_power_up', + 'fatal_error', 'folding_cutting_deck_sensor_defect', 'folding_sensor_activated', 'geofence_problem', @@ -1343,6 +1352,9 @@ 'docking_sensor_defect', 'electronic_problem', 'empty_battery', + 'error', + 'error_at_power_up', + 'fatal_error', 'folding_cutting_deck_sensor_defect', 'folding_sensor_activated', 'geofence_problem', diff --git a/tests/components/husqvarna_automower/test_sensor.py b/tests/components/husqvarna_automower/test_sensor.py index 1a4f545ac96..39bff398da6 100644 --- a/tests/components/husqvarna_automower/test_sensor.py +++ b/tests/components/husqvarna_automower/test_sensor.py @@ -2,7 +2,7 @@ from unittest.mock import AsyncMock, patch -from aioautomower.model import MowerModes +from aioautomower.model import MowerModes, MowerStates from aioautomower.utils import mower_list_to_dictionary_dataclass from freezegun.api import FrozenDateTimeFactory import pytest @@ -163,11 +163,15 @@ async def test_error_sensor( ) await setup_integration(hass, mock_config_entry) - for state, expected_state in ( - (None, "no_error"), - ("can_error", "can_error"), + for state, error_key, expected_state in ( + (MowerStates.IN_OPERATION, None, "no_error"), + (MowerStates.ERROR, "can_error", "can_error"), + (MowerStates.ERROR, None, MowerStates.ERROR.lower()), + (MowerStates.ERROR_AT_POWER_UP, None, MowerStates.ERROR_AT_POWER_UP.lower()), + (MowerStates.FATAL_ERROR, None, MowerStates.FATAL_ERROR.lower()), ): - values[TEST_MOWER_ID].mower.error_key = state + values[TEST_MOWER_ID].mower.state = state + values[TEST_MOWER_ID].mower.error_key = error_key mock_automower_client.get_status.return_value = values freezer.tick(SCAN_INTERVAL) async_fire_time_changed(hass)