diff --git a/homeassistant/components/system_bridge/__init__.py b/homeassistant/components/system_bridge/__init__.py index 05e607d56edb02..d1c79dc9a43ecc 100644 --- a/homeassistant/components/system_bridge/__init__.py +++ b/homeassistant/components/system_bridge/__init__.py @@ -20,6 +20,7 @@ from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( CONF_API_KEY, + CONF_COMMAND, CONF_HOST, CONF_PATH, CONF_PORT, @@ -48,10 +49,20 @@ CONF_TEXT = "text" SERVICE_OPEN_PATH = "open_path" +SERVICE_POWER_COMMAND = "power_command" SERVICE_OPEN_URL = "open_url" SERVICE_SEND_KEYPRESS = "send_keypress" SERVICE_SEND_TEXT = "send_text" +POWER_COMMAND_MAP = { + "hibernate": "power_hibernate", + "lock": "power_lock", + "logout": "power_logout", + "restart": "power_restart", + "shutdown": "power_shutdown", + "sleep": "power_sleep", +} + async def async_setup_entry( hass: HomeAssistant, @@ -137,7 +148,7 @@ async def async_setup_entry( if hass.services.has_service(DOMAIN, SERVICE_OPEN_URL): return True - def valid_device(device: str): + def valid_device(device: str) -> str: """Check device is valid.""" device_registry = dr.async_get(hass) device_entry = device_registry.async_get(device) @@ -162,6 +173,17 @@ async def handle_open_path(call: ServiceCall) -> None: OpenPath(path=call.data[CONF_PATH]) ) + async def handle_power_command(call: ServiceCall) -> None: + """Handle the power command service call.""" + _LOGGER.info("Power command: %s", call.data) + coordinator: SystemBridgeDataUpdateCoordinator = hass.data[DOMAIN][ + call.data[CONF_BRIDGE] + ] + await getattr( + coordinator.websocket_client, + POWER_COMMAND_MAP[call.data[CONF_COMMAND]], + )() + async def handle_open_url(call: ServiceCall) -> None: """Handle the open url service call.""" _LOGGER.info("Open: %s", call.data) @@ -200,6 +222,18 @@ async def handle_send_text(call: ServiceCall) -> None: ), ) + hass.services.async_register( + DOMAIN, + SERVICE_POWER_COMMAND, + handle_power_command, + schema=vol.Schema( + { + vol.Required(CONF_BRIDGE): valid_device, + vol.Required(CONF_COMMAND): vol.In(POWER_COMMAND_MAP), + }, + ), + ) + hass.services.async_register( DOMAIN, SERVICE_OPEN_URL, diff --git a/homeassistant/components/system_bridge/services.yaml b/homeassistant/components/system_bridge/services.yaml index 78d6e87f2184a4..49a7931789eb75 100644 --- a/homeassistant/components/system_bridge/services.yaml +++ b/homeassistant/components/system_bridge/services.yaml @@ -46,3 +46,22 @@ send_text: example: "Hello world" selector: text: +power_command: + fields: + bridge: + required: true + selector: + device: + integration: system_bridge + command: + required: true + example: "sleep" + selector: + select: + options: + - "hibernate" + - "lock" + - "logout" + - "restart" + - "shutdown" + - "sleep" diff --git a/homeassistant/components/system_bridge/strings.json b/homeassistant/components/system_bridge/strings.json index c3e1f949152e69..fc38bd27037024 100644 --- a/homeassistant/components/system_bridge/strings.json +++ b/homeassistant/components/system_bridge/strings.json @@ -84,6 +84,20 @@ "description": "Text to type." } } + }, + "power_command": { + "name": "Power command", + "description": "Sends a power command to the system.", + "fields": { + "bridge": { + "name": "[%key:component::system_bridge::services::open_path::fields::bridge::name%]", + "description": "[%key:component::system_bridge::services::send_keypress::fields::bridge::description%]" + }, + "command": { + "name": "Command", + "description": "Command to call." + } + } } } }