Yerel sipariş karşılama uygulamasını uygulayın

Yerel sipariş karşılamayı desteklemek için bunları işleyecek bir uygulama geliştirmeniz gerekir akıllı ev amaçları:

  • IDENTIFY: Yerel olarak kontrol edilebilen akıllı cihazların keşfedilmesini destekler. İlgili içeriği oluşturmak için kullanılan intent işleyici, keşif sırasında akıllı cihazınızın döndürdüğü verileri ayıklar ve bunu Google'a yanıt olarak gönderir.
  • EXECUTE: Komutların yürütülmesini destekler.
  • QUERY: Cihaz durumunu sorgulamayı destekler.
  • REACHABLE_DEVICES: (İsteğe bağlı) Yerel olarak kontrol edilebilir öğelerin keşfini destekler bir merkez (veya köprü) cihazının arkasındaki son cihazlar.

Bu uygulama, kullanıcının Google Home veya Google Nest cihazlarında çalışır ve akıllı cihazınızı Asistan Uygulamayı TypeScript (tercih edilen) veya JavaScript kullanarak oluşturabilirsiniz.

TypeScript önerilir çünkü bağlamalar uygulamanızın döndürdüğü verilerin olması gerekiyor.

API hakkında daha fazla bilgi için Local Home SDK API referansı.

Aşağıdaki snippet'ler yerel sipariş karşılama uygulamasını ilk kullanıma nasıl hazırlayabileceğinizi ve işleyicilerinizi ekleyin.

Bağımsız
import App = smarthome.App;
const localHomeApp: App = new App("1.0.0");
localHomeApp
  .onIdentify(identifyHandler)
  .onExecute(executeHandler)
  .listen()
  .then(() => {
    console.log("Ready");
  });
Merkez
import App = smarthome.App;
const localHomeApp: App = new App("1.0.0");
localHomeApp
  .onIdentify(identifyHandler)
  .onReachableDevices(reachableDevicesHandler)
  .onExecute(executeHandler)
  .listen()
  .then(() => {
    console.log("Ready");
  });

Projenizi oluşturun

Yerel sipariş karşılama uygulamanızı dağıtmak için bir JavaScript paketi oluşturmanız gerekir ve tüm bağımlılıkları için geçerli olacaktır.

Yerel sipariş karşılama uygulaması projesini kullanın başlatıcı uygun proje yapısını, tercih ettiğiniz paketleyici ile önyüklemek için yapılandırma.

Proje şablonları

Paketleyici yapılandırmanızı seçmek için npm init komutunu şurada gösterildiği gibi çalıştırın: şu örneklere bakabilirsiniz:

Hiçbiri

Paketleyici yapılandırması olmayan TypeScript:

npm init @google/local-home-app project-directory/ --bundler none

Proje yapısı:

project-directory/
├── node_modules/
├── package.json
├── .gitignore
├── index.ts
├── test.ts
├── tsconfig.json
├── tslint.json
└── serve.js

project-directory komutunu, şunu içeren yeni bir dizinle değiştirin: yerel sipariş karşılama uygulaması projesidir.

ziyaret edin.
Web Paketi

TypeScript içeren webpack paketleyici yapılandırma:

npm init @google/local-home-app project-directory/ --bundler webpack

Proje yapısı:

project-directory/
├── node_modules/
├── package.json
├── .gitignore
├── index.ts
├── test.ts
├── tsconfig.json
├── tslint.json
├── webpack.config.web.js
├── webpack.config.node.js
└── serve.js

project-directory komutunu, şunu içeren yeni bir dizinle değiştirin: yerel sipariş karşılama uygulaması projesidir.

ziyaret edin.
Birleştirme

Rollup ile TypeScript paketleyici yapılandırması:

npm init @google/local-home-app project-directory/ --bundler rollup

Proje yapısı:

project-directory/
├── node_modules/
├── package.json
├── .gitignore
├── index.ts
├── test.ts
├── tsconfig.json
├── tslint.json
├── rollup.config.js
└── serve.js

project-directory komutunu, şunu içeren yeni bir dizinle değiştirin: yerel sipariş karşılama uygulaması projesidir.

ziyaret edin.
Kargo

Parcel ile TypeScript paketleyici yapılandırması:

npm init @google/local-home-app project-directory/ --bundler parcel

Proje yapısı:

project-directory/
├── node_modules/
├── package.json
├── .gitignore
├── index.ts
├── test.ts
├── tsconfig.json
├── tslint.json
└── serve.js

project-directory komutunu, şunu içeren yeni bir dizinle değiştirin: yerel sipariş karşılama uygulaması projesidir.

Proje düzeyindeki yaygın görevleri gerçekleştirme

Oluşturulan proje şu npm'yi destekler: komut dosyaları:

Paket
cd project-directory/
npm run build

Bu komut dosyası, TypeScript kaynağını derler ve uygulamanızı, dist/web alt dizininde ve dist/node alt dizinindeki Node.js çalışma zamanı ortamında Chrome çalışma zamanı ortamına olan bağımlılıklarıyla birlikte paketler.

ziyaret edin.
Doğrula
cd project-directory/
npm run lint
npm run compile
npm test

Bu komut dosyası, TypeScript kodunuzun söz dizimini doğrular, dist/ alt dizininde herhangi bir çıktı oluşturmadan derler ve test.ts üzerinden otomatik testler çalıştırır.

ziyaret edin.
Yayınlayın
cd project-directory/
npm run start

Bu komut dosyası, geliştirme sırasında Chrome ve Node.js çalışma zamanı ortamları için uygulama paketlerinizi yerel olarak sunar.

IDENTIFY işleyicisini uygulama

Google Home veya Google Nest cihazı yeniden başlatıldığında IDENTIFY işleyici tetiklenir. Doğrulanmamış yerel cihazları görür (bir merkeze bağlı son cihazlar dahil). İlgili içeriği oluşturmak için kullanılan Yerel Ev platformu, tarama yapılandırma bilgilerini kullanarak yerel cihazları tarar ve tarama sonuçlarını içeren IDENTIFY işleyicinizi çağırın.

İlgili içeriği oluşturmak için kullanılan IdentifyRequest yerel ev platformundaki bir arama motorunun tarama verilerini LocalIdentifiedDevice kullanır. Tarama yapılandırmasına göre yalnızca bir device örneği doldurulur ilk adımıdır.

Tarama sonuçları cihazınızla eşleşiyorsa IDENTIFY işleyiciniz bir IdentifyResponsePayload içeren device nesnesini içeren akıllı ev meta verileri (ör. türler, özellikler ve rapor durumu)

Google, aşağıdaki durumlarda cihaz ilişkilendirmesi oluşturur IDENTIFY yanıtındaki verificationId şunlardan biriyle eşleşiyor: SYNC yanıtı tarafından otherDeviceIds değer döndürüldü.

Örnek

Aşağıdaki snippet'lerde aşağıdakiler için IDENTIFY işleyicilerini nasıl oluşturabileceğiniz gösterilmektedir bağımsız cihaz ve hub entegrasyonlarını kullanabilirsiniz.

Bağımsız
const identifyHandler = (request: IntentFlow.IdentifyRequest):
  IntentFlow.IdentifyResponse => {

    // Obtain scan data from protocol defined in your scan config
    const device = request.inputs[0].payload.device;
    if (device.udpScanData === undefined) {
      throw Error("Missing discovery response");
    }
    const scanData = device.udpScanData.data;

    // Decode scan data to obtain metadata about local device
    const verificationId = "local-device-id";

    // Return a response
    const response: IntentFlow.IdentifyResponse = {
      intent: Intents.IDENTIFY,
      requestId: request.requestId,
      payload: {
        device: {
          id: device.id || "",
          verificationId, // Must match otherDeviceIds in SYNC response
        },
      },
    };
    return response;
  };
Merkez
const identifyHandler = (request: IntentFlow.IdentifyRequest):
  IntentFlow.IdentifyResponse => {

    // Obtain scan data from protocol defined in your scan config
    const device = request.inputs[0].payload.device;
    if (device.udpScanData === undefined) {
      throw Error("Missing discovery response");
    }
    const scanData = device.udpScanData.data;

    // Decode scan data to obtain metadata about local device
    const proxyDeviceId = "local-hub-id";

    // Return a response
    const response: IntentFlow.IdentifyResponse = {
      intent: Intents.IDENTIFY,
      requestId: request.requestId,
      payload: {
        device: {
          id: proxyDeviceId,
          isProxy: true,     // Device can control other local devices
          isLocalOnly: true, // Device not present in `SYNC` response
        },
      },
    };
    return response;
  };

Hub arkasındaki cihazları tanımlama

Google bir hub cihazı tanımlarsa çoğaltıcıyı, bağlantı noktası olarak değerlendirir ve bu son cihazları doğrulamaya çalışın.

Google'ın hub cihazın mevcut olduğunu onaylaması için şu adımları uygulayın: IDENTIFY işleyiciniz için talimatlar:

  • SYNC yanıtınızda hub'daki isProxy öğesini şurada true olarak ayarlayın: IdentifyResponsePayload.
  • SYNC yanıtınız hub cihazınızı bildirmiyorsa true rolüyle isLocalOnly IdentifyResponsePayload.
  • device.id alanı, hub cihazının yerel cihaz kimliğini içerir.

REACHABLE_Devices işleyicisini uygulayın (yalnızca hub entegrasyonları)

REACHABLE_DEVICES amacı, hangi son cihazların kim olduğunu doğrulamak için Google tarafından gönderilir. yerel olarak kontrol edilebiliyor. Bu amaç, Google tarafından her çalıştırıldığında tetiklenir. keşif taraması (yaklaşık dakikada bir) yalnızca, çevrimiçi olmaktır.

REACHABLE_DEVICES işleyicisini IDENTIFY ile benzer şekilde uygularsınız. (işleyicinizin ek cihaz kimlikleri toplaması gerekmesi dışında) tarafından erişilebilir. İlgili içeriği oluşturmak için kullanılan device.verificationId alanı, bir son cihazın yerel cihaz kimliğini içerir bağlı bir veri noktası türü vardır.

İlgili içeriği oluşturmak için kullanılan ReachableDevicesRequest yerel ev platformu, LocalIdentifiedDevice. Bu örnek aracılığıyla, proxy cihaz kimliğinin yanı sıra tarama sonuçlarını içerir.

REACHABLE_DEVICES işleyiciniz ReachableDevicesPayload şu diziyi içeren devices nesnesini içeren nesne: Hub'ın kontrol ettiği son cihazları temsil eden verificationId değerleri. İlgili içeriği oluşturmak için kullanılan verificationId değerleri,otherDeviceIds SYNC yanıt.

Aşağıdaki snippet, REACHABLE_DEVICES öğenizi nasıl oluşturabileceğinizi gösterir gösterir.

Merkez
const reachableDevicesHandler = (request: IntentFlow.ReachableDevicesRequest):
  IntentFlow.ReachableDevicesResponse => {

    // Reference to the local proxy device
    const proxyDeviceId = request.inputs[0].payload.device.id;

    // Gather additional device ids reachable by local proxy device
    // ...

    const reachableDevices = [
      // Each verificationId must match one of the otherDeviceIds
      // in the SYNC response
      { verificationId: "local-device-id-1" },
      { verificationId: "local-device-id-2" },
    ];

    // Return a response
    const response: IntentFlow.ReachableDevicesResponse = {
      intent: Intents.REACHABLE_DEVICES,
      requestId: request.requestId,
      payload: {
        devices: reachableDevices,
      },
    };
    return response;
  };

EXECUTE işleyicisini uygulama

Uygulamadaki EXECUTE işleyiciniz kullanıcı komutlarını işler ve Yerel Ev SDK'sı ile akıllı cihazlarınıza mevcut bir protokol üzerinden erişebilirsiniz.

Local Home platformu, aynı giriş yükünü EXECUTE işleyiciye iletir işlevi (EXECUTE için olduğu gibi) istediğinize karar verin. Benzer şekilde, EXECUTE işleyiciniz de çıkış verilerini EXECUTE niyetinin işlenmesiyle aynı biçimdedir. Yanıt oluşturma işlemini kolaylaştırmak için Execute.Response.Builder sınıfını da içerir.

Uygulamanızın cihazın IP adresine doğrudan erişimi yok. Bunun yerine her bir CommandRequest arayüzünü kullanarak şu protokollerden birine göre komutlar oluşturabilirsiniz: UDP, TCP veya HTTP. Ardından, deviceManager.send() işlevini kullanın.

Komutları cihazlara hedeflerken, cihaz kimliğini (ve customData alanı (dahil edildiyse) SYNC ile iletişim kurmak için bu bilgileri kontrol edelim.

Örnek

Aşağıdaki kod snippet'i, EXECUTE işleyicinizi nasıl oluşturabileceğinizi göstermektedir.

Bağımsız/Merkez
const executeHandler = (request: IntentFlow.ExecuteRequest):
  Promise<IntentFlow.ExecuteResponse> => {

    // Extract command(s) and device target(s) from request
    const command = request.inputs[0].payload.commands[0];
    const execution = command.execution[0];

    const response = new Execute.Response.Builder()
      .setRequestId(request.requestId);

    const result = command.devices.map((device) => {
      // Target id of the device provided in the SYNC response
      const deviceId = device.id;
      // Metadata for the device provided in the SYNC response
      // Use customData to provide additional required execution parameters
      const customData: any = device.customData;

      // Convert execution command into payload for local device
      let devicePayload: string;
      // ...

      // Construct a local device command over TCP
      const deviceCommand = new DataFlow.TcpRequestData();
      deviceCommand.requestId = request.requestId;
      deviceCommand.deviceId = deviceId;
      deviceCommand.data = devicePayload;
      deviceCommand.port = customData.port;
      deviceCommand.operation = Constants.TcpOperation.WRITE;

      // Send command to the local device
      return localHomeApp.getDeviceManager()
        .send(deviceCommand)
        .then((result) => {
          response.setSuccessState(result.deviceId, state);
        })
        .catch((err: IntentFlow.HandlerError) => {
          err.errorCode = err.errorCode || IntentFlow.ErrorCode.INVALID_REQUEST;
          response.setErrorState(device.id, err.errorCode);
        });
    });

    // Respond once all commands complete
    return Promise.all(result)
      .then(() => response.build());
  };

QUERY işleyicisini uygulama

Uygulamadaki QUERY işleyiciniz kullanıcı isteklerini işler ve Akıllı cihazlarınızın durumunu bildirmek için Yerel Ev SDK'sı.

Local Home platformu, aynı istek yükünü "QUERY" öğesine iletir işleyici QUERY için olduğu gibi işlev görür istediğinize karar verin. Benzer şekilde, QUERY işleyiciniz verileri döndürür QUERY amacının işlenmesiyle aynı biçimdedir.

Bir hub'ın arkasındaki cihazlara komut gönderme

Bir merkez arkasındaki son cihazları kontrol etmek için ek bilgi sağlamanız gerekebilir API'nin veri taşıması için hub'a gönderilen protokole özgü komut yüküne komutun hangi cihaza hedeflendiğini belirleyebilirsiniz. Bazı durumlarda bu, device.id değerinden doğrudan çıkarılabilir. Ancak böyle bir durum söz konusu olmadığında bu ek verileri customData alanının bir parçası olarak eklemelisiniz.

Uygulamanızı TypeScript kullanarak oluşturduysanız, uygulamanızı JavaScript'e dokunun. Kodunuzu yazmak için istediğiniz modül sistemini kullanabilirsiniz. Hedefinizin Chrome tarayıcı tarafından desteklendiğinden emin olun.