Home Assistant Unofficial Reference 2024.12.1
switch.py
Go to the documentation of this file.
1 """Support for interacting with Digital Ocean droplets."""
2 
3 from __future__ import annotations
4 
5 import logging
6 from typing import Any
7 
8 import voluptuous as vol
9 
11  PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA,
12  SwitchEntity,
13 )
14 from homeassistant.core import HomeAssistant
16 from homeassistant.helpers.entity_platform import AddEntitiesCallback
17 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
18 
19 from . import (
20  ATTR_CREATED_AT,
21  ATTR_DROPLET_ID,
22  ATTR_DROPLET_NAME,
23  ATTR_FEATURES,
24  ATTR_IPV4_ADDRESS,
25  ATTR_IPV6_ADDRESS,
26  ATTR_MEMORY,
27  ATTR_REGION,
28  ATTR_VCPUS,
29  ATTRIBUTION,
30  CONF_DROPLETS,
31  DATA_DIGITAL_OCEAN,
32 )
33 
34 _LOGGER = logging.getLogger(__name__)
35 
36 DEFAULT_NAME = "Droplet"
37 
38 PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend(
39  {vol.Required(CONF_DROPLETS): vol.All(cv.ensure_list, [cv.string])}
40 )
41 
42 
44  hass: HomeAssistant,
45  config: ConfigType,
46  add_entities: AddEntitiesCallback,
47  discovery_info: DiscoveryInfoType | None = None,
48 ) -> None:
49  """Set up the Digital Ocean droplet switch."""
50  if not (digital := hass.data.get(DATA_DIGITAL_OCEAN)):
51  return
52 
53  droplets = config[CONF_DROPLETS]
54 
55  dev = []
56  for droplet in droplets:
57  if (droplet_id := digital.get_droplet_id(droplet)) is None:
58  _LOGGER.error("Droplet %s is not available", droplet)
59  return
60  dev.append(DigitalOceanSwitch(digital, droplet_id))
61 
62  add_entities(dev, True)
63 
64 
66  """Representation of a Digital Ocean droplet switch."""
67 
68  _attr_attribution = ATTRIBUTION
69 
70  def __init__(self, do, droplet_id):
71  """Initialize a new Digital Ocean sensor."""
72  self._digital_ocean_digital_ocean = do
73  self._droplet_id_droplet_id = droplet_id
74  self.datadata = None
75  self._state_state = None
76 
77  @property
78  def name(self):
79  """Return the name of the switch."""
80  return self.datadata.name
81 
82  @property
83  def is_on(self):
84  """Return true if switch is on."""
85  return self.datadata.status == "active"
86 
87  @property
89  """Return the state attributes of the Digital Ocean droplet."""
90  return {
91  ATTR_CREATED_AT: self.datadata.created_at,
92  ATTR_DROPLET_ID: self.datadata.id,
93  ATTR_DROPLET_NAME: self.datadata.name,
94  ATTR_FEATURES: self.datadata.features,
95  ATTR_IPV4_ADDRESS: self.datadata.ip_address,
96  ATTR_IPV6_ADDRESS: self.datadata.ip_v6_address,
97  ATTR_MEMORY: self.datadata.memory,
98  ATTR_REGION: self.datadata.region["name"],
99  ATTR_VCPUS: self.datadata.vcpus,
100  }
101 
102  def turn_on(self, **kwargs: Any) -> None:
103  """Boot-up the droplet."""
104  if self.datadata.status != "active":
105  self.datadata.power_on()
106 
107  def turn_off(self, **kwargs: Any) -> None:
108  """Shutdown the droplet."""
109  if self.datadata.status == "active":
110  self.datadata.power_off()
111 
112  def update(self) -> None:
113  """Get the latest data from the device and update the data."""
114  self._digital_ocean_digital_ocean.update()
115 
116  for droplet in self._digital_ocean_digital_ocean.data:
117  if droplet.id == self._droplet_id_droplet_id:
118  self.datadata = droplet
None add_entities(AsusWrtRouter router, AddEntitiesCallback async_add_entities, set[str] tracked)
None setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)
Definition: switch.py:48