diff --git a/homeassistant/components/python_script/__init__.py b/homeassistant/components/python_script/__init__.py index bed159cae6b..2051b32b63f 100644 --- a/homeassistant/components/python_script/__init__.py +++ b/homeassistant/components/python_script/__init__.py @@ -19,7 +19,7 @@ from RestrictedPython.Guards import ( ) import voluptuous as vol -from homeassistant.const import SERVICE_RELOAD +from homeassistant.const import CONF_DESCRIPTION, CONF_NAME, SERVICE_RELOAD from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers.service import async_set_service_schema from homeassistant.loader import bind_hass @@ -71,6 +71,8 @@ ALLOWED_DT_UTIL = { "get_age", } +CONF_FIELDS = "fields" + class ScriptError(HomeAssistantError): """When a script error occurs.""" @@ -125,8 +127,9 @@ def discover_scripts(hass): hass.services.register(DOMAIN, name, python_script_service_handler) service_desc = { - "description": services_dict.get(name, {}).get("description", ""), - "fields": services_dict.get(name, {}).get("fields", {}), + CONF_NAME: services_dict.get(name, {}).get("name", name), + CONF_DESCRIPTION: services_dict.get(name, {}).get("description", ""), + CONF_FIELDS: services_dict.get(name, {}).get("fields", {}), } async_set_service_schema(hass, DOMAIN, name, service_desc) diff --git a/homeassistant/components/python_script/services.yaml b/homeassistant/components/python_script/services.yaml index 835f6402481..e9f860f1a62 100644 --- a/homeassistant/components/python_script/services.yaml +++ b/homeassistant/components/python_script/services.yaml @@ -1,4 +1,5 @@ # Describes the format for available python_script services reload: + name: Reload description: Reload all available python_scripts diff --git a/homeassistant/components/script/__init__.py b/homeassistant/components/script/__init__.py index 320033e1013..8f2e0743f77 100644 --- a/homeassistant/components/script/__init__.py +++ b/homeassistant/components/script/__init__.py @@ -12,6 +12,7 @@ from homeassistant.const import ( ATTR_NAME, CONF_ALIAS, CONF_DEFAULT, + CONF_DESCRIPTION, CONF_ICON, CONF_MODE, CONF_NAME, @@ -54,7 +55,6 @@ ATTR_LAST_TRIGGERED = "last_triggered" ATTR_VARIABLES = "variables" CONF_ADVANCED = "advanced" -CONF_DESCRIPTION = "description" CONF_EXAMPLE = "example" CONF_FIELDS = "fields" CONF_REQUIRED = "required" @@ -287,6 +287,7 @@ async def _async_process_config(hass, config, component): # Register the service description service_desc = { + CONF_NAME: script_entity.name, CONF_DESCRIPTION: cfg[CONF_DESCRIPTION], CONF_FIELDS: cfg[CONF_FIELDS], } diff --git a/homeassistant/components/script/services.yaml b/homeassistant/components/script/services.yaml index 5af81734a9e..b772b80a1d2 100644 --- a/homeassistant/components/script/services.yaml +++ b/homeassistant/components/script/services.yaml @@ -1,16 +1,20 @@ # Describes the format for available python_script services reload: + name: Reload description: Reload all the available scripts turn_on: + name: Turn on description: Turn on script target: turn_off: + name: Turn off description: Turn off script target: toggle: + name: Toggle description: Toggle script target: diff --git a/tests/components/python_script/test_init.py b/tests/components/python_script/test_init.py index b58bd6eb469..142d833698d 100644 --- a/tests/components/python_script/test_init.py +++ b/tests/components/python_script/test_init.py @@ -306,6 +306,7 @@ async def test_service_descriptions(hass): service_descriptions1 = ( "hello:\n" + " name: ABC\n" " description: Description of hello.py.\n" " fields:\n" " fake_param:\n" @@ -333,6 +334,7 @@ async def test_service_descriptions(hass): assert len(descriptions) == 1 + assert descriptions[DOMAIN]["hello"]["name"] == "ABC" assert descriptions[DOMAIN]["hello"]["description"] == "Description of hello.py." assert ( descriptions[DOMAIN]["hello"]["fields"]["fake_param"]["description"] @@ -343,6 +345,8 @@ async def test_service_descriptions(hass): == "This is a test of python_script.hello" ) + # Verify default name = file name + assert descriptions[DOMAIN]["world_beer"]["name"] == "world_beer" assert descriptions[DOMAIN]["world_beer"]["description"] == "" assert bool(descriptions[DOMAIN]["world_beer"]["fields"]) is False diff --git a/tests/components/script/test_init.py b/tests/components/script/test_init.py index c1485a0c6ab..cf2c632ee16 100644 --- a/tests/components/script/test_init.py +++ b/tests/components/script/test_init.py @@ -269,6 +269,7 @@ async def test_service_descriptions(hass): descriptions = await async_get_all_descriptions(hass) + assert descriptions[DOMAIN]["test"]["name"] == "test" assert descriptions[DOMAIN]["test"]["description"] == "test description" assert not descriptions[DOMAIN]["test"]["fields"] @@ -303,6 +304,27 @@ async def test_service_descriptions(hass): == "test_param example" ) + # Test 3: has "alias" that will be used as "name" + with patch( + "homeassistant.config.load_yaml_config_file", + return_value={ + "script": { + "test_name": { + "alias": "ABC", + "sequence": [{"delay": {"seconds": 5}}], + } + } + }, + ): + await hass.services.async_call(DOMAIN, SERVICE_RELOAD, blocking=True) + + descriptions = await async_get_all_descriptions(hass) + + assert descriptions[DOMAIN]["test_name"]["name"] == "ABC" + + # Test 4: verify that names from YAML are taken into account as well + assert descriptions[DOMAIN]["turn_on"]["name"] == "Turn on" + async def test_shared_context(hass): """Test that the shared context is passed down the chain."""