Registra acciones de dispositivos personalizadas

Es posible que tu dispositivo tenga capacidades especiales que no están cubiertas por el conjunto actual de rasgos (por ejemplo, "parpadea la luz") de un dispositivo que puede hacer parpadear las luces. Tú puede definir acciones personalizadas para tu dispositivo que especifiquen los comandos enviados a tu dispositivo para activar habilidades especiales.

Para definir una acción personalizada del dispositivo, necesitas lo siguiente:

  • Un patrón que debe coincidir con la consulta del usuario
  • Una acción personalizada del dispositivo para asociarla con una consulta coincidente
  • El texto se lee en voz alta al usuario si el dispositivo admite la acción.
  • Un nombre de comando que se envía de vuelta al dispositivo, junto con cualquier parámetro

Para crear la acción personalizada del dispositivo, debes colocar esta información en un action package. Los paquetes de acciones definen el formato de las respuestas de Asistente. A diferencia de SDK de Actions, las acciones personalizadas de dispositivos se completan de forma local. no especificas un extremo para procesar solicitudes y proporcionar respuestas. Las acciones personalizadas de dispositivos y no de naturaleza coloquial.

Crea un paquete de acción

Con lo siguiente como ejemplo, crea un archivo (como actions.json) que define un comando de prueba: parpadear una luz LED. Cópialo del código de muestra que descargado en un paso anterior:

cd assistant-sdk-python/google-assistant-sdk/googlesamples/assistant/grpc/
cp ~/assistant-sdk-python/google-assistant-sdk/actions.json .
.
Ejemplo
{
    "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"
                    ]
                }
            ]
        }
    ]
}

En el ejemplo anterior, se usa la siguiente información para definir el dispositivo personalizado acción:

  • Un patrón que debe coincidir con la búsqueda del usuario (parpadeo N veces)
  • La acción personalizada del dispositivo que se asociará con una consulta coincidente (com.example.actions.BlinkLight) con fines organizativos
  • El texto se lee en voz alta al usuario si el dispositivo admite la acción. (N de señales intermitentes)
  • Un nombre de comando (com.example.commands.BlinkLight) que se devuelve a el dispositivo, junto con cualquier parámetro (un número y tal vez una descripción de la velocidad)

Para definir el patrón de consulta, ten en cuenta lo siguiente:

  • Puedes usar tipos definidos de schema.org en el patrón de consulta.
  • El array types [...] define la lista de tipos personalizados (por ejemplo, $Speed).
  • Puedes usar tipos personalizados en el patrón de consulta. El usuario puede hablar cualquiera de las sinónimos en tu tipo personalizado para que coincidan con el patrón de consulta.
  • Cuando un sinónimo coincide, el tipo de instancia (speed) muestra la clave normalizada (SLOWLY). Puede haber varias entidades en caso, por ejemplo, hay distintas luces que admiten distintas velocidades que titila.
  • Algunas partes del patrón de TTS de solicitud pueden ser opcionales. Por ejemplo, usa ($Speed:speed)? en el patrón de consulta para que esta parte sea opcional.
  • $type.raw (por ejemplo, $speed.raw) en la El TTS de respuesta se reemplaza por las palabras que el usuario realmente pronunció.

Para obtener descripciones de muchos de estos campos, consulta la ActionPackage en la documentación de Google Cloud.

Implementa el paquete de acciones

Después de crear la acción personalizada de dispositivo en un paquete Action, puedes hacer lo siguiente: Asistente puede acceder al paquete de acciones.

Si bien puedes realizar los pasos de esta sección en tu dispositivo, es posible que sea más fácil hacerlo en tu sistema de desarrollo. Los siguientes comandos no requieren entorno virtual para ejecutar.

  1. Descarga la herramienta de línea de comandos de gactions.

  2. Quita todas las credenciales existentes del mismo directorio que gactions. herramienta.

    rm creds.data
  3. Guarda tu paquete de Action en Google con la CLI de gactions. Reemplaza project_id por tu proyecto de la Consola de Actions. ID.

    ./gactions update --action_package actions.json --project project_id
  4. La primera vez que ejecutes este comando, se te proporcionará una URL y se te pedirá que accede a tu cuenta. Copia la URL y pégala en un navegador (esto se puede hacer en cualquier sistema). En la página, se te pedirá que accedas a tu Cuenta de Google. Firmar a la cuenta de Google que creó el proyecto en una paso.

  5. Después de aprobar la solicitud de permiso de la API, aparecerá un código en su navegador, por ejemplo, "4/XXXX". Copia y pega este código en la terminal:

    Enter the authorization code:

    Si la autorización se realizó correctamente, verá una respuesta similar a la siguiente: lo siguiente:

    Your app for the Assistant for project my-devices-project was successfully
    updated with your actions.
    
  6. Implementa tu paquete de acción en modo de prueba con la CLI de gactions. Debes haber guardado tu paquete de Action en Google al menos una vez ejecutando este comando. El modo de prueba habilita el paquete de acción en tu cuenta de usuario.

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

    Actualmente, no puedes probar el proyecto con el simulador de acciones.

  7. Para actualizar el paquete de acción, usa el comando gactions update.

  8. (Opcional) Puedes crear paquetes de acciones localizados para admitir muchos idiomas y configuraciones regionales diferentes al mismo tiempo en un solo proyecto.

Modifica la muestra

Sigue los pasos que se indican en esta sección en el dispositivo.

nano pushtotalk.py

Agrega un controlador para tu acción personalizada. Ten en cuenta que el siguiente controlador ya se agregó al código de muestra del paquete de acciones de muestra anterior.

...

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)

Ejecuta la muestra

Ejecuta el código fuente.

python pushtotalk.py

Prueba con una consulta. Para el ejemplo anterior, prueba lo siguiente:

Parpadea 5 veces.

Ten en cuenta que la consulta debe coincidir con el patrón de consulta del paquete de acciones.