Регистрация пользовательских действий устройства

Ваше устройство может обладать особыми способностями, не охваченными текущим набором свойствсвойств— например, свойство «моргать светом» для устройства, которое может мигать светом. Вы можете определить специальные действия для своего устройства, определяющие команды, отправляемые на ваше устройство для активации специальных способностей.

Чтобы определить пользовательское действие устройства, вам необходимо следующее:

  • Шаблон для сопоставления с пользовательским запросом
  • Пользовательское действие устройства, которое можно связать с совпадающим запросом.
  • Текст, озвучиваемый пользователю, если устройство поддерживает это действие.
  • Имя команды, которое отправляется обратно на ваше устройство вместе со всеми параметрами.

Вы создаете пользовательское действие для устройства, помещая эту информацию в пакет действий . Пакеты действий определяют формат ответов Ассистента. В отличие от Actions SDK, пользовательские действия с устройством выполняются локально; вы не указываете конечную точку для обработки запросов и предоставления ответов. Пользовательские действия на устройстве не носят диалоговый характер.

Создать пакет действий

Используя следующий пример, создайте файл (например, actions.json ), который определяет тестовую команду: мигание светодиода. Скопируйте его из примера кода, который вы скачали на предыдущем шаге :

cd assistant-sdk-python/google-assistant-sdk/googlesamples/assistant/grpc/
cp ~/assistant-sdk-python/google-assistant-sdk/actions.json .
Пример
{
    "manifest": {
        "displayName": "Blinky light",
        "invocationName": "Blinky light",
        "category": "PRODUCTIVITY"
    },
    "actions": [
        {
            "name": "com.example.actions.BlinkLight",
            "availability": {
                "deviceClasses": [
                    {
                        "assistantSdkDevice": {}
                    }
                ]
            },
            "intent": {
                "name": "com.example.intents.BlinkLight",
                "parameters": [
                    {
                        "name": "number",
                        "type": "SchemaOrg_Number"
                    },
                    {
                        "name": "speed",
                        "type": "Speed"
                    }
                ],
                "trigger": {
                    "queryPatterns": [
                        "blink ($Speed:speed)? $SchemaOrg_Number:number times",
                        "blink $SchemaOrg_Number:number times ($Speed:speed)?"
                    ]
                }
            },
            "fulfillment": {
                "staticFulfillment": {
                    "templatedResponse": {
                        "items": [
                            {
                                "simpleResponse": {
                                    "textToSpeech": "Blinking $number times"
                                }
                            },
                            {
                                "deviceExecution": {
                                    "command": "com.example.commands.BlinkLight",
                                    "params": {
                                        "speed": "$speed",
                                        "number": "$number"
                                    }
                                }
                            }
                        ]
                    }
                }
            }
        }
    ],
    "types": [
        {
            "name": "$Speed",
            "entities": [
                {
                    "key": "SLOWLY",
                    "synonyms": [
                        "slowly",
                        "slow"
                    ]
                },
                {
                    "key": "NORMALLY",
                    "synonyms": [
                        "normally",
                        "regular"
                    ]
                },
                {
                    "key": "QUICKLY",
                    "synonyms": [
                        "quickly",
                        "fast",
                        "quick"
                    ]
                }
            ]
        }
    ]
}

В предыдущем примере для определения настраиваемого действия устройства используется следующая информация:

  • Шаблон для сопоставления с пользовательским запросом ( моргает N раз )
  • Пользовательское действие устройства, которое необходимо связать с соответствующим запросом ( com.example.actions.BlinkLight ) для организационных целей.
  • Текст, озвучиваемый пользователю, если устройство поддерживает это действие ( мигает N раз ).
  • Имя команды ( com.example.commands.BlinkLight ), которое отправляется обратно на устройство вместе с любыми параметрами (числом и, возможно, описанием скорости).

Чтобы определить шаблон запроса, обратите внимание на следующее:

  • В шаблоне запроса можно использовать типы, определенные на сайте Schema.org .
  • Массив types [...] определяет список пользовательских типов (например, $Speed ).
  • Вы можете использовать пользовательские типы в шаблоне запроса. Пользователь может произносить любые синонимы вашего пользовательского типа в соответствии с шаблоном запроса.
  • Если синоним соответствует, экземпляр типа ( speed ) вернет нормализованный ключ ( SLOWLY ). Объектов может быть несколько, например, если существуют разные источники света, которые поддерживают разную скорость мигания.
  • Части шаблона TTS запроса могут быть необязательными. Например, используйте ($Speed:speed)? в шаблоне запроса, чтобы сделать эту часть необязательной.
  • $ type .raw (например, $speed.raw ) в ответе TTS заменяется словами, которые фактически произнес пользователь.

Описания многих из этих полей см. в документации ActionPackage .

Развертывание пакета действий

После создания настраиваемого действия устройства в пакете действий вы можете сделать пакет действий доступным для Ассистента.

Хотя вы можете выполнить действия, описанные в этом разделе, на своем устройстве, возможно, их будет проще выполнить в вашей системе разработки. Для запуска следующих команд не требуется виртуальная среда.

  1. Загрузите инструмент командной строки gactions .

  2. Удалите все существующие учетные данные из того же каталога, что и инструмент gactions .

    rm creds.data
  3. Сохраните пакет действий в Google с помощью интерфейса командной строки gactions . Замените project_id на идентификатор проекта Actions Console.

    ./gactions update --action_package actions.json --project project_id
  4. При первом запуске этой команды вам будет предоставлен URL-адрес и предложено войти в систему. Скопируйте URL-адрес и вставьте его в браузер (это можно сделать в любой системе). На странице вам будет предложено войти в свою учетную запись Google. Войдите в учетную запись Google, которая создала проект на предыдущем шагешаг .

  5. После того, как вы одобрите запрос разрешения от API, в вашем браузере появится код, например «4/XXXX». Скопируйте и вставьте этот код в терминал:

    Enter the authorization code:

    Если авторизация прошла успешно, вы увидите ответ, подобный следующему:

    Your app for the Assistant for project my-devices-project was successfully
    updated with your actions.
    
  6. Разверните пакет действий в тестовом режиме с помощью интерфейса командной строки gactions . Прежде чем запускать эту команду, вы должны сохранить свой пакет действий в Google хотя бы один раз. Тестовый режим включает пакет действий только в вашей учетной записи пользователя.

    ./gactions test --action_package actions.json --project project_id

    В настоящее время вы не можете протестировать проект с помощью симулятора Actions.

  7. Чтобы обновить пакет действий, используйте команду gactions update .

  8. (Необязательно) Вы можете создавать локализованные пакеты действий для одновременной поддержки множества разных языков и локалей в одном проекте.

Изменить образец

Выполните действия, описанные в этом разделе, на устройстве.

nano pushtotalk.py

Добавьте обработчик для вашего специального действия. Обратите внимание, что приведенный ниже обработчик уже добавлен в пример кода для приведенного выше примера пакета действий.

...

device_handler = device_helpers.DeviceRequestHandler(device_id)

@device_handler.command('com.example.commands.BlinkLight')
def blink(speed, number):
    logging.info('Blinking device %s times.' % number)
    delay = 1
    if speed == "SLOWLY":
        delay = 2
    elif speed == "QUICKLY":
        delay = 0.5
    for i in range(int(number)):
        logging.info('Device is blinking.')
        # GPIO.output(25, 1)
        time.sleep(delay)
        # GPIO.output(25, 0)
        time.sleep(1)

Запустите образец

Запустите исходный код.

python pushtotalk.py

Попробуйте запрос. Для приведенного выше примера попробуйте следующее:

Моргните 5 раз.

Обратите внимание, что запрос должен соответствовать шаблону запроса в пакете действий.