Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Platform for sensor integration."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 from datetime import datetime, timedelta
8 
10  SensorDeviceClass,
11  SensorEntity,
12  SensorEntityDescription,
13  SensorStateClass,
14 )
15 from homeassistant.config_entries import ConfigEntry
16 from homeassistant.const import EntityCategory, UnitOfTemperature
17 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 from homeassistant.util.dt import utcnow
20 
21 from .const import DOMAIN
22 from .coordinator import IntellifireDataUpdateCoordinator
23 from .entity import IntellifireEntity
24 
25 
26 @dataclass(frozen=True)
28  """Mixin for required keys."""
29 
30  value_fn: Callable[
31  [IntellifireDataUpdateCoordinator], int | str | datetime | float | None
32  ]
33 
34 
35 @dataclass(frozen=True)
37  SensorEntityDescription,
38  IntellifireSensorRequiredKeysMixin,
39 ):
40  """Describes a sensor entity."""
41 
42 
44  coordinator: IntellifireDataUpdateCoordinator,
45 ) -> datetime | None:
46  """Define a sensor that takes into account timezone."""
47  if not (seconds_offset := coordinator.data.timeremaining_s):
48  return None
49  return utcnow() + timedelta(seconds=seconds_offset)
50 
51 
53  coordinator: IntellifireDataUpdateCoordinator,
54 ) -> datetime | None:
55  """Define a sensor that takes into account a timezone."""
56  if not (seconds_offset := coordinator.data.downtime):
57  return None
58  return utcnow() - timedelta(seconds=seconds_offset)
59 
60 
62  coordinator: IntellifireDataUpdateCoordinator,
63 ) -> datetime | None:
64  """Return a timestamp of how long the sensor has been up."""
65  if not (seconds_offset := coordinator.data.uptime):
66  return None
67  return utcnow() - timedelta(seconds=seconds_offset)
68 
69 
70 INTELLIFIRE_SENSORS: tuple[IntellifireSensorEntityDescription, ...] = (
72  key="flame_height",
73  translation_key="flame_height",
74  state_class=SensorStateClass.MEASUREMENT,
75  # UI uses 1-5 for flame height, backing lib uses 0-4
76  value_fn=lambda coordinator: (coordinator.data.flameheight + 1),
77  ),
79  key="temperature",
80  state_class=SensorStateClass.MEASUREMENT,
81  device_class=SensorDeviceClass.TEMPERATURE,
82  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
83  value_fn=lambda coordinator: coordinator.data.temperature_c,
84  ),
86  key="target_temp",
87  translation_key="target_temp",
88  state_class=SensorStateClass.MEASUREMENT,
89  device_class=SensorDeviceClass.TEMPERATURE,
90  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
91  value_fn=lambda coordinator: coordinator.data.thermostat_setpoint_c,
92  ),
94  key="fan_speed",
95  translation_key="fan_speed",
96  state_class=SensorStateClass.MEASUREMENT,
97  value_fn=lambda coordinator: coordinator.data.fanspeed,
98  ),
100  key="timer_end_timestamp",
101  translation_key="timer_end_timestamp",
102  state_class=SensorStateClass.MEASUREMENT,
103  device_class=SensorDeviceClass.TIMESTAMP,
104  value_fn=_time_remaining_to_timestamp,
105  ),
107  key="downtime",
108  translation_key="downtime",
109  entity_category=EntityCategory.DIAGNOSTIC,
110  device_class=SensorDeviceClass.TIMESTAMP,
111  value_fn=_downtime_to_timestamp,
112  ),
114  key="uptime",
115  translation_key="uptime",
116  entity_category=EntityCategory.DIAGNOSTIC,
117  device_class=SensorDeviceClass.TIMESTAMP,
118  value_fn=_uptime_to_timestamp,
119  ),
121  key="connection_quality",
122  translation_key="connection_quality",
123  entity_category=EntityCategory.DIAGNOSTIC,
124  value_fn=lambda coordinator: coordinator.data.connection_quality,
125  entity_registry_enabled_default=False,
126  ),
128  key="ecm_latency",
129  translation_key="ecm_latency",
130  entity_category=EntityCategory.DIAGNOSTIC,
131  value_fn=lambda coordinator: coordinator.data.ecm_latency,
132  entity_registry_enabled_default=False,
133  ),
135  key="ipv4_address",
136  translation_key="ipv4_address",
137  entity_category=EntityCategory.DIAGNOSTIC,
138  value_fn=lambda coordinator: coordinator.data.ipv4_address,
139  ),
140 )
141 
142 
144  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
145 ) -> None:
146  """Define setup entry call."""
147 
148  coordinator: IntellifireDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
150  IntelliFireSensor(coordinator=coordinator, description=description)
151  for description in INTELLIFIRE_SENSORS
152  )
153 
154 
156  """Extends IntelliFireEntity with Sensor specific logic."""
157 
158  entity_description: IntellifireSensorEntityDescription
159 
160  @property
161  def native_value(self) -> int | str | datetime | float | None:
162  """Return the state."""
163  return self.entity_descriptionentity_description.value_fn(self.coordinator)
int|str|datetime|float|None native_value(self)
Definition: sensor.py:161
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:145
datetime|None _uptime_to_timestamp(IntellifireDataUpdateCoordinator coordinator)
Definition: sensor.py:63
datetime|None _time_remaining_to_timestamp(IntellifireDataUpdateCoordinator coordinator)
Definition: sensor.py:45
datetime|None _downtime_to_timestamp(IntellifireDataUpdateCoordinator coordinator)
Definition: sensor.py:54