Home Assistant Unofficial Reference 2024.12.1
lawn_mower.py
Go to the documentation of this file.
1 """The Husqvarna Autoconnect Bluetooth lawn mower platform."""
2 
3 from __future__ import annotations
4 
5 from automower_ble.protocol import MowerActivity, MowerState
6 
7 from homeassistant.components import bluetooth
9  LawnMowerActivity,
10  LawnMowerEntity,
11  LawnMowerEntityFeature,
12 )
13 from homeassistant.config_entries import ConfigEntry
14 from homeassistant.core import HomeAssistant, callback
15 from homeassistant.helpers.entity_platform import AddEntitiesCallback
16 
17 from .const import LOGGER
18 from .coordinator import HusqvarnaCoordinator
19 from .entity import HusqvarnaAutomowerBleEntity
20 
21 
23  hass: HomeAssistant,
24  config_entry: ConfigEntry,
25  async_add_entities: AddEntitiesCallback,
26 ) -> None:
27  """Set up AutomowerLawnMower integration from a config entry."""
28  coordinator: HusqvarnaCoordinator = config_entry.runtime_data
29  address = coordinator.address
30 
32  [
34  coordinator,
35  address,
36  ),
37  ]
38  )
39 
40 
42  """Husqvarna Automower."""
43 
44  _attr_name = None
45  _attr_supported_features = (
46  LawnMowerEntityFeature.PAUSE
47  | LawnMowerEntityFeature.START_MOWING
48  | LawnMowerEntityFeature.DOCK
49  )
50 
51  def __init__(
52  self,
53  coordinator: HusqvarnaCoordinator,
54  address: str,
55  ) -> None:
56  """Initialize the lawn mower."""
57  super().__init__(coordinator)
58  self._attr_unique_id_attr_unique_id = str(address)
59 
60  def _get_activity(self) -> LawnMowerActivity | None:
61  """Return the current lawn mower activity."""
62  if self.coordinator.data is None:
63  return None
64 
65  state = self.coordinator.data["state"]
66  activity = self.coordinator.data["activity"]
67 
68  if state is None or activity is None:
69  return None
70 
71  if state == MowerState.PAUSED:
72  return LawnMowerActivity.PAUSED
73  if state in (MowerState.STOPPED, MowerState.OFF, MowerState.WAIT_FOR_SAFETYPIN):
74  # This is actually stopped, but that isn't an option
75  return LawnMowerActivity.ERROR
76  if state in (
77  MowerState.RESTRICTED,
78  MowerState.IN_OPERATION,
79  MowerState.PENDING_START,
80  ):
81  if activity in (
82  MowerActivity.CHARGING,
83  MowerActivity.PARKED,
84  MowerActivity.NONE,
85  ):
86  return LawnMowerActivity.DOCKED
87  if activity in (MowerActivity.GOING_OUT, MowerActivity.MOWING):
88  return LawnMowerActivity.MOWING
89  if activity == MowerActivity.GOING_HOME:
90  return LawnMowerActivity.RETURNING
91  return LawnMowerActivity.ERROR
92 
93  @callback
94  def _handle_coordinator_update(self) -> None:
95  """Handle updated data from the coordinator."""
96  LOGGER.debug("AutomowerLawnMower: _handle_coordinator_update")
97 
98  self._attr_activity_attr_activity = self._get_activity_get_activity()
99  self._attr_available_attr_available = self._attr_activity_attr_activity is not None
101 
102  async def async_start_mowing(self) -> None:
103  """Start mowing."""
104  LOGGER.debug("Starting mower")
105 
106  if not self.coordinator.mower.is_connected():
107  device = bluetooth.async_ble_device_from_address(
108  self.coordinator.hass, self.coordinator.address, connectable=True
109  )
110  if not await self.coordinator.mower.connect(device):
111  return
112 
113  await self.coordinator.mower.mower_resume()
114  if self._attr_activity_attr_activity is LawnMowerActivity.DOCKED:
115  await self.coordinator.mower.mower_override()
116  await self.coordinator.async_request_refresh()
117 
118  self._attr_activity_attr_activity = self._get_activity_get_activity()
119  self.async_write_ha_stateasync_write_ha_state()
120 
121  async def async_dock(self) -> None:
122  """Start docking."""
123  LOGGER.debug("Start docking")
124 
125  if not self.coordinator.mower.is_connected():
126  device = bluetooth.async_ble_device_from_address(
127  self.coordinator.hass, self.coordinator.address, connectable=True
128  )
129  if not await self.coordinator.mower.connect(device):
130  return
131 
132  await self.coordinator.mower.mower_park()
133  await self.coordinator.async_request_refresh()
134 
135  self._attr_activity_attr_activity = self._get_activity_get_activity()
136  self.async_write_ha_stateasync_write_ha_state()
137 
138  async def async_pause(self) -> None:
139  """Pause mower."""
140  LOGGER.debug("Pausing mower")
141 
142  if not self.coordinator.mower.is_connected():
143  device = bluetooth.async_ble_device_from_address(
144  self.coordinator.hass, self.coordinator.address, connectable=True
145  )
146  if not await self.coordinator.mower.connect(device):
147  return
148 
149  await self.coordinator.mower.mower_pause()
150  await self.coordinator.async_request_refresh()
151 
152  self._attr_activity_attr_activity = self._get_activity_get_activity()
153  self.async_write_ha_stateasync_write_ha_state()
None __init__(self, HusqvarnaCoordinator coordinator, str address)
Definition: lawn_mower.py:55
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: lawn_mower.py:26