Use EntityDescription - repetier (#55926)

This commit is contained in:
Marc Mueller 2021-09-08 14:28:04 +02:00 committed by GitHub
parent 69d6d5ffce
commit 32b8be5a6e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 97 additions and 81 deletions

View File

@ -1,10 +1,14 @@
"""Support for Repetier-Server sensors.""" """Support for Repetier-Server sensors."""
from __future__ import annotations
from dataclasses import dataclass
from datetime import timedelta from datetime import timedelta
import logging import logging
import pyrepetier import pyrepetier
import voluptuous as vol import voluptuous as vol
from homeassistant.components.sensor import SensorEntityDescription
from homeassistant.const import ( from homeassistant.const import (
CONF_API_KEY, CONF_API_KEY,
CONF_HOST, CONF_HOST,
@ -109,33 +113,66 @@ def has_all_unique_names(value):
return value return value
SENSOR_TYPES = { @dataclass
# Type, Unit, Icon, post class RepetierRequiredKeysMixin:
"bed_temperature": [ """Mixin for required keys."""
"temperature",
TEMP_CELSIUS, type: str
None,
"_bed_",
DEVICE_CLASS_TEMPERATURE, @dataclass
], class RepetierSensorEntityDescription(
"extruder_temperature": [ SensorEntityDescription, RepetierRequiredKeysMixin
"temperature", ):
TEMP_CELSIUS, """Describes Repetier sensor entity."""
None,
"_extruder_",
DEVICE_CLASS_TEMPERATURE, SENSOR_TYPES: dict[str, RepetierSensorEntityDescription] = {
], "bed_temperature": RepetierSensorEntityDescription(
"chamber_temperature": [ key="bed_temperature",
"temperature", type="temperature",
TEMP_CELSIUS, native_unit_of_measurement=TEMP_CELSIUS,
None, name="_bed_",
"_chamber_", device_class=DEVICE_CLASS_TEMPERATURE,
DEVICE_CLASS_TEMPERATURE, ),
], "extruder_temperature": RepetierSensorEntityDescription(
"current_state": ["state", None, "mdi:printer-3d", "", None], key="extruder_temperature",
"current_job": ["progress", PERCENTAGE, "mdi:file-percent", "_current_job", None], type="temperature",
"job_end": ["progress", None, "mdi:clock-end", "_job_end", None], native_unit_of_measurement=TEMP_CELSIUS,
"job_start": ["progress", None, "mdi:clock-start", "_job_start", None], name="_extruder_",
device_class=DEVICE_CLASS_TEMPERATURE,
),
"chamber_temperature": RepetierSensorEntityDescription(
key="chamber_temperature",
type="temperature",
native_unit_of_measurement=TEMP_CELSIUS,
name="_chamber_",
device_class=DEVICE_CLASS_TEMPERATURE,
),
"current_state": RepetierSensorEntityDescription(
key="current_state",
type="state",
icon="mdi:printer-3d",
),
"current_job": RepetierSensorEntityDescription(
key="current_job",
type="progress",
native_unit_of_measurement=PERCENTAGE,
icon="mdi:file-percent",
name="_current_job",
),
"job_end": RepetierSensorEntityDescription(
key="job_end",
type="progress",
icon="mdi:clock-end",
name="_job_end",
),
"job_start": RepetierSensorEntityDescription(
key="job_start",
type="progress",
icon="mdi:clock-start",
name="_job_start",
),
} }
SENSOR_SCHEMA = vol.Schema( SENSOR_SCHEMA = vol.Schema(

View File

@ -8,7 +8,7 @@ from homeassistant.const import DEVICE_CLASS_TIMESTAMP
from homeassistant.core import callback from homeassistant.core import callback
from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.dispatcher import async_dispatcher_connect
from . import REPETIER_API, SENSOR_TYPES, UPDATE_SIGNAL from . import REPETIER_API, SENSOR_TYPES, UPDATE_SIGNAL, RepetierSensorEntityDescription
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -35,12 +35,13 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
printer_id = info["printer_id"] printer_id = info["printer_id"]
sensor_type = info["sensor_type"] sensor_type = info["sensor_type"]
temp_id = info["temp_id"] temp_id = info["temp_id"]
name = f"{info['name']}{SENSOR_TYPES[sensor_type][3]}" description = SENSOR_TYPES[sensor_type]
name = f"{info['name']}{description.name or ''}"
if temp_id is not None: if temp_id is not None:
_LOGGER.debug("%s Temp_id: %s", sensor_type, temp_id) _LOGGER.debug("%s Temp_id: %s", sensor_type, temp_id)
name = f"{name}{temp_id}" name = f"{name}{temp_id}"
sensor_class = sensor_map[sensor_type] sensor_class = sensor_map[sensor_type]
entity = sensor_class(api, temp_id, name, printer_id, sensor_type) entity = sensor_class(api, temp_id, name, printer_id, description)
entities.append(entity) entities.append(entity)
add_entities(entities, True) add_entities(entities, True)
@ -49,48 +50,33 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
class RepetierSensor(SensorEntity): class RepetierSensor(SensorEntity):
"""Class to create and populate a Repetier Sensor.""" """Class to create and populate a Repetier Sensor."""
def __init__(self, api, temp_id, name, printer_id, sensor_type): entity_description: RepetierSensorEntityDescription
"""Init new sensor.""" _attr_should_poll = False
self._api = api
self._attributes = {}
self._available = False
self._temp_id = temp_id
self._name = name
self._printer_id = printer_id
self._sensor_type = sensor_type
self._state = None
self._attr_device_class = SENSOR_TYPES[self._sensor_type][4]
@property def __init__(
def available(self) -> bool: self,
"""Return True if entity is available.""" api,
return self._available temp_id,
name,
printer_id,
description: RepetierSensorEntityDescription,
):
"""Init new sensor."""
self.entity_description = description
self._api = api
self._attributes: dict = {}
self._temp_id = temp_id
self._printer_id = printer_id
self._state = None
self._attr_name = name
self._attr_available = False
@property @property
def extra_state_attributes(self): def extra_state_attributes(self):
"""Return sensor attributes.""" """Return sensor attributes."""
return self._attributes return self._attributes
@property
def name(self):
"""Return the name of the sensor."""
return self._name
@property
def native_unit_of_measurement(self):
"""Return the unit of measurement of this entity, if any."""
return SENSOR_TYPES[self._sensor_type][1]
@property
def icon(self):
"""Icon to use in the frontend."""
return SENSOR_TYPES[self._sensor_type][2]
@property
def should_poll(self):
"""Return False as entity is updated from the component."""
return False
@property @property
def native_value(self): def native_value(self):
"""Return sensor state.""" """Return sensor state."""
@ -109,14 +95,13 @@ class RepetierSensor(SensorEntity):
def _get_data(self): def _get_data(self):
"""Return new data from the api cache.""" """Return new data from the api cache."""
data = self._api.get_data(self._printer_id, self._sensor_type, self._temp_id) sensor_type = self.entity_description.key
data = self._api.get_data(self._printer_id, sensor_type, self._temp_id)
if data is None: if data is None:
_LOGGER.debug( _LOGGER.debug("Data not found for %s and %s", sensor_type, self._temp_id)
"Data not found for %s and %s", self._sensor_type, self._temp_id self._attr_available = False
)
self._available = False
return None return None
self._available = True self._attr_available = True
return data return data
def update(self): def update(self):
@ -125,7 +110,7 @@ class RepetierSensor(SensorEntity):
if data is None: if data is None:
return return
state = data.pop("state") state = data.pop("state")
_LOGGER.debug("Printer %s State %s", self._name, state) _LOGGER.debug("Printer %s State %s", self.name, state)
self._attributes.update(data) self._attributes.update(data)
self._state = state self._state = state
@ -147,7 +132,7 @@ class RepetierTempSensor(RepetierSensor):
return return
state = data.pop("state") state = data.pop("state")
temp_set = data["temp_set"] temp_set = data["temp_set"]
_LOGGER.debug("Printer %s Setpoint: %s, Temp: %s", self._name, temp_set, state) _LOGGER.debug("Printer %s Setpoint: %s, Temp: %s", self.name, temp_set, state)
self._attributes.update(data) self._attributes.update(data)
self._state = state self._state = state
@ -166,10 +151,7 @@ class RepetierJobSensor(RepetierSensor):
class RepetierJobEndSensor(RepetierSensor): class RepetierJobEndSensor(RepetierSensor):
"""Class to create and populate a Repetier Job End timestamp Sensor.""" """Class to create and populate a Repetier Job End timestamp Sensor."""
@property _attr_device_class = DEVICE_CLASS_TIMESTAMP
def device_class(self):
"""Return the device class."""
return DEVICE_CLASS_TIMESTAMP
def update(self): def update(self):
"""Update the sensor.""" """Update the sensor."""
@ -194,10 +176,7 @@ class RepetierJobEndSensor(RepetierSensor):
class RepetierJobStartSensor(RepetierSensor): class RepetierJobStartSensor(RepetierSensor):
"""Class to create and populate a Repetier Job Start timestamp Sensor.""" """Class to create and populate a Repetier Job Start timestamp Sensor."""
@property _attr_device_class = DEVICE_CLASS_TIMESTAMP
def device_class(self):
"""Return the device class."""
return DEVICE_CLASS_TIMESTAMP
def update(self): def update(self):
"""Update the sensor.""" """Update the sensor."""