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:
J. Nick Koston 2025-03-19 11:19:04 -10:00 committed by GitHub
parent 100e4425e4
commit a600bc5e57
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 126 additions and 3 deletions

View File

@ -83,7 +83,7 @@ class HomeKitTelevision(HomeKitEntity, MediaPlayerEntity):
@property
def supported_features(self) -> MediaPlayerEntityFeature:
"""Flag media player features that are supported."""
features = MediaPlayerEntityFeature(0)
features = MediaPlayerEntityFeature.TURN_OFF | MediaPlayerEntityFeature.TURN_ON
if self.service.has(CharacteristicsTypes.ACTIVE_IDENTIFIER):
features |= MediaPlayerEntityFeature.SELECT_SOURCE
@ -177,6 +177,14 @@ class HomeKitTelevision(HomeKitEntity, MediaPlayerEntity):
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:
"""Send play command."""
if self.state == MediaPlayerState.PLAYING:

View File

@ -14352,7 +14352,7 @@
'original_name': 'LG webOS TV AF80',
'platform': 'homekit_controller',
'previous_unique_id': None,
'supported_features': <MediaPlayerEntityFeature: 18433>,
'supported_features': <MediaPlayerEntityFeature: 18817>,
'translation_key': None,
'unique_id': '00:00:00:00:00:00_1_48',
'unit_of_measurement': None,
@ -14371,7 +14371,7 @@
'AV',
'HDMI 4',
]),
'supported_features': <MediaPlayerEntityFeature: 18433>,
'supported_features': <MediaPlayerEntityFeature: 18817>,
}),
'entity_id': 'media_player.lg_webos_tv_af80',
'state': 'on',

View File

@ -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

View File

@ -10,6 +10,11 @@ from aiohomekit.model.characteristics import (
from aiohomekit.model.services import Service, ServicesTypes
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.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
== 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,
},
)