Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
58029a1
added tv from media player
adrum Apr 2, 2019
bda109a
Merge branch 'dev' into add-homekit-television
adrum Apr 3, 2019
6b02d97
added play_pause for homekit tv
adrum Apr 4, 2019
9be5963
added warning and checks on None for sources
adrum Apr 8, 2019
1b20c85
removed initial value for on_off
adrum Apr 8, 2019
54f341b
added type validation
adrum Apr 10, 2019
c4d4a9e
added television test
adrum Apr 10, 2019
a5ce8e5
send specific command if known
adrum Apr 10, 2019
babf1e1
do not save play state to remotekey char
adrum Apr 10, 2019
290c457
fixed values
adrum Apr 10, 2019
9aa806a
fixed volume step to be testable
adrum Apr 10, 2019
00f1841
bump HAP-python
adrum Apr 10, 2019
6c2f954
Merge branch 'dev' into add-homekit-television
adrum Apr 10, 2019
87d77ec
Merge branch 'dev' into add-homekit-television
adrum Apr 11, 2019
7adb4cc
remove unused service
adrum Apr 11, 2019
a89248b
remove unused imports
adrum Apr 11, 2019
874979a
lint issues
adrum Apr 11, 2019
36e3adc
more lint issues
adrum Apr 11, 2019
d75782e
updated missing dep location
adrum Apr 11, 2019
abf3bbb
fixed a test
adrum Apr 11, 2019
c7b8e6f
Merge branch 'dev' into add-homekit-television
adrum Apr 13, 2019
aa51554
Merge branch 'dev' into add-homekit-television
adrum Apr 17, 2019
fe03486
fixed lint & tests
adrum Apr 17, 2019
147767e
Merge branch 'dev' into add-homekit-television-breaking-change
adrum Apr 23, 2019
efa0304
Merge branch 'dev' into add-homekit-television
adrum Apr 25, 2019
3f43ebe
fix typo
adrum Apr 28, 2019
66bea25
moved telvisionmediaplayer to own accessory type
adrum Apr 28, 2019
2d6ed88
map televisionmediaplayer
adrum Apr 28, 2019
a18d373
Merge branch 'dev' into add-homekit-television
adrum Apr 28, 2019
c0aa9dc
removed conf_type for media players
adrum Apr 28, 2019
d3317fa
fixed tests
adrum Apr 28, 2019
9e8ce16
fixed lint
adrum Apr 28, 2019
a22a1f9
changed device class to const
adrum Apr 28, 2019
a80ae08
dont add already required characteristic
adrum Apr 29, 2019
054dcd7
remove unused feature list
adrum Apr 29, 2019
05dbdf0
more fixes
adrum Apr 29, 2019
c91e935
more simplification
adrum Apr 29, 2019
7582a91
Merge branch 'dev' into add-homekit-television
adrum Apr 29, 2019
647810b
fixed device class import
adrum Apr 29, 2019
1b454db
renamed input service
adrum Apr 30, 2019
5da6423
dont validate TelevisionMediaPlayer accessory via config features
adrum Apr 30, 2019
3076c0b
updated char structure
adrum Apr 30, 2019
d3475d6
fixed tests
adrum Apr 30, 2019
ef76a30
lint fixes
adrum Apr 30, 2019
7cab1d3
condensed lines
adrum Apr 30, 2019
588b053
more lint and test fixes
adrum Apr 30, 2019
e0bf9d0
fixed tests
adrum Apr 30, 2019
481babf
Merge branch 'dev' into add-homekit-television
adrum May 1, 2019
fbf7154
flags
adrum May 1, 2019
03cbc84
one line for name
adrum May 1, 2019
9c493d1
serv_speaker
adrum May 1, 2019
970a1c3
char_mute
adrum May 1, 2019
15eee34
single line for inputs
adrum May 1, 2019
f8bd62f
revert whitespace in test util
adrum May 1, 2019
4168cba
renamed chars array
adrum May 1, 2019
df5245b
moved active identifier to flag
adrum May 1, 2019
71a8626
removed possible error power state
adrum May 1, 2019
997786e
cleaned up sources
adrum May 1, 2019
bd5e3b0
renamed char input source
adrum May 1, 2019
9264469
moved add linked input service
adrum May 1, 2019
8333782
fixed a possible error when checking for mute status
adrum May 1, 2019
985dc7b
added volume char configured
adrum May 1, 2019
40d1d17
fixed some flags
adrum May 1, 2019
2cf1899
TODO: added tests for volume char
adrum May 1, 2019
9e57e2e
removed none from state
adrum May 1, 2019
f9d1bdb
added flags for volume level
adrum May 1, 2019
d345013
fixed tests
adrum May 1, 2019
4e213d7
added volume level tests
adrum May 1, 2019
66e8fbc
renamed setter for mute char
adrum May 1, 2019
d9e4551
moved sources
adrum May 2, 2019
3283548
added comments for updating states from HA
adrum May 2, 2019
c1fd16f
call play pause from set_remote_key
adrum May 2, 2019
3c9923e
dont read volume level
adrum May 2, 2019
ca72a8d
use in chars to check volume
adrum May 2, 2019
c471b94
removed setting volume from homekit and parse state
adrum May 2, 2019
8a9cba4
lint fixes
adrum May 2, 2019
69c656c
fixed syntax
adrum May 2, 2019
8d6d783
fixes
adrum May 3, 2019
59054e4
fixed tests
adrum May 3, 2019
41f6047
removed volume flag
adrum May 3, 2019
6db4e0e
missed one
adrum May 3, 2019
bc6172a
added code coverage
adrum May 3, 2019
20b415a
added volume level set test
adrum May 3, 2019
2aaccac
test lack of input sources
adrum May 3, 2019
d0651aa
more changes
adrum May 4, 2019
6c05622
added more tests
adrum May 4, 2019
10a3967
Last changes
cdce8p May 5, 2019
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
14 changes: 10 additions & 4 deletions homeassistant/components/homekit/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import voluptuous as vol

from homeassistant.components import cover
from homeassistant.components.media_player import DEVICE_CLASS_TV
from homeassistant.const import (
ATTR_DEVICE_CLASS, ATTR_SUPPORTED_FEATURES, ATTR_UNIT_OF_MEASUREMENT,
CONF_IP_ADDRESS, CONF_NAME, CONF_PORT, CONF_TYPE, DEVICE_CLASS_HUMIDITY,
Expand Down Expand Up @@ -99,7 +100,7 @@ def handle_homekit_service_start(service):
def get_accessory(hass, driver, state, aid, config):
"""Take state and return an accessory object if supported."""
if not aid:
_LOGGER.warning('The entitiy "%s" is not supported, since it '
_LOGGER.warning('The entity "%s" is not supported, since it '
'generates an invalid aid, please change it.',
state.entity_id)
return None
Expand Down Expand Up @@ -138,10 +139,15 @@ def get_accessory(hass, driver, state, aid, config):
a_type = 'Lock'

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

if device_class == DEVICE_CLASS_TV:
a_type = 'TelevisionMediaPlayer'
else:
if feature_list and \
validate_media_player_features(state, feature_list):
a_type = 'MediaPlayer'

elif state.domain == 'sensor':
device_class = state.attributes.get(ATTR_DEVICE_CLASS)
Expand Down
16 changes: 16 additions & 0 deletions homeassistant/components/homekit/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@
SERV_FANV2 = 'Fanv2'
SERV_GARAGE_DOOR_OPENER = 'GarageDoorOpener'
SERV_HUMIDITY_SENSOR = 'HumiditySensor'
SERV_INPUT_SOURCE = 'InputSource'
SERV_LEAK_SENSOR = 'LeakSensor'
SERV_LIGHT_SENSOR = 'LightSensor'
SERV_LIGHTBULB = 'Lightbulb'
Expand All @@ -71,13 +72,16 @@
SERV_SECURITY_SYSTEM = 'SecuritySystem'
SERV_SMOKE_SENSOR = 'SmokeSensor'
SERV_SWITCH = 'Switch'
SERV_TELEVISION = 'Television'
SERV_TELEVISION_SPEAKER = 'TelevisionSpeaker'
SERV_TEMPERATURE_SENSOR = 'TemperatureSensor'
SERV_THERMOSTAT = 'Thermostat'
SERV_VALVE = 'Valve'
SERV_WINDOW_COVERING = 'WindowCovering'

# #### Characteristics ####
CHAR_ACTIVE = 'Active'
CHAR_ACTIVE_IDENTIFIER = 'ActiveIdentifier'
CHAR_AIR_PARTICULATE_DENSITY = 'AirParticulateDensity'
CHAR_AIR_QUALITY = 'AirQuality'
CHAR_BATTERY_LEVEL = 'BatteryLevel'
Expand All @@ -90,6 +94,7 @@
CHAR_CARBON_MONOXIDE_PEAK_LEVEL = 'CarbonMonoxidePeakLevel'
CHAR_CHARGING_STATE = 'ChargingState'
CHAR_COLOR_TEMPERATURE = 'ColorTemperature'
CHAR_CONFIGURED_NAME = 'ConfiguredName'
CHAR_CONTACT_SENSOR_STATE = 'ContactSensorState'
CHAR_COOLING_THRESHOLD_TEMPERATURE = 'CoolingThresholdTemperature'
CHAR_CURRENT_AMBIENT_LIGHT_LEVEL = 'CurrentAmbientLightLevel'
Expand All @@ -99,26 +104,33 @@
CHAR_CURRENT_HUMIDITY = 'CurrentRelativeHumidity'
CHAR_CURRENT_SECURITY_STATE = 'SecuritySystemCurrentState'
CHAR_CURRENT_TEMPERATURE = 'CurrentTemperature'
CHAR_CURRENT_VISIBILITY_STATE = 'CurrentVisibilityState'
CHAR_FIRMWARE_REVISION = 'FirmwareRevision'
CHAR_HEATING_THRESHOLD_TEMPERATURE = 'HeatingThresholdTemperature'
CHAR_HUE = 'Hue'
CHAR_IDENTIFIER = 'Identifier'
CHAR_IN_USE = 'InUse'
CHAR_INPUT_SOURCE_TYPE = 'InputSourceType'
CHAR_IS_CONFIGURED = 'IsConfigured'
CHAR_LEAK_DETECTED = 'LeakDetected'
CHAR_LOCK_CURRENT_STATE = 'LockCurrentState'
CHAR_LOCK_TARGET_STATE = 'LockTargetState'
CHAR_LINK_QUALITY = 'LinkQuality'
CHAR_MANUFACTURER = 'Manufacturer'
CHAR_MODEL = 'Model'
CHAR_MOTION_DETECTED = 'MotionDetected'
CHAR_MUTE = 'Mute'
CHAR_NAME = 'Name'
CHAR_OCCUPANCY_DETECTED = 'OccupancyDetected'
CHAR_ON = 'On'
CHAR_OUTLET_IN_USE = 'OutletInUse'
CHAR_POSITION_STATE = 'PositionState'
CHAR_REMOTE_KEY = 'RemoteKey'
CHAR_ROTATION_DIRECTION = 'RotationDirection'
CHAR_ROTATION_SPEED = 'RotationSpeed'
CHAR_SATURATION = 'Saturation'
CHAR_SERIAL_NUMBER = 'SerialNumber'
CHAR_SLEEP_DISCOVER_MODE = 'SleepDiscoveryMode'
CHAR_SMOKE_DETECTED = 'SmokeDetected'
CHAR_STATUS_LOW_BATTERY = 'StatusLowBattery'
CHAR_SWING_MODE = 'SwingMode'
Expand All @@ -129,6 +141,10 @@
CHAR_TARGET_TEMPERATURE = 'TargetTemperature'
CHAR_TEMP_DISPLAY_UNITS = 'TemperatureDisplayUnits'
CHAR_VALVE_TYPE = 'ValveType'
CHAR_VOLUME = 'Volume'
CHAR_VOLUME_SELECTOR = 'VolumeSelector'
CHAR_VOLUME_CONTROL_TYPE = 'VolumeControlType'


# #### Properties ####
PROP_MAX_VALUE = 'maxValue'
Expand Down
222 changes: 215 additions & 7 deletions homeassistant/components/homekit/type_media_players.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,49 @@
"""Class to hold all media player accessories."""
import logging

from pyhap.const import CATEGORY_SWITCH
from pyhap.const import CATEGORY_SWITCH, CATEGORY_TELEVISION

from homeassistant.components.media_player import (
ATTR_MEDIA_VOLUME_MUTED, DOMAIN)
ATTR_INPUT_SOURCE, ATTR_INPUT_SOURCE_LIST, ATTR_MEDIA_VOLUME_MUTED,
ATTR_MEDIA_VOLUME_LEVEL, SERVICE_SELECT_SOURCE, DOMAIN, SUPPORT_PAUSE,
SUPPORT_PLAY, SUPPORT_VOLUME_MUTE, SUPPORT_VOLUME_SET, SUPPORT_VOLUME_STEP,
SUPPORT_SELECT_SOURCE)
from homeassistant.const import (
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)
ATTR_ENTITY_ID, ATTR_SUPPORTED_FEATURES, SERVICE_MEDIA_PAUSE,
SERVICE_MEDIA_PLAY, SERVICE_MEDIA_PLAY_PAUSE, SERVICE_MEDIA_STOP,
SERVICE_TURN_OFF, SERVICE_TURN_ON, SERVICE_VOLUME_MUTE, SERVICE_VOLUME_UP,
SERVICE_VOLUME_DOWN, SERVICE_VOLUME_SET, STATE_OFF, STATE_PLAYING,
STATE_PAUSED, STATE_UNKNOWN)

from . import TYPES
from .accessories import HomeAccessory
from .const import (
CHAR_NAME, CHAR_ON, CONF_FEATURE_LIST, FEATURE_ON_OFF, FEATURE_PLAY_PAUSE,
FEATURE_PLAY_STOP, FEATURE_TOGGLE_MUTE, SERV_SWITCH)
CHAR_ACTIVE, CHAR_ACTIVE_IDENTIFIER, CHAR_CONFIGURED_NAME,
CHAR_CURRENT_VISIBILITY_STATE, CHAR_IDENTIFIER, CHAR_INPUT_SOURCE_TYPE,
CHAR_IS_CONFIGURED, CHAR_NAME, CHAR_SLEEP_DISCOVER_MODE, CHAR_MUTE,
CHAR_ON, CHAR_REMOTE_KEY, CHAR_VOLUME_CONTROL_TYPE, CHAR_VOLUME_SELECTOR,
CHAR_VOLUME, CONF_FEATURE_LIST, FEATURE_ON_OFF, FEATURE_PLAY_PAUSE,
FEATURE_PLAY_STOP, FEATURE_TOGGLE_MUTE, SERV_SWITCH, SERV_TELEVISION,
SERV_TELEVISION_SPEAKER, SERV_INPUT_SOURCE)

_LOGGER = logging.getLogger(__name__)

MEDIA_PLAYER_KEYS = {
# 0: "Rewind",
# 1: "FastForward",
# 2: "NextTrack",
# 3: "PreviousTrack",
# 4: "ArrowUp",
# 5: "ArrowDown",
# 6: "ArrowLeft",
# 7: "ArrowRight",
# 8: "Select",
# 9: "Back",
# 10: "Exit",
11: SERVICE_MEDIA_PLAY_PAUSE,
# 15: "Information",
}

MODE_FRIENDLY_NAME = {
FEATURE_ON_OFF: 'Power',
FEATURE_PLAY_PAUSE: 'Play/Pause',
Expand Down Expand Up @@ -142,3 +168,185 @@ def update_state(self, new_state):
self.entity_id, current_state)
self.chars[FEATURE_TOGGLE_MUTE].set_value(current_state)
self._flag[FEATURE_TOGGLE_MUTE] = False


@TYPES.register('TelevisionMediaPlayer')
class TelevisionMediaPlayer(HomeAccessory):
"""Generate a Television Media Player accessory."""

def __init__(self, *args):
"""Initialize a Switch accessory object."""
super().__init__(*args, category=CATEGORY_TELEVISION)

self._flag = {CHAR_ACTIVE: False, CHAR_ACTIVE_IDENTIFIER: False,
CHAR_MUTE: False}
self.support_select_source = False

self.sources = []

# Add additional characteristics if volume or input selection supported
self.chars_tv = []
self.chars_speaker = []
features = self.hass.states.get(self.entity_id) \
.attributes.get(ATTR_SUPPORTED_FEATURES, 0)

if features & (SUPPORT_PLAY | SUPPORT_PAUSE):
self.chars_tv.append(CHAR_REMOTE_KEY)
if features & SUPPORT_VOLUME_MUTE or features & SUPPORT_VOLUME_STEP:
self.chars_speaker.extend((CHAR_NAME, CHAR_ACTIVE,
CHAR_VOLUME_CONTROL_TYPE,
CHAR_VOLUME_SELECTOR))
if features & SUPPORT_VOLUME_SET:
self.chars_speaker.append(CHAR_VOLUME)

if features & SUPPORT_SELECT_SOURCE:
self.support_select_source = True

serv_tv = self.add_preload_service(SERV_TELEVISION, self.chars_tv)
self.set_primary_service(serv_tv)
serv_tv.configure_char(CHAR_CONFIGURED_NAME, value=self.display_name)
serv_tv.configure_char(CHAR_SLEEP_DISCOVER_MODE, value=True)
self.char_active = serv_tv.configure_char(
CHAR_ACTIVE, setter_callback=self.set_on_off)

if CHAR_REMOTE_KEY in self.chars_tv:
self.char_remote_key = serv_tv.configure_char(
Comment thread
cdce8p marked this conversation as resolved.
CHAR_REMOTE_KEY, setter_callback=self.set_remote_key)

if CHAR_VOLUME_SELECTOR in self.chars_speaker:
serv_speaker = self.add_preload_service(
SERV_TELEVISION_SPEAKER, self.chars_speaker)
serv_tv.add_linked_service(serv_speaker)

name = '{} {}'.format(self.display_name, 'Volume')
serv_speaker.configure_char(CHAR_NAME, value=name)
serv_speaker.configure_char(CHAR_ACTIVE, value=1)

self.char_mute = serv_speaker.configure_char(
CHAR_MUTE, value=False, setter_callback=self.set_mute)

volume_control_type = 1 if CHAR_VOLUME in self.chars_speaker else 2
serv_speaker.configure_char(CHAR_VOLUME_CONTROL_TYPE,
value=volume_control_type)

self.char_volume_selector = serv_speaker.configure_char(
Comment thread
adrum marked this conversation as resolved.
CHAR_VOLUME_SELECTOR, setter_callback=self.set_volume_step)

if CHAR_VOLUME in self.chars_speaker:
self.char_volume = serv_speaker.configure_char(
Comment thread
adrum marked this conversation as resolved.
CHAR_VOLUME, setter_callback=self.set_volume)
Comment thread
cdce8p marked this conversation as resolved.

if self.support_select_source:
self.sources = self.hass.states.get(self.entity_id) \
.attributes.get(ATTR_INPUT_SOURCE_LIST, [])
self.char_input_source = serv_tv.configure_char(
CHAR_ACTIVE_IDENTIFIER, setter_callback=self.set_input_source)
for index, source in enumerate(self.sources):
serv_input = self.add_preload_service(
SERV_INPUT_SOURCE, [CHAR_IDENTIFIER, CHAR_NAME])
Comment thread
cdce8p marked this conversation as resolved.
serv_tv.add_linked_service(serv_input)
serv_input.configure_char(
CHAR_CONFIGURED_NAME, value=source)
serv_input.configure_char(CHAR_NAME, value=source)
serv_input.configure_char(CHAR_IDENTIFIER, value=index)
serv_input.configure_char(CHAR_IS_CONFIGURED, value=True)
input_type = 3 if "hdmi" in source.lower() else 0
serv_input.configure_char(CHAR_INPUT_SOURCE_TYPE,
value=input_type)
serv_input.configure_char(CHAR_CURRENT_VISIBILITY_STATE,
value=False)
_LOGGER.debug('%s: Added source %s.', self.entity_id, source)

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[CHAR_ACTIVE] = True
service = SERVICE_TURN_ON if value else SERVICE_TURN_OFF
params = {ATTR_ENTITY_ID: self.entity_id}
self.call_service(DOMAIN, service, params)

def set_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[CHAR_MUTE] = True
params = {ATTR_ENTITY_ID: self.entity_id,
ATTR_MEDIA_VOLUME_MUTED: value}
self.call_service(DOMAIN, SERVICE_VOLUME_MUTE, params)

def set_volume(self, value):
"""Send volume step value if call came from HomeKit."""
_LOGGER.debug('%s: Set volume to %s', self.entity_id, value)
params = {ATTR_ENTITY_ID: self.entity_id,
ATTR_MEDIA_VOLUME_LEVEL: value}
self.call_service(DOMAIN, SERVICE_VOLUME_SET, params)

def set_volume_step(self, value):
"""Send volume step value if call came from HomeKit."""
_LOGGER.debug('%s: Step volume by %s',
self.entity_id, value)
service = SERVICE_VOLUME_DOWN if value else SERVICE_VOLUME_UP
params = {ATTR_ENTITY_ID: self.entity_id}
self.call_service(DOMAIN, service, params)

def set_input_source(self, value):
"""Send input set value if call came from HomeKit."""
_LOGGER.debug('%s: Set current input to %s',
self.entity_id, value)
source = self.sources[value]
self._flag[CHAR_ACTIVE_IDENTIFIER] = True
params = {ATTR_ENTITY_ID: self.entity_id,
ATTR_INPUT_SOURCE: source}
self.call_service(DOMAIN, SERVICE_SELECT_SOURCE, params)

def set_remote_key(self, value):
"""Send remote key value if call came from HomeKit."""
_LOGGER.debug('%s: Set remote key to %s', self.entity_id, value)
service = MEDIA_PLAYER_KEYS.get(value)
if service:
# Handle Play Pause
if service == SERVICE_MEDIA_PLAY_PAUSE:
state = self.hass.states.get(self.entity_id).state
if state in (STATE_PLAYING, STATE_PAUSED):
service = SERVICE_MEDIA_PLAY if state == STATE_PAUSED \
else SERVICE_MEDIA_PAUSE
params = {ATTR_ENTITY_ID: self.entity_id}
self.call_service(DOMAIN, service, params)

def update_state(self, new_state):
"""Update Television state after state changed."""
current_state = new_state.state

# Power state television
hk_state = current_state not in (STATE_OFF, STATE_UNKNOWN)
if not self._flag[CHAR_ACTIVE]:
_LOGGER.debug('%s: Set current active state to %s',
self.entity_id, hk_state)
self.char_active.set_value(hk_state)
self._flag[CHAR_ACTIVE] = False

# Set mute state
if CHAR_VOLUME_SELECTOR in self.chars_speaker:
Comment thread
adrum marked this conversation as resolved.
current_mute_state = new_state.attributes.get(
ATTR_MEDIA_VOLUME_MUTED)
if not self._flag[CHAR_MUTE]:
_LOGGER.debug('%s: Set current mute state to %s',
self.entity_id, current_mute_state)
self.char_mute.set_value(current_mute_state)
self._flag[CHAR_MUTE] = False

# Set active input
if self.support_select_source:
source_name = new_state.attributes.get(ATTR_INPUT_SOURCE)
if self.sources and not self._flag[CHAR_ACTIVE_IDENTIFIER]:
_LOGGER.debug('%s: Set current input to %s', self.entity_id,
source_name)
if source_name in self.sources:
index = self.sources.index(source_name)
self.char_input_source.set_value(index)
else:
_LOGGER.warning('%s: Sources out of sync. '
'Restart HomeAssistant', self.entity_id)
self.char_input_source.set_value(0)
Comment thread
adrum marked this conversation as resolved.
self._flag[CHAR_ACTIVE_IDENTIFIER] = False
24 changes: 20 additions & 4 deletions tests/components/homekit/test_get_accessories.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,6 @@ def test_customize_options(config, name):
('Fan', 'fan.test', 'on', {}, {}),
('Light', 'light.test', 'on', {}, {}),
('Lock', 'lock.test', 'locked', {}, {ATTR_CODE: '1234'}),
('MediaPlayer', 'media_player.test', 'on',
{ATTR_SUPPORTED_FEATURES: media_player_c.SUPPORT_TURN_ON |
media_player_c.SUPPORT_TURN_OFF}, {CONF_FEATURE_LIST:
{FEATURE_ON_OFF: None}}),
('SecuritySystem', 'alarm_control_panel.test', 'armed_away', {},
{ATTR_CODE: '1234'}),
('Thermostat', 'climate.test', 'auto', {}, {}),
Expand Down Expand Up @@ -101,6 +97,26 @@ def test_type_covers(type_name, entity_id, state, attrs):
assert mock_type.called


@pytest.mark.parametrize('type_name, entity_id, state, attrs, config', [
('MediaPlayer', 'media_player.test', 'on',
{ATTR_SUPPORTED_FEATURES: media_player_c.SUPPORT_TURN_ON |
media_player_c.SUPPORT_TURN_OFF}, {CONF_FEATURE_LIST:
{FEATURE_ON_OFF: None}}),
('TelevisionMediaPlayer', 'media_player.tv', 'on',
{ATTR_DEVICE_CLASS: 'tv'}, {}),
])
def test_type_media_player(type_name, entity_id, state, attrs, config):
"""Test if media_player types are associated correctly."""
mock_type = Mock()
with patch.dict(TYPES, {type_name: mock_type}):
entity_state = State(entity_id, state, attrs)
get_accessory(None, None, entity_state, 2, config)
assert mock_type.called

if config:
assert mock_type.call_args[0][-1] == config


@pytest.mark.parametrize('type_name, entity_id, state, attrs', [
('BinarySensor', 'binary_sensor.opening', 'on',
{ATTR_DEVICE_CLASS: 'opening'}),
Expand Down
Loading