Added HomeKit fan speed based on speed_list (#19767)
Speed_list needs to be in ascending order.
This commit is contained in:
parent
208ea6eae4
commit
a94a24f6f8
5 changed files with 194 additions and 20 deletions
|
@ -1,17 +1,19 @@
|
|||
"""Collection of useful functions for the HomeKit component."""
|
||||
from collections import namedtuple, OrderedDict
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.components import media_player
|
||||
from homeassistant.core import split_entity_id
|
||||
from homeassistant.components import fan, media_player
|
||||
from homeassistant.const import (
|
||||
ATTR_CODE, ATTR_SUPPORTED_FEATURES, CONF_NAME, CONF_TYPE, TEMP_CELSIUS)
|
||||
from homeassistant.core import split_entity_id
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
import homeassistant.util.temperature as temp_util
|
||||
|
||||
from .const import (
|
||||
CONF_FEATURE, CONF_FEATURE_LIST, HOMEKIT_NOTIFY_ID, FEATURE_ON_OFF,
|
||||
FEATURE_PLAY_PAUSE, FEATURE_PLAY_STOP, FEATURE_TOGGLE_MUTE, TYPE_FAUCET,
|
||||
CONF_FEATURE, CONF_FEATURE_LIST, FEATURE_ON_OFF, FEATURE_PLAY_PAUSE,
|
||||
FEATURE_PLAY_STOP, FEATURE_TOGGLE_MUTE, HOMEKIT_NOTIFY_ID, TYPE_FAUCET,
|
||||
TYPE_OUTLET, TYPE_SHOWER, TYPE_SPRINKLER, TYPE_SWITCH, TYPE_VALVE)
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
@ -110,6 +112,50 @@ def validate_media_player_features(state, feature_list):
|
|||
return True
|
||||
|
||||
|
||||
SpeedRange = namedtuple('SpeedRange', ('start', 'target'))
|
||||
SpeedRange.__doc__ += """ Maps Home Assistant speed \
|
||||
values to percentage based HomeKit speeds.
|
||||
start: Start of the range (inclusive).
|
||||
target: Percentage to use to determine HomeKit percentages \
|
||||
from HomeAssistant speed.
|
||||
"""
|
||||
|
||||
|
||||
class HomeKitSpeedMapping:
|
||||
"""Supports conversion between Home Assistant and HomeKit fan speeds."""
|
||||
|
||||
def __init__(self, speed_list):
|
||||
"""Initialize a new SpeedMapping object."""
|
||||
if speed_list[0] != fan.SPEED_OFF:
|
||||
_LOGGER.warning("%s does not contain the speed setting "
|
||||
"%s as its first element. "
|
||||
"Assuming that %s is equivalent to 'off'.",
|
||||
speed_list, fan.SPEED_OFF, speed_list[0])
|
||||
self.speed_ranges = OrderedDict()
|
||||
list_size = len(speed_list)
|
||||
for index, speed in enumerate(speed_list):
|
||||
# By dividing by list_size -1 the following
|
||||
# desired attributes hold true:
|
||||
# * index = 0 => 0%, equal to "off"
|
||||
# * index = len(speed_list) - 1 => 100 %
|
||||
# * all other indices are equally distributed
|
||||
target = index * 100 / (list_size - 1)
|
||||
start = index * 100 / list_size
|
||||
self.speed_ranges[speed] = SpeedRange(start, target)
|
||||
|
||||
def speed_to_homekit(self, speed):
|
||||
"""Map Home Assistant speed state to HomeKit speed."""
|
||||
speed_range = self.speed_ranges[speed]
|
||||
return speed_range.target
|
||||
|
||||
def speed_to_states(self, speed):
|
||||
"""Map HomeKit speed to Home Assistant speed state."""
|
||||
for state, speed_range in reversed(self.speed_ranges.items()):
|
||||
if speed_range.start <= speed:
|
||||
return state
|
||||
return list(self.speed_ranges.keys())[0]
|
||||
|
||||
|
||||
def show_setup_message(hass, pincode):
|
||||
"""Display persistent notification with setup information."""
|
||||
pin = pincode.decode()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue