16
16
from homeassistant .helpers .event import async_track_state_change
17
17
import homeassistant .helpers .config_validation as cv
18
18
from homeassistant .helpers .restore_state import RestoreEntity
19
+ from homeassistant .util .percentage import (
20
+ ordered_list_item_to_percentage ,
21
+ percentage_to_ordered_list_item
22
+ )
19
23
from . import COMPONENT_ABS_DIR , Helper
20
24
from .controller import get_controller
21
25
@@ -93,7 +97,7 @@ def __init__(self, hass, config, device_data):
93
97
self ._supported_models = device_data ['supportedModels' ]
94
98
self ._supported_controller = device_data ['supportedController' ]
95
99
self ._commands_encoding = device_data ['commandsEncoding' ]
96
- self ._speed_list = [ SPEED_OFF ] + device_data ['speed' ]
100
+ self ._speed_list = device_data ['speed' ]
97
101
self ._commands = device_data ['commands' ]
98
102
99
103
self ._speed = SPEED_OFF
@@ -161,19 +165,22 @@ def name(self):
161
165
def state (self ):
162
166
"""Return the current state."""
163
167
if (self ._on_by_remote or \
164
- self .speed != SPEED_OFF ):
168
+ self ._speed != SPEED_OFF ):
165
169
return STATE_ON
166
170
return SPEED_OFF
167
171
168
172
@property
169
- def speed_list (self ):
170
- """Get the list of available speeds."""
171
- return self ._speed_list
173
+ def percentage (self ):
174
+ """Return speed percentage of the fan."""
175
+ if (self ._speed == SPEED_OFF ):
176
+ return 0
177
+
178
+ return ordered_list_item_to_percentage (self ._speed_list , self ._speed )
172
179
173
180
@property
174
- def speed (self ):
175
- """Return the current speed ."""
176
- return self ._speed
181
+ def speed_count (self ):
182
+ """Return the number of speeds the fan supports ."""
183
+ return len ( self ._speed_list )
177
184
178
185
@property
179
186
def oscillating (self ):
@@ -207,12 +214,16 @@ def extra_state_attributes(self):
207
214
'commands_encoding' : self ._commands_encoding ,
208
215
}
209
216
210
- async def async_set_speed (self , speed : str ):
211
- """Set the speed of the fan."""
212
- self ._speed = speed
217
+ async def async_set_percentage (self , percentage : int ):
218
+ """Set the desired speed for the fan."""
219
+ if (percentage == 0 ):
220
+ self ._speed = SPEED_OFF
221
+ else :
222
+ self ._speed = percentage_to_ordered_list_item (
223
+ self ._speed_list , percentage )
213
224
214
- if not speed == SPEED_OFF :
215
- self ._last_on_speed = speed
225
+ if not self . _speed == SPEED_OFF :
226
+ self ._last_on_speed = self . _speed
216
227
217
228
await self .send_command ()
218
229
await self .async_update_ha_state ()
@@ -233,16 +244,17 @@ async def async_set_direction(self, direction: str):
233
244
234
245
await self .async_update_ha_state ()
235
246
236
- async def async_turn_on (self , speed : str = None , ** kwargs ):
247
+ async def async_turn_on (self , percentage : int = None , ** kwargs ):
237
248
"""Turn on the fan."""
238
- if speed is None :
239
- speed = self ._last_on_speed or self ._speed_list [1 ]
249
+ if percentage is None :
250
+ percentage = ordered_list_item_to_percentage (
251
+ self ._speed_list , self ._last_on_speed or self ._speed_list [0 ])
240
252
241
- await self .async_set_speed ( speed )
253
+ await self .async_set_percentage ( percentage )
242
254
243
255
async def async_turn_off (self ):
244
256
"""Turn off the fan."""
245
- await self .async_set_speed ( SPEED_OFF )
257
+ await self .async_set_percentage ( 0 )
246
258
247
259
async def send_command (self ):
248
260
async with self ._temp_lock :
@@ -280,4 +292,4 @@ async def _async_power_sensor_changed(self, entity_id, old_state, new_state):
280
292
self ._on_by_remote = False
281
293
if self ._speed != SPEED_OFF :
282
294
self ._speed = SPEED_OFF
283
- await self .async_update_ha_state ()
295
+ await self .async_update_ha_state ()
0 commit comments