1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
"""SkyKettle."""
import logging
from homeassistant.components.sensor import SensorEntity, SensorStateClass
from homeassistant.helpers.entity import EntityCategory
from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.const import *
from .skykettle import SkyKettle
from .const import *
_LOGGER = logging.getLogger(__name__)
SENSOR_TYPE_WATER_FRESHNESS = "water_freshness"
SENSOR_TYPE_SUCCESS_RATE = "success_rate"
async def async_setup_entry(hass, entry, async_add_entities):
"""Set up the SkyKettle entry."""
model_code = hass.data[DOMAIN][entry.entry_id][DATA_CONNECTION].model_code
async_add_entities([
SkySensor(hass, entry, SENSOR_TYPE_SUCCESS_RATE),
])
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_WATER_FRESHNESS),
])
class SkySensor(SensorEntity):
"""Representation of a SkyKettle sensor device."""
def __init__(self, hass, entry, sensor_type):
"""Initialize the sensor device."""
self.hass = hass
self.entry = entry
self.sensor_type = sensor_type
async def async_added_to_hass(self):
self.update()
self.async_on_remove(async_dispatcher_connect(self.hass, DISPATCHER_UPDATE, self.update))
def update(self):
self.schedule_update_ha_state()
@property
def kettle(self):
return self.hass.data[DOMAIN][self.entry.entry_id][DATA_CONNECTION]
@property
def unique_id(self):
return f"{self.entry.entry_id}_{self.sensor_type}"
@property
def name(self):
"""Name of the entity."""
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_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
@property
def available(self):
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
@property
def last_reset(self):
return None
@property
def native_value(self):
if self.sensor_type == SENSOR_TYPE_WATER_FRESHNESS:
return self.kettle.water_freshness_hours
if self.sensor_type == SENSOR_TYPE_SUCCESS_RATE:
return self.kettle.success_rate
@property
def native_unit_of_measurement(self):
if self.sensor_type == SENSOR_TYPE_WATER_FRESHNESS:
return "h"
if self.sensor_type == SENSOR_TYPE_SUCCESS_RATE:
return "%"
@property
def state_class(self):
if self.sensor_type == SENSOR_TYPE_WATER_FRESHNESS:
return SensorStateClass.MEASUREMENT
if self.sensor_type == SENSOR_TYPE_SUCCESS_RATE:
return SensorStateClass.MEASUREMENT
|