Benutzerdefinierte Geräteaktionen registrieren

Dein Gerät hat möglicherweise besondere Fähigkeiten, die von den aktuellenEigenschaften nicht abgedeckt werden, z. B. die Eigenschaft „Blink mein Licht“ für ein Gerät, das seine Lichter blinken kann. Sie können benutzerdefinierte Aktionen für Ihr Gerät definieren, die Befehle festlegen, die an Ihr Gerät gesendet werden, um spezielle Funktionen auszulösen.

Um eine benutzerdefinierte Geräteaktion zu definieren, benötigen Sie Folgendes:

  • Ein Muster für den Abgleich mit der Nutzeranfrage
  • Eine benutzerdefinierte Geräteaktion, die mit einer übereinstimmenden Suchanfrage verknüpft werden soll
  • Text, der dem Nutzer gesprochen wird, wenn das Gerät die Aktion unterstützt
  • Ein Befehlsname, der zusammen mit allen Parametern an Ihr Gerät zurückgesendet wird

Um die benutzerdefinierte Geräteaktion zu erstellen, fügen Sie diese Informationen in ein Aktionspaket ein. Aktionspakete definieren das Format für die Assistant-Antworten. Im Gegensatz zum Actions SDK werden benutzerdefinierte Geräteaktionen lokal ausgeführt. Sie geben also keinen Endpunkt an, um Anfragen zu verarbeiten und Antworten bereitzustellen. Benutzerdefinierte Geräteaktionen sind nicht dialogorientiert.

Aktionspaket erstellen

Erstellen Sie anhand des folgenden Beispiels eine Datei (z. B. actions.json), die einen Testbefehl definiert: eine LED blinkt. Kopieren Sie ihn aus dem Beispielcode, den Sie in einem vorherigen Schritt heruntergeladen haben:

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

Im vorherigen Beispiel werden die folgenden Informationen verwendet, um die benutzerdefinierte Geräteaktion zu definieren:

  • Muster für den Abgleich mit der Nutzeranfrage (n-mal blinken)
  • Die benutzerdefinierte Geräteaktion, die aus organisatorischen Gründen mit einer übereinstimmenden Abfrage (com.example.actions.BlinkLight) verknüpft werden soll
  • Dem Nutzer gesprochener Text, wenn das Gerät die Aktion unterstützt (n-mal blinkend)
  • Ein Befehlsname (com.example.commands.BlinkLight), der zusammen mit allen Parametern (einer Zahl und möglicherweise eine Beschreibung der Geschwindigkeit) an das Gerät zurückgesendet wird

Beachten Sie beim Definieren des Abfragemusters Folgendes:

  • Sie können im Abfragemuster schema.org-definierte Typen verwenden.
  • Mit dem Array types [...] wird die Liste der benutzerdefinierten Typen definiert, z. B. $Speed.
  • Sie können im Abfragemuster benutzerdefinierte Typen verwenden. Der Nutzer kann jedes beliebige Synonym in Ihrem benutzerdefinierten Typ sprechen, um dem Abfragemuster zu entsprechen.
  • Wenn ein Synonym übereinstimmt, würde die Typinstanz (speed) den normalisierten Schlüssel (SLOWLY) zurückgeben. Es können mehrere Entitäten vorhanden sein, z. B. gibt es verschiedene Lichter, die unterschiedliche Blinkgeschwindigkeiten unterstützen.
  • Teile des TTS-Anfragemusters können optional sein. Verwenden Sie beispielsweise ($Speed:speed)? im Abfragemuster, um diesen Teil optional zu machen.
  • $type.raw (z. B. $speed.raw) wird in der Antwort-TTS durch die Wörter ersetzt, die der Nutzer tatsächlich gesprochen hat.

Beschreibungen vieler dieser Felder finden Sie in der Dokumentation zu ActionPackage.

Aktionspaket bereitstellen

Nachdem du deine benutzerdefinierte Geräteaktion in einem Aktionspaket erstellt hast, kannst du das Aktionspaket für Assistant zugänglich machen.

Sie können die Schritte in diesem Abschnitt zwar auf Ihrem Gerät ausführen, auf Ihrem Entwicklungssystem ist es aber möglicherweise einfacher. Für die Ausführung der folgenden Befehle ist keine virtuelle Umgebung erforderlich.

  1. Laden Sie das gactions-Befehlszeilentool herunter.

  2. Entfernen Sie alle vorhandenen Anmeldedaten aus demselben Verzeichnis wie das gactions-Tool.

    rm creds.data
  3. Speichern Sie das Aktionspaket mithilfe der gactions-Befehlszeile bei Google. Ersetzen Sie project_id durch die ID Ihres Actions Console-Projekts.

    ./gactions update --action_package actions.json --project project_id
  4. Wenn Sie diesen Befehl zum ersten Mal ausführen, erhalten Sie eine URL und werden aufgefordert, sich anzumelden. Kopieren Sie die URL und fügen Sie sie in einen Browser ein. Dieser Schritt ist auf jedem System möglich. Sie werden aufgefordert, sich in Ihrem Google-Konto anzumelden. Melden Sie sich in dem Google-Konto an, mit dem das Projekt in einem vorherigen Schritt.

  5. Nachdem Sie die Berechtigungsanfrage von der API genehmigt haben, wird ein Code in Ihrem Browser angezeigt, z. B. „4/XXXX“. Kopieren Sie diesen Code und fügen Sie ihn in das Terminal ein:

    Enter the authorization code:

    Wenn die Autorisierung erfolgreich war, sehen Sie in etwa folgende Antwort:

    Your app for the Assistant for project my-devices-project was successfully
    updated with your actions.
    
  6. Stellen Sie das Aktionspaket über die gactions-Befehlszeile im Testmodus bereit. Du musst dein Aktionspaket mindestens einmal bei Google gespeichert haben, bevor du diesen Befehl ausführen kannst. Im Testmodus wird das Aktionspaket nur für Ihr Nutzerkonto aktiviert.

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

    Derzeit können Sie das Projekt nicht mit dem Actions-Simulator testen.

  7. Verwenden Sie den Befehl gactions update, um das Aktionspaket zu aktualisieren.

  8. (Optional) Du kannst lokalisierte Aktionspakete erstellen, um viele verschiedene Sprachen und Gebietsschemas gleichzeitig in einem einzigen Projekt zu unterstützen.

Beispiel ändern

Führen Sie die Schritte in diesem Abschnitt auf dem Gerät aus.

nano pushtotalk.py

Fügen Sie einen Handler für die benutzerdefinierte Aktion hinzu. Der unten gezeigte Handler wurde dem Beispielcode für das obige Beispiel-Aktionspaket bereits hinzugefügt.

...

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)

Beispiel ausführen

Führen Sie den Quellcode aus.

python pushtotalk.py

Versuchen Sie es mit einer Suchanfrage. Versuchen Sie für das obige Beispiel Folgendes:

Fünfmal blinken

Die Abfrage muss mit dem Abfragemuster im Aktionspaket übereinstimmen.