Akıllı Ev'de Hata Ayıklama

1. Başlamadan önce

Nesnelerin İnterneti (IoT) geliştiricisi olarak, kullanıcılarınıza Google Home uygulamasındaki dokunmatik kontroller ve Google Asistan'daki sesli komutlar aracılığıyla cihazlarını kontrol etme olanağı tanıyan 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 ve Günlük Kaydı ile Akıllı Ev Testi, entegrasyonlarınızdaki sorunları tespit etmenize ve çözmenize yardımcı olur.

Ön koşullar

Oluşturacağınız uygulama

Bu codelab'de, 2 hataya sahip bir buluttan buluta entegrasyon dağıtıp Asistan'a bağlayacak, ardından akıllı ev ve Google Cloud Platform (GCP) metrikleri ve günlük kaydı için Test Suite aracılığıyla entegrasyondaki hataları gidereceksiniz.

Neler öğreneceksiniz?

  • Üretim sorunlarını tespit edip çözmek için GCP metriklerini ve günlük kaydını kullanma
  • İşlevsel ve API sorunlarını belirlemek için akıllı ev için Test Paketi'ni kullanma

Gerekenler

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

Kaynak kodunu alma

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

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

$ 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 edip izlemek için kullanılan ön uç kullanıcı arayüzü.
  • functions: Cloud Functions for Firebase ve Firebase Realtime Database ile akıllı çamaşır makinesini yöneten, tamamen 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'yi ayarlayın:

$ 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. Bu uyarı, bazı eski bağımlılıklardan kaynaklanmaktadır. Daha fazla bilgiyi 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, hatalı çamaşır makinesi uygulamasını dağıtmaya hazırsınız.

$ firebase deploy

Göreceğiniz konsol çıkışı şu şekildedir:

...

✔ 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 (https://<firebase-project-id>.firebaseapp.com) Barındırma URL'sini açın. Web kullanıcı arayüzünde, Senkronizasyon iste aracılığıyla HomeGraph'ı hatalı çamaşır makinesi uygulamasındaki en son cihaz meta verileriyle güncellemek için Yenileae8d3b25777a5e30.png düğmesini tıklayın:

6f2b1344179977cf.png

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

e357de6a7faff925.png

3. Entegrasyonunuzu test etme

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

Yıkayı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 makinemi aç."

"Ok Google, çamaşır makinemi başlat."

"Ok Google, çamaşır makinemi duraklat."

"Ok Google, çamaşır makinemi devam ettir."

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

Çamaşır makinesini duraklattığınızda / devam ettirdiğinizde Asistan sesli olarak bir sorun olduğunu belirtir:

"<project display name> adresine ulaşamadık."

Bu sorunun hata ayıklama işlemini başlatmak için öncelikle hatayla ilgili daha fazla bilgiye ihtiyacınız var. Bu sayede, sorunun temel nedenini belirleyebilir ve daraltabilirsiniz.

Smarthome Analytics kontrol paneli

Hataları incelemek için iyi bir yer, bulut sipariş tamamlama işleminizin Kullanım ve Sağlık metrikleri grafiklerini toplayan Smarthome Analytics kontrol panelidir:

  • Kullanım metrikleri, günlük etkin kullanıcı sayısı ve sipariş tamamlama işlemine 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ünü kapsayan buluttan buluta entegrasyonunuzda anormallik oluşumunu izlemenize yardımcı olur.

Hatanın nedenini daraltmak için aşağıdaki adımları uygulayarak proje kontrol paneline erişin.

  1. Developer Console'da Projeler sayfasına gidin.
  2. Akıllı ev projenizi seçin.
  3. Sol menüden 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 kontrol panelini seçin.

5edd3751323176dd.png

  1. Vurgulanan zaman aralığının hata kodlarını görüntülemek için Cloud Fulfillment Hataları - Durum Ayrıştırması grafiğine gidin.

c468743c20a11c15.png

PARTNER_RESPONSE_MISSING_DEVICE hata kodu, temel nedenle ilgili bir ipucu sağlar. Ardından, daha fazla ayrıntı için hata koduna göre etkinlik günlüklerini alın.

Olay günlüklerine erişim

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

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

Tüm alanları 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, akıllı ev etkinliği gösterilir ve hata ayrıntıları şu bilgileri içerir:

  • Kullanıcının yaptığı işlem, son başarısız sesli komuta karşılık gelen "çamaşır makinesini devam ettirme"dir (actionType: "STARTSTOP_UNPAUSE").
  • İlişkili hata ayıklama mesajı: "JSON response does not include device."

Hata ayıklama mesajına göre, çamaşır makinesi uygulamasının EXECUTE yanıtında doğru cihazı neden içermediğ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şleyiciyi (onExecute dizisinde) bulun. Cihaz kimliklerinin EXECUTE yanıtına eklenmesi, updateDevice işlevinin çözümüne 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şlemini nasıl işlediğini daha ayrıntılı bir şekilde kontrol edin. Duraklat / devam ettir komutuyla eşleşecek 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':
     state = {isPaused: params.pause};
     if (params.pause) state.isRunning = false;
     ref = firebaseRef.child(deviceId).child('StartStop');
     break;
 }

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

Hatayı düzeltme

Hatanın temel nedenini 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':
     state = {isPaused: params.pause};
     if (params.pause) state.isRunning = false;
     ref = firebaseRef.child(deviceId).child('StartStop');
     break;
 }

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

Düzeltme işleminizi test etme

Güncellenen kodu Firebase CLI'yi kullanarak dağıtın:

firebase deploy --only functions

Aşağıdaki sesli komutları tekrar deneyin. Artık Asistan, çamaşır makinesini duraklattığınızda / devam ettirdiğinizde doğru yanıt verecektir.

"Ok Google, çamaşır makinemi duraklat."

=>

"Elbette, çamaşır makinesini duraklatıyorum."

"Ok Google, çamaşır makinemi devam ettir."

=>

"Anladım, çamaşır makinesini devam ettiriyorum."

Soru sorarak da ç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 makinemde hangi program açık?"

4. Entegrasyonunuzu Test Suite ile test etme

Manuel testin yanı sıra, entegrasyonunuzla ilişkili cihaz türlerine ve özelliklerine göre 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 etkinlik günlüklerine göz atmadan önce hata ayıklamanızı hızlandırmak için başarısız test durumlarıyla ilgili bilgilendirici mesajlar gösterir.

Akıllı ev için Test Paketi'ni çalıştırma

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

  1. Web tarayıcınızda Akıllı ev için Test Suite'i 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. Ardından, 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 eklemek / kaldırmak / yeniden adlandırmak 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 / adını değiştirdiğinde Senkronizasyon İste'yi tetiklemeniz gerekir.
  2. Testi çalıştırmaya başlamak için SONRAKİ'yi tıklayın.

Test paketi çalıştırıldıktan sonra test durumlarının sonuçlarını görüntüleyin. İlgili hata mesajıyla birlikte yakalanan iki başarısız test örneğini görürsünüz:

5838d10631c98ed2.png

Buluttan buluta entegrasyonunuzda hatayla ilgili 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 senaryosu için hatanın nedenini belirten hata mesajları gösterir.

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

99e4e5d06965a8a7.png

Hata mesajı, Test Suite'in buluttan buluta entegrasyonunuzdan bildirilen eyaletlerde "isPause": true beklediğini ancak gerçek eyaletlerin yalnızca "isPause": false olduğunu gösterir.

Ayrıca, başarısız olan ikinci testin hata mesajı, buluttan buluta entegrasyonunuzdan gelen QUERY yanıtındaki durumların "isPause": true içerdiğini belirtir. Bu durum, buluttan buluta entegrasyonunuzdan bildirilen "isPause": false durumlarından farklıdır:

fdb5124102e3a37.png

Her iki hata mesajına göre, entegrasyon raporlarınızın isPaused değerini doğru değerle belirtip belirtmediğini kontrol etmeniz gerekir.

Hatanın temel nedenini belirleme

Durum değişikliklerini Rapor Durumu aracılığıyla Ana Grafik'e yayınlayan reportstate işlevini içeren functions/index.js dosyasını açın. Rapor Durumu yükü incelendiğinde, yükte isPaused durumunun eksik olduğu görülebilir. Test paketi, başarısız test durumlarında tam olarak bunu kontrol eder.

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: true,
                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üzeltme

Hatanın temel nedenini belirlediğinize göre, Rapor Durumu yüküne isPaused durumunu ekleyerek functions/index.js'ü 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: true,
                on: snapshot.OnOff.on,
                isPaused: snapshot.StartStop.isPaused,
                isRunning: snapshot.StartStop.isRunning,
                currentRunCycle: [{
                  currentCycle: 'rinse',
                  nextCycle: 'spin',
                  lang: 'en',
                }],
                currentTotalRemainingTime: 1212,
                currentCycleRemainingTime: 301,
              },
            },
          },
        },
      };
      ...
    });

Düzeltme işleminizi test etme

Güncellenen kodu Firebase CLI'yi kullanarak dağıtın:

$ firebase deploy --only functions

Akıllı ev için Test Paketi'ni yeniden çalıştırdığınızda tüm test senaryolarının geçtiğini görürsünüz.

148837f85d377dd6.png

5. Tebrikler

17d485868a6771bc.png

Tebrikler! Akıllı ev için Test Suite ve GCP Metrikleri ve Günlük Kayıtları aracılığıyla buluttan buluta entegrasyon sorunlarını nasıl gidereceğinizi başarıyla öğrendiniz.

Daha fazla bilgi

Bu Codelab'i temel alarak aşağıdaki alıştırmaları deneyin ve ek kaynakları keşfedin:

Ayrıca, entegrasyonunuzu kullanıcılara yayınlamak için sertifika süreci de dahil olmak üzere bir entegrasyonu test etme ve incelemeye gönderme hakkında daha fazla bilgi edinebilirsiniz.