Home Assistant Unofficial Reference 2024.12.1
switch.py
Go to the documentation of this file.
1 """Support for AirGradient switch entities."""
2 
3 from collections.abc import Awaitable, Callable
4 from dataclasses import dataclass
5 from typing import Any
6 
7 from airgradient import AirGradientClient, Config
8 from airgradient.models import ConfigurationControl
9 
11  DOMAIN as SWITCH_DOMAIN,
12  SwitchEntity,
13  SwitchEntityDescription,
14 )
15 from homeassistant.const import EntityCategory
16 from homeassistant.core import HomeAssistant, callback
17 from homeassistant.helpers import entity_registry as er
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 
20 from . import AirGradientConfigEntry
21 from .const import DOMAIN
22 from .coordinator import AirGradientCoordinator
23 from .entity import AirGradientEntity
24 
25 
26 @dataclass(frozen=True, kw_only=True)
28  """Describes AirGradient switch entity."""
29 
30  value_fn: Callable[[Config], bool]
31  set_value_fn: Callable[[AirGradientClient, bool], Awaitable[None]]
32 
33 
34 POST_DATA_TO_AIRGRADIENT = AirGradientSwitchEntityDescription(
35  key="post_data_to_airgradient",
36  translation_key="post_data_to_airgradient",
37  entity_category=EntityCategory.CONFIG,
38  value_fn=lambda config: config.post_data_to_airgradient,
39  set_value_fn=lambda client, value: client.enable_sharing_data(enable=value),
40 )
41 
42 
44  hass: HomeAssistant,
45  entry: AirGradientConfigEntry,
46  async_add_entities: AddEntitiesCallback,
47 ) -> None:
48  """Set up AirGradient switch entities based on a config entry."""
49  coordinator = entry.runtime_data
50 
51  added_entities = False
52 
53  @callback
54  def _async_check_entities() -> None:
55  nonlocal added_entities
56 
57  if (
58  coordinator.data.config.configuration_control is ConfigurationControl.LOCAL
59  and not added_entities
60  ):
62  [AirGradientSwitch(coordinator, POST_DATA_TO_AIRGRADIENT)]
63  )
64  added_entities = True
65  elif (
66  coordinator.data.config.configuration_control
67  is not ConfigurationControl.LOCAL
68  and added_entities
69  ):
70  entity_registry = er.async_get(hass)
71  unique_id = f"{coordinator.serial_number}-{POST_DATA_TO_AIRGRADIENT.key}"
72  if entity_id := entity_registry.async_get_entity_id(
73  SWITCH_DOMAIN, DOMAIN, unique_id
74  ):
75  entity_registry.async_remove(entity_id)
76  added_entities = False
77 
78  coordinator.async_add_listener(_async_check_entities)
79  _async_check_entities()
80 
81 
83  """Defines an AirGradient switch entity."""
84 
85  entity_description: AirGradientSwitchEntityDescription
86 
87  def __init__(
88  self,
89  coordinator: AirGradientCoordinator,
90  description: AirGradientSwitchEntityDescription,
91  ) -> None:
92  """Initialize AirGradient switch."""
93  super().__init__(coordinator)
94  self.entity_descriptionentity_description = description
95  self._attr_unique_id_attr_unique_id = f"{coordinator.serial_number}-{description.key}"
96 
97  @property
98  def is_on(self) -> bool:
99  """Return the state of the switch."""
100  return self.entity_descriptionentity_description.value_fn(self.coordinator.data.config)
101 
102  async def async_turn_on(self, **kwargs: Any) -> None:
103  """Turn the switch on."""
104  await self.entity_descriptionentity_description.set_value_fn(self.coordinator.client, True)
105  await self.coordinator.async_request_refresh()
106 
107  async def async_turn_off(self, **kwargs: Any) -> None:
108  """Turn the switch off."""
109  await self.entity_descriptionentity_description.set_value_fn(self.coordinator.client, False)
110  await self.coordinator.async_request_refresh()
None __init__(self, AirGradientCoordinator coordinator, AirGradientSwitchEntityDescription description)
Definition: switch.py:91
None async_setup_entry(HomeAssistant hass, AirGradientConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: switch.py:47