Add unit_getter for feature (#993)

Allow defining getter for unit, necessary to set the correct unit based
on device responses.
This commit is contained in:
Teemu R 2024-06-21 14:51:56 +02:00 committed by GitHub
parent 472008e818
commit ac1e81dc17
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 10 additions and 3 deletions

View File

@ -99,7 +99,7 @@ class Feature:
Choice = auto() Choice = auto()
Unknown = -1 Unknown = -1
# TODO: unsure if this is a great idea.. # Aliases for easy access
Sensor = Type.Sensor Sensor = Type.Sensor
BinarySensor = Type.BinarySensor BinarySensor = Type.BinarySensor
Switch = Type.Switch Switch = Type.Switch
@ -139,6 +139,9 @@ class Feature:
icon: str | None = None icon: str | None = None
#: Unit, if applicable #: Unit, if applicable
unit: str | None = None unit: str | None = None
#: Attribute containing the name of the unit getter property.
#: If set, this property will be used to set *unit*.
unit_getter: str | None = None
#: Category hint for downstreams #: Category hint for downstreams
category: Feature.Category = Category.Unset category: Feature.Category = Category.Unset
#: Type of the feature #: Type of the feature
@ -177,6 +180,10 @@ class Feature:
if self.choices_getter is not None: if self.choices_getter is not None:
self.choices = getattr(container, self.choices_getter) self.choices = getattr(container, self.choices_getter)
# Populate unit, if unit_getter is given
if self.unit_getter is not None:
self.unit = getattr(container, self.unit_getter)
# Set the category, if unset # Set the category, if unset
if self.category is Feature.Category.Unset: if self.category is Feature.Category.Unset:
if self.attribute_setter: if self.attribute_setter:

View File

@ -28,6 +28,7 @@ class TemperatureSensor(SmartModule):
attribute_getter="temperature", attribute_getter="temperature",
icon="mdi:thermometer", icon="mdi:thermometer",
category=Feature.Category.Primary, category=Feature.Category.Primary,
unit_getter="temperature_unit",
) )
) )
if "current_temp_exception" in device.sys_info: if "current_temp_exception" in device.sys_info:
@ -55,7 +56,6 @@ class TemperatureSensor(SmartModule):
choices=["celsius", "fahrenheit"], choices=["celsius", "fahrenheit"],
) )
) )
# TODO: use temperature_unit for feature creation
@property @property
def temperature(self): def temperature(self):
@ -68,7 +68,7 @@ class TemperatureSensor(SmartModule):
return self._device.sys_info.get("current_temp_exception", 0) != 0 return self._device.sys_info.get("current_temp_exception", 0) != 0
@property @property
def temperature_unit(self): def temperature_unit(self) -> Literal["celsius", "fahrenheit"]:
"""Return current temperature unit.""" """Return current temperature unit."""
return self._device.sys_info["temp_unit"] return self._device.sys_info["temp_unit"]