mirror of
https://github.com/home-assistant/core.git
synced 2025-07-18 02:37:08 +00:00
Add turn on/off support to HomeKit TVs (#140957)
* Add turn on/off support to HomeKit TVs * 0 = off, 1 = on, not a bool * add coverage * update snapshot
This commit is contained in:
parent
100e4425e4
commit
a600bc5e57
@ -83,7 +83,7 @@ class HomeKitTelevision(HomeKitEntity, MediaPlayerEntity):
|
|||||||
@property
|
@property
|
||||||
def supported_features(self) -> MediaPlayerEntityFeature:
|
def supported_features(self) -> MediaPlayerEntityFeature:
|
||||||
"""Flag media player features that are supported."""
|
"""Flag media player features that are supported."""
|
||||||
features = MediaPlayerEntityFeature(0)
|
features = MediaPlayerEntityFeature.TURN_OFF | MediaPlayerEntityFeature.TURN_ON
|
||||||
|
|
||||||
if self.service.has(CharacteristicsTypes.ACTIVE_IDENTIFIER):
|
if self.service.has(CharacteristicsTypes.ACTIVE_IDENTIFIER):
|
||||||
features |= MediaPlayerEntityFeature.SELECT_SOURCE
|
features |= MediaPlayerEntityFeature.SELECT_SOURCE
|
||||||
@ -177,6 +177,14 @@ class HomeKitTelevision(HomeKitEntity, MediaPlayerEntity):
|
|||||||
|
|
||||||
return MediaPlayerState.ON
|
return MediaPlayerState.ON
|
||||||
|
|
||||||
|
async def async_turn_on(self) -> None:
|
||||||
|
"""Turn the tv on."""
|
||||||
|
await self.async_put_characteristics({CharacteristicsTypes.ACTIVE: 1})
|
||||||
|
|
||||||
|
async def async_turn_off(self) -> None:
|
||||||
|
"""Turn the tv off."""
|
||||||
|
await self.async_put_characteristics({CharacteristicsTypes.ACTIVE: 0})
|
||||||
|
|
||||||
async def async_media_play(self) -> None:
|
async def async_media_play(self) -> None:
|
||||||
"""Send play command."""
|
"""Send play command."""
|
||||||
if self.state == MediaPlayerState.PLAYING:
|
if self.state == MediaPlayerState.PLAYING:
|
||||||
|
@ -14352,7 +14352,7 @@
|
|||||||
'original_name': 'LG webOS TV AF80',
|
'original_name': 'LG webOS TV AF80',
|
||||||
'platform': 'homekit_controller',
|
'platform': 'homekit_controller',
|
||||||
'previous_unique_id': None,
|
'previous_unique_id': None,
|
||||||
'supported_features': <MediaPlayerEntityFeature: 18433>,
|
'supported_features': <MediaPlayerEntityFeature: 18817>,
|
||||||
'translation_key': None,
|
'translation_key': None,
|
||||||
'unique_id': '00:00:00:00:00:00_1_48',
|
'unique_id': '00:00:00:00:00:00_1_48',
|
||||||
'unit_of_measurement': None,
|
'unit_of_measurement': None,
|
||||||
@ -14371,7 +14371,7 @@
|
|||||||
'AV',
|
'AV',
|
||||||
'HDMI 4',
|
'HDMI 4',
|
||||||
]),
|
]),
|
||||||
'supported_features': <MediaPlayerEntityFeature: 18433>,
|
'supported_features': <MediaPlayerEntityFeature: 18817>,
|
||||||
}),
|
}),
|
||||||
'entity_id': 'media_player.lg_webos_tv_af80',
|
'entity_id': 'media_player.lg_webos_tv_af80',
|
||||||
'state': 'on',
|
'state': 'on',
|
||||||
|
@ -0,0 +1,56 @@
|
|||||||
|
"""Test against characteristics captured from an LG TV."""
|
||||||
|
|
||||||
|
from homeassistant.components.media_player import (
|
||||||
|
ATTR_INPUT_SOURCE_LIST,
|
||||||
|
MediaPlayerEntityFeature,
|
||||||
|
)
|
||||||
|
from homeassistant.const import ATTR_SUPPORTED_FEATURES, STATE_ON
|
||||||
|
from homeassistant.core import HomeAssistant
|
||||||
|
|
||||||
|
from ..common import (
|
||||||
|
HUB_TEST_ACCESSORY_ID,
|
||||||
|
DeviceTestInfo,
|
||||||
|
assert_devices_and_entities_created,
|
||||||
|
setup_accessories_from_file,
|
||||||
|
setup_test_accessories,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
async def test_lg_tv_setup(hass: HomeAssistant) -> None:
|
||||||
|
"""Test that a LG TV can be correctly setup in HA."""
|
||||||
|
accessories = await setup_accessories_from_file(hass, "lg_tv.json")
|
||||||
|
await setup_test_accessories(hass, accessories)
|
||||||
|
|
||||||
|
await assert_devices_and_entities_created(
|
||||||
|
hass,
|
||||||
|
DeviceTestInfo(
|
||||||
|
unique_id=HUB_TEST_ACCESSORY_ID,
|
||||||
|
name="LG webOS TV AF80",
|
||||||
|
model="OLED55B9PUA",
|
||||||
|
manufacturer="LG Electronics",
|
||||||
|
sw_version="04.71.04",
|
||||||
|
hw_version="1",
|
||||||
|
serial_number="A0000A000000000A",
|
||||||
|
devices=[],
|
||||||
|
entities=[],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
state = hass.states.get("media_player.lg_webos_tv_af80")
|
||||||
|
assert state is not None
|
||||||
|
assert state.state == STATE_ON
|
||||||
|
assert state.attributes[ATTR_INPUT_SOURCE_LIST] == [
|
||||||
|
"AirPlay",
|
||||||
|
"Live TV",
|
||||||
|
"HDMI 1",
|
||||||
|
"Sony",
|
||||||
|
"Apple",
|
||||||
|
"AV",
|
||||||
|
"HDMI 4",
|
||||||
|
]
|
||||||
|
features = state.attributes[ATTR_SUPPORTED_FEATURES]
|
||||||
|
assert features & MediaPlayerEntityFeature.TURN_ON
|
||||||
|
assert features & MediaPlayerEntityFeature.TURN_OFF
|
||||||
|
assert features & MediaPlayerEntityFeature.SELECT_SOURCE
|
||||||
|
assert features & MediaPlayerEntityFeature.PLAY
|
||||||
|
assert features & MediaPlayerEntityFeature.PAUSE
|
@ -10,6 +10,11 @@ from aiohomekit.model.characteristics import (
|
|||||||
from aiohomekit.model.services import Service, ServicesTypes
|
from aiohomekit.model.services import Service, ServicesTypes
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
from homeassistant.components.media_player import (
|
||||||
|
DOMAIN as MEDIA_PLAYER_DOMAIN,
|
||||||
|
SERVICE_TURN_OFF,
|
||||||
|
SERVICE_TURN_ON,
|
||||||
|
)
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers import entity_registry as er
|
from homeassistant.helpers import entity_registry as er
|
||||||
|
|
||||||
@ -408,3 +413,57 @@ async def test_migrate_unique_id(
|
|||||||
entity_registry.async_get(media_player_entry.entity_id).unique_id
|
entity_registry.async_get(media_player_entry.entity_id).unique_id
|
||||||
== f"00:00:00:00:00:00_{aid}_8"
|
== f"00:00:00:00:00:00_{aid}_8"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
async def test_turn_on(hass: HomeAssistant, get_next_aid: Callable[[], int]) -> None:
|
||||||
|
"""Test that we can turn on a media player."""
|
||||||
|
helper = await setup_test_component(
|
||||||
|
hass, get_next_aid(), create_tv_service_with_target_media_state
|
||||||
|
)
|
||||||
|
|
||||||
|
await helper.async_update(
|
||||||
|
ServicesTypes.TELEVISION,
|
||||||
|
{
|
||||||
|
CharacteristicsTypes.CURRENT_MEDIA_STATE: 0,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
await hass.services.async_call(
|
||||||
|
MEDIA_PLAYER_DOMAIN,
|
||||||
|
SERVICE_TURN_ON,
|
||||||
|
{"entity_id": "media_player.testdevice"},
|
||||||
|
blocking=True,
|
||||||
|
)
|
||||||
|
helper.async_assert_service_values(
|
||||||
|
ServicesTypes.TELEVISION,
|
||||||
|
{
|
||||||
|
CharacteristicsTypes.ACTIVE: 1,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
async def test_turn_off(hass: HomeAssistant, get_next_aid: Callable[[], int]) -> None:
|
||||||
|
"""Test that we can turn off a media player."""
|
||||||
|
helper = await setup_test_component(
|
||||||
|
hass, get_next_aid(), create_tv_service_with_target_media_state
|
||||||
|
)
|
||||||
|
|
||||||
|
await helper.async_update(
|
||||||
|
ServicesTypes.TELEVISION,
|
||||||
|
{
|
||||||
|
CharacteristicsTypes.CURRENT_MEDIA_STATE: 0,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
await hass.services.async_call(
|
||||||
|
MEDIA_PLAYER_DOMAIN,
|
||||||
|
SERVICE_TURN_OFF,
|
||||||
|
{"entity_id": "media_player.testdevice"},
|
||||||
|
blocking=True,
|
||||||
|
)
|
||||||
|
helper.async_assert_service_values(
|
||||||
|
ServicesTypes.TELEVISION,
|
||||||
|
{
|
||||||
|
CharacteristicsTypes.ACTIVE: 0,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user