Mendaftarkan Tindakan Perangkat Kustom

Perangkat Anda mungkin memiliki kemampuan khusus yang tidak tercakup dalam kumpulan saat ini -- seperti fitur "kedipkan lampu saya" untuk perangkat yang dapat mengedipkan lampunya. Anda dapat menentukan tindakan kustom untuk perangkat yang menentukan perintah yang dikirim ke perangkat untuk memicu kemampuan khusus.

Untuk menentukan tindakan perangkat kustom, Anda memerlukan hal berikut:

  • Pola untuk dicocokkan dengan kueri pengguna
  • Tindakan perangkat kustom yang akan dikaitkan dengan kueri yang cocok
  • Teks yang diucapkan balik kepada pengguna jika perangkat mendukung tindakan tersebut
  • Nama perintah yang dikirimkan kembali ke perangkat Anda, bersama dengan parameter apa pun

Anda membuat tindakan perangkat kustom dengan memasukkan informasi ini ke dalam paket tindakan. Paket tindakan menentukan format untuk respons Asisten. Tidak seperti Action SDK, tindakan perangkat kustom terpenuhi secara lokal; Anda tidak menentukan endpoint untuk memproses permintaan dan memberikan respons. Tindakan perangkat kustom tidak bersifat percakapan.

Membuat Paket Action

Dengan menggunakan contoh berikut, buat file (seperti actions.json) yang menentukan perintah pengujian: mengedipkan LED. Salin dari kode contoh yang Anda download pada langkah sebelumnya:

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

Contoh sebelumnya menggunakan informasi berikut untuk menentukan tindakan perangkat kustom:

  • Pola yang akan dicocokkan dengan kueri pengguna (kedip N kali)
  • Tindakan perangkat kustom yang akan dikaitkan dengan kueri yang cocok (com.example.actions.BlinkLight) untuk tujuan organisasi
  • Teks yang diucapkan balik kepada pengguna jika perangkat mendukung tindakan tersebut (Berkedip N kali)
  • Nama perintah (com.example.commands.BlinkLight) yang dikirim kembali ke perangkat, bersama dengan parameter apa pun (angka dan mungkin deskripsi kecepatan)

Untuk menentukan pola kueri, perhatikan hal-hal berikut:

  • Anda dapat menggunakan jenis yang ditentukan schema.org dalam pola kueri.
  • Array types [...] menentukan daftar jenis kustom (misalnya, $Speed).
  • Anda dapat menggunakan jenis kustom dalam pola kueri. Pengguna dapat mengucapkan salah satu sinonim dalam jenis kustom Anda agar cocok dengan pola kueri.
  • Jika sinonim cocok, instance jenis (speed) akan menampilkan kunci yang dinormalisasi (SLOWLY). Mungkin ada beberapa entity jika ada, misalnya, ada lampu berbeda yang mendukung kecepatan berkedip yang berbeda.
  • Bagian dari pola TTS permintaan dapat bersifat opsional. Misalnya, gunakan ($Speed:speed)? dalam pola kueri untuk menjadikan bagian ini opsional.
  • $type.raw (misalnya, $speed.raw) dalam TTS respons diganti dengan kata yang sebenarnya diucapkan pengguna.

Untuk deskripsi banyak kolom ini, lihat dokumentasi ActionPackage.

Men-deploy Paket Action

Setelah membuat tindakan perangkat kustom dalam paket Action, Anda dapat membuat paket Action dapat diakses oleh Asisten.

Meskipun Anda dapat melakukan langkah-langkah di bagian ini pada perangkat, akan lebih mudah untuk melakukannya pada sistem pengembangan Anda. Perintah berikut tidak memerlukan lingkungan virtual untuk dijalankan.

  1. Download alat command line gactions.

  2. Hapus kredensial yang ada dari direktori yang sama dengan alat gactions.

    rm creds.data
  3. Simpan paket Action Anda ke Google menggunakan CLI gactions. Ganti project_id dengan project Konsol Actions ID Anda.

    ./gactions update --action_package actions.json --project project_id
  4. Saat pertama kali menjalankan perintah ini, Anda akan diberi URL dan diminta untuk login. Salin URL dan tempelkan ke browser (ini dapat dilakukan di sistem apa pun). Halaman tersebut akan meminta Anda untuk login ke Akun Google Anda. Login ke Akun Google yang membuat project di langkah langkah.

  5. Setelah Anda menyetujui permintaan izin dari API, kode akan muncul di browser, seperti "4/XXXX". Salin dan tempel kode ini ke terminal:

    Enter the authorization code:

    Jika otorisasi berhasil, Anda akan melihat respons seperti berikut:

    Your app for the Assistant for project my-devices-project was successfully
    updated with your actions.
    
  6. Deploy paket Action Anda ke dalam mode pengujian menggunakan CLI gactions. Anda harus menyimpan paket Action ke Google setidaknya sekali sebelum menjalankan perintah ini. Mode pengujian mengaktifkan paket Action hanya di akun pengguna Anda.

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

    Saat ini, Anda tidak dapat menguji project menggunakan simulator Action.

  7. Untuk mengupdate paket Action, gunakan perintah gactions update.

  8. (Opsional) Anda dapat membuat paket Action yang dilokalkan untuk mendukung banyak bahasa dan lokalitas yang berbeda secara bersamaan dalam satu project.

Mengubah sampel

Lakukan langkah-langkah di bagian ini pada perangkat.

nano pushtotalk.py

Tambahkan pengendali untuk tindakan kustom Anda. Perhatikan bahwa pengendali di bawah telah ditambahkan ke kode contoh untuk contoh Paket Action di atas.

...

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)

Menjalankan contoh

Jalankan kode sumber.

python pushtotalk.py

Coba kueri. Untuk contoh di atas, coba yang berikut ini:

Berkedip 5 kali.

Perhatikan bahwa kueri harus cocok dengan pola kueri di Paket Action.