Yerel sipariş karşılama özelliğini desteklemek için aşağıdaki akıllı ev intent'lerini işleyen bir uygulama oluşturmanız gerekir:
IDENTIFY
: Yerel olarak kontrol edilebilen akıllı cihazların bulunmasını destekler. Intent işleyici, akıllı cihazınızın keşif sırasında döndürdüğü verileri ayıklayıp 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ında yerel olarak kontrol edilebilir uç cihazları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 edilir) veya JavaScript kullanarak oluşturabilirsiniz.
Uygulamanızın döndürdüğü verilerin platformun beklediği türlerle statik olarak eşleştiğinden emin olmak için bağlantılardan yararlanabileceğiniz için TypeScript önerilir.
API hakkında daha fazla bilgi için Local Home SDK API referansı başlıklı makaleyi inceleyin.
Aşağıdaki snippet'ler, yerel sipariş karşılama uygulamasını nasıl başlatabileceğinizi ve işleyicilerinizi nasıl ekleyebileceğinizi gösterir.
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 istiyorsanız 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 uygulama oluşturma uygulaması project initializer'ı 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 sipariş tamamlama uygulaması projesini barındıracak 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 öğesini, yerel sipariş karşılama uygulaması projesini içerecek yeni bir dizinle değiştirin.
Rollup paketleyici yapılandırmasına sahip 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ş tamamlama uygulaması projesini barındıracak 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 sipariş tamamlama uygulaması projesini barındıracak yeni bir dizin girin.
Proje düzeyinde sık yapılan 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ı derleyip 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ı ile 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ış oluşturmadan derler ve test.ts
'dan 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 ortamı için uygulama paketlerinizi yerel olarak sunar.
IDENTIFY işleyicisini uygulama
IDENTIFY
işleyicisi, Google Home veya Google Nest cihazı yeniden başlatıldığında ve doğrulanmamış yerel cihazlar (hub'a bağlı uç cihazlar dahil) algılandığında tetiklenir. Yerel Home platformu, daha önce belirttiğiniz tarama yapılandırma bilgilerini kullanarak yerel cihazları tarar ve IDENTIFY
işleyicinizi tarama sonuçlarıyla çağırır.
Yerel Home platformundaki IdentifyRequest
, 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şiyorsa IDENTIFY
işleyiciniz, akıllı ev meta verilerine (türler, özellikler ve rapor durumu gibi) sahip device
nesnesi içeren bir IdentifyResponsePayload
nesnesi döndürür.
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, sırasıyla 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ı tanımlarsa hub'ı, hub'a bağlı uç cihazlara giden bir kanal olarak değerlendirir ve bu uç cihazları doğrulamaya çalışır.
Google'ın bir hub cihazın mevcut olduğunu doğrulamasını sağlamak için IDENTIFY
işleyicinizle ilgili aşağıdaki talimatları uygulayın:
SYNC
yanıtınız, hub'a bağlı yerel uç cihazların kimliklerini bildiriyorsaIdentifyResponsePayload
içindeisProxy
değerinitrue
olarak ayarlayın.SYNC
yanıtınız hub cihazınızı bildirmiyorsaIdentifyResponsePayload
bölümündeisLocalOnly
öğesinitrue
olarak ayarlayın.device.id
alanı, hub cihazın yerel cihaz kimliğini içerir.
REACHABLE_DEVICES işleyicisini uygulama (yalnızca hub entegrasyonları)
REACHABLE_DEVICES
intent'i, hangi uç cihazların yerel olarak kontrol edilebileceğini onaylamak için Google tarafından gönderilir. Bu intent, Google bir keşif taraması her gerçekleştirdiğinde (yaklaşık olarak her dakika bir) ve hub'ın online olduğu tespit edildiğinde tetiklenir.
REACHABLE_DEVICES
işleyicisini, IDENTIFY
işleyicisine benzer şekilde uygularsınız. Bununla birlikte, işleyicinizin yerel proxy (hub) cihazı tarafından erişilebilen ek cihaz kimlikleri toplaması gerekir. device.verificationId
alanı, hub'a bağlı bir uç cihazın yerel cihaz kimliğini içerir.
Yerel Ana Sayfa platformundaki ReachableDevicesRequest
, LocalIdentifiedDevice
örneği içerir.
Bu örnek aracılığıyla, proxy cihaz kimliğinin yanı sıra tarama sonuçlarından veri alabilirsiniz.
REACHABLE_DEVICES
işleyiciniz, hub'ın kontrol ettiği son cihazları temsil eden bir verificationId
değer dizisi içeren bir devices
nesnesini içeren bir ReachableDevicesPayload
nesnesi döndürmelidir. verificationId
değerleri, SYNC
yanıtındaki otherDeviceIds
değerlerinden biriyle eşleşmelidir.
Aşağıdaki snippet, REACHABLE_DEVICES
işleyicinizi nasıl oluşturabileceğinizi göstermektedir.
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 aracılığıyla akıllı cihazlarınıza erişmek için Yerel Ev SDK'sını kullanır.
Yerel Ana Sayfa platformu, bulut sipariş karşılama hizmetinize EXECUTE
intent'i için EXECUTE
işleyici işlevine aynı giriş yükünü iletir. Benzer şekilde, EXECUTE
işleyiciniz çıkış verilerini EXECUTE
amacını işlemekle aynı biçimde döndürür.
Yanıt oluşturmayı basitleştirmek için Local Home 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, UDP, TCP veya HTTP protokollerinden birine dayalı 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.
Cihazlara komut gönderirken 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 Home SDK'sını kullanır.
Yerel Ana Sayfa platformu, bulut sipariş karşılama hizmetinize QUERY
intent'inde olduğu gibi "QUERY" işleyici işlevine aynı istek yükünü iletir. Benzer şekilde, QUERY
işleyiciniz, QUERY
intent'inin işlenmesiyle aynı biçimde veri döndürür.
Hub arkasındaki cihazlara komut gönderme
Bir hub'ın arkasındaki uç cihazları kontrol etmek için, hub'ın komutun hangi cihaza yönelik olduğunu belirlemesi amacıyla hub'a gönderilen protokole özgü komut yükü içinde ek bilgiler sağlamanız gerekebilir. Bazı durumlarda bu, doğrudan device.id
değerinden çıkarılabilir ancak bu durum söz konusu değilse bu ek verileri customData
alanının bir parçası olarak eklemeniz gerekir.
Uygulamanızı TypeScript kullanarak oluşturduysanız JavaScript olarak derlemeyi unutmayın. Kodunuzu yazmak için istediğiniz modül sistemini kullanabilirsiniz. Hedefinizin Chrome tarayıcı tarafından desteklendiğinden emin olun.