Home Assistant Unofficial Reference 2024.12.1
binary_sensor.py
Go to the documentation of this file.
1 """NINA sensor platform."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
8  BinarySensorDeviceClass,
9  BinarySensorEntity,
10 )
11 from homeassistant.config_entries import ConfigEntry
12 from homeassistant.core import HomeAssistant
13 from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
14 from homeassistant.helpers.entity_platform import AddEntitiesCallback
15 from homeassistant.helpers.update_coordinator import CoordinatorEntity
16 
17 from .const import (
18  ATTR_AFFECTED_AREAS,
19  ATTR_DESCRIPTION,
20  ATTR_EXPIRES,
21  ATTR_HEADLINE,
22  ATTR_ID,
23  ATTR_RECOMMENDED_ACTIONS,
24  ATTR_SENDER,
25  ATTR_SENT,
26  ATTR_SEVERITY,
27  ATTR_START,
28  ATTR_WEB,
29  CONF_MESSAGE_SLOTS,
30  CONF_REGIONS,
31  DOMAIN,
32 )
33 from .coordinator import NINADataUpdateCoordinator
34 
35 
37  hass: HomeAssistant,
38  config_entry: ConfigEntry,
39  async_add_entities: AddEntitiesCallback,
40 ) -> None:
41  """Set up entries."""
42 
43  coordinator: NINADataUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id]
44 
45  regions: dict[str, str] = config_entry.data[CONF_REGIONS]
46  message_slots: int = config_entry.data[CONF_MESSAGE_SLOTS]
47 
49  NINAMessage(coordinator, ent, regions[ent], i + 1, config_entry)
50  for ent in coordinator.data
51  for i in range(message_slots)
52  )
53 
54 
55 class NINAMessage(CoordinatorEntity[NINADataUpdateCoordinator], BinarySensorEntity):
56  """Representation of an NINA warning."""
57 
58  _attr_device_class = BinarySensorDeviceClass.SAFETY
59 
60  def __init__(
61  self,
62  coordinator: NINADataUpdateCoordinator,
63  region: str,
64  region_name: str,
65  slot_id: int,
66  config_entry: ConfigEntry,
67  ) -> None:
68  """Initialize."""
69  super().__init__(coordinator)
70 
71  self._region_region = region
72  self._warning_index_warning_index = slot_id - 1
73 
74  self._attr_name_attr_name = f"Warning: {region_name} {slot_id}"
75  self._attr_unique_id_attr_unique_id = f"{region}-{slot_id}"
76  self._attr_device_info_attr_device_info = DeviceInfo(
77  identifiers={(DOMAIN, config_entry.entry_id)},
78  manufacturer="NINA",
79  entry_type=DeviceEntryType.SERVICE,
80  )
81 
82  @property
83  def is_on(self) -> bool:
84  """Return the state of the sensor."""
85  if len(self.coordinator.data[self._region_region]) <= self._warning_index_warning_index:
86  return False
87 
88  data = self.coordinator.data[self._region_region][self._warning_index_warning_index]
89 
90  return data.is_valid
91 
92  @property
93  def extra_state_attributes(self) -> dict[str, Any]:
94  """Return extra attributes of the sensor."""
95  if not self.is_onis_on:
96  return {}
97 
98  data = self.coordinator.data[self._region_region][self._warning_index_warning_index]
99 
100  return {
101  ATTR_HEADLINE: data.headline,
102  ATTR_DESCRIPTION: data.description,
103  ATTR_SENDER: data.sender,
104  ATTR_SEVERITY: data.severity,
105  ATTR_RECOMMENDED_ACTIONS: data.recommended_actions,
106  ATTR_AFFECTED_AREAS: data.affected_areas,
107  ATTR_WEB: data.web,
108  ATTR_ID: data.id,
109  ATTR_SENT: data.sent,
110  ATTR_START: data.start,
111  ATTR_EXPIRES: data.expires,
112  }
None __init__(self, NINADataUpdateCoordinator coordinator, str region, str region_name, int slot_id, ConfigEntry config_entry)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)