Home Assistant Unofficial Reference 2024.12.1
binary_sensor.py
Go to the documentation of this file.
1 """Support for monitoring OctoPrint binary sensors."""
2 
3 from __future__ import annotations
4 
5 from abc import abstractmethod
6 
7 from pyoctoprintapi import OctoprintPrinterInfo
8 
9 from homeassistant.components.binary_sensor import BinarySensorEntity
10 from homeassistant.config_entries import ConfigEntry
11 from homeassistant.core import HomeAssistant
12 from homeassistant.helpers.entity_platform import AddEntitiesCallback
13 from homeassistant.helpers.update_coordinator import CoordinatorEntity
14 
15 from . import OctoprintDataUpdateCoordinator
16 from .const import DOMAIN
17 
18 
20  hass: HomeAssistant,
21  config_entry: ConfigEntry,
22  async_add_entities: AddEntitiesCallback,
23 ) -> None:
24  """Set up the available OctoPrint binary sensors."""
25  coordinator: OctoprintDataUpdateCoordinator = hass.data[DOMAIN][
26  config_entry.entry_id
27  ]["coordinator"]
28  device_id = config_entry.unique_id
29 
30  assert device_id is not None
31 
32  entities: list[BinarySensorEntity] = [
33  OctoPrintPrintingBinarySensor(coordinator, device_id),
34  OctoPrintPrintingErrorBinarySensor(coordinator, device_id),
35  ]
36 
37  async_add_entities(entities)
38 
39 
41  CoordinatorEntity[OctoprintDataUpdateCoordinator], BinarySensorEntity
42 ):
43  """Representation an OctoPrint binary sensor."""
44 
45  def __init__(
46  self,
47  coordinator: OctoprintDataUpdateCoordinator,
48  sensor_type: str,
49  device_id: str,
50  ) -> None:
51  """Initialize a new OctoPrint sensor."""
52  super().__init__(coordinator)
53  self._device_id_device_id = device_id
54  self._attr_name_attr_name = f"OctoPrint {sensor_type}"
55  self._attr_unique_id_attr_unique_id = f"{sensor_type}-{device_id}"
56  self._attr_device_info_attr_device_info = coordinator.device_info
57 
58  @property
59  def is_on(self):
60  """Return true if binary sensor is on."""
61  if not (printer := self.coordinator.data["printer"]):
62  return None
63 
64  return bool(self._get_flag_state_get_flag_state(printer))
65 
66  @property
67  def available(self) -> bool:
68  """Return if entity is available."""
69  return self.coordinator.last_update_success and self.coordinator.data["printer"]
70 
71  @abstractmethod
72  def _get_flag_state(self, printer_info: OctoprintPrinterInfo) -> bool | None:
73  """Return the value of the sensor flag."""
74 
75 
77  """Representation an OctoPrint binary sensor."""
78 
79  def __init__(
80  self, coordinator: OctoprintDataUpdateCoordinator, device_id: str
81  ) -> None:
82  """Initialize a new OctoPrint sensor."""
83  super().__init__(coordinator, "Printing", device_id)
84 
85  def _get_flag_state(self, printer_info: OctoprintPrinterInfo) -> bool | None:
86  return bool(printer_info.state.flags.printing)
87 
88 
90  """Representation an OctoPrint binary sensor."""
91 
92  def __init__(
93  self, coordinator: OctoprintDataUpdateCoordinator, device_id: str
94  ) -> None:
95  """Initialize a new OctoPrint sensor."""
96  super().__init__(coordinator, "Printing Error", device_id)
97 
98  def _get_flag_state(self, printer_info: OctoprintPrinterInfo) -> bool | None:
99  return bool(printer_info.state.flags.error)
None __init__(self, OctoprintDataUpdateCoordinator coordinator, str sensor_type, str device_id)
bool|None _get_flag_state(self, OctoprintPrinterInfo printer_info)
None __init__(self, OctoprintDataUpdateCoordinator coordinator, str device_id)
bool|None _get_flag_state(self, OctoprintPrinterInfo printer_info)
None __init__(self, OctoprintDataUpdateCoordinator coordinator, str device_id)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)