Yerel karşılamayı desteklemek için aşağıdaki akıllı ev intent'lerini işleyecek bir uygulama oluşturmanız gerekir:
IDENTIFY: Yerel olarak kontrol edilebilen akıllı cihazların keşfedilmesini destekler. Intent işleyici, akıllı cihazınızın keşif sırasında 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ı) Bir hub (veya köprü) cihazının arkasındaki yerel olarak kontrol edilebilir uç cihazların keşfedilmesini destekler.
Bu uygulama, kullanıcının Google Home veya Google Nest cihazlarında çalışır ve akıllı cihazınızı Asistan'a bağlar. Uygulamayı TypeScript (tercih edilen) veya JavaScript kullanarak oluşturabilirsiniz.
Uygulamanızın döndürdüğü verilerin platformun beklediği türlerle eşleştiğinden statik olarak emin olmak için bağlamalardan yararlanabileceğinizden TypeScript önerilir.
API hakkında daha fazla bilgi için Local Home SDK API referansı'na bakın.
Aşağıdaki snippet'lerde, yerel karşılama uygulamasını nasıl başlatabileceğiniz ve işleyicilerinizi nasıl ekleyebileceğiniz gösterilmektedir.
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şturma
Yerel sipariş karşılama uygulamanızı dağıtmak için kodunuz ve tüm bağımlılıkları için bir JavaScript paketi oluşturmanız gerekir.
Tercih ettiğiniz paketleyici yapılandırmasıyla uygun proje yapısını başlatmak için yerel karşılama uygulaması proje başlatıcısını kullanın.
Proje şablonları
Paketleyici yapılandırmanızı seçmek için aşağıdaki örneklerde gösterildiği gibi npm init komutunu çalıştırın:
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 yerine, yerel karşılama uygulaması projesini içerecek yeni bir dizin girin.
webpack paketleyici yapılandırmasıyla TypeScript:
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 yerine, yerel karşılama uygulaması projesini içerecek yeni bir dizin girin.
Rollup paketleyici yapılandırmasıyla TypeScript:
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 yerine, yerel karşılama uygulaması projesini içerecek yeni bir dizin girin.
Parcel paketleyici yapılandırmasıyla TypeScript:
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 yerine, yerel karşılama uygulaması projesini içerecek yeni bir dizin girin.
Proje düzeyinde sık gerçekleştirilen görevleri yapma
Oluşturulan proje, aşağıdaki npm komut dosyalarını destekler:
cd project-directory/ npm run build
Bu komut dosyası, TypeScript kaynağını derler ve uygulamanızı, dist/web alt dizinindeki Chrome çalışma zamanı ortamı ve dist/node alt dizinindeki Node.js çalışma zamanı ortamı için 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 çıkış üretmeden kodu derler ve test.ts dizinindeki otomatik testleri çalıştırır.
cd project-directory/ npm run start
Geliştirme sırasında bu komut dosyası, Chrome ve Node.js çalışma zamanı ortamları için uygulama paketlerinizi yerel olarak sunar.
IDENTIFY işleyicisini uygulama
IDENTIFY işleyici, Google Home veya Google Nest cihazı yeniden başlatıldığında ve doğrulanmamış yerel cihazları (bir hub'a bağlı uç cihazlar dahil) gördüğünde tetiklenir. Yerel Ev platformu, daha önce belirttiğiniz tarama yapılandırması bilgilerini kullanarak yerel cihazları tarar ve tarama sonuçlarıyla birlikte IDENTIFY işleyicinizi çağırır.
Yerel Ev platformundan gelen IdentifyRequest, bir LocalIdentifiedDevice örneğinin tarama verilerini içerir. Cihazı keşfeden tarama yapılandırmasına göre yalnızca bir device örneği doldurulur.
Tarama sonuçları cihazınızla eşleşirse IDENTIFY işleyiciniz, akıllı ev meta verilerini (türler, özellikler ve rapor durumu gibi) içeren bir device nesnesi barındıran IdentifyResponsePayload nesnesi döndürmelidir.
IDENTIFY yanıtındaki verificationId, SYNC yanıtı tarafından döndürülen otherDeviceIds değerlerinden biriyle eşleşirse Google bir cihaz ilişkilendirmesi oluşturur.
Örnek
Aşağıdaki snippet'lerde, bağımsız cihaz ve hub entegrasyonları için IDENTIFY işleyicileri nasıl oluşturabileceğiniz gösterilmektedir.
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; };
Bir hub'ın arkasındaki cihazları tanımlama
Google bir hub cihazı tespit ederse hub'ı, bağlı uç cihazlarına giden kanal olarak değerlendirir ve bu uç cihazları doğrulamaya çalışır.
Google'ın bir hub cihazının mevcut olduğunu onaylamasını sağlamak için IDENTIFY işleyicinizle ilgili aşağıdaki talimatları uygulayın:
SYNCyanıtınız, hub'a bağlı yerel uç cihazların kimliklerini bildiriyorsaIdentifyResponsePayloadiçindeisProxydeğerinitrueolarak ayarlayın.SYNCyanıtınız, hub cihazınızı bildirmiyorsaIdentifyResponsePayloadiçindeisLocalOnlydeğerinitrueolarak ayarlayın.device.idalanı, hub cihazın yerel cihaz kimliğini içerir.
REACHABLE_DEVICES işleyicisini uygulama (yalnızca hub entegrasyonları)
REACHABLE_DEVICES intent'i, yerel olarak kontrol edilebilecek uç cihazları onaylamak için Google tarafından gönderilir. Bu intent, hub'ın internete bağlı olduğu algılandığı sürece Google her keşif taraması yaptığında (yaklaşık dakikada bir) tetiklenir.
REACHABLE_DEVICES işleyicisini, IDENTIFY işleyicisine benzer şekilde uygularsınız. Ancak işleyicinizin, yerel proxy (yani hub) cihazı tarafından erişilebilen ek cihaz kimliklerini toplaması gerekir. device.verificationId alanı, hub'a bağlı bir uç cihazın yerel cihaz kimliğini içerir.
Yerel Ev platformundan gelen ReachableDevicesRequest, LocalIdentifiedDevice örneği içerir.
Bu örnek aracılığıyla proxy cihaz kimliğini ve tarama sonuçlarından elde edilen verileri alabilirsiniz.
REACHABLE_DEVICES işleyiciniz, hub'ın kontrol ettiği uç cihazları temsil eden verificationId değerlerinden oluşan bir dizi içeren devices nesnesini barındıran bir ReachableDevicesPayload nesnesi döndürmelidir. verificationId değerleri, SYNC yanıtındaki otherDeviceIds değerlerinden biriyle eşleşmelidir.
Aşağıdaki snippet'te, REACHABLE_DEVICES işleyicinizi nasıl oluşturabileceğiniz gösterilmektedir.
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 mevcut bir protokol üzerinden akıllı cihazlarınıza erişmek için Yerel Home SDK'yı kullanır.
Yerel Ev platformu, bulut karşılama hizmetinize EXECUTE intent'i için gönderdiği giriş yükünü EXECUTE işleyici işlevine de gönderir. Benzer şekilde, EXECUTE işleyiciniz, EXECUTE niyetini işlerken elde edilenle aynı biçimde çıkış verileri döndürür.
Yanıt oluşturma işlemini basitleştirmek için Yerel Ev SDK'sının sağladığı Execute.Response.Builder sınıfını kullanabilirsiniz.
Uygulamanızın cihazın IP adresine doğrudan erişimi yoktur. Bunun yerine,
UDP, TCP veya HTTP protokollerinden birini temel alan komutlar oluşturmak için
CommandRequest
arayüzünü kullanın. Ardından, komutları göndermek için deviceManager.send() işlevini çağırın.
Komutları cihazlara yönlendirirken cihazla iletişim kurmak için SYNC yanıtındaki cihaz kimliğini (ve varsa customData alanındaki parametreleri) kullanın.
Örnek
Aşağıdaki kod snippet'inde, EXECUTE işleyicinizi nasıl oluşturabileceğiniz gösterilmektedir.
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ını kullanır.
Yerel Ev platformu, bulut sipariş karşılama hizmetinize QUERY amacıyla gönderilen istek yükünü "QUERY" işleyici işlevine de iletir. Benzer şekilde, QUERY işleyiciniz, QUERY niyetini işlerken kullandığı biçimde veri döndürür.
Bir hub'ın arkasındaki cihazlara komut gönderme
Bir merkezin arkasındaki uç cihazları kontrol etmek için, merkeze gönderilen protokole özgü komut yükünde ek bilgiler sağlamanız gerekebilir. Böylece merkez, komutun hangi cihazı hedeflediğini belirleyebilir. Bazı durumlarda bu, doğrudan device.id değerinden çıkarılabilir ancak bu mümkün olmadığında bu ek verileri customData alanının bir parçası olarak eklemeniz gerekir.
Uygulamanızı TypeScript kullanarak oluşturduysanız uygulamanızı JavaScript'e derlemeyi unutmayın. Kodunuzu yazmak için istediğiniz modül sistemini kullanabilirsiniz. Hedefinizin Chrome Tarayıcı tarafından desteklendiğinden emin olun.