Home Assistant Unofficial Reference 2024.12.1
binary_sensor.py
Go to the documentation of this file.
1 """PrusaLink binary sensors."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 from typing import Generic, TypeVar
8 
9 from pyprusalink.types import JobInfo, PrinterInfo, PrinterStatus
10 from pyprusalink.types_legacy import LegacyPrinterStatus
11 
13  BinarySensorEntity,
14  BinarySensorEntityDescription,
15 )
16 from homeassistant.config_entries import ConfigEntry
17 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 
20 from .const import DOMAIN
21 from .coordinator import PrusaLinkUpdateCoordinator
22 from .entity import PrusaLinkEntity
23 
24 T = TypeVar("T", PrinterStatus, LegacyPrinterStatus, JobInfo, PrinterInfo)
25 
26 
27 @dataclass(frozen=True)
29  """Mixin for required keys."""
30 
31  value_fn: Callable[[T], bool]
32 
33 
34 @dataclass(frozen=True)
36  BinarySensorEntityDescription,
37  PrusaLinkBinarySensorEntityDescriptionMixin[T],
38  Generic[T],
39 ):
40  """Describes PrusaLink sensor entity."""
41 
42  available_fn: Callable[[T], bool] = lambda _: True
43 
44 
45 BINARY_SENSORS: dict[str, tuple[PrusaLinkBinarySensorEntityDescription, ...]] = {
46  "info": (
47  PrusaLinkBinarySensorEntityDescription[PrinterInfo](
48  key="info.mmu",
49  translation_key="mmu",
50  value_fn=lambda data: data["mmu"],
51  entity_registry_enabled_default=False,
52  ),
53  ),
54 }
55 
56 
58  hass: HomeAssistant,
59  entry: ConfigEntry,
60  async_add_entities: AddEntitiesCallback,
61 ) -> None:
62  """Set up PrusaLink sensor based on a config entry."""
63  coordinators: dict[str, PrusaLinkUpdateCoordinator] = hass.data[DOMAIN][
64  entry.entry_id
65  ]
66 
67  entities: list[PrusaLinkEntity] = []
68  for coordinator_type, binary_sensors in BINARY_SENSORS.items():
69  coordinator = coordinators[coordinator_type]
70  entities.extend(
71  PrusaLinkBinarySensorEntity(coordinator, sensor_description)
72  for sensor_description in binary_sensors
73  )
74 
75  async_add_entities(entities)
76 
77 
79  """Defines a PrusaLink binary sensor."""
80 
81  entity_description: PrusaLinkBinarySensorEntityDescription
82 
83  def __init__(
84  self,
85  coordinator: PrusaLinkUpdateCoordinator,
86  description: PrusaLinkBinarySensorEntityDescription,
87  ) -> None:
88  """Initialize a PrusaLink sensor entity."""
89  super().__init__(coordinator=coordinator)
90  self.entity_descriptionentity_description = description
91  self._attr_unique_id_attr_unique_id = f"{coordinator.config_entry.entry_id}_{description.key}"
92 
93  @property
94  def is_on(self) -> bool:
95  """Return the state of the sensor."""
96  return self.entity_descriptionentity_description.value_fn(self.coordinator.data)