Fix/160 core 300 s automation broken (#163)

* only accept numbers for AQI sensor

* fix syntax error and update style.

* add an air quality value sensor

* add empty unit of measurement.

* fix validate
This commit is contained in:
Vincent Le Bourlot 2023-09-14 11:24:56 +02:00 committed by GitHub
parent 9c7a779a9d
commit b54a839187
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 65 additions and 18 deletions

View File

@ -1,6 +1,7 @@
name: Validate name: Validate with hassfest
on: on:
push:
pull_request: pull_request:
schedule: schedule:
- cron: "0 0 * * *" - cron: "0 0 * * *"
@ -9,11 +10,5 @@ jobs:
validate: validate:
runs-on: "ubuntu-latest" runs-on: "ubuntu-latest"
steps: steps:
- uses: "actions/checkout@v3.6.0" - uses: "actions/checkout@v3"
- name: HACS validation - uses: home-assistant/actions/hassfest@master
uses: "hacs/action@22.5.0"
with:
ignore: "brands"
category: "integration"
comment: false

View File

@ -60,6 +60,8 @@ def _setup_entities(devices, async_add_entities, coordinator):
entities.append(VeSyncHumiditySensor(dev, coordinator)) entities.append(VeSyncHumiditySensor(dev, coordinator))
if has_feature(dev, "details", "air_quality"): if has_feature(dev, "details", "air_quality"):
entities.append(VeSyncAirQualitySensor(dev, coordinator)) entities.append(VeSyncAirQualitySensor(dev, coordinator))
if has_feature(dev, "details", "air_quality_value"):
entities.append(VeSyncAirQualityValueSensor(dev, coordinator))
if has_feature(dev, "details", "filter_life"): if has_feature(dev, "details", "filter_life"):
entities.append(VeSyncFilterLifeSensor(dev, coordinator)) entities.append(VeSyncFilterLifeSensor(dev, coordinator))
@ -185,11 +187,19 @@ class VeSyncAirQualitySensor(VeSyncHumidifierSensorEntity):
"""Representation of an air quality sensor.""" """Representation of an air quality sensor."""
_attr_state_class = SensorStateClass.MEASUREMENT _attr_state_class = SensorStateClass.MEASUREMENT
_attr_device_class = SensorDeviceClass.AQI _attr_native_unit_of_measurement = " "
def __init__(self, plug, coordinator): def __init__(self, device, coordinator):
"""Initialize the VeSync outlet device.""" """Initialize the VeSync device."""
super().__init__(plug, coordinator) super().__init__(device, coordinator)
self._numeric_quality = None
if self.native_value is not None:
self._numeric_quality = isinstance(self.native_value, (int, float))
@property
def device_class(self):
"""Return the air quality device class."""
return SensorDeviceClass.AQI if self._numeric_quality else None
@property @property
def unique_id(self): def unique_id(self):
@ -204,12 +214,54 @@ class VeSyncAirQualitySensor(VeSyncHumidifierSensorEntity):
@property @property
def native_value(self): def native_value(self):
"""Return the air quality index.""" """Return the air quality index."""
quality = None if has_feature(self.smarthumidifier, "details", "air_quality"):
if has_feature(self.smarthumidifier, "details", "air_quality_value"):
quality = self.smarthumidifier.details["air_quality_value"]
elif has_feature(self.smarthumidifier, "details", "air_quality"):
quality = self.smarthumidifier.details["air_quality"] quality = self.smarthumidifier.details["air_quality"]
return quality.capitalize() if isinstance(quality, str) else quality if isinstance(quality, (int, float)):
return quality
_LOGGER.warn(
"Got non numeric value for AQI sensor from 'air_quality' for %s: %s",
self.name,
quality,
)
_LOGGER.warn("No air quality index found in '%s'", self.name)
return None
class VeSyncAirQualityValueSensor(VeSyncHumidifierSensorEntity):
"""Representation of an air quality sensor."""
_attr_state_class = SensorStateClass.MEASUREMENT
_attr_device_class = SensorDeviceClass.AQI
_attr_native_unit_of_measurement = " "
def __init__(self, device, coordinator):
"""Initialize the VeSync device."""
super().__init__(device, coordinator)
@property
def unique_id(self):
"""Return unique ID for air quality sensor on device."""
return f"{super().unique_id}-air-quality-value"
@property
def name(self):
"""Return sensor name."""
return f"{super().name} air quality value"
@property
def native_value(self):
"""Return the air quality index."""
if has_feature(self.smarthumidifier, "details", "air_quality_value"):
quality_value = self.smarthumidifier.details["air_quality_value"]
if isinstance(quality_value, (int, float)):
return quality_value
_LOGGER.warn(
"Got non numeric value for AQI sensor from 'air_quality_value' for %s: %s",
self.name,
quality_value,
)
_LOGGER.warn("No air quality value found in '%s'", self.name)
return None
class VeSyncFilterLifeSensor(VeSyncHumidifierSensorEntity): class VeSyncFilterLifeSensor(VeSyncHumidifierSensorEntity):