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ıklama 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 üzere 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ükleri 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 kodunu 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 Barındırma URL'si'ni (https://<firebase-project-id>.firebaseapp.com) açın. Web kullanıcı arayüzünde, Senkronizasyon İste'yi kullanarak Home Graph'i hatalı çamaşır makinesi uygulamasından alınan en son cihaz meta verileriyle güncellemek için Yenile'yi (ae8d3b25777a5e30.png) tıklayın.

6f2b1344179977cf.png

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

e357de6a7faff925.png

3. Entegrasyonunuzu test etme

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

Püskürtücüyü test etme

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 makinem çalışmaya devam etsin."

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

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

"Üzgünüm, <proje görüntüleme 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, bulut karşılamanızla ilgili Kullanım ve Durum metriklerinin grafiklerini toplayan Akıllı Ev Analizleri kontrol panelidir:

  • Kullanım metrikleri, günlük etkin kullanıcı sayısı ve karşılama isteğinizin toplam 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 proje kontrol paneline erişmek üzere aşağıdaki adımları uygulayın.

  1. Developer 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 sizi Google Cloud'daki projenizin kontrol panelleri 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, aşağıdaki hata ayrıntılarını içeren bir akıllı ev etkinliği gösteriliyor:

  • Gerçekleştirilen 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 şekilde 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 çalışmaya devam ediyor."

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 de 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, buluttan buluta 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 İsteği Senkronizasyonu seçeneğini devre dışı bırakın. Ü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ıklama yapmak 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 durumuyla ilgili hata mesajlarını gösterir. Bu mesajlar, başarısızlığın nedenini belirtir.

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

99e4e5d06965a8a7.png

Hata mesajında, Test Paketi'nin buluttan buluta 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 olduğunu 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, 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 değerini, Report State yüküne isPaused durumunu ekleyerek 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ırdığınızda tüm test senaryolarının başarılı olduğunu görürsünüz.

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 sertifika süreci de dahil olmak üzere, entegrasyon test etme ve incelemeye gönderme hakkında daha fazla bilgi edinebilirsiniz.