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.
import App = smarthome.App; const localHomeApp: App = new App("1.0.0"); localHomeApp .onIdentify(identifyHandler) .onExecute(executeHandler) .listen() .then(() => { console.log("Ready"); });
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:
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.
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.
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.
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ı:
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.
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.
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.
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; };
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'dakiisProxy
öğesini şuradatrue
olarak ayarlayın:IdentifyResponsePayload
.SYNC
yanıtınız hub cihazınızı bildirmiyorsatrue
rolüyleisLocalOnly
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.
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.
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.