Buluttan buluta entegrasyonlarınızı iyileştirin ve güvenliğini sağlayın

1. Başlamadan önce

Buluttan buluta entegrasyonlar, Google Asistan'a bir cihazla 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. Cihazlar, entegrasyona eklenen her cihaz özelliğinin durumlarını devralır.

dc8dce0dea87cd5c.png

Kullanıcılarınızın cihazlarının işlevini özelleştirmek için desteklenen tüm özellikleri seçtiğiniz cihaz türüne bağlayabilirsiniz. İşlemlerinize şu anda cihaz şemasında bulunmayan özel özellikler uygulamak istiyorsanız Modlar ve Anahtarlama özellikleri, belirli ayarların sizin tanımladığınız özel bir adla kontrol edilmesine olanak tanır.

Smart Home API, türler ve özellikler tarafından sağlanan temel kontrol özelliğinin ötesinde, kullanıcı deneyimini iyileştirmeye yönelik ek özelliklere sahiptir. Hata yanıtları, intent'ler 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 ek güvenlik ekler. Asistan'dan gönderilen istek bloklarına belirli hata yanıtları göndererek buluttan buluta entegrasyonunuzun bir komutu tamamlaması için ek yetkilendirme gerekebilir.

Ön koşullar

Ne oluşturacaksınız?

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

Neler öğreneceksiniz?

  • Entegrasyonunuza Modlar ve Açma/Kapatma özellikleri ekleme
  • Hataları ve istisnaları bildirme
  • İkincil kullanıcı doğrulamasını uygulama

İhtiyacınız olanlar

2. Başlarken

Etkinlik kontrolleri'ni 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 özgü değildir. Bu verileri paylaşmak için henüz bir hesabınız yoksa Google Hesabı oluşturun. Geliştirici hesabınızın olması gerekmez. Herhangi bir Google Hesabı kullanabilirsiniz.

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

Aşağıdaki açma/kapatma düğmelerinin 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
  • Konuşma ve Ses Etkinliği

Buluttan buluta entegrasyon projesi oluşturma

  1. Developer Console'a gidin.
  2. Proje Oluştur'u tıklayın, proje için bir ad girin ve Proje Oluştur'u tıklayın.

Projeyi Adlandırın

Buluttan buluta entegrasyonu seçin

Geliştirici Konsolu'ndaki Proje Ana Sayfası'nda Buluttan buluta bölümünde Buluttan buluta entegrasyon ekle'yi seçin.

Buluttan buluta entegrasyon ekleme

Firebase CLI'yi yükleme

Firebase Komut Satırı Arayüzü (CLI), web uygulamalarınızı yerel olarak yayınlamanıza ve web uygulamanızı Firebase Hosting'e dağıtmanıza olanak tanır.

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

npm install -g firebase-tools

CLI'nin doğru şekilde yüklendiğini doğrulamak için şunları çalıştırın:

firebase --version

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

firebase login

Firebase projesi oluşturma

  1. Firebase'e gidin.
  2. Proje oluştur'u tıklayın ve projenizin adını girin.
  3. Sözleşme onay kutusunu işaretleyin ve Devam'ı tıklayın. Sözleşme onay kutusu yoksa bu adımı atlayabilirsiniz.
    Firebase projesi oluşturun
  4. Firebase projeniz oluşturulduktan sonra proje kimliğini bulun. Projeye Genel Bakış'a gidin ve ayarlar simgesini > Proje Ayarları'nı tıklayın.
    Proje ayarlarını açma
  5. Projeniz Genel sekmesinde listelenir.
    Genel proje ayarları

HomeGraph API'yi etkinleştirme

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

Google Cloud Console'da, Actions ile eşleşen projeyi seçtiğinizden emin olun <firebase-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ı oluşturduğunuza göre, her şeyin doğru şekilde yapılandırıldığından emin olmak için başlangıç projesini dağıtabilirsiniz.

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-traits.git

İndirilen ZIP dosyasının sıkıştırmasını 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 izlemek için ön uç kullanıcı arayüzü.
  • functions: Firebase için Cloud Functions ve Firebase Realtime Database ile akıllı çamaşır makinesini yöneten, tamamen uygulanmış bir bulut hizmeti.

Sağlanan bulut istek karşılama, index.js'te 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 intent karşılama uç noktası
  • reportstate: Cihaz durumunda değişiklik olduğunda 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, ardından Firebase CLI'yi entegrasyon projenizle ayarlayın:

cd washer-start
firebase use <firebase-project-id>

Firebase projesini yapılandırma

Firebase projesini başlatın.

firebase init

CLI özelliklerini, Gerçek Zamanlı Veritabanı'nı, İşlevler'i 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 başlatı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ıç projesi kodunu kullandığınız için 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 kod tabanını başlatmak veya üzerine yazmak isteyip istemediğiniz sorulduğunda Üzerine yaz'ı seçin.

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

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

? 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 functions/.gitignore dosyasını başlatmak veya üzerine yazmak isteyip istemediğ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, barındırma ayarlarınızı proje kodundaki public dizinini ve mevcut index.html dosyasını kullanacak şekilde yapılandırı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 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. Benzer ada sahip .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ükleyip projenizi yapılandırdığınıza göre uygulamayı ilk kez çalıştırmaya 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>.web.app

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

Web uygulamasını görüntülemek için tarayıcınızda (https://<firebase-project-id>.web.app) Barındırma URL'sini 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 bir üçüncü taraf platformunu temsil eder. Veritabanınıza cihaz bilgileri 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 Geliştirici Konsolu'nu kullanarak Google Asistan'a bağlama zamanı.

Developer Console projenizi yapılandırma

Geliştir sekmesinde, etkileşiminiz için bir Görünen Ad ekleyin. Bu ad, Google Home uygulamasında görünür.

Görünen ad ekleme

Uygulama markalama bölümünde, uygulama simgesi için 144 x 144 piksel boyutunda ve .png adlı bir png dosyası yükleyin.

Uygulama simgesi ekleme

Hesap bağlama özelliğini etkinleştirmek için şu hesap bağlama ayarlarını kullanın:

İstemci Kimliği

ABC123

İstemci gizli anahtarı

DEF456

Yetkilendirme URL'si

https://us-central1-
.cloudfunctions.net/fakeauth

Jeton URL'si

https://us-central1-
.cloudfunctions.net/faketoken

Hesap bağlama URL&#39;lerini güncelleme

Cloud istek karşılama URL'si bölümüne, akıllı ev intent'leri için istek karşılama sağlayan Cloud Functions işlevinizin URL'sini girin.

https://us-central1--cloudfunctions.net/smarthome

Cloud Functions işlevi URL&#39;si ekleme

Proje yapılandırmanızı kaydetmek için Kaydet'i, ardından projenizde testi etkinleştirmek için Sonraki: Test'i tıklayın.

Buluttan buluta entegrasyonunuzu test etme

Artık cihaz durumunu Asistan'a bağlamak için gerekli webhook'ları uygulamaya başlayabilirsiniz.

Buluttan buluta entegrasyonunuzu test etmek için projenizi bir Google Hesabı'na bağlamanız gerekir. Bu sayede, aynı hesapta oturum açmış Google Asistan yüzeyleri ve Google Home uygulaması üzerinden test yapabilirsiniz.

  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 bölümünde) gidin.
  3. Sağ üstteki arama simgesini tıklayın.
  4. Belirli bir test uygulamanızı bulmak için [test] ön ekini kullanarak test uygulamanızı arayın.
  5. İlgili öğeyi seçin. Ardından Google Asistan, hizmetinizle kimlik doğrulaması yapar ve hizmetinizden kullanıcının cihaz listesini sağlamasını isteyen bir SYNC isteği gönderir.

Google Home uygulamasını açıp çamaşır makinenizi görebildiğinizi doğrulayın.

ae252220753726f6.png

Google Home uygulamasında sesli komutları kullanarak çamaşır makinesini kontrol edebildiğinizi doğrulayın. Ayrıca, buluttan sipariş tamamlama işleminizin ön uç web kullanıcı arayüzünde cihaz durumunun değiştiğini göreceksiniz.

Temel bir yıkayıcı dağıttığınıza göre cihazınızdaki modları özelleştirebilirsiniz.

4. Mod ekleme

action.devices.traits.Modes özelliği, bir cihazın bir mod için istediğiniz sayıda ayar almasını sağlar. Bu ayarlardan aynı anda yalnızca biri ayarlanabilir. Çamaşır makinesine, çamaşır yükü boyutunu (küçük, orta veya büyük) tanımlayacak bir mod eklersiniz.

Senkronizasyon yanıtını güncelleme

functions/index.js'daki SYNC yanıtınıza yeni özellik hakkında bilgi eklemeniz gerekir. 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 intent'inize 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üncelleme

Ardından, QUERY yanıtınızı güncelleyerek çamaşır makinesinin mevcut durumunu bildirin.

Gerçek Zamanlı Veritabanı'nda depolanan durumu 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üncelleme

Son olarak, reportstate işlevinizi, çamaşır makinesinin mevcut yük ayarını Home Graph'a 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 entegrasyonu 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 tetikler.

bf4f6a866160a982.png

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

"Ok Google, çamaşır makinesinin yükünü büyük olarak ayarla."

Ayrıca, çamaşır makinenizle ilgili şu gibi sorular da sorabilirsiniz:

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

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

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

Senkronizasyon yanıtını güncelleme

SYNC yanıtınıza yeni cihaz özelliğiyle ilgili bilgileri eklemeniz gerekir. 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 intent'inize 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üncelleme

Son olarak, çamaşır makinesinin turbo modunu bildirmek için QUERY yanıtınızı güncellemeniz gerekir. Açma/kapatma durumunu, Gerçek Zamanlı Veritabanı'nda 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,
    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 turbo ayarına ayarlanıp ayarlanmadığını Home Graph'a 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 istek senkronizasyonunu tetiklemek için web kullanıcı arayüzündeki Yenile ae8d3b25777a5e30.png düğmesini tıklayın.

Artık çamaşır makinesini turbo moduna ayarlamak için şu komutu verebilirsiniz:

"Ok Google, çamaşır makinesini turbo moduna al."

Ayrıca çamaşır makinenizin turbo modda olup olmadığını şu şekilde de kontrol edebilirsiniz:

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

6. Hataları ve istisnaları bildirme

Buluttan buluta entegrasyonunuzda hata işleme, sorunlar EXECUTE ve QUERY yanıtlarının başarısız olmasına neden olduğunda kullanıcılara bildirmenize olanak tanır. Bildirimler, kullanıcılarınız akıllı cihazınız ve entegrasyonunuzla etkileşime geçtiğinde daha olumlu bir kullanıcı deneyimi sağlar.

EXECUTE veya QUERY isteği her başarısız olduğunda entegrasyonunuz bir hata kodu döndürmelidir. Örneğin, kullanıcı çamaşır makinesini kapağı açıkken başlatmaya çalıştığında hata mesajı göstermek istiyorsanız EXECUTE yanıtınız aşağıdaki kod snippet'ine benzer:

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

Artık kullanıcı çamaşır makinesini başlatmasını istediğinde Asistan şu yanıtı veriyor:

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

İstisnalar hatalara benzer ancak bir uyarının bir komutla ilişkilendirildiğini gösterir. Bu uyarı, başarılı yürütmeyi engelleyebilir veya engellemeyebilir. İstisnalar, StatusReport özelliğini kullanarak pil seviyesi veya son durum değişikliği gibi ilgili bilgileri sağlayabilir. Engellemeyen istisna kodları SUCCESS durumuyla birlikte, engelleyen istisna kodları ise EXCEPTIONS durumuyla birlikte döndürülür.

İstisna içeren ö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 şu yanıtı verir:

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

Çamaşır makineniz için hata raporlaması eklemek üzere functions/index.js dosyasını açın ve aşağıdaki kod snippet'inde gösterilen 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(
        updateDevice(execution, device.id)
        .then((data) => {
          ...
        })
        //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 hata kodlarını kullanıcılarınıza bildirebilir. Sonraki bölümde bu konuyla ilgili bir örnek göreceksiniz.

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

Cihazınızda güvenliğinin sağlanması gereken veya belirli bir yetkili kullanıcı grubuyla sınırlandırılması gereken modlar (ör. yazılım güncellemesi veya kilit açma) varsa entegrasyonunuza ikincil kullanıcı doğrulamasını uygulamanız gerekir.

Güvenlik sorgusunun her seferinde mi yoksa belirli kriterleri karşılaması gerekip gerekmediğine göre özelleştirerek tüm cihaz türleri ve özelliklerinde ikincil kullanıcı doğrulamasını uygulayabilirsiniz.

Desteklenen üç tür doğrulama vardır:

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

Bu kod laboratuvarının amacı, çamaşır makinesini açma komutuna bir ackNeeded istemi ve ikincil doğrulama istemi başarısız olursa hata döndürme işlevi eklemektir.

functions/index.js dosyasını açın ve aşağıdaki kod snippet'inde gösterildiği gibi hata kodunu ve istem 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ı 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(

        updateDevice(execution, device.id)
        .then((data) => {
          ...
        })
        .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 makinesini açmak veya kapatmak için açık bir 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."

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 buluttan buluta entegrasyonların özelliklerini genişlettiniz ve ikincil kullanıcı doğrulaması ile bunların 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 durumunuzu değiştirmek için farklı bir ikincil kullanıcı doğrulama istemi türü kullanın.
  • Dinamik olarak güncellenmesi için RunCycle özelliği SORGU yanıtını güncelleyin.
  • Bu GitHub örneğini inceleyin.