1 """Support for monitoring OctoPrint sensors."""
3 from __future__
import annotations
5 from datetime
import datetime, timedelta
8 from pyoctoprintapi
import OctoprintJobInfo, OctoprintPrinterInfo
21 from .
import OctoprintDataUpdateCoordinator
22 from .const
import DOMAIN
24 _LOGGER = logging.getLogger(__name__)
26 JOB_PRINTING_STATES = [
"Printing from SD",
"Printing"]
33 and printer.state.flags
34 and printer.state.flags.printing
40 config_entry: ConfigEntry,
41 async_add_entities: AddEntitiesCallback,
43 """Set up the available OctoPrint binary sensors."""
44 coordinator: OctoprintDataUpdateCoordinator = hass.data[DOMAIN][
47 device_id = config_entry.unique_id
49 assert device_id
is not None
54 def async_add_tool_sensors() -> None:
55 if not coordinator.data[
"printer"]:
58 new_tools: list[OctoPrintTemperatureSensor] = []
61 for tool
in coordinator.data[
"printer"].temperatures
62 if tool.name
not in known_tools
64 assert device_id
is not None
65 known_tools.add(tool.name)
73 for temp_type
in (
"actual",
"target")
77 config_entry.async_on_unload(coordinator.async_add_listener(async_add_tool_sensors))
79 if coordinator.data[
"printer"]:
80 async_add_tool_sensors()
82 entities: list[SensorEntity] = [
93 CoordinatorEntity[OctoprintDataUpdateCoordinator], SensorEntity
95 """Representation of an OctoPrint sensor."""
99 coordinator: OctoprintDataUpdateCoordinator,
103 """Initialize a new OctoPrint sensor."""
112 """Representation of an OctoPrint sensor."""
114 _attr_icon =
"mdi:printer-3d"
117 self, coordinator: OctoprintDataUpdateCoordinator, device_id: str
119 """Initialize a new OctoPrint sensor."""
120 super().
__init__(coordinator,
"Current State", device_id)
124 """Return sensor state."""
125 printer: OctoprintPrinterInfo = self.coordinator.data[
"printer"]
129 return printer.state.text
133 """Return if entity is available."""
134 return self.coordinator.last_update_success
and self.coordinator.data[
"printer"]
138 """Representation of an OctoPrint sensor."""
140 _attr_native_unit_of_measurement = PERCENTAGE
141 _attr_icon =
"mdi:file-percent"
144 self, coordinator: OctoprintDataUpdateCoordinator, device_id: str
146 """Initialize a new OctoPrint sensor."""
147 super().
__init__(coordinator,
"Job Percentage", device_id)
151 """Return sensor state."""
152 job: OctoprintJobInfo = self.coordinator.data[
"job"]
156 if not (state := job.progress.completion):
159 return round(state, 2)
163 """Representation of an OctoPrint sensor."""
165 _attr_device_class = SensorDeviceClass.TIMESTAMP
168 self, coordinator: OctoprintDataUpdateCoordinator, device_id: str
170 """Initialize a new OctoPrint sensor."""
171 super().
__init__(coordinator,
"Estimated Finish Time", device_id)
175 """Return sensor state."""
176 job: OctoprintJobInfo = self.coordinator.data[
"job"]
179 or not job.progress.print_time_left
184 read_time = self.coordinator.data[
"last_read_time"]
186 return (read_time +
timedelta(seconds=job.progress.print_time_left)).replace(
192 """Representation of an OctoPrint sensor."""
194 _attr_device_class = SensorDeviceClass.TIMESTAMP
197 self, coordinator: OctoprintDataUpdateCoordinator, device_id: str
199 """Initialize a new OctoPrint sensor."""
200 super().
__init__(coordinator,
"Start Time", device_id)
204 """Return sensor state."""
205 job: OctoprintJobInfo = self.coordinator.data[
"job"]
209 or not job.progress.print_time
214 read_time = self.coordinator.data[
"last_read_time"]
216 return (read_time -
timedelta(seconds=job.progress.print_time)).replace(
222 """Representation of an OctoPrint sensor."""
224 _attr_native_unit_of_measurement = UnitOfTemperature.CELSIUS
225 _attr_device_class = SensorDeviceClass.TEMPERATURE
226 _attr_state_class = SensorStateClass.MEASUREMENT
230 coordinator: OctoprintDataUpdateCoordinator,
235 """Initialize a new OctoPrint sensor."""
236 super().
__init__(coordinator, f
"{temp_type} {tool} temp", device_id)
242 """Return sensor state."""
243 printer: OctoprintPrinterInfo = self.coordinator.data[
"printer"]
247 for temp
in printer.temperatures:
252 else temp.target_temp
263 """Return if entity is available."""
264 return self.coordinator.last_update_success
and self.coordinator.data[
"printer"]
None __init__(self, OctoprintDataUpdateCoordinator coordinator, str device_id)
datetime|None native_value(self)
None __init__(self, OctoprintDataUpdateCoordinator coordinator, str device_id)
None __init__(self, OctoprintDataUpdateCoordinator coordinator, str sensor_type, str device_id)
None __init__(self, OctoprintDataUpdateCoordinator coordinator, str device_id)
datetime|None native_value(self)
None __init__(self, OctoprintDataUpdateCoordinator coordinator, str device_id)
None __init__(self, OctoprintDataUpdateCoordinator coordinator, str tool, str temp_type, str device_id)
bool _is_printer_printing(OctoprintPrinterInfo printer)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)