Benutzerdefinierte Geräteaktionen registrieren

Möglicherweise verfügt dein Gerät über besondere Funktionen, die von den aktuellen Eigenschaften - z. B. „blink mein Licht“ Trait für ein Gerät, das seine Lichter blinken kann. Ich kann benutzerdefinierte Aktionen für Ihr Gerät definieren, die die Befehle angeben, die an um spezielle Funktionen auszulösen.

Zum Definieren einer benutzerdefinierten Geräteaktion benötigen Sie Folgendes:

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

Sie erstellen die benutzerdefinierte Geräteaktion, indem Sie diese Informationen action-Paket bezeichnet. Aktionspakete definieren das Format für Assistant-Antworten. Im Gegensatz zur Actions SDK, benutzerdefinierte Geräteaktionen werden lokal ausgeführt; geben Sie keine 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 definiert einen Testbefehl: das Blinken einer LED. Kopieren Sie ihn aus dem mit einem vorherigen Schritt heruntergeladen haben:

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> <ph type="x-smartling-placeholder">
</ph>
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 wurden die folgenden Informationen verwendet, um das benutzerdefinierte Gerät zu definieren Aktion:

  • Ein Muster zum Abgleich mit der Nutzeranfrage (n-mal blinken)
  • Die benutzerdefinierte Geräteaktion, die mit einer übereinstimmenden Abfrage verknüpft werden soll (com.example.actions.BlinkLight) für organisatorische Zwecke
  • An den Nutzer gesprochener Text, wenn das Gerät die Aktion unterstützt (Blinkt N-mal)
  • Ein Befehlsname (com.example.commands.BlinkLight), der an das Gerät samt Parametern (eine Zahl und ggf. eine Beschreibung der Geschwindigkeit)

Beachten Sie Folgendes, um das Abfragemuster zu definieren:

  • Sie können von schema.org definierte Typen verwenden im Abfragemuster enthalten.
  • 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 jede der folgenden Sprachen sprechen: Synonyme in Ihrem benutzerdefinierten Typ, damit diese mit dem Abfragemuster übereinstimmen.
  • Wenn ein Synonym übereinstimmt, würde die Typinstanz (speed) gibt den normalisierten Schlüssel zurück (SLOWLY). Es können mehrere Entitäten in So gibt es beispielsweise verschiedene Leuchten, die unterschiedliche Geschwindigkeiten unterstützen. zu blinken.
  • 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) im Antwort TTS wird durch das Wort bzw. die Wörter ersetzt, die der Nutzer tatsächlich gesprochen hat.

Beschreibungen vieler dieser Felder finden Sie in der ActionPackage Dokumentation.

Aktionspaket bereitstellen

Nachdem Sie Ihre benutzerdefinierte Geräteaktion in einem Aktionspaket erstellt haben, können Sie die Aktionspaket für Assistant zugänglich.

Du kannst die Schritte in diesem Abschnitt zwar auf deinem Gerät ausführen, es ist aber möglicherweise einfacher, um sie in Ihrem Entwicklungssystem auszuführen. Für die folgenden Befehle ist kein virtuelle Umgebung ausgeführt werden soll.

  1. Laden Sie das gactions-Befehlszeilentool herunter.

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

    rm creds.data
  3. Speichern Sie das Aktionspaket über die gactions-Befehlszeile in Google. Ersetzen Sie project_id durch Ihr Actions Console-Projekt ID fest.

    ./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 gebeten, melden Sie sich an. Kopieren Sie die URL und fügen Sie sie in einen Browser ein. Dies ist auf jedem System möglich. Auf dieser Seite werden Sie aufgefordert, sich in Ihrem Google-Konto anzumelden. Unterzeichnen mit dem Google-Konto verknüpft, mit dem das Projekt in einem früheren Schritt:

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

    Enter the authorization code:

    Wenn die Autorisierung erfolgreich war, sehen Sie eine Antwort ähnlich der folgenden: Folgendes:

    Your app for the Assistant for project my-devices-project was successfully
    updated with your actions.
    
  6. Stellen Sie das Aktionspaket mithilfe der gactions-Befehlszeile im Testmodus bereit. Du musst dein Aktionspaket mindestens einmal zuvor bei Google gespeichert haben und führen diesen Befehl aus. Im Testmodus wird das Aktionspaket auf deinem Nutzerkonto.

    ./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 Regionen zu unterstützen gleichzeitig an einem Projekt durchzuführen.

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 Handler unten wurde bereits hinzugefügt für das obige Beispiel-Aktionspaket hinzufügen.

...

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 Abfrage. Versuchen Sie für das obige Beispiel Folgendes:

Blinke fünfmal.

Beachte, dass die Abfrage mit dem Abfragemuster im Aktionspaket übereinstimmen muss.