From 4c7c622ad5ccb1fff4a115a37d9a9e42d28d9749 Mon Sep 17 00:00:00 2001 From: Alexey 'Cluster' Avdyukhin Date: Tue, 16 Aug 2022 22:54:13 +0300 Subject: More sensors --- custom_components/skykettle/sensor.py | 119 ++++++++++++++++++++++++---------- 1 file changed, 86 insertions(+), 33 deletions(-) diff --git a/custom_components/skykettle/sensor.py b/custom_components/skykettle/sensor.py index bfe9ad5..0645bdf 100644 --- a/custom_components/skykettle/sensor.py +++ b/custom_components/skykettle/sensor.py @@ -1,7 +1,7 @@ """SkyKettle.""" import logging -from homeassistant.components.sensor import SensorEntity, SensorStateClass +from homeassistant.components.sensor import SensorEntity, SensorStateClass, SensorDeviceClass from homeassistant.helpers.entity import EntityCategory from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.const import * @@ -14,6 +14,10 @@ _LOGGER = logging.getLogger(__name__) SENSOR_TYPE_WATER_FRESHNESS = "water_freshness" SENSOR_TYPE_SUCCESS_RATE = "success_rate" +SENSOR_TYPE_ENERGY = "energy" +SENSOR_TYPE_ONTIME = "ontime" +SENSOR_TYPE_HEATER_ON_COUNT = "heater_on_count" +SENSOR_TYPE_USER_ON_COUNT = "user_on_count" async def async_setup_entry(hass, entry, async_add_entities): @@ -24,10 +28,13 @@ async def async_setup_entry(hass, entry, async_add_entities): ]) if model_code in [SkyKettle.MODELS_4]: # RK-G2xxS, RK-M13xS, RK-M21xS, RK-M223S but not sure async_add_entities([ + SkySensor(hass, entry, SENSOR_TYPE_ENERGY), + SkySensor(hass, entry, SENSOR_TYPE_ONTIME), + SkySensor(hass, entry, SENSOR_TYPE_HEATER_ON_COUNT), + SkySensor(hass, entry, SENSOR_TYPE_USER_ON_COUNT), SkySensor(hass, entry, SENSOR_TYPE_WATER_FRESHNESS), ]) - class SkySensor(SensorEntity): """Representation of a SkyKettle sensor device.""" @@ -52,9 +59,33 @@ class SkySensor(SensorEntity): def unique_id(self): return f"{self.entry.entry_id}_{self.sensor_type}" + @property + def device_info(self): + return self.hass.data[DOMAIN][DATA_DEVICE_INFO]() + + @property + def should_poll(self): + return False + + @property + def assumed_state(self): + return False + + @property + def last_reset(self): + return None + @property def name(self): """Name of the entity.""" + if self.sensor_type == SENSOR_TYPE_ENERGY: + return (FRIENDLY_NAME + " " + self.entry.data.get(CONF_FRIENDLY_NAME, "")).strip() + " total energy consumed" + if self.sensor_type == SENSOR_TYPE_ONTIME: + return (FRIENDLY_NAME + " " + self.entry.data.get(CONF_FRIENDLY_NAME, "")).strip() + " total work time" + if self.sensor_type == SENSOR_TYPE_HEATER_ON_COUNT: + return (FRIENDLY_NAME + " " + self.entry.data.get(CONF_FRIENDLY_NAME, "")).strip() + " heater on count" + if self.sensor_type == SENSOR_TYPE_USER_ON_COUNT: + return (FRIENDLY_NAME + " " + self.entry.data.get(CONF_FRIENDLY_NAME, "")).strip() + " user on count" if self.sensor_type == SENSOR_TYPE_WATER_FRESHNESS: return (FRIENDLY_NAME + " " + self.entry.data.get(CONF_FRIENDLY_NAME, "")).strip() + " water freshness" if self.sensor_type == SENSOR_TYPE_SUCCESS_RATE: @@ -62,32 +93,28 @@ class SkySensor(SensorEntity): @property def icon(self): + if self.sensor_type == SENSOR_TYPE_ONTIME: + return "mdi:timelapse" + if self.sensor_type == SENSOR_TYPE_HEATER_ON_COUNT: + return "mdi:dip-switch" + if self.sensor_type == SENSOR_TYPE_USER_ON_COUNT: + return "mdi:dip-switch" if self.sensor_type == SENSOR_TYPE_WATER_FRESHNESS: return "mdi:water-sync" if self.sensor_type == SENSOR_TYPE_SUCCESS_RATE: return "mdi:bluetooth-connect" - - @property - def device_class(self): - if self.sensor_type == SENSOR_TYPE_WATER_FRESHNESS: - return None # Unusual class - if self.sensor_type == SENSOR_TYPE_SUCCESS_RATE: - return None # Unusual class - - @property - def device_info(self): - return self.hass.data[DOMAIN][DATA_DEVICE_INFO]() - - @property - def should_poll(self): - return False - - @property - def assumed_state(self): - return False + return None @property def available(self): + if self.sensor_type == SENSOR_TYPE_ENERGY: + return self.kettle.available and self.kettle.energy_wh != None + if self.sensor_type == SENSOR_TYPE_ONTIME: + return self.kettle.available and self.kettle.ontime != None + if self.sensor_type == SENSOR_TYPE_HEATER_ON_COUNT: + return self.kettle.available and self.kettle.heater_on_count != None + if self.sensor_type == SENSOR_TYPE_USER_ON_COUNT: + return self.kettle.available and self.kettle.user_on_count != None if self.sensor_type == SENSOR_TYPE_WATER_FRESHNESS: return self.kettle.available and self.kettle.water_freshness_hours != None if self.sensor_type == SENSOR_TYPE_SUCCESS_RATE: @@ -95,32 +122,58 @@ class SkySensor(SensorEntity): @property def entity_category(self): - if self.sensor_type == SENSOR_TYPE_WATER_FRESHNESS: - return None if self.sensor_type == SENSOR_TYPE_SUCCESS_RATE: return EntityCategory.DIAGNOSTIC + return None @property - def last_reset(self): - return None + def device_class(self): + if self.sensor_type == SENSOR_TYPE_ENERGY: + return SensorDeviceClass.ENERGY + if self.sensor_type == SENSOR_TYPE_ONTIME: + return SensorDeviceClass.DURATION + if self.sensor_type == SENSOR_TYPE_WATER_FRESHNESS: + return SensorDeviceClass.DURATION + return None # Unusual class @property - def native_value(self): + def state_class(self): + if self.sensor_type == SENSOR_TYPE_ENERGY: + return SensorStateClass.TOTAL_INCREASING + if self.sensor_type == SENSOR_TYPE_ONTIME: + return SensorStateClass.TOTAL_INCREASING + if self.sensor_type == SENSOR_TYPE_HEATER_ON_COUNT: + return SensorStateClass.TOTAL_INCREASING + if self.sensor_type == SENSOR_TYPE_USER_ON_COUNT: + return SensorStateClass.TOTAL_INCREASING if self.sensor_type == SENSOR_TYPE_WATER_FRESHNESS: - return self.kettle.water_freshness_hours + return SensorStateClass.MEASUREMENT if self.sensor_type == SENSOR_TYPE_SUCCESS_RATE: - return self.kettle.success_rate + return SensorStateClass.MEASUREMENT @property def native_unit_of_measurement(self): + if self.sensor_type == SENSOR_TYPE_ENERGY: + return ENERGY_WATT_HOUR + if self.sensor_type == SENSOR_TYPE_ONTIME: + return TIME_SECONDS if self.sensor_type == SENSOR_TYPE_WATER_FRESHNESS: - return "h" + return TIME_HOURS if self.sensor_type == SENSOR_TYPE_SUCCESS_RATE: - return "%" + return PERCENTAGE + return None @property - def state_class(self): + def native_value(self): + if self.sensor_type == SENSOR_TYPE_ENERGY: + return self.kettle.energy_wh + if self.sensor_type == SENSOR_TYPE_ONTIME: + return self.kettle.ontime.total_seconds() + if self.sensor_type == SENSOR_TYPE_HEATER_ON_COUNT: + return self.kettle.heater_on_count + if self.sensor_type == SENSOR_TYPE_USER_ON_COUNT: + return self.kettle.user_on_count if self.sensor_type == SENSOR_TYPE_WATER_FRESHNESS: - return SensorStateClass.MEASUREMENT + return self.kettle.water_freshness_hours if self.sensor_type == SENSOR_TYPE_SUCCESS_RATE: - return SensorStateClass.MEASUREMENT + return self.kettle.success_rate -- cgit v1.2.3