Home Assistant Unofficial Reference 2024.12.1
switch.py
Go to the documentation of this file.
1 """Switch platform for V2C EVSE."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable, Coroutine
6 from dataclasses import dataclass
7 import logging
8 from typing import Any
9 
10 from pytrydan import Trydan, TrydanData
11 from pytrydan.models.trydan import (
12  ChargePointTimerState,
13  DynamicState,
14  LockState,
15  PauseDynamicState,
16  PauseState,
17 )
18 
19 from homeassistant.components.switch import SwitchEntity, SwitchEntityDescription
20 from homeassistant.core import HomeAssistant
21 from homeassistant.helpers.entity_platform import AddEntitiesCallback
22 
23 from . import V2CConfigEntry
24 from .coordinator import V2CUpdateCoordinator
25 from .entity import V2CBaseEntity
26 
27 _LOGGER = logging.getLogger(__name__)
28 
29 
30 @dataclass(frozen=True, kw_only=True)
32  """Describes a V2C EVSE switch entity."""
33 
34  value_fn: Callable[[TrydanData], bool]
35  turn_on_fn: Callable[[Trydan], Coroutine[Any, Any, Any]]
36  turn_off_fn: Callable[[Trydan], Coroutine[Any, Any, Any]]
37 
38 
39 TRYDAN_SWITCHES = (
41  key="paused",
42  translation_key="paused",
43  value_fn=lambda evse_data: evse_data.paused == PauseState.PAUSED,
44  turn_on_fn=lambda evse: evse.pause(),
45  turn_off_fn=lambda evse: evse.resume(),
46  ),
48  key="locked",
49  translation_key="locked",
50  value_fn=lambda evse_data: evse_data.locked == LockState.ENABLED,
51  turn_on_fn=lambda evse: evse.lock(),
52  turn_off_fn=lambda evse: evse.unlock(),
53  ),
55  key="timer",
56  translation_key="timer",
57  value_fn=lambda evse_data: evse_data.timer == ChargePointTimerState.TIMER_ON,
58  turn_on_fn=lambda evse: evse.timer(),
59  turn_off_fn=lambda evse: evse.timer_disable(),
60  ),
62  key="dynamic",
63  translation_key="dynamic",
64  value_fn=lambda evse_data: evse_data.dynamic == DynamicState.ENABLED,
65  turn_on_fn=lambda evse: evse.dynamic(),
66  turn_off_fn=lambda evse: evse.dynamic_disable(),
67  ),
69  key="pause_dynamic",
70  translation_key="pause_dynamic",
71  icon="mdi:pause",
72  value_fn=lambda evse_data: evse_data.pause_dynamic
73  == PauseDynamicState.NOT_MODULATING,
74  turn_on_fn=lambda evse: evse.pause_dynamic(),
75  turn_off_fn=lambda evse: evse.resume_dynamic(),
76  ),
77 )
78 
79 
81  hass: HomeAssistant,
82  config_entry: V2CConfigEntry,
83  async_add_entities: AddEntitiesCallback,
84 ) -> None:
85  """Set up V2C switch platform."""
86  coordinator = config_entry.runtime_data
87 
89  V2CSwitchEntity(coordinator, description, config_entry.entry_id)
90  for description in TRYDAN_SWITCHES
91  )
92 
93 
95  """Representation of a V2C switch entity."""
96 
97  entity_description: V2CSwitchEntityDescription
98 
99  def __init__(
100  self,
101  coordinator: V2CUpdateCoordinator,
102  description: SwitchEntityDescription,
103  entry_id: str,
104  ) -> None:
105  """Initialize the V2C switch entity."""
106  super().__init__(coordinator, description)
107  self._attr_unique_id_attr_unique_id = f"{entry_id}_{description.key}"
108 
109  @property
110  def is_on(self) -> bool:
111  """Return the state of the EVSE switch."""
112  return self.entity_descriptionentity_description.value_fn(self.datadatadata)
113 
114  async def async_turn_on(self, **kwargs: Any) -> None:
115  """Turn on the EVSE switch."""
116  await self.entity_descriptionentity_description.turn_on_fn(self.coordinator.evse)
117  await self.coordinator.async_request_refresh()
118 
119  async def async_turn_off(self, **kwargs: Any) -> None:
120  """Turn off the EVSE switch."""
121  await self.entity_descriptionentity_description.turn_off_fn(self.coordinator.evse)
122  await self.coordinator.async_request_refresh()
None __init__(self, V2CUpdateCoordinator coordinator, SwitchEntityDescription description, str entry_id)
Definition: switch.py:104
None async_setup_entry(HomeAssistant hass, V2CConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: switch.py:84