Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 13 additions & 13 deletions homeassistant/components/homekit/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,24 +9,23 @@

import voluptuous as vol

from homeassistant.components.cover import (
SUPPORT_CLOSE, SUPPORT_OPEN, SUPPORT_SET_POSITION)
import homeassistant.components.cover as cover
from homeassistant.const import (
ATTR_DEVICE_CLASS, ATTR_SUPPORTED_FEATURES, ATTR_UNIT_OF_MEASUREMENT,
CONF_IP_ADDRESS, CONF_MODE, CONF_NAME, CONF_PORT,
DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_ILLUMINANCE, DEVICE_CLASS_TEMPERATURE,
CONF_IP_ADDRESS, CONF_NAME, CONF_PORT, DEVICE_CLASS_HUMIDITY,
DEVICE_CLASS_ILLUMINANCE, DEVICE_CLASS_TEMPERATURE,
EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP,
TEMP_CELSIUS, TEMP_FAHRENHEIT)
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entityfilter import FILTER_SCHEMA
from homeassistant.util import get_local_ip
from homeassistant.util.decorator import Registry
from .const import (
CONF_AUTO_START, CONF_ENTITY_CONFIG, CONF_FILTER, DEFAULT_AUTO_START,
DEFAULT_PORT, DEVICE_CLASS_CO2, DEVICE_CLASS_PM25, DOMAIN, HOMEKIT_FILE,
SERVICE_HOMEKIT_START)
CONF_AUTO_START, CONF_ENTITY_CONFIG, CONF_FEATURE_LIST, CONF_FILTER,
DEFAULT_AUTO_START, DEFAULT_PORT, DEVICE_CLASS_CO2, DEVICE_CLASS_PM25,
DOMAIN, HOMEKIT_FILE, SERVICE_HOMEKIT_START)
from .util import (
show_setup_message, validate_entity_config, validate_media_player_modes)
show_setup_message, validate_entity_config, validate_media_player_features)

TYPES = Registry()
_LOGGER = logging.getLogger(__name__)
Expand Down Expand Up @@ -110,11 +109,11 @@ def get_accessory(hass, state, aid, config):
device_class = state.attributes.get(ATTR_DEVICE_CLASS)

if device_class == 'garage' and \
features & (SUPPORT_OPEN | SUPPORT_CLOSE):
features & (cover.SUPPORT_OPEN | cover.SUPPORT_CLOSE):
a_type = 'GarageDoorOpener'
elif features & SUPPORT_SET_POSITION:
elif features & cover.SUPPORT_SET_POSITION:
a_type = 'WindowCovering'
elif features & (SUPPORT_OPEN | SUPPORT_CLOSE):
elif features & (cover.SUPPORT_OPEN | cover.SUPPORT_CLOSE):
a_type = 'WindowCoveringBasic'

elif state.domain == 'fan':
Expand All @@ -127,8 +126,9 @@ def get_accessory(hass, state, aid, config):
a_type = 'Lock'

elif state.domain == 'media_player':
validate_media_player_modes(state, config)
if config.get(CONF_MODE):
feature_list = config.get(CONF_FEATURE_LIST)
if feature_list and \
validate_media_player_features(state, feature_list):
a_type = 'MediaPlayer'

elif state.domain == 'sensor':
Expand Down
14 changes: 8 additions & 6 deletions homeassistant/components/homekit/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,20 @@
# #### Config ####
CONF_AUTO_START = 'auto_start'
CONF_ENTITY_CONFIG = 'entity_config'
CONF_FEATURE = 'feature'
CONF_FEATURE_LIST = 'feature_list'
CONF_FILTER = 'filter'

# #### Config Defaults ####
DEFAULT_AUTO_START = True
DEFAULT_PORT = 51827

# #### Features ####
FEATURE_ON_OFF = 'on_off'
FEATURE_PLAY_PAUSE = 'play_pause'
FEATURE_PLAY_STOP = 'play_stop'
FEATURE_TOGGLE_MUTE = 'toggle_mute'

# #### HomeKit Component Services ####
SERVICE_HOMEKIT_START = 'start'

Expand All @@ -23,12 +31,6 @@
BRIDGE_SERIAL_NUMBER = 'homekit.bridge'
MANUFACTURER = 'Home Assistant'

# #### Media Player Modes ####
ON_OFF = 'on_off'
PLAY_PAUSE = 'play_pause'
PLAY_STOP = 'play_stop'
TOGGLE_MUTE = 'toggle_mute'

# #### Services ####
SERV_ACCESSORY_INFO = 'AccessoryInformation'
SERV_AIR_QUALITY_SENSOR = 'AirQualitySensor'
Expand Down
98 changes: 49 additions & 49 deletions homeassistant/components/homekit/type_media_players.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from pyhap.const import CATEGORY_SWITCH

from homeassistant.const import (
ATTR_ENTITY_ID, CONF_MODE, SERVICE_MEDIA_PAUSE, SERVICE_MEDIA_PLAY,
ATTR_ENTITY_ID, SERVICE_MEDIA_PAUSE, SERVICE_MEDIA_PLAY,
SERVICE_MEDIA_STOP, SERVICE_TURN_OFF, SERVICE_TURN_ON, SERVICE_VOLUME_MUTE,
STATE_OFF, STATE_PLAYING, STATE_UNKNOWN)
from homeassistant.components.media_player import (
Expand All @@ -13,15 +13,15 @@
from . import TYPES
from .accessories import HomeAccessory
from .const import (
CHAR_NAME, CHAR_ON, ON_OFF, PLAY_PAUSE, PLAY_STOP, SERV_SWITCH,
TOGGLE_MUTE)
CHAR_NAME, CHAR_ON, CONF_FEATURE_LIST, FEATURE_ON_OFF, FEATURE_PLAY_PAUSE,
FEATURE_PLAY_STOP, FEATURE_TOGGLE_MUTE, SERV_SWITCH)

_LOGGER = logging.getLogger(__name__)

MODE_FRIENDLY_NAME = {ON_OFF: 'Power',
PLAY_PAUSE: 'Play/Pause',
PLAY_STOP: 'Play/Stop',
TOGGLE_MUTE: 'Mute'}
MODE_FRIENDLY_NAME = {FEATURE_ON_OFF: 'Power',
FEATURE_PLAY_PAUSE: 'Play/Pause',
FEATURE_PLAY_STOP: 'Play/Stop',
FEATURE_TOGGLE_MUTE: 'Mute'}


@TYPES.register('MediaPlayer')
Expand All @@ -31,38 +31,38 @@ class MediaPlayer(HomeAccessory):
def __init__(self, *args):
"""Initialize a Switch accessory object."""
super().__init__(*args, category=CATEGORY_SWITCH)
self._flag = {ON_OFF: False, PLAY_PAUSE: False,
PLAY_STOP: False, TOGGLE_MUTE: False}
self.chars = {ON_OFF: None, PLAY_PAUSE: None,
PLAY_STOP: None, TOGGLE_MUTE: None}
modes = self.config[CONF_MODE]

if ON_OFF in modes:
self._flag = {FEATURE_ON_OFF: False, FEATURE_PLAY_PAUSE: False,
FEATURE_PLAY_STOP: False, FEATURE_TOGGLE_MUTE: False}
self.chars = {FEATURE_ON_OFF: None, FEATURE_PLAY_PAUSE: None,
FEATURE_PLAY_STOP: None, FEATURE_TOGGLE_MUTE: None}
feature_list = self.config[CONF_FEATURE_LIST]

if FEATURE_ON_OFF in feature_list:
name = self.generate_service_name(FEATURE_ON_OFF)
serv_on_off = self.add_preload_service(SERV_SWITCH, CHAR_NAME)
serv_on_off.configure_char(
CHAR_NAME, value=self.generate_service_name(ON_OFF))
self.chars[ON_OFF] = serv_on_off.configure_char(
serv_on_off.configure_char(CHAR_NAME, value=name)
self.chars[FEATURE_ON_OFF] = serv_on_off.configure_char(
CHAR_ON, value=False, setter_callback=self.set_on_off)

if PLAY_PAUSE in modes:
if FEATURE_PLAY_PAUSE in feature_list:
name = self.generate_service_name(FEATURE_PLAY_PAUSE)
serv_play_pause = self.add_preload_service(SERV_SWITCH, CHAR_NAME)
serv_play_pause.configure_char(
CHAR_NAME, value=self.generate_service_name(PLAY_PAUSE))
self.chars[PLAY_PAUSE] = serv_play_pause.configure_char(
serv_play_pause.configure_char(CHAR_NAME, value=name)
self.chars[FEATURE_PLAY_PAUSE] = serv_play_pause.configure_char(
CHAR_ON, value=False, setter_callback=self.set_play_pause)

if PLAY_STOP in modes:
if FEATURE_PLAY_STOP in feature_list:
name = self.generate_service_name(FEATURE_PLAY_STOP)
serv_play_stop = self.add_preload_service(SERV_SWITCH, CHAR_NAME)
serv_play_stop.configure_char(
CHAR_NAME, value=self.generate_service_name(PLAY_STOP))
self.chars[PLAY_STOP] = serv_play_stop.configure_char(
serv_play_stop.configure_char(CHAR_NAME, value=name)
self.chars[FEATURE_PLAY_STOP] = serv_play_stop.configure_char(
CHAR_ON, value=False, setter_callback=self.set_play_stop)

if TOGGLE_MUTE in modes:
if FEATURE_TOGGLE_MUTE in feature_list:
name = self.generate_service_name(FEATURE_TOGGLE_MUTE)
serv_toggle_mute = self.add_preload_service(SERV_SWITCH, CHAR_NAME)
serv_toggle_mute.configure_char(
CHAR_NAME, value=self.generate_service_name(TOGGLE_MUTE))
self.chars[TOGGLE_MUTE] = serv_toggle_mute.configure_char(
serv_toggle_mute.configure_char(CHAR_NAME, value=name)
self.chars[FEATURE_TOGGLE_MUTE] = serv_toggle_mute.configure_char(
CHAR_ON, value=False, setter_callback=self.set_toggle_mute)

def generate_service_name(self, mode):
Expand All @@ -73,7 +73,7 @@ def set_on_off(self, value):
"""Move switch state to value if call came from HomeKit."""
_LOGGER.debug('%s: Set switch state for "on_off" to %s',
self.entity_id, value)
self._flag[ON_OFF] = True
self._flag[FEATURE_ON_OFF] = True
service = SERVICE_TURN_ON if value else SERVICE_TURN_OFF
params = {ATTR_ENTITY_ID: self.entity_id}
self.hass.services.call(DOMAIN, service, params)
Expand All @@ -82,7 +82,7 @@ def set_play_pause(self, value):
"""Move switch state to value if call came from HomeKit."""
_LOGGER.debug('%s: Set switch state for "play_pause" to %s',
self.entity_id, value)
self._flag[PLAY_PAUSE] = True
self._flag[FEATURE_PLAY_PAUSE] = True
service = SERVICE_MEDIA_PLAY if value else SERVICE_MEDIA_PAUSE
params = {ATTR_ENTITY_ID: self.entity_id}
self.hass.services.call(DOMAIN, service, params)
Expand All @@ -91,7 +91,7 @@ def set_play_stop(self, value):
"""Move switch state to value if call came from HomeKit."""
_LOGGER.debug('%s: Set switch state for "play_stop" to %s',
self.entity_id, value)
self._flag[PLAY_STOP] = True
self._flag[FEATURE_PLAY_STOP] = True
service = SERVICE_MEDIA_PLAY if value else SERVICE_MEDIA_STOP
params = {ATTR_ENTITY_ID: self.entity_id}
self.hass.services.call(DOMAIN, service, params)
Expand All @@ -100,7 +100,7 @@ def set_toggle_mute(self, value):
"""Move switch state to value if call came from HomeKit."""
_LOGGER.debug('%s: Set switch state for "toggle_mute" to %s',
self.entity_id, value)
self._flag[TOGGLE_MUTE] = True
self._flag[FEATURE_TOGGLE_MUTE] = True
params = {ATTR_ENTITY_ID: self.entity_id,
ATTR_MEDIA_VOLUME_MUTED: value}
self.hass.services.call(DOMAIN, SERVICE_VOLUME_MUTE, params)
Expand All @@ -109,34 +109,34 @@ def update_state(self, new_state):
"""Update switch state after state changed."""
current_state = new_state.state

if self.chars[ON_OFF]:
if self.chars[FEATURE_ON_OFF]:
hk_state = current_state not in (STATE_OFF, STATE_UNKNOWN, 'None')
if not self._flag[ON_OFF]:
if not self._flag[FEATURE_ON_OFF]:
_LOGGER.debug('%s: Set current state for "on_off" to %s',
self.entity_id, hk_state)
self.chars[ON_OFF].set_value(hk_state)
self._flag[ON_OFF] = False
self.chars[FEATURE_ON_OFF].set_value(hk_state)
self._flag[FEATURE_ON_OFF] = False

if self.chars[PLAY_PAUSE]:
if self.chars[FEATURE_PLAY_PAUSE]:
hk_state = current_state == STATE_PLAYING
if not self._flag[PLAY_PAUSE]:
if not self._flag[FEATURE_PLAY_PAUSE]:
_LOGGER.debug('%s: Set current state for "play_pause" to %s',
self.entity_id, hk_state)
self.chars[PLAY_PAUSE].set_value(hk_state)
self._flag[PLAY_PAUSE] = False
self.chars[FEATURE_PLAY_PAUSE].set_value(hk_state)
self._flag[FEATURE_PLAY_PAUSE] = False

if self.chars[PLAY_STOP]:
if self.chars[FEATURE_PLAY_STOP]:
hk_state = current_state == STATE_PLAYING
if not self._flag[PLAY_STOP]:
if not self._flag[FEATURE_PLAY_STOP]:
_LOGGER.debug('%s: Set current state for "play_stop" to %s',
self.entity_id, hk_state)
self.chars[PLAY_STOP].set_value(hk_state)
self._flag[PLAY_STOP] = False
self.chars[FEATURE_PLAY_STOP].set_value(hk_state)
self._flag[FEATURE_PLAY_STOP] = False

if self.chars[TOGGLE_MUTE]:
if self.chars[FEATURE_TOGGLE_MUTE]:
current_state = new_state.attributes.get(ATTR_MEDIA_VOLUME_MUTED)
if not self._flag[TOGGLE_MUTE]:
if not self._flag[FEATURE_TOGGLE_MUTE]:
_LOGGER.debug('%s: Set current state for "toggle_mute" to %s',
self.entity_id, current_state)
self.chars[TOGGLE_MUTE].set_value(current_state)
self._flag[TOGGLE_MUTE] = False
self.chars[FEATURE_TOGGLE_MUTE].set_value(current_state)
self._flag[FEATURE_TOGGLE_MUTE] = False
Loading