Home Assistant Unofficial Reference 2024.12.1
switch.py
Go to the documentation of this file.
1 """Support for interacting with Linode nodes."""
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,
21  ATTR_IPV4_ADDRESS,
22  ATTR_IPV6_ADDRESS,
23  ATTR_MEMORY,
24  ATTR_NODE_ID,
25  ATTR_NODE_NAME,
26  ATTR_REGION,
27  ATTR_VCPUS,
28  CONF_NODES,
29  DATA_LINODE,
30 )
31 
32 _LOGGER = logging.getLogger(__name__)
33 
34 DEFAULT_NAME = "Node"
35 
36 PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend(
37  {vol.Required(CONF_NODES): vol.All(cv.ensure_list, [cv.string])}
38 )
39 
40 
42  hass: HomeAssistant,
43  config: ConfigType,
44  add_entities: AddEntitiesCallback,
45  discovery_info: DiscoveryInfoType | None = None,
46 ) -> None:
47  """Set up the Linode Node switch."""
48  linode = hass.data[DATA_LINODE]
49  nodes = config[CONF_NODES]
50 
51  dev = []
52  for node in nodes:
53  if (node_id := linode.get_node_id(node)) is None:
54  _LOGGER.error("Node %s is not available", node)
55  return
56  dev.append(LinodeSwitch(linode, node_id))
57 
58  add_entities(dev, True)
59 
60 
62  """Representation of a Linode Node switch."""
63 
64  def __init__(self, li, node_id):
65  """Initialize a new Linode sensor."""
66  self._linode_linode = li
67  self._node_id_node_id = node_id
68  self.datadata = None
69  self._attr_extra_state_attributes_attr_extra_state_attributes = {}
70 
71  def turn_on(self, **kwargs: Any) -> None:
72  """Boot-up the Node."""
73  if self.datadata.status != "running":
74  self.datadata.boot()
75 
76  def turn_off(self, **kwargs: Any) -> None:
77  """Shutdown the nodes."""
78  if self.datadata.status == "running":
79  self.datadata.shutdown()
80 
81  def update(self) -> None:
82  """Get the latest data from the device and update the data."""
83  self._linode_linode.update()
84  if self._linode_linode.data is not None:
85  for node in self._linode_linode.data:
86  if node.id == self._node_id_node_id:
87  self.datadata = node
88  if self.datadata is not None:
89  self._attr_is_on_attr_is_on = self.datadata.status == "running"
90  self._attr_extra_state_attributes_attr_extra_state_attributes = {
91  ATTR_CREATED: self.datadata.created,
92  ATTR_NODE_ID: self.datadata.id,
93  ATTR_NODE_NAME: self.datadata.label,
94  ATTR_IPV4_ADDRESS: self.datadata.ipv4,
95  ATTR_IPV6_ADDRESS: self.datadata.ipv6,
96  ATTR_MEMORY: self.datadata.specs.memory,
97  ATTR_REGION: self.datadata.region.country,
98  ATTR_VCPUS: self.datadata.specs.vcpus,
99  }
100  self._attr_name_attr_name = self.datadata.label
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:46