1 """Husqvarna Automower lawn mower entity."""
3 from datetime
import timedelta
5 from typing
import TYPE_CHECKING
7 from aioautomower.model
import MowerActivities, MowerStates, WorkArea
8 import voluptuous
as vol
13 LawnMowerEntityFeature,
20 from .
import AutomowerConfigEntry
21 from .const
import DOMAIN
22 from .coordinator
import AutomowerDataUpdateCoordinator
23 from .entity
import AutomowerAvailableEntity, handle_sending_exception
25 _LOGGER = logging.getLogger(__name__)
29 DOCKED_ACTIVITIES = (MowerActivities.PARKED_IN_CS, MowerActivities.CHARGING)
31 MowerActivities.MOWING,
32 MowerActivities.LEAVING,
36 MowerStates.WAIT_UPDATING,
37 MowerStates.WAIT_POWER_UP,
39 SUPPORT_STATE_SERVICES = (
40 LawnMowerEntityFeature.DOCK
41 | LawnMowerEntityFeature.PAUSE
42 | LawnMowerEntityFeature.START_MOWING
46 OVERRIDE_MODES = [MOW, PARK]
51 entry: AutomowerConfigEntry,
52 async_add_entities: AddEntitiesCallback,
54 """Set up lawn mower platform."""
55 coordinator = entry.runtime_data
60 platform = entity_platform.async_get_current_platform()
61 platform.async_register_entity_service(
64 vol.Required(
"override_mode"): vol.In(OVERRIDE_MODES),
65 vol.Required(
"duration"): vol.All(
67 cv.positive_timedelta,
71 "async_override_schedule",
73 platform.async_register_entity_service(
74 "override_schedule_work_area",
76 vol.Required(
"work_area_id"): vol.Coerce(int),
77 vol.Required(
"duration"): vol.All(
79 cv.positive_timedelta,
83 "async_override_schedule_work_area",
88 """Defining each mower Entity."""
91 _attr_supported_features = SUPPORT_STATE_SERVICES
96 coordinator: AutomowerDataUpdateCoordinator,
98 """Set up HusqvarnaAutomowerEntity."""
99 super().
__init__(mower_id, coordinator)
104 """Return the state of the mower."""
106 if mower_attributes.mower.state
in PAUSED_STATES:
107 return LawnMowerActivity.PAUSED
108 if mower_attributes.mower.activity
in MOWING_ACTIVITIES:
109 return LawnMowerActivity.MOWING
110 if mower_attributes.mower.activity == MowerActivities.GOING_HOME:
111 return LawnMowerActivity.RETURNING
112 if (mower_attributes.mower.state ==
"RESTRICTED")
or (
113 mower_attributes.mower.activity
in DOCKED_ACTIVITIES
115 return LawnMowerActivity.DOCKED
116 return LawnMowerActivity.ERROR
120 """Return the work areas of the mower."""
123 @handle_sending_exception()
125 """Resume schedule."""
126 await self.coordinator.api.commands.resume_schedule(self.
mower_idmower_id)
128 @handle_sending_exception()
130 """Pauses the mower."""
131 await self.coordinator.api.commands.pause_mowing(self.
mower_idmower_id)
133 @handle_sending_exception()
135 """Parks the mower until next schedule."""
136 await self.coordinator.api.commands.park_until_next_schedule(self.
mower_idmower_id)
138 @handle_sending_exception()
140 self, override_mode: str, duration: timedelta
142 """Override the schedule with mowing or parking."""
143 if override_mode == MOW:
144 await self.coordinator.api.commands.start_for(self.
mower_idmower_id, duration)
145 if override_mode == PARK:
146 await self.coordinator.api.commands.park_for(self.
mower_idmower_id, duration)
148 @handle_sending_exception()
150 self, work_area_id: int, duration: timedelta
152 """Override the schedule with a certain work area."""
155 translation_domain=DOMAIN, translation_key=
"work_areas_not_supported"
159 if work_area_id
not in self.
work_areaswork_areas:
161 translation_domain=DOMAIN, translation_key=
"work_area_not_existing"
163 await self.coordinator.api.commands.start_in_workarea(
164 self.
mower_idmower_id, work_area_id, duration
MowerAttributes mower_attributes(self)
None async_start_mowing(self)
None async_override_schedule_work_area(self, int work_area_id, timedelta duration)
dict[int, WorkArea]|None work_areas(self)
None __init__(self, str mower_id, AutomowerDataUpdateCoordinator coordinator)
None async_override_schedule(self, str override_mode, timedelta duration)
LawnMowerActivity activity(self)
None async_setup_entry(HomeAssistant hass, AutomowerConfigEntry entry, AddEntitiesCallback async_add_entities)