From 3ff0320ed8e649d9ee686dd47b03442360631c44 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Tue, 3 Feb 2026 11:11:19 +0100 Subject: [PATCH] Move vizio service registration (#162133) --- homeassistant/components/vizio/__init__.py | 10 +++++ homeassistant/components/vizio/const.py | 15 -------- .../components/vizio/media_player.py | 8 +--- homeassistant/components/vizio/services.py | 38 +++++++++++++++++++ tests/components/vizio/test_media_player.py | 2 +- 5 files changed, 50 insertions(+), 23 deletions(-) create mode 100644 homeassistant/components/vizio/services.py diff --git a/homeassistant/components/vizio/__init__.py b/homeassistant/components/vizio/__init__.py index 10a71695e05d..fbf7c6d16e13 100644 --- a/homeassistant/components/vizio/__init__.py +++ b/homeassistant/components/vizio/__init__.py @@ -8,14 +8,24 @@ from homeassistant.components.media_player import MediaPlayerDeviceClass from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_DEVICE_CLASS, Platform from homeassistant.core import HomeAssistant +from homeassistant.helpers import config_validation as cv from homeassistant.helpers.storage import Store +from homeassistant.helpers.typing import ConfigType from .const import CONF_APPS, DOMAIN from .coordinator import VizioAppsDataUpdateCoordinator +from .services import async_setup_services +CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN) PLATFORMS = [Platform.MEDIA_PLAYER] +async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: + """Set up the component.""" + async_setup_services(hass) + return True + + async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Load the saved entities.""" diff --git a/homeassistant/components/vizio/const.py b/homeassistant/components/vizio/const.py index fbfaf222cad9..64064a693008 100644 --- a/homeassistant/components/vizio/const.py +++ b/homeassistant/components/vizio/const.py @@ -4,26 +4,11 @@ from pyvizio.const import ( DEVICE_CLASS_SPEAKER as VIZIO_DEVICE_CLASS_SPEAKER, DEVICE_CLASS_TV as VIZIO_DEVICE_CLASS_TV, ) -import voluptuous as vol from homeassistant.components.media_player import ( MediaPlayerDeviceClass, MediaPlayerEntityFeature, ) -from homeassistant.helpers import config_validation as cv -from homeassistant.helpers.typing import VolDictType - -SERVICE_UPDATE_SETTING = "update_setting" - -ATTR_SETTING_TYPE = "setting_type" -ATTR_SETTING_NAME = "setting_name" -ATTR_NEW_VALUE = "new_value" - -UPDATE_SETTING_SCHEMA: VolDictType = { - vol.Required(ATTR_SETTING_TYPE): vol.All(cv.string, vol.Lower, cv.slugify), - vol.Required(ATTR_SETTING_NAME): vol.All(cv.string, vol.Lower, cv.slugify), - vol.Required(ATTR_NEW_VALUE): vol.Any(vol.Coerce(int), cv.string), -} CONF_ADDITIONAL_CONFIGS = "additional_configs" CONF_APP_ID = "APP_ID" diff --git a/homeassistant/components/vizio/media_player.py b/homeassistant/components/vizio/media_player.py index d44db5e45ee8..424ce958ebc3 100644 --- a/homeassistant/components/vizio/media_player.py +++ b/homeassistant/components/vizio/media_player.py @@ -25,7 +25,7 @@ from homeassistant.const import ( CONF_NAME, ) from homeassistant.core import HomeAssistant, callback -from homeassistant.helpers import device_registry as dr, entity_platform +from homeassistant.helpers import device_registry as dr from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.dispatcher import ( @@ -42,9 +42,7 @@ from .const import ( DEFAULT_VOLUME_STEP, DEVICE_ID, DOMAIN, - SERVICE_UPDATE_SETTING, SUPPORTED_COMMANDS, - UPDATE_SETTING_SCHEMA, VIZIO_AUDIO_SETTINGS, VIZIO_DEVICE_CLASSES, VIZIO_MUTE, @@ -122,10 +120,6 @@ async def async_setup_entry( entity = VizioDevice(config_entry, device, name, device_class, apps_coordinator) async_add_entities([entity], update_before_add=True) - platform = entity_platform.async_get_current_platform() - platform.async_register_entity_service( - SERVICE_UPDATE_SETTING, UPDATE_SETTING_SCHEMA, "async_update_setting" - ) class VizioDevice(MediaPlayerEntity): diff --git a/homeassistant/components/vizio/services.py b/homeassistant/components/vizio/services.py new file mode 100644 index 000000000000..0e2b40e3ca3e --- /dev/null +++ b/homeassistant/components/vizio/services.py @@ -0,0 +1,38 @@ +"""Vizio SmartCast services.""" + +from __future__ import annotations + +import voluptuous as vol + +from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN +from homeassistant.core import HomeAssistant, callback +from homeassistant.helpers import config_validation as cv, service +from homeassistant.helpers.typing import VolDictType + +from .const import DOMAIN + +SERVICE_UPDATE_SETTING = "update_setting" + +ATTR_SETTING_TYPE = "setting_type" +ATTR_SETTING_NAME = "setting_name" +ATTR_NEW_VALUE = "new_value" + +UPDATE_SETTING_SCHEMA: VolDictType = { + vol.Required(ATTR_SETTING_TYPE): vol.All(cv.string, vol.Lower, cv.slugify), + vol.Required(ATTR_SETTING_NAME): vol.All(cv.string, vol.Lower, cv.slugify), + vol.Required(ATTR_NEW_VALUE): vol.Any(vol.Coerce(int), cv.string), +} + + +@callback +def async_setup_services(hass: HomeAssistant) -> None: + """Set up services.""" + + service.async_register_platform_entity_service( + hass, + DOMAIN, + SERVICE_UPDATE_SETTING, + entity_domain=MEDIA_PLAYER_DOMAIN, + schema=UPDATE_SETTING_SCHEMA, + func="async_update_setting", + ) diff --git a/tests/components/vizio/test_media_player.py b/tests/components/vizio/test_media_player.py index a76dfa3fa2da..26c5c76a9589 100644 --- a/tests/components/vizio/test_media_player.py +++ b/tests/components/vizio/test_media_player.py @@ -47,8 +47,8 @@ from homeassistant.components.vizio.const import ( CONF_VOLUME_STEP, DEFAULT_VOLUME_STEP, DOMAIN, - SERVICE_UPDATE_SETTING, ) +from homeassistant.components.vizio.services import SERVICE_UPDATE_SETTING from homeassistant.const import ATTR_ENTITY_ID, STATE_OFF, STATE_ON, STATE_UNAVAILABLE from homeassistant.core import HomeAssistant from homeassistant.util import dt as dt_util