Home Assistant Unofficial Reference 2024.12.1
switch.py
Go to the documentation of this file.
1 """Contains switches exposed by the Starlink integration."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Awaitable, Callable
6 from dataclasses import dataclass
7 from typing import Any
8 
10  SwitchDeviceClass,
11  SwitchEntity,
12  SwitchEntityDescription,
13 )
14 from homeassistant.config_entries import ConfigEntry
15 from homeassistant.core import HomeAssistant
16 from homeassistant.helpers.entity_platform import AddEntitiesCallback
17 
18 from .const import DOMAIN
19 from .coordinator import StarlinkData, StarlinkUpdateCoordinator
20 from .entity import StarlinkEntity
21 
22 
24  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
25 ) -> None:
26  """Set up all binary sensors for this entry."""
27  coordinator = hass.data[DOMAIN][entry.entry_id]
28 
30  StarlinkSwitchEntity(coordinator, description) for description in SWITCHES
31  )
32 
33 
34 @dataclass(frozen=True, kw_only=True)
36  """Describes a Starlink switch entity."""
37 
38  value_fn: Callable[[StarlinkData], bool | None]
39  turn_on_fn: Callable[[StarlinkUpdateCoordinator], Awaitable[None]]
40  turn_off_fn: Callable[[StarlinkUpdateCoordinator], Awaitable[None]]
41 
42 
44  """A SwitchEntity for Starlink devices. Handles creating unique IDs."""
45 
46  entity_description: StarlinkSwitchEntityDescription
47 
48  @property
49  def is_on(self) -> bool | None:
50  """Return True if entity is on."""
51  return self.entity_descriptionentity_description.value_fn(self.coordinator.data)
52 
53  async def async_turn_on(self, **kwargs: Any) -> None:
54  """Turn the entity on."""
55  return await self.entity_descriptionentity_description.turn_on_fn(self.coordinator)
56 
57  async def async_turn_off(self, **kwargs: Any) -> None:
58  """Turn the entity off."""
59  return await self.entity_descriptionentity_description.turn_off_fn(self.coordinator)
60 
61 
62 SWITCHES = [
64  key="stowed",
65  translation_key="stowed",
66  device_class=SwitchDeviceClass.SWITCH,
67  value_fn=lambda data: data.status["state"] == "STOWED",
68  turn_on_fn=lambda coordinator: coordinator.async_stow_starlink(True),
69  turn_off_fn=lambda coordinator: coordinator.async_stow_starlink(False),
70  ),
72  key="sleep_schedule",
73  translation_key="sleep_schedule",
74  device_class=SwitchDeviceClass.SWITCH,
75  value_fn=lambda data: data.sleep[2],
76  turn_on_fn=lambda coordinator: coordinator.async_set_sleep_schedule_enabled(
77  True
78  ),
79  turn_off_fn=lambda coordinator: coordinator.async_set_sleep_schedule_enabled(
80  False
81  ),
82  ),
83 ]