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 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",

View file

@ -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",

View file

@ -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',

View file

@ -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)