From b54a8391875693ce0f4529f504d1850f9942316a Mon Sep 17 00:00:00 2001 From: Vincent Le Bourlot Date: Thu, 14 Sep 2023 11:24:56 +0200 Subject: [PATCH] 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 --- .github/workflows/validate.yml | 13 ++---- custom_components/vesync/sensor.py | 70 ++++++++++++++++++++++++++---- 2 files changed, 65 insertions(+), 18 deletions(-) diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 613aa5f..bf1b612 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -1,6 +1,7 @@ -name: Validate +name: Validate with hassfest on: + push: pull_request: schedule: - cron: "0 0 * * *" @@ -9,11 +10,5 @@ jobs: validate: runs-on: "ubuntu-latest" steps: - - uses: "actions/checkout@v3.6.0" - - name: HACS validation - uses: "hacs/action@22.5.0" - with: - ignore: "brands" - category: "integration" - comment: false - + - uses: "actions/checkout@v3" + - uses: home-assistant/actions/hassfest@master \ No newline at end of file diff --git a/custom_components/vesync/sensor.py b/custom_components/vesync/sensor.py index 77bbdcd..e69a785 100644 --- a/custom_components/vesync/sensor.py +++ b/custom_components/vesync/sensor.py @@ -60,6 +60,8 @@ def _setup_entities(devices, async_add_entities, coordinator): entities.append(VeSyncHumiditySensor(dev, coordinator)) if has_feature(dev, "details", "air_quality"): 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"): entities.append(VeSyncFilterLifeSensor(dev, coordinator)) @@ -185,11 +187,19 @@ class VeSyncAirQualitySensor(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, plug, coordinator): - """Initialize the VeSync outlet device.""" - super().__init__(plug, coordinator) + def __init__(self, device, coordinator): + """Initialize the VeSync device.""" + 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 def unique_id(self): @@ -204,12 +214,54 @@ class VeSyncAirQualitySensor(VeSyncHumidifierSensorEntity): @property def native_value(self): """Return the air quality index.""" - quality = None - if has_feature(self.smarthumidifier, "details", "air_quality_value"): - quality = self.smarthumidifier.details["air_quality_value"] - elif has_feature(self.smarthumidifier, "details", "air_quality"): + if has_feature(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):