Return an error if no error key is provided in Husqvarna Automower (#127584)
return error
This commit is contained in:
parent
39e65c8586
commit
204bea8947
4 changed files with 50 additions and 9 deletions
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue