Yerel sipariş karşılamayı desteklemek için aşağıdaki akıllı ev amaçlarına yönelik bir uygulama oluşturmanız gerekir:
IDENTIFY
: Yerel olarak kontrol edilebilen akıllı cihazların bulunmasını destekler. Amaç işleyici, akıllı cihazınızın keşif sırasında döndürdüğü verileri ayıklar ve 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 merkezi (veya köprü) cihazın arkasında bulunan ve yerel olarak kontrol edilen bitiş cihazlarının bulunmasını 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.
TypeScript, uygulamanızın döndürdüğü verilerin platformun beklediği türlerle eşleştiğinden emin olmak için bağlamalardan yararlandığından önerilir.
API hakkında daha fazla bilgi için Local Home SDK API referansı sayfasına bakın.
Aşağıdaki snippet'lerde yerel sipariş karşılama uygulamasını nasıl başlatabileceğinizi ve işleyicilerinizi nasıl ekleyeceğinizi görebilirsiniz.
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 üzere kodunuz ve tüm bağımlıları için bir JavaScript paketi oluşturmanız gerekir.
Tercih ettiğiniz paketleyici yapılandırmasıyla uygun proje yapısını önyüklemek için yerel sipariş karşılama uygulaması projesini başlatan kullanıcıyı kullanın.
Proje şablonları
Paketleyici yapılandırmanızı seçmek için npm init
komutunu aşağıdaki örneklerde gösterildiği gibi ç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 sipariş karşılama projesini içeren yeni bir dizin girin.
webpack paketleyici yapılandırması olan 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 sipariş karşılama projesini içeren yeni bir dizin girin.
Rollup paket yapılandırması olan 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 sipariş karşılama projesini içeren yeni bir dizin girin.
Parcel paket 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 sipariş karşılama projesini içeren yeni bir dizin girin.
Proje düzeyinde genel görevleri gerçekleştirme
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ı, dist/node
alt dizinindeki Node.js çalışma zamanı ortamına bağımlı olarak bir araya getirir.
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ış oluşturmadan derler ve test.ts
sitesinden 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 ve doğrulanmamış yerel cihazlar (merkeze bağlı son cihazlar dahil) gösterildiğinde IDENTIFY
işleyici tetiklenir. Yerel Ev platformu, daha önce belirttiğiniz tarama yapılandırma bilgilerini kullanarak yerel cihazları tarar ve IDENTIFY
işleyicinizi tarama sonuçlarıyla birlikte çağırır.
Yerel Ev platformundaki IdentifyRequest
, bir LocalIdentifiedDevice
örneğinin tarama verilerini içerir. Cihazı keşfeden tarama yapılandırmasına bağlı olarak yalnızca bir device
örneği doldurulur.
Tarama sonuçları cihazınızla eşleşiyorsa IDENTIFY
işleyiciniz, akıllı ev meta verileri (türler, özellikler ve rapor durumu gibi) içeren bir device
nesnesi içeren bir IdentifyResponsePayload
nesnesi döndürmelidir.
Google, IDENTIFY
yanıtındaki verificationId
, SYNC
yanıtı tarafından döndürülen otherDeviceIds
değerlerinden biriyle eşleşirse cihaz ilişkilendirme oluşturur.
Örnek
Aşağıdaki snippet'lerde, bağımsız cihaz ve Hub entegrasyonları için sırasıyla IDENTIFY
işleyicilerini 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; };
Hub'ın arkasındaki cihazları tanımlama
Google bir merkez cihaz tanımlarsa bu merkezi, hub'ın bağlı son cihazları için bir kanal olarak değerlendirir ve bu son cihazları doğrulamaya çalışır.
Google'ın, bir hub cihazı olduğunu onaylamasını sağlamak üzere IDENTIFY
işleyiciniz için aşağıdaki talimatları uygulayın:
SYNC
yanıtınız nedeniyle kulübedeki yerel bitiş cihazlarının kimlikleri bildirilirseisProxy
özelliğinitrue
IdentifyResponsePayload
olarak ayarlayın.SYNC
yanıtınız hub cihazınızı raporlamazsaIdentifyResponsePayload
içindeisLocalOnly
özelliğinitrue
olarak ayarlayın.device.id
alanı, hub cihazının yerel cihaz kimliğini içerir.
REACHABLE_DEVICES işleyicisini uygula (yalnızca merkezi entegrasyonlar)
REACHABLE_DEVICES
amacı, hangi son cihazların yerel olarak kontrol edilebileceğini onaylamak için Google tarafından gönderilir. Google'ın keşif taraması yaptığı her sefer (yaklaşık olarak dakikada bir kez) bu amaç tetiklenir (merkezin çevrimiçi olduğu algılanırsa).
REACHABLE_DEVICES
işleyicisini IDENTIFY
işleyicisine benzer bir şekilde uygularsınız. Ancak işleyicinizin, yerel proxy (yani hub) cihazı tarafından erişilebilen ek cihaz kimlikleri toplaması gerekir. device.verificationId
alanı, hub'a bağlı bir son cihazın yerel cihaz kimliğini içerir.
Yerel Ev platformundaki ReachableDevicesRequest
, LocalIdentifiedDevice
örneğini içerir.
Bu örnek üzerinden hem tarama cihazı kimliğini hem de tarama sonuçlarından gelen verileri alabilirsiniz.
REACHABLE_DEVICES
işleyiciniz, hub'ın kontrol ettiği son cihazları temsil eden verificationId
değerlerini içeren bir devices
nesnesi içeren ReachableDevicesPayload
nesne döndürmelidir. verificationId
değerleri, SYNC
yanıtındaki otherDeviceIds
ile 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 akıllı cihazlarınıza mevcut bir protokol üzerinden erişmek için Yerel Ev SDK'sını kullanır.
Yerel Ev platformu, bulut karşılama amacınız için EXECUTE
ile aynı giriş yükünü EXECUTE
işleyici işlevine iletir. Benzer şekilde, EXECUTE
işleyiciniz çıkış verilerini EXECUTE
amacının işlenmesiyle aynı biçimde döndürür.
Yanıt oluşturma sürecini 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 yok. Bunun yerine, şu protokollerden birini temel alan komutlar oluşturmak için CommandRequest
arayüzünü kullanın: UDP, TCP veya HTTP. Komutları göndermek için deviceManager.send()
işlevini çağırın.
Komutları cihazlara hedeflerken, 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'i, EXECUTE
işleyicinizi nasıl oluşturacağınızı 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şliyor ve akıllı cihazlarınızın durumunu bildirmek için Yerel Ev SDK'sını kullanıyor.
Yerel Ev platformu, buluta geçiş için sağlanan QUERY
aracı ile aynı istek yükünü "QUERY" işleyici işlevine iletir. Benzer şekilde, QUERY
işleyiciniz QUERY
amacının işlenmesiyle aynı biçimde veriler döndürür.
Bir merkezin arkasındaki cihazlara komut gönderme
Bir merkezdeki son cihazları kontrol etmek amacıyla, merkezin komutun hangi cihaza yönelik olduğunu belirlemesi için merkeze gönderilen protokole özgü komut yükünde ek bilgi sağlamanız gerekebilir. Bazı durumlarda, bu doğrudan device.id
değerinden çıkarılabilir. Ancak, bu mümkün olmadığında söz konusu ekstra 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 tercih ettiğiniz modül sistemini kullanabilirsiniz. Hedefinizin Chrome tarayıcı tarafından desteklendiğinden emin olun.