Registra azioni personalizzate per dispositivo

Il tuo dispositivo potrebbe avere capacità speciali che non rientrano nell'attuale insieme di tratti , ad esempio il tratto "batti le luci" per un dispositivo in grado di far lampeggiare le luci. Puoi definire azioni personalizzate per il tuo dispositivo che specificano i comandi inviati al dispositivo per attivare funzionalità speciali.

Per definire un'azione personalizzata del dispositivo, occorre quanto segue:

  • Un pattern da abbinare alla query dell'utente
  • Un'azione personalizzata del dispositivo da associare a una query con corrispondenza
  • Testo pronunciato all'utente se il dispositivo supporta l'azione
  • Il nome di un comando inviato al tuo dispositivo, insieme a eventuali parametri

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

Crea un pacchetto Azioni

Utilizzando quanto segue come esempio, crea un file (ad esempio actions.json) che definisca un comando di test: il lampeggiamento di un LED. Copialo dal codice campione che hai scaricato 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 l'azione personalizzata del dispositivo:

  • Un pattern per 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) per scopi organizzativi
  • Testo pronunciato all'utente se il dispositivo supporta l'azione (lampeggiante N volte)
  • Un nome di comando (com.example.commands.BlinkLight) che viene inviato al dispositivo, insieme a eventuali parametri (un numero ed eventualmente una descrizione della velocità)

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

  • Nel pattern di query puoi utilizzare tipi definiti da schema.org.
  • 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 del tipo personalizzato in modo che corrisponda al pattern di query.
  • Quando un sinonimo corrisponde, l'istanza del tipo (speed) restituisce la chiave normalizzata (SLOWLY). Possono esserci più entità nel caso in cui, ad esempio, ci siano diverse luci che supportano diverse velocità di intermittenza.
  • Alcune parti del pattern di sintesi vocale della richiesta possono essere facoltative. Ad esempio, utilizza ($Speed:speed)? nel pattern di query per rendere facoltativa questa parte.
  • $type.raw (ad esempio, $speed.raw) nella risposta TTS viene sostituito dalle parole effettivamente pronunciate dall'utente.

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

Esegui il deployment del pacchetto azioni

Dopo aver creato l'azione personalizzata del dispositivo in un pacchetto Azioni, puoi rendere quest'ultimo accessibile all'assistente.

Puoi eseguire i passaggi di questa sezione sul tuo dispositivo, ma potrebbe essere più semplice eseguirli sul tuo sistema di sviluppo. I comandi seguenti non richiedono un ambiente virtuale per essere eseguiti.

  1. Scarica lo strumento a riga di comando gactions.

  2. Rimuovi tutte le credenziali esistenti dalla stessa directory dello strumento gactions.

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

    ./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 accedere. Copia l'URL e incollalo in un browser (questa operazione può essere eseguita in qualsiasi sistema). In questa pagina ti verrà chiesto di accedere al tuo Account Google. Accedi all'Account Google che ha creato il progetto in un passaggio.

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

    Enter the authorization code:

    Se l'autorizzazione ha esito positivo, vedrai una risposta simile alla seguente:

    Your app for the Assistant for project my-devices-project was successfully
    updated with your actions.
    
  6. Esegui il deployment del pacchetto Azioni in modalità di test utilizzando l'interfaccia a riga di comando gactions. Devi aver salvato il pacchetto azioni in Google almeno una volta prima di eseguire questo comando. La modalità di test attiva il pacchetto Azione solo nell'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 Azioni, utilizza il comando gactions update.

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

Modifica l'esempio

Esegui i passaggi descritti in questa sezione sul dispositivo.

nano pushtotalk.py

Aggiungi un gestore per l'azione personalizzata. Nota che il gestore seguente è già stato aggiunto al codice di esempio per il pacchetto 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 con una query. Per l'esempio precedente, prova quanto segue:

Lampeggia 5 volte.

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