Registra azioni personalizzate per dispositivo

Il tuo dispositivo potrebbe avere funzionalità speciali non coperte dall'attuale gruppo di trait -- come, ad esempio, "lampeggia la luce" per un dispositivo in grado di far lampeggiare le luci. Tu puoi definire azioni personalizzate per il tuo dispositivo che specificano i comandi inviati a il tuo dispositivo per attivare abilità speciali.

Per definire un'azione personalizzata dei dispositivi, devi disporre di quanto segue:

  • Un pattern per trovare una corrispondenza con la query dell'utente
  • Un'azione personalizzata del dispositivo da associare a una query con corrispondenza
  • Testo vocale all'utente se il dispositivo supporta l'azione
  • Un nome del comando che viene rinviato al tuo dispositivo, insieme agli eventuali parametri

Puoi creare l'azione personalizzata del dispositivo inserendo queste informazioni in un pacchetto di azioni. I pacchetti di azioni definiscono il formato delle risposte dell'assistente. A differenza del l'SDK Actions, le azioni personalizzate sui dispositivi vengono eseguite localmente. non specifichi un dell'endpoint per elaborare le richieste e fornire le risposte. Le azioni personalizzate dei dispositivi sono e non di natura conversazionale.

Creare un pacchetto di azioni

Utilizzando il seguente esempio come esempio, crea un file (ad esempio actions.json) che definisce un comando di test: un LED lampeggiante. Copialo dal codice campione che hai scaricati in un passaggio precedente:

cd assistant-sdk-python/google-assistant-sdk/googlesamples/assistant/grpc/
cp ~/assistant-sdk-python/google-assistant-sdk/actions.json .
Esempio
{
    "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'esempio precedente utilizza le seguenti informazioni per definire il dispositivo personalizzato azione:

  • Un pattern per creare una corrispondenza con la query dell'utente (lampeggia N volte)
  • L'azione personalizzata del dispositivo da associare a una query con corrispondenza (com.example.actions.BlinkLight) a fini organizzativi
  • Testo vocale all'utente se il dispositivo supporta l'azione (Lampeggia N volte)
  • Un nome comando (com.example.commands.BlinkLight) che viene restituito a il dispositivo, insieme a eventuali parametri (un numero ed eventualmente una descrizione della velocità)

Per definire il pattern di query, tieni presente quanto segue:

  • Puoi utilizzare i tipi definiti da schema.org nel pattern della query.
  • L'array types [...] definisce l'elenco di tipi personalizzati (ad esempio, $Speed).
  • Nel pattern di query puoi utilizzare tipi personalizzati. L'utente può pronunciare uno qualsiasi dei sinonimi nel tuo tipo personalizzato per corrispondere al pattern di query.
  • Quando un sinonimo corrisponde, viene restituito il tipo di istanza (speed) restituisce la chiave normalizzata (SLOWLY). Ci possono essere più entità in Ad esempio, ci sono luci diverse che supportano velocità diverse lampeggiare.
  • Alcune parti del pattern della sintesi vocale della richiesta possono essere facoltative. Ad esempio, utilizza ($Speed:speed)? nel pattern di query per rendere questa parte facoltativa.
  • $type.raw (ad esempio $speed.raw) nel la sintesi vocale della risposta viene sostituita dalle parole effettivamente pronunciate dall'utente.

Per una descrizione di molti di questi campi, consulta ActionPackage documentazione.

Deployment del pacchetto di azioni

Dopo aver creato l'azione personalizzata dei dispositivi in un pacchetto Azioni, puoi rendere Pacchetto di azioni accessibile all'assistente.

Puoi eseguire i passaggi descritti in questa sezione sul tuo dispositivo, ma potrebbe essere più semplice per eseguirle sul tuo sistema di sviluppo. I comandi seguenti non richiedono dell'ambiente virtuale da eseguire.

  1. Scarica lo strumento a riga di comando gactions.

  2. Rimuovi eventuali credenziali esistenti dalla stessa directory di gactions lo strumento a riga di comando gcloud.

    rm creds.data
  3. Salva il tuo pacchetto Action su Google utilizzando l'interfaccia a riga di comando gactions. Sostituisci project_id con il tuo progetto Actions Console ID.

    ./gactions update --action_package actions.json --project project_id
  4. La prima volta che esegui questo comando ti verrà fornito un URL e ti verrà chiesto di accedi. Copia l'URL e incollalo in un browser (questa operazione può essere eseguita su qualsiasi sistema). Nella pagina ti verrà chiesto di accedere al tuo Account Google. Firma all'Account Google che ha creato il progetto in una passaggio.

  5. Dopo aver approvato la richiesta di autorizzazione dall'API, verrà visualizzato un codice nel browser, ad esempio "4/XXXX". Copia e incolla questo codice terminale:

    Enter the authorization code:

    Se l'autorizzazione è riuscita, vedrai una risposta simile alla le seguenti:

    Your app for the Assistant for project my-devices-project was successfully
    updated with your actions.
    
  6. Esegui il deployment del tuo pacchetto Azioni in modalità di test utilizzando l'interfaccia a riga di comando gactions. Devi aver salvato il tuo pacchetto di azioni su Google almeno una volta in passato che esegue questo comando. La modalità di test attiva il pacchetto Action sul tuo solo account utente.

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

    Al momento, non puoi testare il progetto utilizzando il simulatore di Actions.

  7. Per aggiornare il pacchetto Action, utilizza il comando gactions update.

  8. (Facoltativo) Puoi creare pacchetti di azioni localizzati per supportare molte lingue e impostazioni internazionali diverse contemporaneamente in un singolo progetto.

Modifica l'esempio

Svolgi la procedura descritta in questa sezione sul dispositivo.

nano pushtotalk.py

Aggiungi un gestore per l'azione personalizzata. Tieni presente che il gestore seguente è già stato aggiunto al codice per il pacchetto di azioni di esempio riportato sopra.

...

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)

Esegui l'esempio

Esegui il codice sorgente.

python pushtotalk.py

Prova una query. Per l'esempio precedente, prova quanto segue:

Lampeggia 5 volte.

Tieni presente che la query deve corrispondere al pattern della query nel pacchetto di azioni.