Home Assistant Unofficial Reference 2024.12.1
binary_sensor.py
Go to the documentation of this file.
1 """Support for monitoring the state of Linode Nodes."""
2 
3 from __future__ import annotations
4 
5 import logging
6 
7 import voluptuous as vol
8 
10  PLATFORM_SCHEMA as BINARY_SENSOR_PLATFORM_SCHEMA,
11  BinarySensorDeviceClass,
12  BinarySensorEntity,
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 PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend(
36  {vol.Required(CONF_NODES): vol.All(cv.ensure_list, [cv.string])}
37 )
38 
39 
41  hass: HomeAssistant,
42  config: ConfigType,
43  add_entities: AddEntitiesCallback,
44  discovery_info: DiscoveryInfoType | None = None,
45 ) -> None:
46  """Set up the Linode droplet sensor."""
47  linode = hass.data[DATA_LINODE]
48  nodes = config[CONF_NODES]
49 
50  dev = []
51  for node in nodes:
52  if (node_id := linode.get_node_id(node)) is None:
53  _LOGGER.error("Node %s is not available", node)
54  return
55  dev.append(LinodeBinarySensor(linode, node_id))
56 
57  add_entities(dev, True)
58 
59 
61  """Representation of a Linode droplet sensor."""
62 
63  _attr_device_class = BinarySensorDeviceClass.MOVING
64 
65  def __init__(self, li, node_id):
66  """Initialize a new Linode sensor."""
67  self._linode_linode = li
68  self._node_id_node_id = node_id
69  self._attr_extra_state_attributes_attr_extra_state_attributes = {}
70  self._attr_name_attr_name = None
71 
72  def update(self) -> None:
73  """Update state of sensor."""
74  data = None
75  self._linode_linode.update()
76  if self._linode_linode.data is not None:
77  for node in self._linode_linode.data:
78  if node.id == self._node_id_node_id:
79  data = node
80 
81  if data is not None:
82  self._attr_is_on_attr_is_on = data.status == "running"
83  self._attr_extra_state_attributes_attr_extra_state_attributes = {
84  ATTR_CREATED: data.created,
85  ATTR_NODE_ID: data.id,
86  ATTR_NODE_NAME: data.label,
87  ATTR_IPV4_ADDRESS: data.ipv4,
88  ATTR_IPV6_ADDRESS: data.ipv6,
89  ATTR_MEMORY: data.specs.memory,
90  ATTR_REGION: data.region.country,
91  ATTR_VCPUS: data.specs.vcpus,
92  }
93  self._attr_name_attr_name = data.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)