Home Assistant Unofficial Reference 2024.12.1
binary_sensor.py
Go to the documentation of this file.
1 """Support for monitoring the state of Digital Ocean droplets."""
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_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 PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend(
38  {vol.Required(CONF_DROPLETS): vol.All(cv.ensure_list, [cv.string])}
39 )
40 
41 
43  hass: HomeAssistant,
44  config: ConfigType,
45  add_entities: AddEntitiesCallback,
46  discovery_info: DiscoveryInfoType | None = None,
47 ) -> None:
48  """Set up the Digital Ocean droplet sensor."""
49  if not (digital := hass.data.get(DATA_DIGITAL_OCEAN)):
50  return
51 
52  droplets = config[CONF_DROPLETS]
53 
54  dev = []
55  for droplet in droplets:
56  if (droplet_id := digital.get_droplet_id(droplet)) is None:
57  _LOGGER.error("Droplet %s is not available", droplet)
58  return
59  dev.append(DigitalOceanBinarySensor(digital, droplet_id))
60 
61  add_entities(dev, True)
62 
63 
65  """Representation of a Digital Ocean droplet sensor."""
66 
67  _attr_attribution = ATTRIBUTION
68 
69  def __init__(self, do, droplet_id):
70  """Initialize a new Digital Ocean sensor."""
71  self._digital_ocean_digital_ocean = do
72  self._droplet_id_droplet_id = droplet_id
73  self._state_state = None
74  self.datadata = None
75 
76  @property
77  def name(self):
78  """Return the name of the sensor."""
79  return self.datadata.name
80 
81  @property
82  def is_on(self):
83  """Return true if the binary sensor is on."""
84  return self.datadata.status == "active"
85 
86  @property
87  def device_class(self):
88  """Return the class of this sensor."""
89  return BinarySensorDeviceClass.MOVING
90 
91  @property
93  """Return the state attributes of the Digital Ocean droplet."""
94  return {
95  ATTR_CREATED_AT: self.datadata.created_at,
96  ATTR_DROPLET_ID: self.datadata.id,
97  ATTR_DROPLET_NAME: self.datadata.name,
98  ATTR_FEATURES: self.datadata.features,
99  ATTR_IPV4_ADDRESS: self.datadata.ip_address,
100  ATTR_IPV6_ADDRESS: self.datadata.ip_v6_address,
101  ATTR_MEMORY: self.datadata.memory,
102  ATTR_REGION: self.datadata.region["name"],
103  ATTR_VCPUS: self.datadata.vcpus,
104  }
105 
106  def update(self) -> None:
107  """Update state of sensor."""
108  self._digital_ocean_digital_ocean.update()
109 
110  for droplet in self._digital_ocean_digital_ocean.data:
111  if droplet.id == self._droplet_id_droplet_id:
112  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)