Akıllı ev İşlemleri için yerel karşılamayı etkinleştir

1. Başlamadan önce

Akıllı ev entegrasyonları, Google Asistan'ın kullanıcıların evlerindeki bağlı cihazları kontrol etmesine olanak tanır. Akıllı ev İşlemi derlemek için akıllı ev amaçlarını işleyebilen bir Cloud webhook uç noktası sağlamanız gerekir. Örneğin, bir kullanıcı "Ok Google, ışıkları aç" dediğinde Asistan, cihazın durumunu güncellemek için bu komutu bulut karşılama aracınıza gönderir.

Yerel Ev SDK'sı, akıllı ev amaçlarını doğrudan bir Google Home cihazına yönlendiren yerel bir yol ekleyerek akıllı ev entegrasyonunuzu geliştirir. Bu yöntem, güvenilirliği artırır ve kullanıcıların komutlarının işlenmesinde gecikmeyi azaltır. Cihazları tanımlayan ve herhangi bir Google Home akıllı hoparlörde ya da Google Nest akıllı ekranda komut yürüten TypeScript veya JavaScript ile yerel bir istek karşılama uygulaması yazıp dağıtmanıza olanak tanır. Ardından uygulamanız, komutları yerine getirmek için mevcut standart protokolleri kullanarak yerel ağ üzerinden kullanıcıların mevcut akıllı cihazlarıyla doğrudan iletişim kurar.

72ffb320986092c.png

Ön koşullar

Derlemeniz

Bu codelab'de, Firebase ile önceden oluşturulmuş bir akıllı ev entegrasyonunu dağıtacak, ardından Actions console'da bir tarama yapılandırması uygulayacak ve Node.js'de yazılmış komutları bir sanal çamaşır makinesine göndermek için TypeScript'i kullanarak yerel bir uygulama oluşturacaksınız.

Neler öğreneceksiniz?

  • Actions Console'da yerel istek karşılama özelliğini etkinleştirme ve yapılandırma.
  • Yerel sipariş karşılama uygulaması yazmak için Yerel Ev SDK'sı nasıl kullanılır?
  • Google Home hoparlörde veya Google Nest akıllı ekranda yüklü yerel sipariş karşılama uygulamasının hatalarını ayıklama.

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.

AZWF

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

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

36RsBUWBgbgsa5xZ7MJVMm1sIg07nXbfjv0mWCxXViaC5SlbL2gMigw9hgXsZQhNMHLLFOfiKdZsSTNXONFB1i47gksw3SBNpkVYl492WeryOLlgxKtp-ZtkZ-Ort

Akıllı ev deneyim kartını seçin. Bunu yaptığınızda proje konsolunuza yönlendirilirsiniz.

pzgHPsmc2LvLoeUvJfkjKQqD_BvO4v8JOPlcrxsmyptFkkjL4PP6LqrM9r5tNvEIfT9HmK-UKw3GWFPXTjqo4nUrhD2o5shUKHBE31OT8iIA69JZCev7_0_nh-lnL2oJHoxGfqqZ4w

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.

5SVCzM8IZLi_9DV8M0nEklv16NXkpvM0bIzQK2hSyKyvnFHBxPOz90rbr72ayxzmxd5aNROOqC_Cp4outbdlwJdObDs0DIE_8vYzw6dovoVrP9IZWlWsZxDS7UHOi1jiRbDMG8MqUA

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

Proje hakkında

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

  • public: Akıllı yıkayıcıyı kontrol etmek ve izlemek için ön uç web kullanıcı arayüzü
  • functions: Akıllı ev işlemi için bulut istek karşılama özelliğini uygulayan Cloud Functions işlevleri
  • local: Amaç işleyicileri içeren iskelet yerel istek karşılama uygulama projesi index.ts içinde oluşturulmuştur

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 HomeGraph API'yi çağırır
  • updateDevice: Rapor Durumunu tetiklemek için sanal cihaz tarafından kullanılan uç nokta

Firebase'e bağlanma

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

cd app-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 yapılandırmanızın doğru ve eksiksiz olduğundan emin olmak için firebase.json dosyasını washer-done dizininden washer-start dizinine kopyalayıp washer-start'deki dosyanın üzerine yazın.

washer-start dizininde:

cp -vp ../washer-done/firebase.json .

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:

L60eA7MOnPmbBMl2XMipT9MdnP-RaVjyjf0Y93Y1b7mEyIsqZrrwczE7D3RQISRs-iusL1g4XbNmGhuA6-5sLcWefnczwNJEPfNLtwBsO4Tb9YvcAZBI6_rX19z8rxbik9Vq8F2fwg

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

Uso-o00XQXBHvOR9vQq9tmpYDYQJKsFEstsgRFnxPAJf7zJ2FxwhISiodo3dB1Tz49Okd6ivi66fjpo7rarS_GZelglGWCT1r9FzDGUl1r67ddIcIbQrxqN8jG9F9GAKOpk0Ckc-eA

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.

gvC-TvmKDy-D-xjwkeCjNt__9ErA7DL8hZWa1oH1yPJ9SpYOepDYjxx6WnJ56IG-t37fJ65kmHISQdh72Ot2G-0tu6Flxf4gom5kvx_3hlvFeMqYuFgXr_85pfWWn7VLFHtS55p1zw

s4yc1kOW4XtKUQN1EYegiDLU5oTqmxQ2PNbeaujm26OQmYKKpjug7j5FYmutLSAZ1zBd-ZkcZlL7zyTZqw4bge3_oOeWvJTsqJ-A08vfZwImYQrKiquLskLuTpmMqXEZD1xchhCWGQ

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

rRyZTiBSTuPk3YtJtXjDK1pPftUxsaEhs9jzpvFtbHTD6bEwYxM8jV4MWxiljKA1bKVZrIRoO9O3jtBefLKf_OyMpukPjwIj8zGvyU3UwASzMrnRskl-hVAfAmQVi4sC_zAwgYwRXw

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.

OgUvpQfXioygkRwPcaJpzjyNQDZy6enidUC8YMPaCOrZi0YeWCFsCJV9Gqg-_UfsqTnn4KEg--uE3Ymr0QuamDonF4RyYHtRKcULXABDuaEnj2hq8i20LYj1SrGP_1lQ_UsUB90pGw

Simulator sayfasına yönlendirilirsiniz. Farenizi Cihazda Test ( SoCeBB1CkSIEqsBmDc8Cth6EjgcXUnrOHeOpLNlvMiiXM73Rmh8iBK1ZFLFd47kycYqIMq3Fm49ryAGUt79BXVPDyEB1IU3W0fgiL49iqTAVrpRszqV1qTAVrpRszZL1qMiiXM73Rmh8iBK1ZFLFd47kycYqIMq3) simgesinin üzerine getirerek projeniz için testin etkinleştirildiğini doğrulayın.

2zbfeYpG-wEd2SFP07Wc4mJzHakLX7YvrNw3IV0_0Kd-TonfsKIvvjKWlwvrmTm5jLj3XPWqCtcDd5J2z6gwn9fnchpYVraw1j_mE4M0LVppAl5WY5cK7g0uZyhZ3VFFS25yPmyksg

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.

XcWmBVamBZtPfOFqtsr5I38stPWTqDcMfQwbBjetBgxt0FCjEs285pa9K3QXSASptw0KYN2G8yfkT0-xg664V4PjqMreDDs-HPegHjOc4EVtReYPu-WKZyygq9Xmkf8X8z9177nBjQ

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

Artık İşleminize yerel sipariş karşılama özelliği eklemeye başlayabilirsiniz.

4. Bulut istek karşılamayı güncelle

Yerel istek karşılamayı desteklemek üzere Cloud SYNC yanıtına, cihaz için benzersiz bir yerel tanımlayıcı içeren otherDeviceIds adlı yeni bir cihaz başına alan eklemeniz gerekir. Bu alan, söz konusu cihazı yerel olarak kontrol etme olanağını da gösterir.

otherDeviceIds alanını, aşağıdaki kod snippet'inde gösterildiği gibi SYNC yanıtına ekleyin:

functions/index.js

app.onSync((body) => {
  return {
    requestId: body.requestId,
    payload: {
      agentUserId: '123',
      devices: [{
        id: 'washer',
        type: 'action.devices.types.WASHER',
        traits: [ ... ],
        name: { ... },
        deviceInfo: { ... },
        willReportState: true,
        attributes: {
          pausable: true,
        },
        otherDeviceIds: [{
          deviceId: 'deviceid123',
        }],
      }],
    },
  };
});

Güncellenen projeyi Firebase'e dağıtı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, bir Senkronizasyon İsteği işlemini tetikler ve Asistan'ın güncellenmiş SYNC yanıt verilerini alır.

bf4f6a866160a982.png

5. Yerel istek karşılamayı yapılandırın

Bu bölümde, akıllı ev İşleminize yerel sipariş karşılama için gerekli yapılandırma seçeneklerini ekleyeceksiniz. Geliştirme sırasında yerel sipariş karşılama uygulamasını, Google Home cihazının erişip indirebileceği Firebase Hosting'de yayınlarsınız.

Actions Console'da Geliştirme > İşlemler'i seçip Yerel ana sayfa SDK'sını yapılandır bölümünü bulun. Test URL'si alanına aşağıdaki URL'yi girin, proje kimliğinizi ekleyin ve Kaydet'i tıklayın:

https://<project-id>.web.app/local-home/index.html

7d59b31f8d2a988.png

Ardından, Google Home cihazının yerel akıllı cihazları nasıl keşfetmesi gerektiğini tanımlamamız gerekir. Yerel Ev platformu, cihaz keşfi için mDNS, UPnP ve UDP yayını gibi çeşitli protokolleri destekler. Akıllı çamaşır makinesini keşfetmek için UDP yayınını kullanacaksınız.

Yeni bir tarama yapılandırması eklemek için Cihaz tarama yapılandırması altında Yeni tarama yapılandırması'nı tıklayın. Protokol olarak UDP'yi seçin ve aşağıdaki özellikleri girin:

Alan

Açıklama

Önerilen değer

Yayın adresi

UDP yayın adresi

255.255.255.255

Yayın bağlantı noktası

Google Home'un UDP yayınını gönderdiği bağlantı noktası

3311

Dinleme bağlantı noktası

Google Home'un yanıtı dinlediği bağlantı noktası

3312

Keşif paketi

UDP yayını veri yükü

48656c6c6f4c6f63616c486f6d6553444b

4777bf63c53b6858.png

Son olarak, yaptığınız değişiklikleri yayınlamak için pencerenin üst tarafındaki Kaydet'i tıklayın.

6. Yerel istek karşılamayı uygulayın

Yerel Ev SDK'sı yazma paketini kullanarak TypeScript'te yerel sipariş karşılama uygulamanızı geliştireceksiniz. Başlangıç projesinde sağlanan iskelete bakın:

local/index.ts

/// <reference types="@google/local-home-sdk" />

import App = smarthome.App;
import Constants = smarthome.Constants;
import DataFlow = smarthome.DataFlow;
import Execute = smarthome.Execute;
import Intents = smarthome.Intents;
import IntentFlow = smarthome.IntentFlow;

...

class LocalExecutionApp {

  constructor(private readonly app: App) { }

  identifyHandler(request: IntentFlow.IdentifyRequest):
      Promise<IntentFlow.IdentifyResponse> {
    // TODO: Implement device identification
  }

  executeHandler(request: IntentFlow.ExecuteRequest):
      Promise<IntentFlow.ExecuteResponse> {
    // TODO: Implement local fulfillment
  }

  ...
}

const localHomeSdk = new App('1.0.0');
const localApp = new LocalExecutionApp(localHomeSdk);
localHomeSdk
  .onIdentify(localApp.identifyHandler.bind(localApp))
  .onExecute(localApp.executeHandler.bind(localApp))
  .listen()
  .then(() => console.log('Ready'))
  .catch((e: Error) => console.error(e));

Yerel istek karşılamanın temel bileşeni smarthome.App sınıfıdır. Başlangıç projesi, IDENTIFY ve EXECUTE amaçları için işleyiciler ekler, ardından Yerel Ev SDK'sına uygulamanın hazır olduğunu bildirmek için listen() yöntemini çağırır.

IDENTIFY işleyicisini ekleyin

Google Home cihazı, Actions konsolunda sağlanan tarama yapılandırmasına göre yerel ağda doğrulanmamış cihazlar tespit ettiğinde, Yerel Ev SDK'sı IDENTIFY işleyicinizi tetikler.

Bu sırada platform, Google eşleşen bir cihaz keşfettiğinde elde edilen tarama verileriyle birlikte identifyHandler işlevini çağırır. Uygulamanızda tarama bir UDP yayını kullanılarak gerçekleştirilir ve IDENTIFY işleyiciye sağlanan tarama verileri, yerel cihaz tarafından gönderilen yanıt yükünü içerir.

İşleyici, yerel cihaz için benzersiz tanımlayıcı içeren bir IdentifyResponse örneği döndürür. Yerel cihazdan gelen UDP yanıtını işlemek ve uygun yerel cihaz kimliğini belirlemek için identifyHandler yönteminize aşağıdaki kodu ekleyin:

local/index .ts

identifyHandler(request: IntentFlow.IdentifyRequest):
    Promise<IntentFlow.IdentifyResponse> {
  console.log("IDENTIFY intent: " + JSON.stringify(request, null, 2));

  const scanData = request.inputs[0].payload.device.udpScanData;
  if (!scanData) {
    const err = new IntentFlow.HandlerError(request.requestId,
        'invalid_request', 'Invalid scan data');
    return Promise.reject(err);
  }

  // In this codelab, the scan data contains only local device id.
  const localDeviceId = Buffer.from(scanData.data, 'hex');

  const response: IntentFlow.IdentifyResponse = {
    intent: Intents.IDENTIFY,
    requestId: request.requestId,
    payload: {
      device: {
        id: 'washer',
        verificationId: localDeviceId.toString(),
      }
    }
  };
  console.log("IDENTIFY response: " + JSON.stringify(response, null, 2));

  return Promise.resolve(response);
}

verificationId alanının, SYNC yanıtınızdaki otherDeviceIds değerlerinden biriyle eşleşmesi gerektiğini unutmayın. Bu değer, cihazın kullanıcının Home Graph'inde cihazın yerel sipariş karşılama için kullanılabilir olarak işaretlenmesini sağlar. Google bir eşleşme bulduğunda bu cihazın doğrulanmış ve yerel olarak sipariş karşılamaya hazır olduğu kabul edilir.

EXECUTE işleyicisini ekleme

Yerel Ev SDK'sı, yerel istek karşılamayı destekleyen bir cihaz bir komut aldığında EXECUTE işleyicinizi tetikler. Yerel amacın içeriği, bulut istek karşılamanıza gönderilen EXECUTE amacına eşdeğer olduğundan amacı yerel olarak işlemenin mantığı, bunu bulutta ele alma şeklinize benzer.

Uygulama, yerel cihazlarla iletişim kurmak için TCP/UDP yuvalarını veya HTTP(S) isteklerini kullanabilir. Bu codelab'de HTTP, sanal cihazı kontrol etmek için kullanılan protokol görevi görür. Bağlantı noktası numarası index.ts içinde SERVER_PORT değişkeni olarak tanımlanır.

Gelen komutları işleyip HTTP üzerinden yerel cihaza göndermek için executeHandler yönteminize aşağıdaki kodu ekleyin:

local/index.ts

executeHandler(request: IntentFlow.ExecuteRequest):
    Promise<IntentFlow.ExecuteResponse> {
  console.log("EXECUTE intent: " + JSON.stringify(request, null, 2));

  const command = request.inputs[0].payload.commands[0];
  const execution = command.execution[0];
  const response = new Execute.Response.Builder()
    .setRequestId(request.requestId);

  const promises: Array<Promise<void>> = command.devices.map((device) => {
    console.log("Handling EXECUTE intent for device: " + JSON.stringify(device));

    // Convert execution params to a string for the local device
    const params = execution.params as IWasherParams;
    const payload = this.getDataForCommand(execution.command, params);

    // Create a command to send over the local network
    const radioCommand = new DataFlow.HttpRequestData();
    radioCommand.requestId = request.requestId;
    radioCommand.deviceId = device.id;
    radioCommand.data = JSON.stringify(payload);
    radioCommand.dataType = 'application/json';
    radioCommand.port = SERVER_PORT;
    radioCommand.method = Constants.HttpOperation.POST;
    radioCommand.isSecure = false;

    console.log("Sending request to the smart home device:", payload);

    return this.app.getDeviceManager()
      .send(radioCommand)
      .then(() => {
        const state = {online: true};
        response.setSuccessState(device.id, Object.assign(state, params));
        console.log(`Command successfully sent to ${device.id}`);
      })
      .catch((e: IntentFlow.HandlerError) => {
        e.errorCode = e.errorCode || 'invalid_request';
        response.setErrorState(device.id, e.errorCode);
        console.error('An error occurred sending the command', e.errorCode);
      });
  });

  return Promise.all(promises)
    .then(() => {
      return response.build();
    })
    .catch((e) => {
      const err = new IntentFlow.HandlerError(request.requestId,
          'invalid_request', e.message);
      return Promise.reject(err);
    });
}

TypeScript uygulamasını derleyin.

local/ dizinine gidin ve TypeScript derleyicisini indirip uygulamayı derlemek için aşağıdaki komutları çalıştırın:

cd local
npm install
npm run build

index.ts (TypeScript) kaynağını derler ve aşağıdaki içerikleri public/local-home/ dizinine yerleştirir:

  • bundle.js: Yerel uygulamayı ve bağımlılıkları içeren derlenmiş JavaScript çıkışı.
  • index.html: Uygulamayı cihaz üzerinde test etmek amacıyla sunmak için kullanılan yerel barındırma sayfası.

Test projesini dağıtma

Google Home cihazından erişebilmek için güncellenen proje dosyalarını Firebase Hosting'e dağıtın.

firebase deploy --only hosting

7. Akıllı çamaşır makinesini çalıştır

Şimdi yerel sipariş karşılama uygulamanız ile akıllı çamaşır makinesi arasındaki iletişimi test etmenin zamanı geldi. Codelab başlangıç projesi, Node.js'de yazılmış ve kullanıcıların yerel olarak kontrol edebileceği bir akıllı çamaşır makinesini simüle eden, vsanal bir akıllı çamaşır makinesi içerir.

Cihazı yapılandırma

Sanal cihazı, Actions Console'da cihaz keşfi için tarama yapılandırmasına uyguladığınız UDP parametrelerini kullanacak şekilde yapılandırmanız gerekir. Ayrıca, cihaz durumu değiştiğinde Rapor Durumu etkinlikleri için sanal cihaza hangi yerel cihaz kimliğinin bildirileceğini ve Actions proje kimliğinin kullanılacağını bildirmeniz gerekir.

Parametre

Önerilen değer

deviceId

deviceid123

discoveryPortOut

3311

discoveryPacket

HelloLocalHomeSDK

projectId

Actions proje kimliğiniz

Cihazı başlat

virtual-device/ dizinine gidin ve yapılandırma parametrelerini bağımsız değişken olarak ileterek cihaz komut dosyasını çalıştırın:

cd virtual-device
npm install
npm start -- \
  --deviceId=deviceid123 --projectId=<project-id> \
  --discoveryPortOut=3311 --discoveryPacket=HelloLocalHomeSDK

Cihaz komut dosyasının beklenen parametrelerle çalıştığını doğrulayın:

(...): UDP Server listening on 3311
(...): Device listening on port 3388
(...): Report State successful

8. TypeScript uygulamasında hata ayıklama

Aşağıdaki bölümde Google Home cihazının yerel ağ üzerinden düzgün şekilde tarama yapabildiğini, tanımlayıp sanal akıllı çamaşır makinesine komut gönderebildiğini doğrulayacaksınız. Google Home cihazına bağlanmak, konsol günlüklerini görüntülemek ve TypeScript uygulamasında hata ayıklamak için Google Chrome Geliştirici Araçları'nı kullanabilirsiniz.

Chrome Geliştirici Araçları'nı bağlama

Hata ayıklayıcıyı yerel sipariş karşılama uygulamanıza bağlamak için şu adımları uygulayın:

  1. Google Home cihazınızı, Actions console projesine erişim izni olan bir kullanıcıya bağladığınızdan emin olun.
  2. Google Home cihazınızı yeniden başlatın. Bu işlem, hem HTML'nizin URL'sini hem de Actions konsoluna yerleştirdiğiniz tarama yapılandırmasını almasını sağlar.
  3. Geliştirme makinenizde Chrome'u başlatın.
  4. Yeni bir Chrome sekmesi açın ve denetleyiciyi başlatmak için adres alanına chrome://inspect yazın.

Sayfada cihazların bir listesini göreceksiniz. Ayrıca Google Home cihazınızın adının altında uygulama URL'niz görünecektir.

567f97789a7d8846.png

İnceleyiciyi başlatma

Chrome Geliştirici Araçları'nı başlatmak için uygulama URL'nizin altında Denetle'yi tıklayın. Console (Konsol) sekmesini seçin ve TypeScript uygulamanız tarafından yazdırılan IDENTIFY intent'inin içeriğini görebildiğinizi doğrulayın.

6b67ded470a4c8be.png

Bu çıkış, yerel sipariş karşılama uygulamanızın sanal cihazı başarıyla keşfettiği ve tanımladığı anlamına gelir.

Yerel sipariş karşılama testi

Google Home uygulamasındaki dokunma kontrollerini kullanarak veya sesli komutlarla Google Home cihazına aşağıdaki gibi komutlar gönderin:

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

"Ok Google, çamaşır makinemi çalıştır."

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

Bu, platformu TypeScript uygulamanıza bir EXECUTE niyeti gönderecek şekilde tetiklemelidir.

bc030517dacc3ac9.png

Her komutla yerel akıllı çamaşır makinesinin durum değişikliğini görebildiğinizi doğrulayın.

...
***** The washer is RUNNING *****
...
***** The washer is STOPPED *****

9. Tebrikler

764dbc83b95782a.png

Tebrikler! Yerel sipariş karşılama özelliğini akıllı ev işlemine entegre etmek için Yerel Ev SDK'sını kullandınız.

Daha fazla bilgi

Şunları da deneyebilirsiniz:

  • Tarama yapılandırmasını değiştirerek çalışmasını sağlayın. Örneğin, farklı bir UDP bağlantı noktası veya keşif paketi kullanmayı deneyin.
  • Sanal akıllı cihaz kod tabanını Raspberry Pi gibi yerleşik bir cihazda çalışacak şekilde değiştirin ve mevcut durumu görselleştirmek için LED'ler veya ekran kullanın.