-
Notifications
You must be signed in to change notification settings - Fork 1
/
number.py
151 lines (115 loc) · 4.32 KB
/
number.py
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
"""Support for number settings on VeSync devices."""
import logging
from homeassistant.components.number import NumberEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.entity import EntityCategory
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .common import VeSyncBaseEntity, is_humidifier
from .const import DOMAIN, VS_DISCOVERY, VS_NUMBERS
MAX_HUMIDITY = 80
MIN_HUMIDITY = 30
_LOGGER = logging.getLogger(__name__)
async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up numbers."""
@callback
def discover(devices):
"""Add new devices to platform."""
_setup_entities(devices, async_add_entities)
config_entry.async_on_unload(
async_dispatcher_connect(hass, VS_DISCOVERY.format(VS_NUMBERS), discover)
)
_setup_entities(hass.data[DOMAIN][VS_NUMBERS], async_add_entities)
@callback
def _setup_entities(devices, async_add_entities):
"""Check if device is online and add entity."""
entities = []
for dev in devices:
if is_humidifier(dev.device_type):
entities.append(VeSyncHumidifierMistLevelHA(dev))
entities.append(VeSyncHumidifierTargetLevelHA(dev))
else:
_LOGGER.debug(
"%s - Unknown device type - %s", dev.device_name, dev.device_type
)
continue
async_add_entities(entities, update_before_add=True)
class VeSyncHumidifierNumberEntity(VeSyncBaseEntity, NumberEntity):
"""Representation of a number for configuring a VeSync humidifier."""
def __init__(self, humidifier):
"""Initialize the VeSync humidifier device."""
super().__init__(humidifier)
self.smarthumidifier = humidifier
@property
def entity_category(self):
"""Return the diagnostic entity category."""
return EntityCategory.CONFIG
class VeSyncHumidifierMistLevelHA(VeSyncHumidifierNumberEntity):
"""Representation of the mist level of a VeSync humidifier."""
@property
def unique_id(self):
"""Return the ID of this device."""
return f"{super().unique_id}-mist-level"
@property
def name(self):
"""Return the name of the device."""
return f"{super().name} mist level"
@property
def value(self):
"""Return the mist level."""
return self.device.details["mist_virtual_level"]
@property
def min_value(self) -> float:
"""Return the minimum mist level."""
return self.device.config_dict["mist_levels"][0]
@property
def max_value(self) -> float:
"""Return the maximum mist level."""
return self.device.config_dict["mist_levels"][-1]
@property
def step(self) -> float:
"""Return the steps for the mist level."""
return 1.0
@property
def extra_state_attributes(self):
"""Return the state attributes of the humidifier."""
attr = {}
attr["mist levels"] = self.device.config_dict["mist_levels"]
return attr
def set_value(self, value):
"""Set the mist level."""
self.device.set_mist_level(int(value))
class VeSyncHumidifierTargetLevelHA(VeSyncHumidifierNumberEntity):
"""Representation of the target humidity level of a VeSync humidifier."""
@property
def unique_id(self):
"""Return the ID of this device."""
return f"{super().unique_id}-target-level"
@property
def name(self):
"""Return the name of the device."""
return f"{super().name} target level"
@property
def value(self):
"""Return the current target humidity level."""
return self.device.config["auto_target_humidity"]
@property
def min_value(self) -> float:
"""Return the minimum humidity level."""
return MIN_HUMIDITY
@property
def max_value(self) -> float:
"""Return the maximum humidity level."""
return MAX_HUMIDITY
@property
def step(self) -> float:
"""Return the humidity change step."""
return 1.0
def set_value(self, value):
"""Set the target humidity level."""
self.device.set_humidity(int(value))