Akıllı ev Action'larınızı geliştirme ve güvenliğini sağlama

1. Başlamadan önce

Akıllı Ev İşlemleri, bir cihazda hangi dil bilgisinin kullanılması gerektiğini Google Asistan'a bildirmek için cihaz türlerini kullanır. Cihaz özellikleri, bir cihaz türünün özelliklerini tanımlar. Bir cihaz, bir İşleme eklenen her cihaz özelliğinin durumunu devralır.

dc8dce0dea87cd5c.png

Kullanıcılarınızın cihazlarının işlevlerini özelleştirmek için, desteklenen tüm özellikleri seçtiğiniz cihaz türüne bağlayabilirsiniz. Şu anda cihaz şemasında kullanılamayan özel özellikleri Actions'ınıza uygulamak isterseniz Modlar ve Geçişler özellikleri, tanımladığınız özel bir adla belirli ayarların kontrolüne olanak tanır.

Akıllı Ev API'si, türler ve özelliklerin sağladığı temel kontrol yeteneğinin ötesinde kullanıcı deneyimini geliştiren ek özelliklere sahiptir. Hata yanıtları, amaçlar başarısız olduğunda ayrıntılı kullanıcı geri bildirimi sağlar. İkincil kullanıcı doğrulaması, bu yanıtları genişletir ve seçtiğiniz cihaz özelliğine ek güvenlik sağlar. Asistan'dan gelen sorgulama bloklarına belirli hata yanıtları göndererek akıllı ev İşleminiz bir komutu tamamlamak için ek yetkilendirme gerektirebilir.

Ön koşullar

Neler derleyeceksiniz?

Bu codelab'de, Firebase ile önceden oluşturulmuş bir akıllı ev entegrasyonunu dağıtacak, ardından yükleme boyutu ve turbo mod için akıllı ev çamaşır makinesine standart olmayan özelliklerin nasıl ekleneceğini öğreneceksiniz. Ayrıca, hata ve istisna raporlaması uygulayacak ve ikincil kullanıcı doğrulamasını kullanarak çamaşır makinesini açmak için sözlü bir onayı zorunlu kılmayı öğreneceksiniz.

Neler öğreneceksiniz?

  • İşleminize modlar ekleme ve özellikleri açma/kapatma
  • Hataları ve istisnaları bildirme
  • İkincil kullanıcı doğrulaması nasıl uygulanır?

Gerekenler

2. Başlarken

Etkinlik kontrollerini etkinleştirme

Google Asistan'ı kullanmak için belirli etkinlik verilerini Google ile paylaşmanız gerekir. Google Asistan'ın düzgün çalışması için bu verilere ihtiyacı vardır. Ancak veri paylaşma şartı SDK'ya özel değildir. Bu verileri paylaşmak için, henüz hesabınız yoksa bir Google Hesabı oluşturun. Herhangi bir Google hesabını kullanabilirsiniz, geliştirici hesabınız olması gerekmez.

Asistan'la kullanmak istediğiniz Google Hesabı'nın Etkinlik kontrolleri sayfasını açın.

Aşağıdaki açma/kapatma anahtarlarının etkin olduğundan emin olun:

  • Web ve Uygulama Etkinliği - Ayrıca, Chrome geçmişini ve Google hizmetlerini kullanan site, uygulama ve cihazlardaki etkinlikleri ekle onay kutusunu işaretlediğinizden emin olun.
  • Cihaz Bilgileri
  • Konuşma ve Ses Etkinliği

Actions projesi oluşturma

  1. Actions on Google Geliştirici Konsolu'na gidin.
  2. Yeni Proje'yi tıklayın, proje için bir ad girin ve PROJE OLUŞTUR'u tıklayın.

3d6b68ca79afd54c.png

Akıllı Ev uygulamasını seçme

Actions Console'daki Genel Bakış ekranında Akıllı ev'i seçin.

2fa4988f44f8914b.png

Akıllı ev deneyim kartını seçip Derlemeye Başla'yı tıkladığınızda proje konsolunuza yönlendirilirsiniz.

Firebase CLI'yı yükleme

Firebase Komut Satırı Arayüzü (CLI), web uygulamalarınızı yerel olarak sunmanızı ve web uygulamanızı Firebase barındırmaya dağıtmanızı sağlar.

CLI'yi yüklemek için terminalden aşağıdaki npm komutunu çalıştırın:

npm install -g firebase-tools

KSA'nın doğru şekilde yüklendiğini doğrulamak için şu komutu çalıştırın:

firebase --version

Aşağıdaki komutu çalıştırarak Firebase CLI'yı Google hesabınızla yetkilendirin:

firebase login

HomeGraph API'yi etkinleştirme

HomeGraph API, bir kullanıcının Home Graph'inde cihazların ve cihaz durumlarının depolanmasını ve sorgulanmasını sağlar. Bu API'yi kullanmak için önce Google Cloud konsolunu açıp HomeGraph API'yi etkinleştirmeniz gerekir.

Google Cloud konsolunda İşlemlerinizle eşleşen projeyi seçtiğinizden emin olun <project-id>. Ardından, HomeGraph API'nin API Kitaplığı ekranında Etkinleştir'i tıklayın.

ee198858a6eac112.png

3. Başlangıç uygulamasını çalıştırın

Geliştirme ortamınızı ayarladığınıza göre artık başlangıç projesini dağıtarak her şeyin doğru şekilde yapılandırıldığını doğrulayabilirsiniz.

Kaynak kodunu alma

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

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

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

İndirilen zip dosyasının paketini açın.

Proje hakkında

Başlangıç projesi aşağıdaki alt dizinleri içerir:

  • public: Akıllı çamaşır makinesinin durumunu kolayca kontrol etmenizi ve izlemenizi sağlayan ön uç kullanıcı arayüzü.
  • functions: Cloud Functions for Firebase ve Firebase Realtime Database ile akıllı çamaşır makinesini yöneten, eksiksiz bir bulut hizmeti.

Sağlanan bulut istek karşılama, index.js ürününde aşağıdaki işlevleri içerir:

  • fakeauth: Hesap bağlama için yetkilendirme uç noktası
  • faketoken: Hesap bağlama için jeton uç noktası
  • smarthome: Akıllı ev amacı karşılama uç noktası
  • reportstate: Cihaz durumu değiştiğinde Home Graph API'yi çağırır.
  • requestsync: Hesabın yeniden bağlanmasına gerek kalmadan kullanıcı cihaz güncellemelerini etkinleştirir

Firebase'e bağlanma

washer-start dizinine gidin, ardından Actions projenizle Firebase CLI'ı ayarlayın:

cd washer-start
firebase use <project-id>

Firebase projesini yapılandırın

Bir Firebase projesini başlatın.

firebase init

CLI özellikleri, Gerçek Zamanlı Veritabanı, İşlevler ve Firebase Hosting'i içeren Barındırma özelliğini seçin.

? Which Firebase CLI features do you want to set up for this directory? Press Space to select features, then
 Enter to confirm your choices.
❯◉ Realtime Database: Configure a security rules file for Realtime Database and (optionally) provision default instance
 ◯ Firestore: Configure security rules and indexes files for Firestore
 ◉ Functions: Configure a Cloud Functions directory and its files
 ◉ Hosting: Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys
 ◯ Hosting: Set up GitHub Action deploys
 ◯ Storage: Configure a security rules file for Cloud Storage
 ◯ Emulators: Set up local emulators for Firebase products
 ◯ Remote Config: Configure a template file for Remote Config
 ◯ Extensions: Set up an empty Extensions manifest

Bu işlem, projeniz için gerekli API'leri ve özellikleri ilk kullanıma hazırlar.

İstendiğinde Realtime Database'i başlatın. Veritabanı örneği için varsayılan konumu kullanabilirsiniz.

? It seems like you haven't initialized Realtime Database in your project yet. Do you want to set it up?
Yes

? Please choose the location for your default Realtime Database instance:
us-central1

Başlangıç proje kodunu kullandığınızdan, Güvenlik kuralları için varsayılan dosyayı seçin ve mevcut veritabanı kuralları dosyasının üzerine yazmadığınızdan emin olun.

? File database.rules.json already exists. Do you want to overwrite it with the Realtime Database Security Rules for <project-ID>-default-rtdb from the Firebase Console?
No

Projenizi yeniden başlatıyorsanız bir kod tabanını başlatmak mı yoksa üzerine yazmak mı istediğiniz sorulduğunda Üzerine yaz seçeneğini belirleyin.

? Would you like to initialize a new codebase, or overwrite an existing one?
Overwrite

İşlevlerinizi yapılandırırken varsayılan dosyaları kullanmanız ve proje örneğindeki mevcut index.js ve package.json dosyalarının üzerine yazmadığınızdan emin olun.

? What language would you like to use to write Cloud Functions?
JavaScript

? Do you want to use ESLint to catch probable bugs and enforce style?
No

? File functions/package.json already exists. Overwrite?
No

? File functions/index.js already exists. Overwrite?
No

Projenizi yeniden başlatıyorsanız işlevleri başlatmak mı yoksa işlevlerin üzerine yazmak mı istediğiniz sorulduğunda Hayır'ı seçin.

? File functions/.gitignore already exists. Overwrite?
No
? Do you want to install dependencies with npm now?
Yes

Son olarak, Hosting kurulumunuzu proje kodunda public dizinini kullanacak şekilde yapılandırın ve mevcut index.html dosyasını kullanın. ESLint'i kullanmanız istendiğinde Hayır'ı seçin.

? What do you want to use as your public directory?
public

? Configure as a single-page app (rewrite all urls to /index.html)?
Yes

? Set up automatic builds and deploys with GitHub?
No

? File public/index.html already exists. Overwrite?
 No

ESLint yanlışlıkla etkinleştirildiyse bunu devre dışı bırakmak için kullanılabilecek iki yöntem vardır:

  1. GUI'yi kullanarak projenin altındaki ../functions klasörüne gidin, .eslintrc.js gizli dosyasını seçin ve silin. Bunu benzer şekilde adlandırılmış .eslintrc.json ile karıştırmayın.
  2. Komut satırını kullanma:
    cd functions
    rm .eslintrc.js
    

Firebase'e dağıtma

Bağımlılıkları yüklediğinize ve projenizi yapılandırdığınıza göre, uygulamayı ilk kez çalıştırmaya hazırsınız.

firebase deploy

Aşağıdaki konsol çıkışını görürsünüz:

...

✔ Deploy complete!

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

Bu komut, birkaç Cloud Functions for Firebase ile birlikte bir web uygulamasını dağıtır.

Web uygulamasını görüntülemek için tarayıcınızda (https://<project-id>.web.app) Hosting URL'yi (Barındırma URL'si) açın. Aşağıdaki arayüzü görürsünüz:

5845443e94705557.png

Bu web kullanıcı arayüzü, cihaz durumlarını görüntülemek veya değiştirmek için kullanılan üçüncü taraf platformu temsil eder. Veritabanınızı cihaz bilgileriyle doldurmaya başlamak için GÜNCELLE'yi tıklayın. Sayfada herhangi bir değişiklik görmezsiniz, ancak çamaşır makinenizin mevcut durumu veritabanında saklanır.

Şimdi, dağıttığınız bulut hizmetini Actions konsolunu kullanarak Google Asistan'a bağlama zamanı.

Actions Console projenizi yapılandırma

Genel Bakış > İşleminizi Derleme bölümünde, İşlem Ekle'yi seçin. Akıllı ev amaçları için istek karşılama sağlayan Cloud Functions işlevinizin URL'sini girip Kaydet'i tıklayın.

https://us-central1-<project-id>.cloudfunctions.net/smarthome

9d7b223427f587ca.png

Geliştirme > Çağrı sekmesinde İşleminiz için bir Görünen Ad ekleyip Kaydet'i tıklayın. Bu ad Google Home uygulamasında görünecektir.

774d0c40c351c7da.png

a8c4673eb11d76ee.png

Hesap bağlamayı etkinleştirmek için sol gezinme menüsünde Geliştirme > Hesap bağlama'yı seçin. Şu hesap bağlama ayarlarını kullanın:

İstemci Kimliği

ABC123

İstemci gizli anahtarı

DEF456

Yetkilendirme URL'si

https://us-central1-<project-id>.cloudfunctions.net/fakeauth

Jeton URL'si

https://us-central1-<project-id>.cloudfunctions.net/faketoken

9730d20b90bcc038.png

Hesap bağlama yapılandırmanızı kaydetmek için Kaydet'i tıklayın, ardından projenizde testi etkinleştirmek için Test'i tıklayın.

ee0547f05b5efd98.png

Simulator sayfasına yönlendirilirsiniz. "Test şimdi etkin" seçeneğini görmüyorsanız testin etkinleştirildiğini doğrulamak için Testi Sıfırla'yı tıklayın.

d0495810dbadf059.png

Akıllı ev İşleminizi test etmek için projenizi bir Google Hesabı'na bağlamanız gerekir. Böylece, aynı hesapta oturum açmış olan Google Asistan yüzeyleri ve Google Home uygulaması üzerinden test yapılabilir.

  1. Telefonunuzda Google Asistan ayarlarını açın. Konsolda kullandığınız hesapla giriş yapmanız gerektiğini unutmayın.
  2. Google Asistan > Ayarlar > Ev Kontrolü'ne (Asistan'ın altında) gidin.
  3. Sağ üstteki arama simgesini tıklayın.
  4. Spesifik test uygulamanızı bulmak için [test] önekini kullanarak test uygulamanızı arayın.
  5. O öğeyi seçin. Ardından Google Asistan, hizmetinizle kimlik doğrulaması yapar ve bir SYNC isteği göndererek hizmetinizden kullanıcı için cihaz listesini sağlamasını ister.

Google Home uygulamasını aç ve çamaşır makinesi cihazını görebildiğini doğrula.

ae252220753726f6.png

Google Home uygulamasında sesli komutları kullanarak çamaşır makinesini kontrol edebildiğinizi doğrulayın. Bulut karşılamanızın ön uç web kullanıcı arayüzünde cihaz durumu değişimini de göreceksiniz.

Artık basit bir çamaşır makineniz olduğuna göre, cihazınızda kullanılabilen modları özelleştirebilirsiniz.

4. Mod ekle

action.devices.traits.Modes özelliği, cihazın bir mod için isteğe bağlı sayıda ayara sahip olmasını sağlar. Bu ayarlardan tek seferde yalnızca bir tanesi ayarlanabilir. Çamaşır makinesine çamaşır yükünün boyutunu tanımlamak için bir mod ekleyeceksiniz: small, medium veya large.

Senkronizasyon yanıtını güncelle

functions/index.js ürününde SYNC yanıtınıza yeni özellikle ilgili bilgi eklemeniz gerekiyor. Bu veriler, aşağıdaki kod snippet'inde gösterildiği gibi traits dizisinde ve attributes nesnesinde görünür.

index.js

app.onSync(body => {
  return {
    requestId: 'ff36a3cc-ec34-11e6-b1a0-64510650abcf',
    payload: {
      agentUserId: USER_ID,
      devices: [{
        id: 'washer',
        type: 'action.devices.types.WASHER',
        traits: [
          'action.devices.traits.OnOff',
          'action.devices.traits.StartStop',
          'action.devices.traits.RunCycle',
          // Add Modes trait
          'action.devices.traits.Modes',
        ],
        name: { ... },
        deviceInfo: { ... },
        attributes: {
          pausable: true,
          //Add availableModes
          availableModes: [{
            name: 'load',
            name_values: [{
              name_synonym: ['load'],
              lang: 'en',
            }],
            settings: [{
              setting_name: 'small',
              setting_values: [{
                setting_synonym: ['small'],
                lang: 'en',
              }]
            }, {
              setting_name: 'medium',
              setting_values: [{
                setting_synonym: ['medium'],
                lang: 'en',
              }]
            }, {
              setting_name: 'large',
              setting_values: [{
                setting_synonym: ['large'],
                lang: 'en',
              }]
            }],
            ordered: true,
          }],
        },
      }],
    },
  };
});

Yeni EXECUTE intent komutları ekleme

EXECUTE amacınızda, aşağıdaki kod snippet'inde gösterildiği gibi action.devices.commands.SetModes komutunu ekleyin.

index.js

const updateDevice = async (execution,deviceId) => {
  const {params,command} = execution;
  let state, ref;
  switch (command) {
    case 'action.devices.commands.OnOff':
      state = {on: params.on};
      ref = firebaseRef.child(deviceId).child('OnOff');
      break;
    case 'action.devices.commands.StartStop':
      state = {isRunning: params.start};
      ref = firebaseRef.child(deviceId).child('StartStop');
      break;
    case 'action.devices.commands.PauseUnpause':
      state = {isPaused: params.pause};
      ref = firebaseRef.child(deviceId).child('StartStop');
      Break;
    // Add SetModes command
    case 'action.devices.commands.SetModes':
      state = {load: params.updateModeSettings.load};
      ref = firebaseRef.child(deviceId).child('Modes');
      break;
}

QUERY yanıtını güncelle

Ardından, çamaşır makinesinin mevcut durumunu bildirmek için QUERY yanıtınızı güncelleyin.

Durumu Realtime Database'de depolandığı şekilde almak için, güncellenen değişiklikleri queryFirebase ve queryDevice işlevlerine ekleyin.

index.js

const queryFirebase = async (deviceId) => {
  const snapshot = await firebaseRef.child(deviceId).once('value');
  const snapshotVal = snapshot.val();
  return {
    on: snapshotVal.OnOff.on,
    isPaused: snapshotVal.StartStop.isPaused,
    isRunning: snapshotVal.StartStop.isRunning,
    // Add Modes snapshot
    load: snapshotVal.Modes.load,
  };
}

const queryDevice = async (deviceId) => {
  const data = await queryFirebase(deviceId);
  return {
    on: data.on,
    isPaused: data.isPaused,
    isRunning: data.isRunning,
    currentRunCycle: [{ ... }],
    currentTotalRemainingTime: 1212,
    currentCycleRemainingTime: 301,
    // Add currentModeSettings
    currentModeSettings: {
      load: data.load,
    },
  };
};

Rapor Durumunu Güncelle

Son olarak, çamaşır makinesinin mevcut yük ayarını Home Graph'e bildirmek için reportstate işlevinizi güncelleyin.

index.js

const requestBody = {
  requestId: 'ff36a3cc', /* Any unique ID */
  agentUserId: USER_ID,
  payload: {
    devices: {
      states: {
        /* Report the current state of your washer */
        [context.params.deviceId]: {
          on: snapshot.OnOff.on,
          isPaused: snapshot.StartStop.isPaused,
          isRunning: snapshot.StartStop.isRunning,
          // Add currentModeSettings
          currentModeSettings: {
            load: snapshot.Modes.load,
          },
        },
      },
    },
  },
};

Firebase'e dağıtma

Güncellenen işlemi dağıtmak için aşağıdaki komutu çalıştırın:

firebase deploy --only functions

Dağıtım tamamlandıktan sonra web kullanıcı arayüzüne gidin ve araç çubuğundaki Yenile ae8d3b25777a5e30.png düğmesini tıklayın. Bu, Asistan'ın güncellenmiş SYNC yanıt verilerini alması için bir İstek Senkronizasyonunu tetikler.

bf4f6a866160a982.png

Artık çamaşır makinesinin modunu ayarlamak için bir komut verebilirsiniz. Örneğin:

"Ok Google, çamaşır makinesi yükünü yüksek seviyeye ayarla."

Ayrıca çamaşır makinenizle ilgili aşağıdaki gibi sorular sorabilirsiniz:

"Ok Google, ne kadar çamaşır makinesi var?"

5. Açma/kapatma düğmeleri ekle

action.devices.traits.Toggles özelliği, bir cihazın adlandırılmış yönlerini (ör. çamaşır makinesinin turbo modda olup olmadığı) doğru veya yanlış durumuna sahip olarak temsil eder.

Senkronizasyon yanıtını güncelle

SYNC yanıtınızda yeni cihazın özelliğiyle ilgili bilgileri eklemeniz gerekiyor. Aşağıdaki kod snippet'inde gösterildiği gibi traits dizisinde ve attributes nesnesinde görünür.

index.js

app.onSync(body => {
  return {
    requestId: 'ff36a3cc-ec34-11e6-b1a0-64510650abcf',
    payload: {
      agentUserId: USER_ID,
      devices: [{
        id: 'washer',
        type: 'action.devices.types.WASHER',
        traits: [
          'action.devices.traits.OnOff',
          'action.devices.traits.StartStop',
          'action.devices.traits.RunCycle',
          'action.devices.traits.Modes',
          // Add Toggles trait
          'action.devices.traits.Toggles',
        ],
        name: { ... },
        deviceInfo: { ... },
        attributes: {
          pausable: true,
          availableModes: [{
            name: 'load',
            name_values: [{
              name_synonym: ['load'],
              lang: 'en'
            }],
            settings: [{ ... }],
            ordered: true,
          }],
          //Add availableToggles
          availableToggles: [{
            name: 'Turbo',
            name_values: [{
              name_synonym: ['turbo'],
              lang: 'en',
            }],
          }],
        },
      }],
    },
  };
});

Yeni EXECUTE intent komutları ekleme

EXECUTE amacınızda, aşağıdaki kod snippet'inde gösterildiği gibi action.devices.commands.SetToggles komutunu ekleyin.

index.js

const updateDevice = async (execution,deviceId) => {
  const {params,command} = execution;
  let state, ref;
  switch (command) {
    case 'action.devices.commands.OnOff':
      state = {on: params.on};
      ref = firebaseRef.child(deviceId).child('OnOff');
      break;
    case 'action.devices.commands.StartStop':
      state = {isRunning: params.start};
      ref = firebaseRef.child(deviceId).child('StartStop');
      break;
    case 'action.devices.commands.PauseUnpause':
      state = {isPaused: params.pause};
      ref = firebaseRef.child(deviceId).child('StartStop');
      break;
    case 'action.devices.commands.SetModes':
      state = {load: params.updateModeSettings.load};
      ref = firebaseRef.child(deviceId).child('Modes');
      break;
    // Add SetToggles command
    case 'action.devices.commands.SetToggles':
      state = {Turbo: params.updateToggleSettings.Turbo};
      ref = firebaseRef.child(deviceId).child('Toggles');
      break;
  }

QUERY yanıtını güncelle

Son olarak, yıkama makinesinin turbo modunu bildirmek için QUERY yanıtınızı güncellemeniz gerekir. Geçiş durumunu Realtime Database'de depolandığı şekilde elde etmek için, güncellenen değişiklikleri queryFirebase ve queryDevice işlevlerine ekleyin.

index.js

const queryFirebase = async (deviceId) => {
  const snapshot = await firebaseRef.child(deviceId).once('value');
  const snapshotVal = snapshot.val();
  return {
    on: snapshotVal.OnOff.on,
    isPaused: snapshotVal.StartStop.isPaused,
    isRunning: snapshotVal.StartStop.isRunning,
    load: snapshotVal.Modes.load,
    // Add Toggles snapshot
    Turbo: snapshotVal.Toggles.Turbo,
  };
}

const queryDevice = async (deviceId) => {
  const data = queryFirebase(deviceId);
  return {
    on: data.on,
    isPaused: data.isPaused,
    isRunning: data.isRunning,
    currentRunCycle: [{ ... }],
    currentTotalRemainingTime: 1212,
    currentCycleRemainingTime: 301,
    currentModeSettings: {
      load: data.load,
    },
    // Add currentToggleSettings
    currentToggleSettings: {
      Turbo: data.Turbo,
    },
  };
};

Rapor Durumunu Güncelle

Son olarak, reportstate fonksiyonunuzu, çamaşır makinesinin turboya ayarlı olup olmadığını Home Graph'e bildirecek şekilde güncelleyin.

index.js

const requestBody = {
  requestId: 'ff36a3cc', /* Any unique ID */
  agentUserId: USER_ID,
  payload: {
    devices: {
      states: {
        /* Report the current state of your washer */
        [context.params.deviceId]: {
          on: snapshot.OnOff.on,
          isPaused: snapshot.StartStop.isPaused,
          isRunning: snapshot.StartStop.isRunning,
          currentModeSettings: {
            load: snapshot.Modes.load,
          },
          // Add currentToggleSettings
          currentToggleSettings: {
            Turbo: snapshot.Toggles.Turbo,
          },
        },
      },
    },
  },
};

Firebase'e dağıtma

Güncellenen işlevleri dağıtmak için aşağıdaki komutu çalıştırın:

firebase deploy --only functions

Dağıtım tamamlandıktan sonra İstek Senkronizasyonunu tetiklemek için web kullanıcı arayüzünde Yenile ae8d3b25777a5e30.png düğmesini tıklayın.

Çamaşır makinesini turbo moduna ayarlamak için komut vererek şu komutu verebilirsiniz:

"Ok Google, çamaşır makinesi için turboyu aç."

Çamaşır makinenizin turbo modunda olup olmadığını şu şekilde kontrol edebilirsiniz:

"Ok Google, çamaşır makinem turbo modda mı?"

6. Hataları ve istisnaları raporlama

Akıllı ev İşleminizde hata giderme işlemi, EXECUTE ve QUERY yanıtlarının başarısız olmasına yol açan sorunlar olduğunda kullanıcıları bilgilendirebilmenizi sağlar. Bildirimler, akıllı cihazınız ve İşleminizle etkileşimde bulunan kullanıcılarınız için daha olumlu bir kullanıcı deneyimi oluşturur.

Bir EXECUTE veya QUERY isteği başarısız olduğunda, İşleminiz bir hata kodu döndürmelidir. Örneğin, bir kullanıcı çamaşır makinesini kapak açıkken çalıştırmayı denediğinde bir hata bildirmek isterseniz EXECUTE yanıtınız aşağıdaki kod snippet'i gibi görünür:

{
  "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
  "payload": {
    "commands": [
      {
        "ids": [
          "456"
        ],
        "status": "ERROR",
        "errorCode": "deviceLidOpen"
      }
    ]
  }
}

Artık bir kullanıcı çamaşır makinesini başlatmak istediğinde Asistan şöyle yanıt verir:

"Çamaşır makinesinin kapağı açık. Lütfen kapatıp tekrar deneyin."

İstisnalar hatalara benzerdir ancak bir uyarının bir komutla ilişkilendirildiği durumları belirtir. Bu durum, işlemin başarılı bir şekilde yürütülmesini engelleyebilir veya engellemeyebilir. İstisnalar, StatusReport özelliği kullanılarak pil seviyesi veya son durum değişikliği gibi alakalı bilgiler sağlayabilir. Engellemeyen istisna kodları, SUCCESS durumuyla birlikte döndürülür. Engelleyen istisna kodları ise EXCEPTIONS durumuyla döndürülür.

İstisnası olan bir yanıta aşağıdaki kod snippet'i örnek verilebilir:

{
  "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
  "payload": {
    "commands": [{
      "ids": ["123"],
      "status": "SUCCESS",
      "states": {
        "online": true,
        "isPaused": false,
        "isRunning": false,
        "exceptionCode": "runCycleFinished"
      }
    }]
  }
}

Asistan şu şekilde yanıt verir:

"Çamaşır makinesinin çalışması bitti."

Çamaşır makinenizle ilgili hata raporlaması eklemek için functions/index.js aracını açın ve aşağıdaki kod snippet'inde gösterildiği gibi hata sınıfı tanımını ekleyin:

index.js

app.onQuery(async (body) => {...});

// Add SmartHome error handling
class SmartHomeError extends Error {
  constructor(errorCode, message) {
    super(message);
    this.name = this.constructor.name;
    this.errorCode = errorCode;
  }
}

Hata kodunu ve hata durumunu döndürmek için yürütme yanıtını güncelleyin:

index.js

const executePromises = [];
const intent = body.inputs[0];
for (const command of intent.payload.commands) {
  for (const device of command.devices) {
    for (const execution of command.execution) {
      executePromises.push( ... )
          //Add error response handling
          .catch((error) => {
            functions.logger.error('EXECUTE', device.id, error);
            result.ids.push(device.id);
            if(error instanceof SmartHomeError) {
              result.status = 'ERROR';
              result.errorCode = error.errorCode;
            }
          })
      );
    }
  }
}

Asistan artık bildirdiğiniz tüm hata kodları hakkında kullanıcılarınıza bilgi verebilir. Sonraki bölümde bununla ilgili bir örnek göreceksiniz.

7. İkincil kullanıcı doğrulaması ekleme

Cihazınızın güvenliğinin sağlanması gereken veya belirli bir yetkili kullanıcı grubuyla (ör. yazılım güncellemesi ya da kilitle etkileşimin kesilmesi) sınırlandırılması gereken modlar varsa İşleminizde ikincil kullanıcı doğrulaması uygulamanız gerekir.

Güvenlik sorgulamasının her seferinde mi yoksa belirli ölçütlerin karşılanması gerektiğinde mi gerçekleşeceğini özelleştirip tüm cihaz türleri ve özelliklerine ikincil kullanıcı doğrulamasını uygulayabilirsiniz.

Desteklenen üç sorgulama türü vardır:

  • No challenge: Kimlik doğrulama sorgulaması kullanmayan bir istek ve yanıt (bu, varsayılan davranıştır)
  • ackNeeded: Açık onay gerektiren ikincil kullanıcı doğrulaması (evet veya hayır)
  • pinNeeded: Kişisel kimlik numarası (PIN) gerektiren ikincil kullanıcı doğrulaması

Bu codelab'de, çamaşır makinesini açmak ve ikincil doğrulama sorgulaması başarısız olursa hata döndürme işlevi için komuta bir ackNeeded sorgulaması ekleyin.

functions/index.js dosyasını açın ve aşağıdaki kod snippet'inde görüldüğü gibi, hata kodunu ve sorgulama türünü döndüren bir hata sınıfı tanımı ekleyin:

index.js

class SmartHomeError extends Error { ... }

// Add secondary user verification error handling
class ChallengeNeededError extends SmartHomeError {
  /**
   * Create a new ChallengeNeededError
   * @param {string} suvType secondary user verification challenge type
   */
  constructor(suvType) {
    super('challengeNeeded', suvType);
    this.suvType = suvType;
  }
}

Ayrıca, challengeNeeded hatasını aşağıdaki gibi döndürmek için yürütme yanıtını da güncellemeniz gerekir:

index.js

const executePromises = [];
const intent = body.inputs[0];
for (const command of intent.payload.commands) {
  for (const device of command.devices) {
    for (const execution of command.execution) {
      executePromises.push( ... )
          .catch((error) => {
            functions.logger.error('EXECUTE', device.id, error);
            result.ids.push(device.id);
            if(error instanceof SmartHomeError) {
              result.status = 'ERROR';
              result.errorCode = error.errorCode;
              //Add error response handling
              if(error instanceof ChallengeNeededError) {
                result.challengeNeeded = {
                  type: error.suvType
                };
              }
            }
          })
      );
    }
  }
}

Son olarak, updateDevice üzerinde değişiklik yaparak çamaşır makinesini açma veya kapatma konusunda açık onayı zorunlu kılın.

index.js

const updateDevice = async (execution,deviceId) => {
  const {challenge,params,command} = execution; //Add secondary user challenge
  let state, ref;
  switch (command) {
    case 'action.devices.commands.OnOff':
      //Add secondary user verification challenge
      if (!challenge || !challenge.ack) {
        throw new ChallengeNeededError('ackNeeded');
      }
      state = {on: params.on};
      ref = firebaseRef.child(deviceId).child('OnOff');
      break;
    ...
  }

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

Firebase'e dağıtma

Güncellenen işlevi dağıtmak için aşağıdaki komutu çalıştırın:

firebase deploy --only functions

Güncellenen kodu dağıttıktan sonra, Asistan'dan çamaşır makinenizi açmasını veya kapatmasını istediğinizde işlemi sözlü olarak onaylamanız gerekir. Örneğin:

Siz: "Ok Google, çamaşır makinesini aç."

Asistan: "Çamaşır makinesini açmak istediğinizden emin misiniz?"

Siz: "Evet."

Firebase günlüklerinizi açarak ikincil kullanıcı doğrulama akışının her adımı için ayrıntılı bir yanıt da görebilirsiniz.

289dbe48f4bb8106.png

8. Tebrikler

674c4f4392e98c1.png

Tebrikler! Modes ve Toggles özellikleriyle akıllı ev işlemlerinin özelliklerini genişletip ikincil kullanıcı doğrulamasıyla bu işlemlerin yürütülmesini sağladınız.

Daha fazla bilgi

Daha derine inmek için uygulayabileceğiniz bazı fikirler:

  • Cihazlarınıza yerel yürütme özellikleri ekleyin.
  • Cihazınızın durumunu değiştirmek için farklı bir ikincil kullanıcı doğrulama sorgulaması türü kullanın.
  • Dinamik olarak güncellemek için RunCycle özelliği QUERY yanıtını güncelleyin.
  • Bu GitHub örneğini keşfedin.