Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for monitoring Dremel 3D Printer sensors."""
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 
9 from dremel3dpy import Dremel3DPrinter
10 
12  SensorDeviceClass,
13  SensorEntity,
14  SensorEntityDescription,
15  SensorStateClass,
16 )
17 from homeassistant.const import (
18  PERCENTAGE,
19  EntityCategory,
20  UnitOfInformation,
21  UnitOfTemperature,
22  UnitOfTime,
23 )
24 from homeassistant.core import HomeAssistant
25 from homeassistant.helpers.entity_platform import AddEntitiesCallback
26 from homeassistant.helpers.typing import StateType
27 from homeassistant.util.dt import utcnow
28 from homeassistant.util.variance import ignore_variance
29 
30 from .const import ATTR_EXTRUDER, ATTR_PLATFORM
31 from .coordinator import DremelConfigEntry
32 from .entity import Dremel3DPrinterEntity
33 
34 
35 @dataclass(frozen=True, kw_only=True)
37  """Describes a Dremel 3D Printer sensor."""
38 
39  value_fn: Callable[[Dremel3DPrinter, str], StateType | datetime]
40  available_fn: Callable[[Dremel3DPrinter, str], bool] = lambda api, _: True
41 
42 
43 SENSOR_TYPES: tuple[Dremel3DPrinterSensorEntityDescription, ...] = (
45  key="job_phase",
46  translation_key="job_phase",
47  value_fn=lambda api, _: api.get_printing_status(),
48  ),
50  key="remaining_time",
51  translation_key="completion_time",
52  device_class=SensorDeviceClass.TIMESTAMP,
53  available_fn=lambda api, key: api.get_job_status()[key] > 0,
54  value_fn=ignore_variance(
55  lambda api, key: utcnow() + timedelta(seconds=api.get_job_status()[key]),
56  timedelta(minutes=2),
57  ),
58  ),
60  key="progress",
61  translation_key="progress",
62  native_unit_of_measurement=PERCENTAGE,
63  state_class=SensorStateClass.MEASUREMENT,
64  entity_category=EntityCategory.DIAGNOSTIC,
65  entity_registry_enabled_default=False,
66  value_fn=lambda api, _: api.get_printing_progress(),
67  ),
69  key="chamber",
70  translation_key="chamber",
71  device_class=SensorDeviceClass.TEMPERATURE,
72  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
73  state_class=SensorStateClass.MEASUREMENT,
74  entity_category=EntityCategory.DIAGNOSTIC,
75  entity_registry_enabled_default=False,
76  value_fn=lambda api, key: api.get_temperature_type(key),
77  ),
79  key="platform_temperature",
80  translation_key="platform_temperature",
81  device_class=SensorDeviceClass.TEMPERATURE,
82  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
83  state_class=SensorStateClass.MEASUREMENT,
84  entity_category=EntityCategory.DIAGNOSTIC,
85  entity_registry_enabled_default=False,
86  value_fn=lambda api, _: api.get_temperature_type(ATTR_PLATFORM),
87  ),
89  key="target_platform_temperature",
90  translation_key="target_platform_temperature",
91  device_class=SensorDeviceClass.TEMPERATURE,
92  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
93  state_class=SensorStateClass.MEASUREMENT,
94  entity_category=EntityCategory.DIAGNOSTIC,
95  entity_registry_enabled_default=False,
96  value_fn=lambda api, _: api.get_temperature_attributes(ATTR_PLATFORM)[
97  "target_temp"
98  ],
99  ),
101  key="max_platform_temperature",
102  translation_key="max_platform_temperature",
103  device_class=SensorDeviceClass.TEMPERATURE,
104  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
105  state_class=SensorStateClass.MEASUREMENT,
106  entity_category=EntityCategory.DIAGNOSTIC,
107  entity_registry_enabled_default=False,
108  value_fn=lambda api, _: api.get_temperature_attributes(ATTR_PLATFORM)[
109  "max_temp"
110  ],
111  ),
113  key=ATTR_EXTRUDER,
114  translation_key="extruder",
115  device_class=SensorDeviceClass.TEMPERATURE,
116  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
117  state_class=SensorStateClass.MEASUREMENT,
118  entity_category=EntityCategory.DIAGNOSTIC,
119  entity_registry_enabled_default=False,
120  value_fn=lambda api, key: api.get_temperature_type(key),
121  ),
123  key="target_extruder_temperature",
124  translation_key="target_extruder_temperature",
125  device_class=SensorDeviceClass.TEMPERATURE,
126  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
127  state_class=SensorStateClass.MEASUREMENT,
128  entity_category=EntityCategory.DIAGNOSTIC,
129  entity_registry_enabled_default=False,
130  value_fn=lambda api, _: api.get_temperature_attributes(ATTR_EXTRUDER)[
131  "target_temp"
132  ],
133  ),
135  key="max_extruder_temperature",
136  translation_key="max_extruder_temperature",
137  device_class=SensorDeviceClass.TEMPERATURE,
138  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
139  state_class=SensorStateClass.MEASUREMENT,
140  entity_category=EntityCategory.DIAGNOSTIC,
141  entity_registry_enabled_default=False,
142  value_fn=lambda api, _: api.get_temperature_attributes(ATTR_EXTRUDER)[
143  "max_temp"
144  ],
145  ),
147  key="network_build",
148  translation_key="network_build",
149  entity_category=EntityCategory.DIAGNOSTIC,
150  entity_registry_enabled_default=False,
151  value_fn=lambda api, key: api.get_job_status()[key],
152  ),
154  key="filament",
155  translation_key="filament",
156  entity_category=EntityCategory.DIAGNOSTIC,
157  entity_registry_enabled_default=False,
158  value_fn=lambda api, key: api.get_job_status()[key],
159  ),
161  key="elapsed_time",
162  translation_key="elapsed_time",
163  native_unit_of_measurement=UnitOfTime.SECONDS,
164  device_class=SensorDeviceClass.DURATION,
165  entity_category=EntityCategory.DIAGNOSTIC,
166  entity_registry_enabled_default=False,
167  available_fn=lambda api, _: api.get_printing_status() == "building",
168  value_fn=lambda api, key: api.get_job_status()[key],
169  ),
171  key="estimated_total_time",
172  translation_key="estimated_total_time",
173  native_unit_of_measurement=UnitOfTime.SECONDS,
174  device_class=SensorDeviceClass.DURATION,
175  entity_category=EntityCategory.DIAGNOSTIC,
176  entity_registry_enabled_default=False,
177  available_fn=lambda api, key: api.get_job_status()[key] > 0,
178  value_fn=lambda api, key: api.get_job_status()[key],
179  ),
181  key="job_status",
182  translation_key="job_status",
183  entity_category=EntityCategory.DIAGNOSTIC,
184  entity_registry_enabled_default=False,
185  value_fn=lambda api, key: api.get_job_status()[key],
186  ),
188  key="job_name",
189  translation_key="job_name",
190  entity_category=EntityCategory.DIAGNOSTIC,
191  entity_registry_enabled_default=False,
192  value_fn=lambda api, _: api.get_job_name(),
193  ),
195  key="api_version",
196  translation_key="api_version",
197  entity_category=EntityCategory.DIAGNOSTIC,
198  entity_registry_enabled_default=False,
199  value_fn=lambda api, key: api.get_printer_info()[key],
200  ),
202  key="host",
203  translation_key="host",
204  entity_category=EntityCategory.DIAGNOSTIC,
205  entity_registry_enabled_default=False,
206  value_fn=lambda api, key: api.get_printer_info()[key],
207  ),
209  key="connection_type",
210  translation_key="connection_type",
211  entity_category=EntityCategory.DIAGNOSTIC,
212  entity_registry_enabled_default=False,
213  value_fn=lambda api, key: api.get_printer_info()[key],
214  ),
216  key="available_storage",
217  translation_key="available_storage",
218  native_unit_of_measurement=UnitOfInformation.MEGABYTES,
219  device_class=SensorDeviceClass.DATA_SIZE,
220  entity_category=EntityCategory.DIAGNOSTIC,
221  entity_registry_enabled_default=False,
222  value_fn=lambda api, key: api.get_printer_info()[key] * 100,
223  ),
225  key="hours_used",
226  translation_key="hours_used",
227  native_unit_of_measurement=UnitOfTime.HOURS,
228  entity_category=EntityCategory.DIAGNOSTIC,
229  entity_registry_enabled_default=False,
230  value_fn=lambda api, key: api.get_printer_info()[key],
231  ),
232 )
233 
234 
236  hass: HomeAssistant,
237  config_entry: DremelConfigEntry,
238  async_add_entities: AddEntitiesCallback,
239 ) -> None:
240  """Set up the available Dremel 3D Printer sensors."""
242  Dremel3DPrinterSensor(config_entry.runtime_data, description)
243  for description in SENSOR_TYPES
244  )
245 
246 
248  """Representation of a Dremel 3D Printer sensor."""
249 
250  entity_description: Dremel3DPrinterSensorEntityDescription
251 
252  @property
253  def available(self) -> bool:
254  """Return True if the entity is available."""
255  return super().available and self.entity_descriptionentity_description.available_fn(
256  self._api_api, self.entity_descriptionentity_description.key
257  )
258 
259  @property
260  def native_value(self) -> StateType | datetime:
261  """Return the sensor state."""
262  return self.entity_descriptionentity_description.value_fn(self._api_api, self.entity_descriptionentity_description.key)
None async_setup_entry(HomeAssistant hass, DremelConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:239