Home Assistant Unofficial Reference 2024.12.1
switch.py
Go to the documentation of this file.
1 """ONVIF switches for controlling cameras."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable, Coroutine
6 from dataclasses import dataclass
7 from typing import Any
8 
9 from homeassistant.components.switch import SwitchEntity, SwitchEntityDescription
10 from homeassistant.config_entries import ConfigEntry
11 from homeassistant.core import HomeAssistant
12 from homeassistant.helpers.entity_platform import AddEntitiesCallback
13 
14 from .const import DOMAIN
15 from .device import ONVIFDevice
16 from .entity import ONVIFBaseEntity
17 from .models import Profile
18 
19 
20 @dataclass(frozen=True, kw_only=True)
22  """Describes ONVIF switch entity."""
23 
24  turn_on_fn: Callable[
25  [ONVIFDevice], Callable[[Profile, Any], Coroutine[Any, Any, None]]
26  ]
27  turn_off_fn: Callable[
28  [ONVIFDevice], Callable[[Profile, Any], Coroutine[Any, Any, None]]
29  ]
30  turn_on_data: Any
31  turn_off_data: Any
32  supported_fn: Callable[[ONVIFDevice], bool]
33 
34 
35 SWITCHES: tuple[ONVIFSwitchEntityDescription, ...] = (
37  key="autofocus",
38  translation_key="autofocus",
39  turn_on_data={"Focus": {"AutoFocusMode": "AUTO"}},
40  turn_off_data={"Focus": {"AutoFocusMode": "MANUAL"}},
41  turn_on_fn=lambda device: device.async_set_imaging_settings,
42  turn_off_fn=lambda device: device.async_set_imaging_settings,
43  supported_fn=lambda device: device.capabilities.imaging,
44  ),
46  key="ir_lamp",
47  translation_key="ir_lamp",
48  turn_on_data={"IrCutFilter": "OFF"},
49  turn_off_data={"IrCutFilter": "ON"},
50  turn_on_fn=lambda device: device.async_set_imaging_settings,
51  turn_off_fn=lambda device: device.async_set_imaging_settings,
52  supported_fn=lambda device: device.capabilities.imaging,
53  ),
55  key="wiper",
56  translation_key="wiper",
57  turn_on_data="tt:Wiper|On",
58  turn_off_data="tt:Wiper|Off",
59  turn_on_fn=lambda device: device.async_run_aux_command,
60  turn_off_fn=lambda device: device.async_run_aux_command,
61  supported_fn=lambda device: device.capabilities.ptz,
62  ),
63 )
64 
65 
67  hass: HomeAssistant,
68  config_entry: ConfigEntry,
69  async_add_entities: AddEntitiesCallback,
70 ) -> None:
71  """Set up a ONVIF switch platform."""
72  device = hass.data[DOMAIN][config_entry.unique_id]
73 
75  ONVIFSwitch(device, description)
76  for description in SWITCHES
77  if description.supported_fn(device)
78  )
79 
80 
82  """An ONVIF switch."""
83 
84  entity_description: ONVIFSwitchEntityDescription
85  _attr_has_entity_name = True
86 
87  def __init__(
88  self, device: ONVIFDevice, description: ONVIFSwitchEntityDescription
89  ) -> None:
90  """Initialize the switch."""
91  super().__init__(device)
92  self._attr_unique_id_attr_unique_id = f"{self.mac_or_serial}_{description.key}"
93  self.entity_descriptionentity_description = description
94 
95  async def async_turn_on(self, **kwargs: Any) -> None:
96  """Turn on switch."""
97  self._attr_is_on_attr_is_on = True
98  profile = self.device.profiles[0]
99  await self.entity_descriptionentity_description.turn_on_fn(self.device)(
100  profile, self.entity_descriptionentity_description.turn_on_data
101  )
102 
103  async def async_turn_off(self, **kwargs: Any) -> None:
104  """Turn off switch."""
105  self._attr_is_on_attr_is_on = False
106  profile = self.device.profiles[0]
107  await self.entity_descriptionentity_description.turn_off_fn(self.device)(
108  profile, self.entity_descriptionentity_description.turn_off_data
109  )
None __init__(self, ONVIFDevice device, ONVIFSwitchEntityDescription description)
Definition: switch.py:89
None async_turn_on(self, **Any kwargs)
Definition: switch.py:95
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: switch.py:70