Return an error if no error key is provided in Husqvarna Automower (#127584)

return error
This commit is contained in:
Thomas55555 2024-10-05 19:13:21 +02:00 committed by GitHub
parent 39e65c8586
commit 204bea8947
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 50 additions and 9 deletions

View File

@ -7,7 +7,12 @@ import logging
from typing import TYPE_CHECKING, Any from typing import TYPE_CHECKING, Any
from zoneinfo import ZoneInfo 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 aioautomower.utils import naive_to_aware
from homeassistant.components.sensor import ( from homeassistant.components.sensor import (
@ -82,6 +87,9 @@ ERROR_KEY_LIST = [
"docking_sensor_defect", "docking_sensor_defect",
"electronic_problem", "electronic_problem",
"empty_battery", "empty_battery",
MowerStates.ERROR.lower(),
MowerStates.ERROR_AT_POWER_UP.lower(),
MowerStates.FATAL_ERROR.lower(),
"folding_cutting_deck_sensor_defect", "folding_cutting_deck_sensor_defect",
"folding_sensor_activated", "folding_sensor_activated",
"geofence_problem", "geofence_problem",
@ -176,6 +184,12 @@ ERROR_KEY_LIST = [
"zone_generator_problem", "zone_generator_problem",
] ]
ERROR_STATES = {
MowerStates.ERROR,
MowerStates.ERROR_AT_POWER_UP,
MowerStates.FATAL_ERROR,
}
RESTRICTED_REASONS: list = [ RESTRICTED_REASONS: list = [
RestrictedReasons.ALL_WORK_AREAS_COMPLETED.lower(), RestrictedReasons.ALL_WORK_AREAS_COMPLETED.lower(),
RestrictedReasons.DAILY_LIMIT.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} 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) @dataclass(frozen=True, kw_only=True)
class AutomowerSensorEntityDescription(SensorEntityDescription): class AutomowerSensorEntityDescription(SensorEntityDescription):
"""Describes Automower sensor entity.""" """Describes Automower sensor entity."""
@ -351,9 +375,7 @@ SENSOR_TYPES: tuple[AutomowerSensorEntityDescription, ...] = (
translation_key="error", translation_key="error",
device_class=SensorDeviceClass.ENUM, device_class=SensorDeviceClass.ENUM,
option_fn=lambda data: ERROR_KEY_LIST, option_fn=lambda data: ERROR_KEY_LIST,
value_fn=lambda data: ( value_fn=_get_error_string,
"no_error" if data.mower.error_key is None else data.mower.error_key
),
), ),
AutomowerSensorEntityDescription( AutomowerSensorEntityDescription(
key="restricted_reason", key="restricted_reason",

View File

@ -118,6 +118,9 @@
"docking_sensor_defect": "Docking sensor defect", "docking_sensor_defect": "Docking sensor defect",
"electronic_problem": "Electronic problem", "electronic_problem": "Electronic problem",
"empty_battery": "Empty battery", "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_cutting_deck_sensor_defect": "Folding cutting deck sensor defect",
"folding_sensor_activated": "Folding sensor activated", "folding_sensor_activated": "Folding sensor activated",
"geofence_problem": "Geofence problem", "geofence_problem": "Geofence problem",

View File

@ -162,6 +162,9 @@
'docking_sensor_defect', 'docking_sensor_defect',
'electronic_problem', 'electronic_problem',
'empty_battery', 'empty_battery',
'error',
'error_at_power_up',
'fatal_error',
'folding_cutting_deck_sensor_defect', 'folding_cutting_deck_sensor_defect',
'folding_sensor_activated', 'folding_sensor_activated',
'geofence_problem', 'geofence_problem',
@ -340,6 +343,9 @@
'docking_sensor_defect', 'docking_sensor_defect',
'electronic_problem', 'electronic_problem',
'empty_battery', 'empty_battery',
'error',
'error_at_power_up',
'fatal_error',
'folding_cutting_deck_sensor_defect', 'folding_cutting_deck_sensor_defect',
'folding_sensor_activated', 'folding_sensor_activated',
'geofence_problem', 'geofence_problem',
@ -1165,6 +1171,9 @@
'docking_sensor_defect', 'docking_sensor_defect',
'electronic_problem', 'electronic_problem',
'empty_battery', 'empty_battery',
'error',
'error_at_power_up',
'fatal_error',
'folding_cutting_deck_sensor_defect', 'folding_cutting_deck_sensor_defect',
'folding_sensor_activated', 'folding_sensor_activated',
'geofence_problem', 'geofence_problem',
@ -1343,6 +1352,9 @@
'docking_sensor_defect', 'docking_sensor_defect',
'electronic_problem', 'electronic_problem',
'empty_battery', 'empty_battery',
'error',
'error_at_power_up',
'fatal_error',
'folding_cutting_deck_sensor_defect', 'folding_cutting_deck_sensor_defect',
'folding_sensor_activated', 'folding_sensor_activated',
'geofence_problem', 'geofence_problem',

View File

@ -2,7 +2,7 @@
from unittest.mock import AsyncMock, patch 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 aioautomower.utils import mower_list_to_dictionary_dataclass
from freezegun.api import FrozenDateTimeFactory from freezegun.api import FrozenDateTimeFactory
import pytest import pytest
@ -163,11 +163,15 @@ async def test_error_sensor(
) )
await setup_integration(hass, mock_config_entry) await setup_integration(hass, mock_config_entry)
for state, expected_state in ( for state, error_key, expected_state in (
(None, "no_error"), (MowerStates.IN_OPERATION, None, "no_error"),
("can_error", "can_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 mock_automower_client.get_status.return_value = values
freezer.tick(SCAN_INTERVAL) freezer.tick(SCAN_INTERVAL)
async_fire_time_changed(hass) async_fire_time_changed(hass)