Akıllı Ev'de Hata Ayıklama

1. Başlamadan önce

Bir Nesnelerin İnterneti (IoT) geliştiricisi olarak, kullanıcılarınıza Google Home uygulamasındaki dokunma kontrolleri ve Google Asistan ile sesli komutlar aracılığıyla cihazlarını kontrol etme olanağı sunan buluttan buluta entegrasyonlar oluşturabilirsiniz.

a4657871181b5ad2.gif

Buluttan buluta entegrasyonlar için hata ayıklama araçlarını öğrenmek, Google Asistan ile üretim kalitesinde entegrasyon oluşturmak için önemli bir adımdır. Kolay izleme ve hata ayıklamayı kolaylaştırmak için Google Cloud Platform (GCP) Metrikleri, Günlük Kaydı ve Akıllı Ev için Test Paketi, entegrasyonlarınızla ilgili sorunları belirlemenize ve çözmenize yardımcı olmak için kullanılabilir.

Ön koşullar

Ne oluşturacaksınız?

Bu codelab'de, 2 kusurlu bir buluttan buluta entegrasyonu dağıtacak, bunu Asistan'a bağlayacak ve ardından akıllı ev ve Google Cloud Platform (GCP) Metrikleri ve Günlük Kaydı için Test Paketi ile entegrasyonun kusurlarında hata ayıklayacaksınız.

Neler öğreneceksiniz?

  • Üretim sorunlarını belirlemek ve çözmek için GCP Metrikleri ve Günlük Kaydı'nı kullanma
  • İşlevsel ve API sorunlarını belirlemek için akıllı ev Test Paketi'ni kullanma

İhtiyacınız olanlar

2. Hatalı uygulamayı çalıştırma

Kaynak kodu alma

Bu codelab'in örneğini geliştirme makinenize indirmek için aşağıdaki bağlantıyı tıklayın:

...veya GitHub deposunu komut satırından klonlayabilirsiniz:

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

Proje hakkında

Çamaşır makinesi uygulaması aşağıdaki alt dizinleri içerir:

  • public: Akıllı çamaşır makinesinin durumunu kolayca kontrol etmek ve izlemek için kullanılan bir ön uç kullanıcı arayüzü.
  • functions: Cloud Functions for Firebase ve Firebase Realtime Database ile akıllı çamaşır makinesini yöneten, tam olarak uygulanmış bir bulut hizmeti

Firebase'e bağlanma

Geliştirme makinenizde terminali açın. washer-faulty dizinine gidin, ardından Akıllı ev cihazlarını Google Asistan'a bağlama codelab'inde oluşturulan entegrasyon projenizle Firebase CLI'yı kurun:

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

Firebase'e dağıtma

functions klasörüne gidin ve npm. kullanarak gerekli tüm bağımlılıkları yükleyin.

$ cd functions
$ npm install

Not: Aşağıdaki mesajı görürseniz yoksayabilir ve devam edebilirsiniz. Uyarı, eski bağımlılıklardan kaynaklanmaktadır. Daha fazla ayrıntıyı burada bulabilirsiniz.

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

Bağımlılıkları yükleyip projenizi yapılandırdığınıza göre artık hatalı çamaşır makinesi uygulamasını dağıtmaya hazırsınız.

$ firebase deploy

Görmeniz gereken konsol çıkışı şudur:

...

✔ Deploy complete!

Project Console: https://console.firebase.google.com/project/<Firebase-project-id>/overview
Hosting URL: https://<Firebase-project-id>.firebaseapp.com

HomeGraph'ı güncelleme

Web uygulamasını görüntülemek için tarayıcınızda Hosting URL'yi (https://<firebase-project-id>.firebaseapp.com) açın. Web kullanıcı arayüzünde, Request Sync'i kullanarak HomeGraph'ı hatalı çamaşır makinesi uygulamasından alınan en son cihaz meta verileriyle güncellemek için Yenile (ae8d3b25777a5e30.png) düğmesini tıklayın.

6f2b1344179977cf.png

Google Home uygulamasını açın ve Arızalı Çamaşır Makinesi adlı çamaşır makinesi cihazını görebildiğinizi doğrulayın.

e357de6a7faff925.png

3. Entegrasyonunuzu test etme

Projenizi dağıttıktan sonra entegrasyonunuzun çamaşır makinesini kontrol ettiğini test edin.

Pulun test edilmesi

Telefonunuzda aşağıdaki sesli komutlardan herhangi birini denediğinizde değer değişikliğini kontrol edin:

"Ok Google, çamaşır makinem aç."

"Ok Google, çamaşır makinem çalışsın."

"Ok Google, çamaşır makinem duraklatılsın."

"Ok Google, çamaşır makinemde işleme devam et."

"Ok Google, çamaşır makinem durdurulsun."

Çamaşır makinesini duraklattığınızda / devam ettirdiğinizde Asistan'ın sesli olarak bir sorun olduğunu söylediğini fark edeceksiniz:

"Üzgünüm, <proje görünen adı> ile iletişime geçemedim."

Bu sorunu ayıklamak için öncelikle hatayla ilgili daha fazla bilgiye ihtiyacınız var. Böylece temel nedeni daraltıp belirleyebilirsiniz.

Akıllı Ev Analizleri kontrol paneli

Hataları incelemek için iyi bir yer olan Akıllı Ev Analizleri Kontrol Paneli, bulutla karşılama için Kullanım ve Durum metriklerinin grafiklerini toplar:

  • Kullanım metrikleri, günlük etkin kullanıcı sayısı ve karşılamanıza yapılan toplam istek sayısı da dahil olmak üzere buluttan buluta entegrasyonunuzun kullanım trendini yansıtır.
  • Durum metrikleri, istek gecikmesi, başarı yüzdesi ve hata dökümü gibi konuları kapsayarak buluttan buluta entegrasyonunuzdaki anormallik oluşumunu izlemenize yardımcı olur.

Hataya neden olan durumu daraltmak için aşağıdaki adımları uygulayarak proje kontrol paneline erişin.

  1. Play Console'da Projeler sayfasına gidin.
  2. Akıllı ev projenizi seçin.
  3. Sol menüde Analytics sekmesini tıklayın.

b1735bbe11a7aff8.png

  1. Bu işlem, Google Cloud'daki projenizin kontrol panellerinin listesine yönlendirir. Google Home Analytics - Cloud Integration (Google Home Analytics - Bulut Entegrasyonu) gösterge tablosunu seçin.

5edd3751323176dd.png

  1. Vurgulanan zaman aralığındaki hata kodlarını görüntülemek için Bulutla Sipariş Karşılama Hataları - Durum Dökümü grafiğine gidin.

c468743c20a11c15.png

PARTNER_RESPONSE_MISSING_DEVICE hata kodu, temel neden hakkında ipucu verir. Ardından, daha fazla ayrıntı için hata koduna göre etkinlik günlüklerini alın.

Olay günlüklerine erişme

Hata hakkında daha fazla bilgi edinmek için Cloud Logging'i kullanarak buluttan buluta entegrasyonunuzun etkinlik günlüklerine erişin.

Google Cloud Platform'da Gezinme Menüsü'nü açın ve İşlemler bölümünde Logging > Logs Explorer'ı (Günlük Gezgini) seçerek projenizin etkinlik günlüklerine erişin. Alternatif olarak, arama kutusunda Logs Explorer'ı (Günlük Gezgini) arayabilirsiniz.

Tüm alanlarda ara giriş alanına PARTNER_RESPONSE_MISSING_DEVICE sorgusunu girin ve Sorguyu Çalıştır'ı tıklayın. Sorguyla eşleşen günlükler Sonuçlar bölümünde gösterilir.

747cca0f1249a5a.png

Hata günlüğünde, hata ayrıntılarının gösterildiği bir akıllı ev etkinliği yer alıyor:

  • Yapılan kullanıcı işlemi, son başarısız sesli komuta karşılık gelen "çamaşır makinesini devam ettirme" (actionType: "STARTSTOP_UNPAUSE") işlemidir.
  • İlişkili hata ayıklama mesajı "JSON response does not include device."

Hata ayıklama mesajına göre, yıkama makinesi uygulamasının neden EXECUTE yanıtına doğru cihazı dahil etmediğini kontrol etmeniz gerekir.

Hatanın temel nedenini belirleme

functions/index.js içinde, her komutun durumunu ve yeni cihaz durumunu döndüren EXECUTE işleyicisini (onExecute dizisinde) bulun. Cihaz kimliklerinin bir EXECUTE yanıtına eklenmesi, updateDevice işlevinin çözümlenmesine bağlıdır:

index.js

app.onExecute(async (body) => {
 ...

 for (const command of intent.payload.commands) {
   for (const device of command.devices) {
     for (const execution of command.execution) {
       executePromises.push(
           updateDevice(execution, device.id)
               .then((data) => {
                 result.ids.push(device.id);
                 Object.assign(result.states, data);
               })
               .catch((e) =>
                 functions.logger.error('EXECUTE',
                     device.id, e.message)));
     }
   }
 }

updateDevice işlevinin çamaşır makinesinde duraklatma / devam ettirme işlemlerini nasıl gerçekleştirdiğini daha ayrıntılı bir şekilde kontrol edin. Duraklatma / devam ettirme komutu için eşleştirilecek dizenin yanlış olduğunu göreceksiniz:

index.js

const updateDevice = async (execution, deviceId) => {
 const {params, command} = execution;
 let state; let ref;
 switch (command) {
   ...
   case 'action.devices.commands.PauseUnpausePause':
      const data = await queryDevice(deviceId);
      state = (data.isPaused === false && data.isRunning === false)
        ? {isRunning: false, isPaused: false}
        : {isRunning: !params.pause, isPaused: params.pause};
      ref = getFirebaseRef().child(deviceId).child('StartStop');
      break;
 }

 return ref.update(state)
     .then(() => state);
};

Hatayı düzeltin

Hataya neden olan temel sorunu belirlediğinize göre, duraklatma / devam ettirme komutunun dizesini düzeltebilirsiniz:

index.js

const updateDevice = async (execution, deviceId) => {
 const {params, command} = execution;
 let state; let ref;
 switch (command) {
   ...
   case 'action.devices.commands.PauseUnpause':
      const data = await queryDevice(deviceId);
      state = (data.isPaused === false && data.isRunning === false)
        ? {isRunning: false, isPaused: false}
        : {isRunning: !params.pause, isPaused: params.pause};
      ref = getFirebaseRef().child(deviceId).child('StartStop');
      break;
 }

 return ref.update(state)
     .then(() => state);
};

Düzeltmenizi test etme

Firebase CLI'yı kullanarak güncellenen kodu dağıtın:

firebase deploy --only functions

Aşağıdaki sesli komutları tekrar deneyin. Artık çamaşır makinesini duraklattığınızda / devam ettirdiğinizde Asistan'ın doğru yanıt verdiğini göreceksiniz.

"Ok Google, çamaşır makinem duraklatılsın."

=>

"Tabii ki, çamaşır makinesi duraklatılıyor."

"Ok Google, çamaşır makinemde yıkamaya devam et."

=>

"Anlaşıldı, çamaşır makinesi devam ettiriliyor."

Ayrıca sorular sorarak çamaşır makinenizin mevcut durumunu test edebilirsiniz.

"Ok Google, çamaşır makinem açık mı?"

"Ok Google, çamaşır makinem çalışıyor mu?"

"Ok Google, çamaşır makinem hangi programda çalışıyor?"

4. Entegrasyonunuzu Test Paketi ile test etme

Manuel olarak test etmenin yanı sıra, entegrasyonunuzla ilişkili cihaz türlerine ve özelliklerine dayalı kullanım alanlarını doğrulamak için otomatik akıllı ev test paketi'ni kullanabilirsiniz. Test paketi, entegrasyonunuzdaki sorunları tespit etmek için bir dizi test çalıştırır ve başarısız olan test senaryoları için bilgilendirici mesajlar göstererek etkinlik günlüklerine girmeden önce hata ayıklama işleminizi hızlandırır.

Akıllı ev için test paketini çalıştırma

Test Paketi ile buluttan buluta entegrasyonunuzu test etmek için aşağıdaki talimatları uygulayın:

  1. Web tarayıcınızda Test Suite for smart home'u (Akıllı Ev için Test Paketi) açın.
  2. Sağ üst köşedeki düğmeyi kullanarak Google'da oturum açın. Bu sayede Test Paketi, komutları doğrudan Google Asistan'a gönderebilir.
  3. Proje Kimliği alanına, Cloud'dan Cloud'a entegrasyonunuzun proje kimliğini girin. Devam etmek için SONRAKİ'yi tıklayın.
  4. Test Ayarları adımında, Test Paketi'nin çamaşır makinesinin cihaz türünü ve özelliklerini listelediğini görürsünüz.

78ed6a1ebdb581bf.png

  1. Örnek çamaşır makinesi uygulamasında çamaşır makinesi ekleme / kaldırma / yeniden adlandırma için kullanıcı arayüzü olmadığından Test Request Sync seçeneğini devre dışı bırakın. Bir üretim sisteminde, kullanıcı cihaz eklediğinde, kaldırdığında veya yeniden adlandırdığında Senkronizasyon İste'yi tetiklemeniz gerekir.
  2. Testi çalıştırmaya başlamak için SONRAKİ'yi tıklayın.

Test paketi çalışmayı tamamladıktan sonra test senaryolarının sonuçlarını görüntüleyin. İlgili hata mesajıyla yakalanan iki başarısız test durumu olduğunu fark edeceksiniz:

5838d10631c98ed2.png

Buluttan buluta entegrasyonunuzda hata ayıklamak için öncelikle hata mesajını analiz ederek hatanın temel nedenini belirlemeniz gerekir.

Hata mesajını analiz etme

Test Paketi, geliştiricilerin temel nedeni belirlemesine yardımcı olmak için başarısız olan her test durumunda hatanın nedenini belirten hata mesajları gösterir.

Yukarıdaki ilk başarısız test durumu için:

99e4e5d06965a8a7.png

Hata mesajında, Test Paketi'nin Cloud'dan Cloud'a entegrasyonunuzdan bildirilen durumlarda "isPause": true beklediği ancak gerçek durumların yalnızca "isPause": false içerdiği belirtiliyor.

Ayrıca, ikinci başarısız test senaryosunun hata mesajı, Cloud'dan Cloud'a entegrasyonunuzdan gelen QUERY yanıtındaki durumların "isPause": true içerdiğini gösteriyor. Bu durum, Cloud'dan Cloud'a entegrasyonunuzdan bildirilen durumlardaki "isPause": false değerinden farklıdır:

fdb5124102e3a37.png

Her iki hata mesajına göre, entegrasyon raporlarınızın isPaused değerini doğru şekilde bildirip bildirmediğini kontrol etmeniz gerekir.

Hatanın temel nedenini belirleme

Durum değişikliklerini Report State kullanarak Home Graph'a gönderen reportstate işlevini içeren functions/index.js dosyasını açın. Report State yükünü incelediğinizde yükte isPaused durumunun eksik olduğunu görürsünüz. Bu durum, Test Paketi'nin başarısız test senaryolarında kontrol ettiği şeydir.

index.js

exports.reportstate = functions.database.ref('{deviceId}').onWrite(
    async (change, context) => {
      ...

      const requestBody = {
        requestId: 'ff36a3cc', /* Any unique ID */
        agentUserId: USER_ID,
        payload: {
          devices: {
            states: {
              /* Report the current state of our washer */
             [context.params.deviceId]: {
                online: snapshot.online,
                on: snapshot.OnOff.on,
                isRunning: snapshot.StartStop.isRunning,
                currentRunCycle: [{
                  currentCycle: 'rinse',
                  nextCycle: 'spin',
                  lang: 'en',
                }],
                currentTotalRemainingTime: 1212,
                currentCycleRemainingTime: 301,
              },
            },
          },
        },
      };

      const res = await homegraph.devices.reportStateAndNotification({
        requestBody,
      });
      ...
    });

Hatayı düzeltin

Hatanın temel nedenini belirlediğinize göre, functions/index.js durumunu Report State yüküne ekleyerek isPaused düzeltin:

index.js

exports.reportstate = functions.database.ref('{deviceId}').onWrite(
    async (change, context) => {
      ...

      const requestBody = {
        requestId: 'ff36a3cc', /* Any unique ID */
        agentUserId: USER_ID,
        payload: {
          devices: {
            states: {
              /* Report the current state of our washer */
             [context.params.deviceId]: {
                online: snapshot.online,
                on: snapshot.OnOff.on,
                isPaused: snapshot.StartStop.isPaused,
                isRunning: snapshot.StartStop.isRunning,
                currentRunCycle: [{
                  currentCycle: 'rinse',
                  nextCycle: 'spin',
                  lang: 'en',
                }],
                currentTotalRemainingTime: 1212,
                currentCycleRemainingTime: 301,
              },
            },
          },
        },
      };
      ...
    });

Düzeltmenizi test etme

Firebase CLI'yı kullanarak güncellenen kodu dağıtın:

$ firebase deploy --only functions

Akıllı ev için test paketini yeniden çalıştırın. Tüm test senaryolarının başarılı olduğunu göreceksiniz.

148837f85d377dd6.png

5. Tebrikler

17d485868a6771bc.png

Tebrikler! Akıllı ev ve GCP metrikleri ve günlük kaydı için Test Paketi'ni kullanarak buluttan buluta entegrasyon sorunlarını nasıl gidereceğinizi öğrendiniz.

Daha fazla bilgi

Bu Codelab'den yararlanarak aşağıdaki alıştırmaları deneyin ve ek kaynakları inceleyin:

Entegrasyonunuzu kullanıcılarla paylaşmak için gereken sertifika süreci de dahil olmak üzere, entegrasyonları test etme ve incelemeye gönderme hakkında daha fazla bilgi edinebilirsiniz.