Home Assistant Unofficial Reference 2024.12.1
switch.py
Go to the documentation of this file.
1 """Support for setting the Transmission BitTorrent client Turtle Mode."""
2 
3 from collections.abc import Callable
4 from dataclasses import dataclass
5 from typing import Any
6 
7 from homeassistant.components.switch import SwitchEntity, SwitchEntityDescription
8 from homeassistant.core import HomeAssistant
9 from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
10 from homeassistant.helpers.entity_platform import AddEntitiesCallback
11 from homeassistant.helpers.update_coordinator import CoordinatorEntity
12 
13 from . import TransmissionConfigEntry
14 from .const import DOMAIN
15 from .coordinator import TransmissionDataUpdateCoordinator
16 
17 
18 @dataclass(frozen=True, kw_only=True)
20  """Entity description class for Transmission switches."""
21 
22  is_on_func: Callable[[TransmissionDataUpdateCoordinator], bool | None]
23  on_func: Callable[[TransmissionDataUpdateCoordinator], None]
24  off_func: Callable[[TransmissionDataUpdateCoordinator], None]
25 
26 
27 SWITCH_TYPES: tuple[TransmissionSwitchEntityDescription, ...] = (
29  key="on_off",
30  translation_key="on_off",
31  is_on_func=lambda coordinator: coordinator.data.active_torrent_count > 0,
32  on_func=lambda coordinator: coordinator.start_torrents(),
33  off_func=lambda coordinator: coordinator.stop_torrents(),
34  ),
36  key="turtle_mode",
37  translation_key="turtle_mode",
38  is_on_func=lambda coordinator: coordinator.get_alt_speed_enabled(),
39  on_func=lambda coordinator: coordinator.set_alt_speed_enabled(True),
40  off_func=lambda coordinator: coordinator.set_alt_speed_enabled(False),
41  ),
42 )
43 
44 
46  hass: HomeAssistant,
47  config_entry: TransmissionConfigEntry,
48  async_add_entities: AddEntitiesCallback,
49 ) -> None:
50  """Set up the Transmission switch."""
51 
52  coordinator = config_entry.runtime_data
53 
55  TransmissionSwitch(coordinator, description) for description in SWITCH_TYPES
56  )
57 
58 
60  CoordinatorEntity[TransmissionDataUpdateCoordinator], SwitchEntity
61 ):
62  """Representation of a Transmission switch."""
63 
64  entity_description: TransmissionSwitchEntityDescription
65  _attr_has_entity_name = True
66 
67  def __init__(
68  self,
69  coordinator: TransmissionDataUpdateCoordinator,
70  entity_description: TransmissionSwitchEntityDescription,
71  ) -> None:
72  """Initialize the Transmission switch."""
73  super().__init__(coordinator)
74  self.entity_descriptionentity_description = entity_description
75  self._attr_unique_id_attr_unique_id = (
76  f"{coordinator.config_entry.entry_id}-{entity_description.key}"
77  )
78  self._attr_device_info_attr_device_info = DeviceInfo(
79  entry_type=DeviceEntryType.SERVICE,
80  identifiers={(DOMAIN, coordinator.config_entry.entry_id)},
81  manufacturer="Transmission",
82  )
83 
84  @property
85  def is_on(self) -> bool:
86  """Return true if device is on."""
87  return bool(self.entity_descriptionentity_description.is_on_func(self.coordinator))
88 
89  async def async_turn_on(self, **kwargs: Any) -> None:
90  """Turn the device on."""
91  await self.hasshasshass.async_add_executor_job(
92  self.entity_descriptionentity_description.on_func, self.coordinator
93  )
94  await self.coordinator.async_request_refresh()
95 
96  async def async_turn_off(self, **kwargs: Any) -> None:
97  """Turn the device off."""
98  await self.hasshasshass.async_add_executor_job(
99  self.entity_descriptionentity_description.off_func, self.coordinator
100  )
101  await self.coordinator.async_request_refresh()
None __init__(self, TransmissionDataUpdateCoordinator coordinator, TransmissionSwitchEntityDescription entity_description)
Definition: switch.py:71
None async_setup_entry(HomeAssistant hass, TransmissionConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: switch.py:49