diff --git a/homeassistant/components/conversation/trigger.py b/homeassistant/components/conversation/trigger.py index 5bd270ccfd5..b64b74c5fa6 100644 --- a/homeassistant/components/conversation/trigger.py +++ b/homeassistant/components/conversation/trigger.py @@ -3,6 +3,7 @@ from __future__ import annotations from typing import Any +from hassil.recognize import PUNCTUATION import voluptuous as vol from homeassistant.const import CONF_COMMAND, CONF_PLATFORM @@ -15,10 +16,22 @@ from . import HOME_ASSISTANT_AGENT, _get_agent_manager from .const import DOMAIN from .default_agent import DefaultAgent + +def has_no_punctuation(value: list[str]) -> list[str]: + """Validate result does not contain punctuation.""" + for sentence in value: + if PUNCTUATION.search(sentence): + raise vol.Invalid("sentence should not contain punctuation") + + return value + + TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { vol.Required(CONF_PLATFORM): DOMAIN, - vol.Required(CONF_COMMAND): vol.All(cv.ensure_list, [cv.string]), + vol.Required(CONF_COMMAND): vol.All( + cv.ensure_list, [cv.string], has_no_punctuation + ), } ) diff --git a/tests/components/conversation/test_trigger.py b/tests/components/conversation/test_trigger.py index 74a5e4df8e2..522162fa457 100644 --- a/tests/components/conversation/test_trigger.py +++ b/tests/components/conversation/test_trigger.py @@ -1,7 +1,9 @@ """Test conversation triggers.""" import pytest +import voluptuous as vol from homeassistant.core import HomeAssistant +from homeassistant.helpers import trigger from homeassistant.setup import async_setup_component from tests.common import async_mock_service @@ -165,3 +167,24 @@ async def test_same_sentence_multiple_triggers( ("trigger1", "conversation", "hello"), ("trigger2", "conversation", "hello"), } + + +@pytest.mark.parametrize( + "command", + ["hello?", "hello!", "4 a.m."], +) +async def test_fails_on_punctuation(hass: HomeAssistant, command: str) -> None: + """Test that validation fails when sentences contain punctuation.""" + with pytest.raises(vol.Invalid): + await trigger.async_validate_trigger_config( + hass, + [ + { + "id": "trigger1", + "platform": "conversation", + "command": [ + command, + ], + }, + ], + )