mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 13:17:32 +00:00
Return an error if no error key is provided in Husqvarna Automower (#127584)
return error
This commit is contained in:
parent
39e65c8586
commit
204bea8947
@ -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",
|
||||||
|
@ -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",
|
||||||
|
@ -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',
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user