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

1. Başlamadan önce

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

dc8dce0dea87cd5c.png

Kullanıcılarınızın işlevlerini özelleştirmek için desteklenen özellikleri, seçtiğiniz cihaz türüne bağlayabilirsiniz. cihazlar. Şu anda cihaz şemasında bulunmayan Action'larınıza özel özellikler uygulamak istiyorsanız Modlar ve Geçişler özellikleri, belirli ayarlara izin verir. kontrolü sizin tanımladığınız özel bir adla değiştirebilir.

Smart Home API, tür ve özelliklerin sağladığı temel kontrol özelliklerinin yanı sıra kullanıcı deneyimini iyileştiren ek özelliklere de sahiptir. Hata yanıtları, amaçlar başarılı olmadığında 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 daha fazla güvenlik ekler. Akıllı ev İşleminiz, Asistan'ın yayınladığı meydan okuma bloklarına belirli hata yanıtlarını göndererek komutu tamamlamak için ek yetkilendirme gerektirebilir.

Ön koşullar

Neler oluşturacaksınız?

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

Neler öğreneceksiniz?

  • İşleminize Modlar ve Geçişler özelliklerini ekleme
  • Hataları ve istisnaları bildirme
  • İkincil kullanıcı doğrulaması uygulama

Gerekenler

2. Başlarken

Etkinlik kontrollerini etkinleştirme

Google Asistan'ı kullanabilmek için belirli etkinlik verilerini Google ile paylaşmanız gerekir. Google Asistan'ın düzgün çalışması için bu veriler gerekir; Ancak veri paylaşma zorunluluğu SDK'ya özel değildir. Bu verileri paylaşmak için hesabınız yoksa bir Google Hesabı oluşturun. Geliştirici hesabınız olması gerekmeden istediğiniz Google hesabını kullanabilirsiniz.

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

Aşağıdaki açma/kapatma anahtarlarının etkinleştirildiğinden 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
  • Ses ve Ses Etkinliği

Actions projesi oluşturma

  1. Actions on Google Developer Console'a gidin.
  2. New Project'i (Yeni Proje) tıklayın, proje için bir ad girin ve CREATE PROJECT'yi (PROJE OLUŞTUR) tıklayın.

3d6b68ca79afd54c.png

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

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

2fa4988f44f8914b.png

Akıllı ev deneyimi kartını seçip Derlemeyi Başlat'ı tıkladığınızda proje konsolunuza yönlendirilirsiniz.

Firebase CLI'ı yükleme

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

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

npm install -g firebase-tools

CLI'ın düzgün şekilde yüklendiğini doğrulamak için aşağıdaki komutu çalıştırın:

firebase --version

Firebase CLI'ı Google Hesabınızla yetkilendirin. Bunun için şu komutu çalıştırın:

firebase login

HomeGraph API'yi etkinleştirme

HomeGraph API, cihazların ve cihaz durumlarının kullanıcının Home Graph'inde 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ırma

Geliştirme ortamınızı ayarladığınıza göre artık her şeyin düzgün bir şekilde yapılandırıldığını doğrulamak için başlangıç projesini dağıtabilirsiniz.

Kaynak kodunu alma

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

veya GitHub deposunu komut satırından 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 edip izlemeyi sağlayan bir ön uç kullanıcı arayüzü.
  • functions: Akıllı çamaşır makinesini Firebase için Cloud Functions ve Firebase Realtime Database ile yöneten, eksiksiz bir bulut hizmeti.

Sağlanan bulut karşılama, index.js içinde 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şikliklerinde Home Graph API'yi çağırır
  • requestsync: Hesabın yeniden bağlanmasını gerektirmeden kullanıcı cihaz güncellemelerini etkinleştirir

Firebase'e bağlanma

washer-start dizinine gidin ve 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 özelliklerini seçin, Realtime Database, Functions ve Firebase Hosting'i içeren Hosting (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, projeniz için gerekli API'leri ve özellikleri kullanıma hazırlayacaktır.

İ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çin.

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

Functions'ınızı 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 olmanız gerekir.

? 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/.gitignore işlevini başlatmak mı yoksa ü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, proje kodunda public dizinini kullanmak için Hosting kurulumunuzu yapılandırın ve mevcut index.html dosyasını kullanın. ESLint 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 iki yöntem vardır:

  1. GUI'yi kullanarak projenin altındaki ../functions klasörüne gidin, gizli .eslintrc.js dosyasını seçin ve silin. Bunu, benzer isimli .eslintrc.json ile karıştırmayın.
  2. Komut satırını kullanarak:
    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

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

...

✔ Deploy complete!

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

Bu komut, çeşitli Firebase için Cloud Functions işleviyle birlikte bir web uygulaması dağıtır.

Web uygulamasını görüntülemek için tarayıcınızda (https://<project-id>.web.app) Barındırma URL'sini açın. Şu arayüzü göreceksiniz:

5845443e94705557.png

Bu web kullanıcı arayüzü, cihaz durumlarını görüntülemek veya değiştirmek için kullanılan bir üçü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 Console'u kullanarak Google Asistan'a bağlama zamanı.

Actions konsolu projenizi yapılandırma

Genel Bakış > İşleminizi oluşturun, İşlem Ekle'yi seçin. Akıllı ev amaçları için karşılama sağlayan bulut işlevinizin URL'sini girin ve Kaydet'i tıklayın.

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

9d7b223427f587ca.png

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

774d0c40c351c7da.png

a8c4673eb11d76ee.png

Hesap bağlama özelliğini etkinleştirmek için Geliştir > Hesap bağlama seçeneğini tıklayın. Ş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 ve projenizde testi etkinleştirmek için Test'i tıklayın.

ee0547f05b5efd98.png

Simulator'a 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 işleminizi test etmek için projenizi bir Google Hesabı'na bağlamanız gerekiyor. Bu şekilde, aynı hesapta oturum açmış olan Google Asistan yüzeyleri ve Google Home uygulaması üzerinden test yapabilirsiniz.

  1. Telefonunuzda Google Asistan ayarlarını açın. Konsoldaki hesapla aynı 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. İlgili test uygulamanızı bulmak için [test] önekini kullanarak test uygulamanızı arayın.
  5. İlgili öğeyi seçin. Google Asistan, hizmetinizle kimlik doğrular ve SYNC isteği göndererek hizmetinizden kullanıcı için cihazların listesini sağlamasını ister.

Google Home uygulamasını açın ve çamaşır makinesi cihazınızı görebildiğinizi doğrulayın.

ae252220753726f6.png

Google Home uygulamasında sesli komutları kullanarak çamaşır makinesini kontrol edebildiğini doğrula. Ayrıca, buluttaki sipariş karşılama işlemlerinizin ön uç web kullanıcı arayüzünde cihaz durumunun değiştiğini de görebilirsiniz.

Temel çamaşır makinesi dağıtıldığına göre artık cihazınızda kullanılabilen modları özelleştirebilirsiniz.

4. Mod ekle

action.devices.traits.Modes özelliği, cihazlarda bir mod için tek seferde yalnızca bir tanesinin seçilebileceği isteğe bağlı sayıda ayara sahip olmasını sağlar. Çamaşır makinesine, çamaşır yükünün boyutunu (küçük, orta veya büyük) tanımlamak için bir mod eklersiniz.

SENKRONİZASYON yanıtını güncelle

functions/index.js uygulamasındaki SYNC yanıtınıza yeni özellikle ilgili bilgi eklemeniz gerekiyor. Bu veriler, aşağıdaki kod snippet'inde gösterildiği gibi traits dizisi 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ıza 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, QUERY yanıtınızı güncelleyerek çamaşır makinesinin mevcut durumunu bildirin.

Realtime Database'de depolandığı şekliyle durumu almak için queryFirebase ve queryDevice işlevlerine güncellenen değişiklikleri 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üncelleme

Son olarak, reportstate işlevinizi, çamaşır makinesinin geçerli yük ayarı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,
          // 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 işlem, Asistan'ın güncellenmiş SYNC yanıt verilerini alması için bir Senkronizasyon İsteği'ni 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ü büyük olarak ayarla."

Ayrıca çamaşır makinenizle ilgili şu tür sorular sorabilirsiniz:

"Ok Google, çamaşır makinesi yükü nedir?"

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

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

SENKRONİZASYON yanıtını güncelle

SYNC yanıtınıza yeni cihaz özelliği hakkında bilgi eklemeniz gerekiyor. Aşağıdaki kod snippet'inde gösterildiği gibi traits dizisi 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ıza 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, çamaşır makinesinin turbo modunu bildirmek için QUERY yanıtınızı güncellemeniz gerekir. Realtime Database'de depolandığı şekliyle açma/kapatma durumunu elde etmek için queryFirebase ve queryDevice işlevlerine güncellenen değişiklikleri 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üncelleme

Son olarak, reportstate işlevinizi, çamaşır makinesinin turboya ayarlanıp ayarlanmadığını Home Graph'e raporlayacak ş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 Senkronizasyonu'nu tetiklemek için web kullanıcı arayüzünde Yenile ae8d3b25777a5e30.png düğmesini tıklayın.

Şimdi şöyle bir komut vererek çamaşır makinesini turbo moduna ayarlama komutu verebilirsiniz:

"Ok Google, çamaşır makinesi için turbo'yu aç."

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

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

6. Raporlama hataları ve istisnalar

Akıllı evinizdeki hata giderme işlemi, sorunlar EXECUTE ve QUERY yanıtlarının başarısız olmasına neden olduğunda bunu kullanıcılara bildirmenizi sağlar. Bildirimler, akıllı cihazınız ve işlemlerinizle etkileşimde bulunan kullanıcılara daha olumlu bir deneyim sunar.

Bir EXECUTE veya QUERY isteği her başarısız olduğunda İşleminiz bir hata kodu döndürecektir. Örneğin, bir kullanıcı kapağı açık şekilde çamaşır makinesini çalıştırmaya çalıştığında hata bildirmek istiyorsanız EXECUTE yanıtınız aşağıdaki kod snippet'i gibi olacaktı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." hata mesajını alıyorum.

İstisnalar hatalara benzer ancak bir uyarının bir komutla ilişkilendirildiği durumları belirtir. Bu, başarılı bir şekilde yürütülmesini engelleyip engellemeyebilir. İstisnalar, pil seviyesi veya son durum değişikliği gibi StatusReport özelliğini kullanan ilgili bilgileri sağlayabilir. Engellemeyen istisna kodları, SUCCESS durumuyla birlikte döndürülür. Engelleme kodları ise EXCEPTIONS durumuyla döndürülür.

İstisnayla birlikte örnek bir yanıt, aşağıdaki kod snippet'inde verilmiştir:

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

Asistan şöyle yanıt verir:

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

Çamaşır makinenize hata raporu eklemek için functions/index.js uygulamasını açın ve hata sınıfı tanımını aşağıdaki kod snippet'inde gösterildiği şekilde 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;
  }
}

Yürütme yanıtını, hata kodunu ve hata durumunu döndürecek şekilde 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ını kullanıcılarınıza bildirebilir. Sonraki bölümde bununla ilgili bir örnek göreceksiniz.

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

Cihazınızın, yazılım güncelleme veya kilidi devre dışı bırakma gibi güvenli hale getirilmesi gereken ya da belirli bir yetkili kullanıcı grubuyla sınırlandırılması gereken modlar varsa İşleminizde ikincil kullanıcı doğrulamasını uygulamalısınız.

İkincil kullanıcı doğrulamasını tüm cihaz türlerine ve özelliklerine uygulayarak güvenlik sorgulamasının her zaman gerçekleşip gerçekleşmeyeceğini veya belirli ölçütlerin karşılanmasının gerekli olup olmayacağını özelleştirebilirsiniz.

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çma komutuna bir ackNeeded sorgulaması ve ikincil doğrulama görevi başarısız olursa hata döndürme işlevi ekleyin.

functions/index.js uygulamasını açın ve aşağıdaki kod snippet'inde görüldüğü şekilde 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;
  }
}

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 öğesini, çamaşır makinesinin açılması veya kapatılması için açık onay gerektirecek şekilde değiştirin.

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."

Ayrıca, Firebase günlüklerinizi açarak ikincil kullanıcı doğrulama akışının her adımıyla ilgili ayrıntılı bir yanıt görebilirsiniz.

289dbe48f4bb8106.png

8. Tebrikler

674c4f4392e98c1.png

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

Daha fazla bilgi

Daha ayrıntılı bilgi edinmek 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ğrulaması sorgulama türü kullanın.
  • Dinamik olarak güncellemek için RunCycle özellik QUERY yanıtını güncelleyin.
  • Bu GitHub örneğini keşfedin.