Mendaftarkan Tindakan Perangkat Kustom

Perangkat Anda mungkin memiliki kemampuan khusus yang tidak tercakup dalam kumpulan karakter -- seperti "kedipkan lampuku" karakteristik untuk perangkat yang dapat mengedipkan lampunya. Anda dapat mendefinisikan tindakan khusus untuk perangkat Anda yang menetapkan perintah yang dikirim ke perangkatmu untuk memicu kemampuan khusus.

Untuk menentukan tindakan perangkat kustom, Anda memerlukan hal berikut:

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

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

Membuat Paket Tindakan

Dengan menggunakan hal berikut sebagai contoh, buat file (seperti actions.json) yang menentukan perintah pengujian: mengedipkan LED. Salin dari kode contoh yang Anda didownload 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 perangkat kustom tindakan:

  • Pola yang akan dicocokkan dengan kueri pengguna (berkedip N kali)
  • Tindakan perangkat kustom yang akan dikaitkan dengan kueri yang cocok (com.example.actions.BlinkLight) untuk tujuan organisasi
  • Teks diucapkan balik kepada pengguna jika perangkat mendukung tindakan (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 di pola kueri.
  • Array types [...] menentukan daftar jenis kustom (misalnya, $Speed).
  • Anda dapat menggunakan jenis kustom di pola kueri. Pengguna dapat berbicara sinonim di jenis kustom agar sesuai dengan pola kueri.
  • Jika sinonim cocok, instance jenis (speed) akan tampilkan kunci yang dinormalisasi (SLOWLY). Mungkin terdapat beberapa entitas di kasus ini, misalnya, ada lampu lain yang mendukung kecepatan berbeda berkedip-kedip.
  • Bagian dari pola TTS permintaan dapat bersifat opsional. Misalnya, gunakan ($Speed:speed)? di pola kueri untuk menjadikan bagian ini opsional.
  • $type.raw (misalnya, $speed.raw) di TTS respons diganti dengan kata yang sebenarnya diucapkan pengguna.

Untuk mengetahui deskripsi dari berbagai kolom tersebut, lihat ActionPackage dokumentasi tambahan.

Men-deploy Paket Tindakan

Setelah membangun tindakan perangkat kustom dalam paket Action, Anda dapat membuat Paket tindakan 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-perintah berikut ini tidak memerlukan lingkungan virtual untuk dijalankan.

  1. Download alat command line gactions.

  2. Hapus kredensial yang ada dari direktori yang sama dengan gactions menyediakan alat command line gcloud.

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

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

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

    Enter the authorization code:

    Jika otorisasi berhasil, Anda akan melihat respons yang mirip dengan hal 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 dengan menggunakan CLI gactions. Anda harus sudah menyimpan paket Action ke Google setidaknya sekali sebelumnya menjalankan perintah ini. Mode pengujian mengaktifkan paket Action di hanya dengan akun pengguna saja.

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

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

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

  8. (Opsional) Anda dapat membuat paket Action yang dilokalkan untuk mendukung banyak bahasa dan lokalitas yang berbeda di waktu yang sama dalam satu proyek.

Mengubah sampel

Lakukan langkah-langkah di bagian ini pada perangkat.

nano pushtotalk.py

Tambahkan pengendali untuk tindakan kustom Anda. Perhatikan, pengendali di bawah ini telah ditambahkan ke kode contoh untuk Contoh Paket Tindakan 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 langkah berikut:

Berkedip 5 kali.

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