Home Assistant Unofficial Reference 2024.12.1
switch.py
Go to the documentation of this file.
1 """Support for Verisure Smartplugs."""
2 
3 from __future__ import annotations
4 
5 from time import monotonic
6 from typing import Any
7 
8 from homeassistant.components.switch import SwitchEntity
9 from homeassistant.config_entries import ConfigEntry
10 from homeassistant.core import HomeAssistant
11 from homeassistant.helpers.device_registry import DeviceInfo
12 from homeassistant.helpers.entity_platform import AddEntitiesCallback
13 from homeassistant.helpers.update_coordinator import CoordinatorEntity
14 
15 from .const import CONF_GIID, DOMAIN
16 from .coordinator import VerisureDataUpdateCoordinator
17 
18 
20  hass: HomeAssistant,
21  entry: ConfigEntry,
22  async_add_entities: AddEntitiesCallback,
23 ) -> None:
24  """Set up Verisure alarm control panel from a config entry."""
25  coordinator: VerisureDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
27  VerisureSmartplug(coordinator, serial_number)
28  for serial_number in coordinator.data["smart_plugs"]
29  )
30 
31 
32 class VerisureSmartplug(CoordinatorEntity[VerisureDataUpdateCoordinator], SwitchEntity):
33  """Representation of a Verisure smartplug."""
34 
35  _attr_has_entity_name = True
36  _attr_name = None
37 
38  def __init__(
39  self, coordinator: VerisureDataUpdateCoordinator, serial_number: str
40  ) -> None:
41  """Initialize the Verisure device."""
42  super().__init__(coordinator)
43  self._attr_unique_id_attr_unique_id = serial_number
44 
45  self.serial_numberserial_number = serial_number
46  self._change_timestamp_change_timestamp: float = 0
47  self._state_state = False
48 
49  @property
50  def device_info(self) -> DeviceInfo:
51  """Return device information about this entity."""
52  area = self.coordinator.data["smart_plugs"][self.serial_numberserial_number]["device"][
53  "area"
54  ]
55  return DeviceInfo(
56  name=area,
57  manufacturer="Verisure",
58  model="SmartPlug",
59  identifiers={(DOMAIN, self.serial_numberserial_number)},
60  via_device=(DOMAIN, self.coordinator.entry.data[CONF_GIID]),
61  configuration_url="https://mypages.verisure.com",
62  )
63 
64  @property
65  def is_on(self) -> bool:
66  """Return true if on."""
67  if monotonic() - self._change_timestamp_change_timestamp < 10:
68  return self._state_state
69  self._state_state = (
70  self.coordinator.data["smart_plugs"][self.serial_numberserial_number]["currentState"]
71  == "ON"
72  )
73  return self._state_state
74 
75  @property
76  def available(self) -> bool:
77  """Return True if entity is available."""
78  return (
79  super().available
80  and self.serial_numberserial_number in self.coordinator.data["smart_plugs"]
81  )
82 
83  async def async_turn_on(self, **kwargs: Any) -> None:
84  """Turn the smartplug on."""
85  await self.async_set_plug_stateasync_set_plug_state(True)
86 
87  async def async_turn_off(self, **kwargs: Any) -> None:
88  """Turn the smartplug off."""
89  await self.async_set_plug_stateasync_set_plug_state(False)
90 
91  async def async_set_plug_state(self, state: bool) -> None:
92  """Set smartplug state."""
93  command: dict[str, str | dict[str, str]] = (
94  self.coordinator.verisure.set_smartplug(self.serial_numberserial_number, state)
95  )
96  await self.hasshasshass.async_add_executor_job(
97  self.coordinator.verisure.request,
98  command,
99  )
100  self._state_state = state
101  self._change_timestamp_change_timestamp = monotonic()
102  await self.coordinator.async_request_refresh()
None __init__(self, VerisureDataUpdateCoordinator coordinator, str serial_number)
Definition: switch.py:40
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: switch.py:23