diff --git a/homeassistant/components/apiai.py b/homeassistant/components/dialogflow.py similarity index 67% rename from homeassistant/components/apiai.py rename to homeassistant/components/dialogflow.py index eb6cd0027f7..3f2cae112f5 100644 --- a/homeassistant/components/apiai.py +++ b/homeassistant/components/dialogflow.py @@ -1,8 +1,8 @@ """ -Support for API.AI webhook. +Support for Dialogflow webhook. For more details about this component, please refer to the documentation at -https://home-assistant.io/components/apiai/ +https://home-assistant.io/components/dialogflow/ """ import asyncio import logging @@ -15,17 +15,16 @@ from homeassistant.components.http import HomeAssistantView _LOGGER = logging.getLogger(__name__) -INTENTS_API_ENDPOINT = '/api/apiai' - CONF_INTENTS = 'intents' CONF_SPEECH = 'speech' CONF_ACTION = 'action' CONF_ASYNC_ACTION = 'async_action' DEFAULT_CONF_ASYNC_ACTION = False - -DOMAIN = 'apiai' DEPENDENCIES = ['http'] +DOMAIN = 'dialogflow' + +INTENTS_API_ENDPOINT = '/api/dialogflow' CONFIG_SCHEMA = vol.Schema({ DOMAIN: {} @@ -34,30 +33,30 @@ CONFIG_SCHEMA = vol.Schema({ @asyncio.coroutine def async_setup(hass, config): - """Activate API.AI component.""" - hass.http.register_view(ApiaiIntentsView) + """Set up Dialogflow component.""" + hass.http.register_view(DialogflowIntentsView) return True -class ApiaiIntentsView(HomeAssistantView): - """Handle API.AI requests.""" +class DialogflowIntentsView(HomeAssistantView): + """Handle Dialogflow requests.""" url = INTENTS_API_ENDPOINT - name = 'api:apiai' + name = 'api:dialogflow' @asyncio.coroutine def post(self, request): - """Handle API.AI.""" + """Handle Dialogflow.""" hass = request.app['hass'] data = yield from request.json() - _LOGGER.debug("Received api.ai request: %s", data) + _LOGGER.debug("Received Dialogflow request: %s", data) req = data.get('result') if req is None: - _LOGGER.error("Received invalid data from api.ai: %s", data) + _LOGGER.error("Received invalid data from Dialogflow: %s", data) return self.json_message( "Expected result value not received", HTTP_BAD_REQUEST) @@ -68,13 +67,13 @@ class ApiaiIntentsView(HomeAssistantView): action = req.get('action') parameters = req.get('parameters') - apiai_response = ApiaiResponse(parameters) + dialogflow_response = DialogflowResponse(parameters) if action == "": _LOGGER.warning("Received intent with empty action") - apiai_response.add_speech( - "You have not defined an action in your api.ai intent.") - return self.json(apiai_response) + dialogflow_response.add_speech( + "You have not defined an action in your Dialogflow intent.") + return self.json(dialogflow_response) try: intent_response = yield from intent.async_handle( @@ -83,31 +82,31 @@ class ApiaiIntentsView(HomeAssistantView): in parameters.items()}) except intent.UnknownIntent as err: - _LOGGER.warning('Received unknown intent %s', action) - apiai_response.add_speech( + _LOGGER.warning("Received unknown intent %s", action) + dialogflow_response.add_speech( "This intent is not yet configured within Home Assistant.") - return self.json(apiai_response) + return self.json(dialogflow_response) except intent.InvalidSlotInfo as err: - _LOGGER.error('Received invalid slot data: %s', err) + _LOGGER.error("Received invalid slot data: %s", err) return self.json_message('Invalid slot data received', HTTP_BAD_REQUEST) except intent.IntentError: - _LOGGER.exception('Error handling request for %s', action) + _LOGGER.exception("Error handling request for %s", action) return self.json_message('Error handling intent', HTTP_BAD_REQUEST) if 'plain' in intent_response.speech: - apiai_response.add_speech( + dialogflow_response.add_speech( intent_response.speech['plain']['speech']) - return self.json(apiai_response) + return self.json(dialogflow_response) -class ApiaiResponse(object): - """Help generating the response for API.AI.""" +class DialogflowResponse(object): + """Help generating the response for Dialogflow.""" def __init__(self, parameters): - """Initialize the response.""" + """Initialize the Dialogflow response.""" self.speech = None self.parameters = {} # Parameter names replace '.' and '-' for '_' @@ -125,7 +124,7 @@ class ApiaiResponse(object): self.speech = text def as_dict(self): - """Return response in an API.AI valid dict.""" + """Return response in a Dialogflow valid dictionary.""" return { 'speech': self.speech, 'displayText': self.speech, diff --git a/tests/components/test_apiai.py b/tests/components/test_dialogflow.py similarity index 93% rename from tests/components/test_apiai.py rename to tests/components/test_dialogflow.py index 0c15326bbfc..8275534123c 100644 --- a/tests/components/test_apiai.py +++ b/tests/components/test_dialogflow.py @@ -1,4 +1,4 @@ -"""The tests for the APIAI component.""" +"""The tests for the Dialogflow component.""" # pylint: disable=protected-access import json import unittest @@ -7,14 +7,14 @@ import requests from homeassistant.core import callback from homeassistant import setup, const -from homeassistant.components import apiai, http +from homeassistant.components import dialogflow, http from tests.common import get_test_instance_port, get_test_home_assistant -API_PASSWORD = "test1234" +API_PASSWORD = 'test1234' SERVER_PORT = get_test_instance_port() BASE_API_URL = "http://127.0.0.1:{}".format(SERVER_PORT) -INTENTS_API_URL = "{}{}".format(BASE_API_URL, apiai.INTENTS_API_ENDPOINT) +INTENTS_API_URL = "{}{}".format(BASE_API_URL, dialogflow.INTENTS_API_ENDPOINT) HA_HEADERS = { const.HTTP_HEADER_HA_AUTH: API_PASSWORD, @@ -27,9 +27,9 @@ INTENT_NAME = "tests" REQUEST_ID = "19ef7e78-fe15-4e94-99dd-0c0b1e8753c3" REQUEST_TIMESTAMP = "2017-01-21T17:54:18.952Z" CONTEXT_NAME = "78a5db95-b7d6-4d50-9c9b-2fc73a5e34c3_id_dialog_context" -MAX_RESPONSE_TIME = 5 # https://docs.api.ai/docs/webhook +MAX_RESPONSE_TIME = 5 # https://dialogflow.com/docs/fulfillment -# An unknown action takes 8s to return. Request timeout should be bigger to +# An unknown action takes 8 s to return. Request timeout should be bigger to # allow the test to finish REQUEST_TIMEOUT = 15 @@ -46,19 +46,23 @@ def setUpModule(): hass = get_test_home_assistant() setup.setup_component( - hass, http.DOMAIN, - {http.DOMAIN: {http.CONF_API_PASSWORD: API_PASSWORD, - http.CONF_SERVER_PORT: SERVER_PORT}}) + hass, http.DOMAIN, { + http.DOMAIN: { + http.CONF_API_PASSWORD: API_PASSWORD, + http.CONF_SERVER_PORT: SERVER_PORT, + } + } + ) @callback def mock_service(call): """Mock action call.""" calls.append(call) - hass.services.register("test", "apiai", mock_service) + hass.services.register('test', 'dialogflow', mock_service) - assert setup.setup_component(hass, apiai.DOMAIN, { - "apiai": {}, + assert setup.setup_component(hass, dialogflow.DOMAIN, { + "dialogflow": {}, }) assert setup.setup_component(hass, "intent_script", { "intent_script": { @@ -92,7 +96,7 @@ def setUpModule(): "text": "Service called", }, "action": { - "service": "test.apiai", + "service": "test.dialogflow", "data_template": { "hello": "{{ ZodiacSign }}" }, @@ -112,12 +116,13 @@ def tearDownModule(): def _intent_req(data): - return requests.post(INTENTS_API_URL, data=json.dumps(data), - timeout=REQUEST_TIMEOUT, headers=HA_HEADERS) + return requests.post( + INTENTS_API_URL, data=json.dumps(data), timeout=REQUEST_TIMEOUT, + headers=HA_HEADERS) -class TestApiai(unittest.TestCase): - """Test APIAI.""" +class TestDialogflow(unittest.TestCase): + """Test Dialogflow.""" def tearDown(self): """Stop everything that was started.""" @@ -167,7 +172,7 @@ class TestApiai(unittest.TestCase): self.assertEqual("", req.text) def test_intent_slot_filling(self): - """Test when API.AI asks for slot-filling return none.""" + """Test when Dialogflow asks for slot-filling return none.""" data = { "id": REQUEST_ID, "timestamp": REQUEST_TIMESTAMP, @@ -424,7 +429,7 @@ class TestApiai(unittest.TestCase): self.assertEqual(call_count + 1, len(calls)) call = calls[-1] self.assertEqual("test", call.domain) - self.assertEqual("apiai", call.service) + self.assertEqual("dialogflow", call.service) self.assertEqual(["switch.test"], call.data.get("entity_id")) self.assertEqual("virgo", call.data.get("hello")) @@ -471,7 +476,7 @@ class TestApiai(unittest.TestCase): self.assertEqual(200, req.status_code) text = req.json().get("speech") self.assertEqual( - "You have not defined an action in your api.ai intent.", text) + "You have not defined an action in your Dialogflow intent.", text) def test_intent_with_unknown_action(self): """Test a intent with an action not defined in the conf."""