Skip to content

Commit

Permalink
More sensors
Browse files Browse the repository at this point in the history
  • Loading branch information
ClusterM committed Aug 16, 2022
1 parent 2bee784 commit 4c7c622
Showing 1 changed file with 86 additions and 33 deletions.
119 changes: 86 additions & 33 deletions custom_components/skykettle/sensor.py
Original file line number Diff line number Diff line change
@@ -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 *
Expand All @@ -14,6 +14,10 @@

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):
Expand All @@ -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."""

Expand All @@ -52,75 +59,121 @@ def kettle(self):
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:
return (FRIENDLY_NAME + " " + self.entry.data.get(CONF_FRIENDLY_NAME, "")).strip() + " success rate"

@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:
return True # Always readable

@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

0 comments on commit 4c7c622

Please sign in to comment.