Men-debug Beranda Lokal

1. Sebelum memulai

Integrasi smart home memungkinkan Asisten Google mengontrol perangkat terhubung di rumah pengguna. Untuk membangun Action smart home, Anda harus menyediakan endpoint webhook cloud yang mampu menangani intent smart home. Misalnya, saat pengguna mengatakan, "Ok Google, nyalakan lampu", Asisten mengirimkan perintah ke fulfillment cloud Anda untuk memperbarui status perangkat.

Local Home SDK meningkatkan integrasi smart home Anda dengan menambahkan jalur lokal untuk merutekan intent smart home langsung ke perangkat Google Home, sehingga meningkatkan keandalan dan mengurangi latensi dalam memproses perintah pengguna. Fitur ini memungkinkan Anda menulis dan men-deploy aplikasi fulfillment lokal dalam TypeScript atau JavaScript yang mengidentifikasi perangkat dan mengeksekusi perintah di smart speaker Google Home atau layar smart Google Nest mana saja. Aplikasi Anda kemudian berkomunikasi langsung dengan perangkat smart pengguna yang ada melalui jaringan area lokal dengan menggunakan protokol standar saat ini untuk memenuhi perintah.

72ffb320986092c.png

Men-debug Action smart home adalah langkah penting untuk membuat Action Anda dengan kualitas produksi, tetapi hal ini menantang dan memakan waktu tanpa alat pemecahan masalah dan pengujian yang informatif dan mudah digunakan. Untuk memfasilitasi proses debug pada Action smart home, Metrik dan Logging Google Cloud Platform (GCP) serta Test Suite for smart home tersedia untuk membantu Anda mengidentifikasi dan menyelesaikan masalah Action Anda.

Prasyarat

Yang akan Anda build

Dalam codelab ini, Anda akan membangun fulfillment lokal untuk Action smart home dan menghubungkannya ke Asisten, lalu men-debug aplikasi Local Home melalui Test suite untuk smart home & Metrik dan Logging Google Cloud Platform (GCP).

Yang akan Anda pelajari

  • Cara menggunakan Metrik dan Logging GCP untuk mengidentifikasi dan menyelesaikan masalah produksi.
  • Cara menggunakan Test Suite untuk mengidentifikasi masalah fungsional dan API.
  • Cara menggunakan Chrome Dev Tools saat mengembangkan aplikasi Home Lokal.

Yang Anda butuhkan

2. Menjalankan aplikasi mesin cuci

Mendapatkan kode sumber

Klik link berikut untuk mendownload contoh codelab ini di mesin pengembangan Anda:

...atau Anda dapat meng-clone repositori GitHub dari command line:

$ git clone https://github.com/google-home/smarthome-debug-local.git

Tentang project ini

Aplikasi awal berisi subdirektori dan fungsi cloud yang serupa dengan codelab Mengaktifkan fulfillment lokal untuk Action smart home. Namun, alih-alih app-start, kita memiliki app-faulty di sini. Kita akan mulai dengan aplikasi layar utama lokal yang berfungsi tetapi tidak begitu baik.

Menghubungkan ke Firebase

Kita akan menggunakan project yang sama yang telah Anda buat di codelab Mengaktifkan fulfillment lokal untuk Action smart home, tetapi kita akan men-deploy file yang didownload dalam codelab ini.

Buka direktori app-faulty, lalu siapkan Firebase CLI dengan project Action Anda yang dibuat di codelab Mengaktifkan fulfillment lokal untuk Action smart home:

$ cd app-faulty
$ firebase use <project-id>

Men-deploy ke Firebase

Buka folder app-faulty/functions dan instal semua dependensi yang diperlukan menggunakan npm:

$ cd functions
$ npm install

Catatan: Jika melihat pesan di bawah ini, Anda dapat mengabaikan dan melanjutkan. Peringatan ini disebabkan oleh beberapa dependensi lama, dan Anda dapat menemukan detail selengkapnya di sini.

found 5 high severity vulnerabilities
  run `npm audit fix` to fix them, or `npm audit` for details

Buka direktori app-faulty/local/ dan jalankan perintah berikut untuk mendownload compiler TypeScript dan mengompilasi aplikasi:

$ cd ../local
$ npm install
$ npm run build

Ini akan mengompilasi sumber index.ts (TypeScript) dan menempatkan konten berikut ke direktori app-faulty/public/local-home/:

  • bundle.js—Output JavaScript yang dikompilasi yang berisi aplikasi lokal dan dependensi.
  • index.html—Halaman hosting lokal yang digunakan untuk menayangkan aplikasi pada pengujian perangkat.

Kini, setelah menginstal dependensi dan mengonfigurasi project, Anda siap menjalankan aplikasi untuk pertama kali.

$ firebase deploy

Ini adalah output konsol yang akan Anda lihat:

...

✔ Deploy complete!

Project Console: https://console.firebase.google.com/project/<project-id>/overview
Hosting URL: https://<projectcd -id>.web.app

Perintah ini men-deploy aplikasi web, beserta beberapa Cloud Functions for Firebase.

Mengupdate HomeGraph

Buka URL Hosting di browser Anda (https://<project-id>.web.app) untuk melihat aplikasi web. Di UI web, klik tombol Refresh ae8d3b25777a5e30.png untuk memperbarui HomeGraph melalui Request Sync dengan metadata perangkat terbaru dari aplikasi mesin cuci yang rusak:

fa3c47f293cfe0b7.png

Buka aplikasi Google Home dan pastikan Anda dapat melihat perangkat mesin cuci dengan nama baru "Pencuci Rusak". Ingatlah untuk menetapkan perangkat ke ruangan yang memiliki perangkat Nest.

2a082ee11d47ad1a.pngS

3. Memulai mesin cuci smart

Jika telah menjalankan codelab Mengaktifkan fulfillment lokal untuk Action smart home, Anda seharusnya sudah memulai mesin cuci smart virtual. Jika terhenti, jangan lupa memulai ulang perangkat virtual.

Memulai perangkat

Buka direktori virtual-device/ dan jalankan skrip perangkat, meneruskan parameter konfigurasi sebagai argumen:

$ cd ../../virtual-device
$ npm install
$ npm start -- \
  --deviceId=deviceid123 --projectId=<project-id> \
  --discoveryPortOut=3311 --discoveryPacket=HelloLocalHomeSDK

Verifikasikan bahwa skrip perangkat berjalan dengan parameter yang ditentukan:

(...): UDP Server listening on 3311
(...): Device listening on port 3388
(...): Report State successful

4. Menguji Aplikasi Home Home

Mengirimkan perintah ke perangkat Anda melalui perintah suara ke perangkat Google Home, seperti:

"Ok Google, nyalakan mesin cuci saya".

"Ok Google, mulai mesin cuci saya".

"Ok Google, paksa lokal".

"Ok Google, hentikan mesin cuci saya".

Anda akan melihat Asisten Google merespons dengan pesan "Maaf, sepertinya Mesin Cuci yang Salah tidak tersedia saat ini" saat Anda mencoba mengontrol mesin cuci setelah "force local".

Artinya, perangkat tidak dapat dijangkau melalui jalur lokal. berfungsi sebelum mengeluarkan "Ok Google, paksa lokal" karena kita akan kembali menggunakan jalur cloud jika perangkat tidak dapat dijangkau melalui jalur lokal. Namun, setelah "force local", opsi untuk kembali ke jalur cloud akan dinonaktifkan.

Untuk mengetahui masalahnya, mari gunakan alat yang kami miliki: Metrik dan Logging Google Cloud Platform (GCP) serta Developer Tools Chrome.

5. Men-debug aplikasi Local Home

Di bagian berikut, Anda akan menggunakan alat yang disediakan oleh Google untuk mencari tahu alasan perangkat tidak dapat dijangkau melalui jalur lokal. Anda dapat menggunakan Google Chrome Developer Tools untuk terhubung ke perangkat Google Home, melihat log konsol, dan melakukan debug pada aplikasi Local Home. Anda juga dapat mengirim log kustom ke Cloud Logging sehingga Anda dapat mengetahui error teratas yang ditemukan pengguna di aplikasi Home Lokal Anda.

Menghubungkan Developer Tools Chrome

Untuk menghubungkan debugger ke aplikasi fulfillment lokal Anda, ikuti langkah-langkah berikut:

  1. Pastikan Anda telah menautkan perangkat Google Home ke pengguna yang memiliki izin untuk mengakses project Konsol Actions.
  2. Mulai ulang perangkat Google Home Anda, yang akan memungkinkan perangkat memperoleh URL HTML Anda, serta konfigurasi pemindaian yang Anda masukkan di Konsol Actions.
  3. Luncurkan Chrome di mesin pengembangan Anda.
  4. Buka tab Chrome baru dan masukkan chrome://inspect di kolom alamat untuk meluncurkan inspector.

Anda akan melihat daftar perangkat di halaman tersebut dan URL aplikasi Anda akan muncul di bawah nama perangkat Google Home Anda.

567f97789a7d8846.png

Meluncurkan inspector

Klik Inspect di bawah URL aplikasi Anda untuk meluncurkan Developer Tools Chrome. Pilih tab Console dan verifikasikan Anda dapat melihat konten intent IDENTIFY yang dicetak aplikasi TypeScript.

774c460c59f9f84a.pngS

Output ini berarti pengendali IDENTIFY berhasil dipicu, tetapi verificationId yang ditampilkan di IdentifyResponse tidak cocok dengan perangkat apa pun di HomeGraph Anda. Mari tambahkan beberapa log khusus untuk mencari tahu alasannya.

Tambahkan log kustom

Meskipun ada error DEVICE_VERIFICATION_FAILED yang dicetak oleh Local Home SDK, error tersebut tidak banyak membantu dalam menemukan akar masalahnya. Mari kita tambahkan beberapa log kustom untuk memastikan kita membaca dan memproses data pemindaian dengan benar. Perhatikan bahwa, jika kita menolak promise dengan error, pesan error tersebut juga akan dikirim ke Cloud Logging.

local/index.ts

identifyHandler(request: IntentFlow.IdentifyRequest):
    Promise<IntentFlow.IdentifyResponse> {
  console.log("IDENTIFY intent: " + JSON.stringify(request, null, 2));

  const scanData = request.inputs[0].payload.device.udpScanData;
  if (!scanData) {
    const err = new IntentFlow.HandlerError(request.requestId,
        'invalid_request', 'Invalid scan data');
    return Promise.reject(err);
  }

  // In this codelab, the scan data contains only local device id.
  // Is there something wrong here?
  const localDeviceId = Buffer.from(scanData.data);
  console.log(`IDENTIFY handler: received local device id
      ${localDeviceId}`);

  // Add custom logs
  if (!localDeviceId.toString().match(/^deviceid[0-9]{3}$/gi)) {
    const err = new IntentFlow.HandlerError(request.requestId,
        'invalid_device', 'Invalid device id from scan data ' +
        localDeviceId);
    return Promise.reject(err);
  }

  const response: IntentFlow.IdentifyResponse = {
    intent: Intents.IDENTIFY,
    requestId: request.requestId,
    payload: {
      device: {
        id: 'washer',
        verificationId: localDeviceId.toString(),
      }
    }
  };
  console.log("IDENTIFY response: " + JSON.stringify(response, null, 2));

  return Promise.resolve(response);
}

Selain itu, ubah versi aplikasi layar utama lokal, agar kami dapat mengidentifikasi apakah kita menggunakan versi yang benar.

local/index.ts

const localHomeSdk = new App('1.0.1');

Setelah menambahkan log kustom, Anda harus mengompilasi aplikasi lagi dan men-deploy ulang ke Firebase.

$ cd ../app-faulty/local
$ npm run build
$ firebase deploy --only hosting

Sekarang, mulai ulang perangkat Google Home Anda agar dapat memuat aplikasi home lokal yang telah diupdate. Anda dapat melihat apakah perangkat Google Home menggunakan versi yang diharapkan dengan melihat log Konsol di Developer Tools Chrome.

ecc56508ebcf9ab.png

Mengakses Cloud Logging

Mari kita lihat cara menggunakan Cloud Logging untuk menemukan error. Untuk mengakses Cloud Logging untuk project Anda:

  1. Di konsol Cloud Platform, buka halaman Project.
  2. Pilih project smart home Anda.
  3. Di bagian Operations, pilih Logging > Logs Explorer.

Akses ke data logging dikelola melalui Identity and Access Management (IAM) bagi pengguna project Action Anda. Untuk mengetahui detail selengkapnya tentang peran dan izin untuk logging data, lihat kontrol akses Cloud Logging.

Menggunakan filter lanjutan

Kita mengetahui bahwa terjadi error dalam intent IDENTIFY, karena jalur lokal tidak berfungsi karena perangkat lokal gagal diidentifikasi. Namun, kita ingin mengetahui masalah persisnya. Jadi, mari kita filter error yang terjadi di pengendali IDENTIFY terlebih dahulu.

Luaskan kotak Query preview, kotak Query builder. Masukkan jsonPayload.intent="IDENTIFY" di kotak Query builder, lalu klik tombol Run query.

4c0b9d2828ee2447.pngS

Akibatnya, Anda mendapatkan semua log error yang ditampilkan di pengendali IDENTIFY. Berikutnya, luaskan error terakhir. Anda akan menemukan errorCode dan debugString yang baru saja ditetapkan saat menolak promise di pengendali IDENTIFY.

71f2f156c6887496.pngS

Dari debugString, kita dapat mengetahui bahwa ID perangkat lokal tidak dalam format yang diharapkan. Aplikasi Local Home mengharapkan mendapatkan ID perangkat lokal sebagai string yang dimulai dengan deviceid diikuti dengan 3 digit, tetapi ID perangkat lokal di sini adalah string hex.

Memperbaiki error

Kembali ke kode sumber tempat kita mengurai ID perangkat lokal dari data pemindaian, kita perhatikan bahwa kita tidak menyediakan encoding saat mengonversi string menjadi byte. Data pemindaian diterima sebagai string heksadesimal, jadi teruskan hex sebagai encoding karakter saat memanggil Buffer.from().

local/index.ts

identifyHandler(request: IntentFlow.IdentifyRequest):
    Promise<IntentFlow.IdentifyResponse> {
  console.log("IDENTIFY intent: " + JSON.stringify(request, null, 2));

  const scanData = request.inputs[0].payload.device.udpScanData;
  if (!scanData) {
    const err = new IntentFlow.HandlerError(request.requestId,
        'invalid_request', 'Invalid scan data');
    return Promise.reject(err);
  }

  // In this codelab, the scan data contains only local device id.
  const localDeviceId = Buffer.from(scanData.data, 'hex');
  console.log(`IDENTIFY handler: received local device id
      ${localDeviceId}`);

  if (!localDeviceId.toString().match(/^deviceid[0-9]{3}$/gi)) {
    const err = new IntentFlow.HandlerError(request.requestId,
      'invalid_device', 'Invalid device id from scan data ' +
      localDeviceId);
    return Promise.reject(err);
  }

  const response: IntentFlow.IdentifyResponse = {
    intent: Intents.IDENTIFY,
    requestId: request.requestId,
    payload: {
      device: {
        id: 'washer',
        verificationId: localDeviceId.toString(),
      }
    }
  };
  console.log("IDENTIFY response: " + JSON.stringify(response, null, 2));

  return Promise.resolve(response);
}

Selain itu, ubah versi aplikasi layar utama lokal, agar kami dapat mengidentifikasi apakah kita menggunakan versi yang benar.

local/index.ts

const localHomeSdk = new App('1.0.2');

Setelah memperbaiki error, kompilasi aplikasi dan deploy ulang ke Firebase. Di app-faulty/local, jalankan:

$ npm run build
$ firebase deploy --only hosting

Uji perbaikan Anda

Setelah deployment, mulai ulang perangkat Google Home agar dapat memuat aplikasi home lokal yang telah diupdate. Pastikan versi aplikasi home lokal adalah 1.0.2, dan kali ini, Anda seharusnya tidak melihat error di Chrome Developers Tools Console.

c8456f7b5f77f894.png

Sekarang Anda dapat mencoba mengirimkan perintah ke perangkat lagi.

"Ok Google, paksa lokal".

"Ok Google, hentikan mesin cuci saya".

"Ok Google, nyalakan mesin cuci saya".

...

"Ok Google, paksa default".

6. Jalankan Test Suite untuk Smart Home

Setelah memverifikasi perangkat menggunakan kontrol sentuh di aplikasi Google Home atau melalui perintah suara, Anda dapat menggunakan Test Suite for smart home otomatis untuk memvalidasi kasus penggunaan berdasarkan jenis dan karakteristik perangkat yang terkait dengan Action Anda. Test Suite menjalankan serangkaian pengujian untuk mendeteksi masalah pada Action Anda, dan menampilkan pesan informatif untuk kasus pengujian yang gagal guna mempercepat proses debug sebelum mendalami log aktivitas.

Jalankan Test Suite untuk smart home

Ikuti petunjuk berikut untuk menguji Action smart home dari Test Suite:

  1. Di browser web, buka Test Suite untuk smart home.
  2. Login ke Google menggunakan tombol di pojok kanan atas. Hal ini memungkinkan Test Suite mengirimkan perintah langsung ke Asisten Google.
  3. Di kolom Project ID, masukkan project ID Action smart home Anda. Lalu klik BERIKUTNYA untuk melanjutkan.
  4. Pada langkah Setelan Pengujian, Anda akan melihat Mesin Cuci yang Salah di bagian Perangkat dan Kartu.
  5. Nonaktifkan opsi Test Request Sync karena aplikasi contoh mesin cuci tidak memiliki UI untuk menambahkan / menghapus / mengganti nama mesin cuci. Dalam sistem produksi, Anda harus memicu Request Sync setiap kali pengguna menambahkan / menghapus / mengganti nama perangkat.
  6. Biarkan opsi Local Home SDK tetap aktif karena kita akan menguji jalur lokal dan cloud.
  7. Klik BERIKUTNYA untuk mulai menjalankan pengujian.

67433d9190fa770e.png

Setelah pengujian selesai, Anda akan melihat bahwa pengujian Pause/Resume di jalur lokal gagal saat pengujian Pause/Resume di jalur cloud lulus.

d1ebd5cfae2a2a47.png

Analisis pesan error

Pelajari lebih lanjut pesan error pada kasus pengujian yang gagal. Tag tersebut memberi tahu Anda apa yang diharapkan untuk pengujian tersebut dan bagaimana sebenarnya. Dalam hal ini, untuk "Pause the Washer", status yang diharapkan adalah isPaused: true, tetapi dalam status sebenarnya, kita mendapatkan isPaused: false. Demikian pula, untuk "Pause the Washer", status yang diharapkan adalah isPaused: true, tetapi dalam status sebenarnya, kita mendapatkan isPaused: false.

6bfd3acef9c16b84.pngS

Dari pesan error, sepertinya di jalur lokal, kita menyetel status isPaused secara terbalik.

Mengidentifikasi dan memperbaiki error

Mari kita cari kode sumber tempat aplikasi Local Home mengirimkan perintah eksekusi ke perangkat. getDataCommand() adalah fungsi yang dipanggil oleh executeHandler() untuk menetapkan payload dalam perintah eksekusi yang dikirim ke perangkat.

local/index.ts

getDataForCommand(command: string, params: IWasherParams): unknown {
    switch (command) {
        case 'action.devices.commands.OnOff':
            return {
                on: params.on ? true : false
            };
        case 'action.devices.commands.StartStop':
            return {
                isRunning: params.start ? true : false
            };
        case 'action.devices.commands.PauseUnpause':
            return {
                // Is there something wrong here?
                isPaused: params.pause ? false : true
            };
        default:
            console.error('Unknown command', command);
            return {};
    }
}

Kita memang menetapkan isPause dalam status sebaliknya, nilai ini harus disetel ke true jika params.pause adalah true dan false jika sebaliknya. Mari kita perbaiki itu.

local/index.ts

getDataForCommand(command: string, params: IWasherParams): unknown {
    switch (command) {
        case 'action.devices.commands.OnOff':
            return {
                on: params.on ? true : false
            };
        case 'action.devices.commands.StartStop':
            return {
                isRunning: params.start ? true : false
            };
        case 'action.devices.commands.PauseUnpause':
            return {
                isPaused: params.pause ? true : false
            };
        default:
            console.error('Unknown command', command);
            return {};
    }
}

Ubah versi aplikasi layar utama lokal, agar kami dapat mengidentifikasi apakah kita menggunakan versi yang benar.

local/index.ts

const localHomeSdk = new App('1.0.3');

Jangan lupa untuk mengompilasi aplikasi lagi dan men-deploy ulang ke Firebase. Di app-faulty/local, jalankan:

$ npm run build
$ firebase deploy --only hosting

Sekarang, mulai ulang perangkat Google Home Anda agar dapat memuat aplikasi home lokal yang telah diupdate. Pastikan versi aplikasi home lokal adalah 1.0.3.

Uji perbaikan Anda

Sekarang, jalankan kembali Test suite untuk smart home dengan konfigurasi yang sama dan Anda akan mendapati bahwa semua kasus pengujian telah lulus.

b7fc8c5d3c727d8d.png

7. Selamat

764dbc83b95782a.png

Selamat! Anda berhasil mempelajari cara memecahkan masalah aplikasi Home Home melalui Test Suite untuk smart home & Cloud Logging.

Pelajari Lebih Lanjut

Berikut beberapa hal lain yang dapat Anda coba:

Anda juga dapat mempelajari lebih lanjut cara menguji dan mengirimkan Action untuk ditinjau, termasuk proses sertifikasi untuk memublikasikan Action Anda kepada pengguna.