Enregistrer des actions personnalisées sur l'appareil

Il est possible que votre appareil dispose de fonctionnalités spéciales qui ne sont pas couvertes par l'ensemble actuel de caractéristiques -- comme "faire clignoter mon éclairage" pour un appareil capable de faire clignoter ses lumières. Toi Vous pouvez définir des actions personnalisées pour votre appareil afin de spécifier les commandes envoyées à votre appareil pour déclencher des capacités spéciales.

Pour définir une action personnalisée sur l'appareil, vous avez besoin des éléments suivants:

  • Un format à mettre en correspondance avec la requête de l'utilisateur
  • Une action personnalisée sur l'appareil à associer à une requête avec correspondance
  • Texte énoncé à l'utilisateur si l'appareil est compatible avec l'action
  • Nom de la commande renvoyée à votre appareil, avec tous les paramètres

Pour créer l'action personnalisée sur l'appareil, vous devez placer ces informations dans un package d'action. Les packages d'actions définissent le format des réponses de l'Assistant. Contrairement au SDK Actions, les actions personnalisées sur les appareils sont exécutées localement. vous ne spécifiez pas pour traiter les requêtes et fournir des réponses. Les actions personnalisées sur l'appareil sont non conversationnelle par nature.

Créer un package d'actions

À l'aide de l'exemple suivant, créez un fichier (tel que actions.json) qui : définit une commande de test: clignotement d'un voyant LED. Copiez-le à partir de l'exemple de code que vous téléchargée lors d'une étape précédente:

cd assistant-sdk-python/google-assistant-sdk/googlesamples/assistant/grpc/
cp ~/assistant-sdk-python/google-assistant-sdk/actions.json .
<ph type="x-smartling-placeholder">
</ph>
Exemple
{
    "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"
                    ]
                }
            ]
        }
    ]
}

L'exemple précédent utilise les informations suivantes pour définir l'appareil personnalisé action:

  • Un schéma à mettre en correspondance avec la requête de l'utilisateur (clignotement N fois)
  • Action personnalisée sur l'appareil à associer à une requête avec correspondance (com.example.actions.BlinkLight) à des fins organisationnelles
  • Texte énoncé à l'utilisateur si l'appareil est compatible avec l'action (N clignotements)
  • Un nom de commande (com.example.commands.BlinkLight) renvoyé à l'appareil, ainsi que tous les paramètres (un nombre et éventuellement une description de la vitesse)

Pour définir le schéma de requête, tenez compte des points suivants:

  • Vous pouvez utiliser des types définis par schema.org. dans le schéma de requête.
  • Le tableau types [...] définit la liste des types personnalisés (par exemple, $Speed).
  • Vous pouvez utiliser des types personnalisés dans le schéma de requête. L'utilisateur peut énoncer n'importe quelle des synonymes dans votre type personnalisé afin qu'ils correspondent au schéma de requête.
  • Lorsqu'un synonyme correspond, l'instance de type (speed) renvoyer la clé normalisée (SLOWLY). Il peut y avoir plusieurs entités dans C'est le cas, par exemple, parce que différents voyants sont compatibles avec différentes vitesses de clignoter.
  • Certaines parties du modèle de synthèse vocale de la requête peuvent être facultatives. Par exemple, utilisez ($Speed:speed)? dans le schéma de requête pour rendre cette partie facultative.
  • $type.raw (par exemple, $speed.raw) dans La synthèse vocale de réponse est remplacée par le ou les mots réellement prononcés par l'utilisateur.

Pour obtenir une description de la plupart de ces champs, consultez la ActionPackage dans la documentation Google Cloud.

Déployer le package Action

Après avoir créé votre action personnalisée sur l'appareil dans un package Action, vous pouvez définir le paramètre Package d'actions accessible à l'Assistant.

Vous pouvez effectuer les étapes de cette section sur votre appareil, mais il peut être plus simple pour les exécuter sur votre système de développement. Les commandes suivantes ne nécessitent pas environnement virtuel à exécuter.

  1. Téléchargez l'outil de ligne de commande gactions.

  2. Supprimez tous les identifiants existants du même répertoire que gactions. .

    rm creds.data
  3. Enregistrez votre package d'action sur Google à l'aide de la CLI gactions. Remplacez project_id par votre projet Actions Console. ID :

    ./gactions update --action_package actions.json --project project_id
  4. La première fois que vous exécutez cette commande, une URL vous est fournie et vous êtes invité à connectez-vous. Copiez l'URL et collez-la dans un navigateur (vous pouvez le faire sur n'importe quel système). Vous êtes alors invité à vous connecter à votre compte Google. Signer au compte Google qui a créé le projet lors d'une étape.

  5. Une fois que vous aurez approuvé la demande d'autorisation de l'API, un code apparaîtra dans votre navigateur ("4/XXXX", par exemple). Copiez et collez ce code dans la terminal:

    Enter the authorization code:

    Si l'autorisation aboutit, une réponse semblable à la suivante s'affiche : les éléments suivants:

    Your app for the Assistant for project my-devices-project was successfully
    updated with your actions.
    
  6. Déployez votre package Action en mode test à l'aide de la CLI gactions. Vous devez avoir enregistré votre package d'actions sur Google au moins une fois auparavant en exécutant cette commande. Le mode test active le package Action sur votre compte utilisateur uniquement.

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

    Actuellement, vous ne pouvez pas tester le projet à l'aide du simulateur Actions.

  7. Pour mettre à jour le package Action, utilisez la commande gactions update.

  8. (Facultatif) Vous pouvez créer des packages pour l'action localisés. pour prendre en charge un grand nombre de langues et de paramètres régionaux différents. en même temps dans un seul projet.

Modifier l'exemple

Suivez la procédure décrite dans cette section sur l'appareil.

nano pushtotalk.py

Ajoutez un gestionnaire pour votre action personnalisée. Notez que le gestionnaire ci-dessous a déjà été ajouté. à l'exemple de code de l'exemple de package d'actions ci-dessus.

...

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)

Exécuter l'exemple

Exécutez le code source.

python pushtotalk.py

Essayez une requête. Pour l'exemple ci-dessus, essayez ce qui suit:

Clignez des yeux cinq fois.

Notez que la requête doit correspondre au schéma de requête du package d'actions.