Home Assistant Unofficial Reference 2024.12.1
binary_sensor.py
Go to the documentation of this file.
1 """Support for binary sensor using RPi GPIO."""
2 
3 from __future__ import annotations
4 
5 import requests
6 import voluptuous as vol
7 
9  PLATFORM_SCHEMA as BINARY_SENSOR_PLATFORM_SCHEMA,
10  BinarySensorEntity,
11 )
12 from homeassistant.const import CONF_HOST
13 from homeassistant.core import HomeAssistant
15 from homeassistant.helpers.entity_platform import AddEntitiesCallback
16 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
17 
18 from . import (
19  CONF_BOUNCETIME,
20  CONF_INVERT_LOGIC,
21  CONF_PULL_MODE,
22  DEFAULT_BOUNCETIME,
23  DEFAULT_INVERT_LOGIC,
24  DEFAULT_PULL_MODE,
25  read_input,
26  setup_input,
27 )
28 
29 CONF_PORTS = "ports"
30 
31 _SENSORS_SCHEMA = vol.Schema({cv.positive_int: cv.string})
32 
33 PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend(
34  {
35  vol.Required(CONF_HOST): cv.string,
36  vol.Required(CONF_PORTS): _SENSORS_SCHEMA,
37  vol.Optional(CONF_INVERT_LOGIC, default=DEFAULT_INVERT_LOGIC): cv.boolean,
38  vol.Optional(CONF_BOUNCETIME, default=DEFAULT_BOUNCETIME): cv.positive_int,
39  vol.Optional(CONF_PULL_MODE, default=DEFAULT_PULL_MODE): cv.string,
40  }
41 )
42 
43 
45  hass: HomeAssistant,
46  config: ConfigType,
47  add_entities: AddEntitiesCallback,
48  discovery_info: DiscoveryInfoType | None = None,
49 ) -> None:
50  """Set up the Raspberry PI GPIO devices."""
51  address = config["host"]
52  invert_logic = config[CONF_INVERT_LOGIC]
53  pull_mode = config[CONF_PULL_MODE]
54  ports = config["ports"]
55  bouncetime = config[CONF_BOUNCETIME] / 1000
56 
57  devices = []
58  for port_num, port_name in ports.items():
59  try:
60  remote_sensor = setup_input(address, port_num, pull_mode, bouncetime)
61  except (ValueError, IndexError, KeyError, OSError):
62  return
63  new_sensor = RemoteRPiGPIOBinarySensor(port_name, remote_sensor, invert_logic)
64  devices.append(new_sensor)
65 
66  add_entities(devices, True)
67 
68 
70  """Represent a binary sensor that uses a Remote Raspberry Pi GPIO."""
71 
72  _attr_should_poll = False
73 
74  def __init__(self, name, sensor, invert_logic):
75  """Initialize the RPi binary sensor."""
76  self._name_name = name
77  self._invert_logic_invert_logic = invert_logic
78  self._state_state = False
79  self._sensor_sensor = sensor
80 
81  async def async_added_to_hass(self) -> None:
82  """Run when entity about to be added to hass."""
83 
84  def read_gpio():
85  """Read state from GPIO."""
86  self._state_state = read_input(self._sensor_sensor)
87  self.schedule_update_ha_stateschedule_update_ha_state()
88 
89  self._sensor_sensor.when_deactivated = read_gpio
90  self._sensor_sensor.when_activated = read_gpio
91 
92  @property
93  def name(self):
94  """Return the name of the sensor."""
95  return self._name_name
96 
97  @property
98  def is_on(self):
99  """Return the state of the entity."""
100  return self._state_state != self._invert_logic_invert_logic
101 
102  @property
103  def device_class(self):
104  """Return the class of this sensor, from DEVICE_CLASSES."""
105  return
106 
107  def update(self) -> None:
108  """Update the GPIO state."""
109  try:
110  self._state = read_input(self._sensor)
111  except requests.exceptions.ConnectionError:
112  return
None schedule_update_ha_state(self, bool force_refresh=False)
Definition: entity.py:1244
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)
def setup_input(address, port, pull_mode, bouncetime)
Definition: __init__.py:28