로컬 처리를 지원하려면 이러한 작업을 처리할 수 있는 앱을 빌드해야 합니다. 스마트 홈 인텐트:
IDENTIFY
: 로컬에서 제어 가능한 스마트 기기 검색을 지원합니다. 이 인텐트 핸들러가 스마트 기기가 검색 중에 반환하는 데이터를 추출합니다. Google에 응답으로 전송합니다.EXECUTE
: 명령어 실행을 지원합니다.QUERY
: 기기 상태 쿼리를 지원합니다.REACHABLE_DEVICES
: (선택사항) 로컬에서 제어 가능한 항목의 검색을 지원합니다. 최종 장치를 연결하는 데 사용되는 네트워크 장치입니다.
이 앱은 사용자의 Google Home 또는 Google Nest 기기에서 실행되며 스마트 기기를 어시스턴트를 탭합니다. TypeScript (권장) 또는 JavaScript를 사용하여 앱을 만들 수 있습니다.
TypeScript가 권장됩니다. 바인딩 앱이 반환하는 데이터가 살펴봤습니다
API에 대한 자세한 내용은 Local Home SDK API 참조
다음 스니펫은 로컬 처리 앱을 초기화하는 방법과 핸들러를 연결합니다.
<ph type="x-smartling-placeholder">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"); });
프로젝트 만들기
로컬 처리 앱을 배포하려면 JavaScript 번들을 빌드해야 합니다. 코드 및 모든 종속 항목에 적용되어야 합니다
로컬 처리 앱 프로젝트 사용 이니셜라이저 원하는 번들러로 적절한 프로젝트 구조를 부트스트랩할 수 있습니다. 구성할 수 있습니다
프로젝트 템플릿
번들러 구성을 선택하려면 npm init
명령어를 실행합니다.
예를 들면 다음과 같습니다.
번들러 구성이 없는 TypeScript:
npm init @google/local-home-app project-directory/ --bundler none
프로젝트 구조:
project-directory/ ├── node_modules/ ├── package.json ├── .gitignore ├── index.ts ├── test.ts ├── tsconfig.json ├── tslint.json └── serve.js
project-directory을 로컬 처리 앱 프로젝트에 액세스할 수 있습니다
TypeScript: webpack 번들러 구성:
npm init @google/local-home-app project-directory/ --bundler webpack
프로젝트 구조:
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을 로컬 처리 앱 프로젝트에 액세스할 수 있습니다
Rollup을 사용한 TypeScript Bundler 구성:
npm init @google/local-home-app project-directory/ --bundler rollup
프로젝트 구조:
project-directory/ ├── node_modules/ ├── package.json ├── .gitignore ├── index.ts ├── test.ts ├── tsconfig.json ├── tslint.json ├── rollup.config.js └── serve.js
project-directory을 로컬 처리 앱 프로젝트에 액세스할 수 있습니다
Parcel을 사용한 TypeScript Bundler 구성:
npm init @google/local-home-app project-directory/ --bundler parcel
프로젝트 구조:
project-directory/ ├── node_modules/ ├── package.json ├── .gitignore ├── index.ts ├── test.ts ├── tsconfig.json ├── tslint.json └── serve.js
project-directory을 로컬 처리 앱 프로젝트에 액세스할 수 있습니다
일반적인 프로젝트 수준 작업 실행
생성된 프로젝트는 다음 npm을 지원합니다. 스크립트:
<ph type="x-smartling-placeholder">cd project-directory/ npm run build
이 스크립트는 TypeScript 소스를 컴파일하고 dist/web
하위 디렉터리에 있는 Chrome 런타임 환경 및 dist/node
하위 디렉터리에 있는 Node.js 런타임 환경의 종속 항목과 함께 앱을 번들로 묶습니다.
cd project-directory/ npm run lint npm run compile npm test
이 스크립트는 TypeScript 코드의 구문을 확인하고 dist/
하위 디렉터리에서 출력을 생성하지 않고 컴파일하며 test.ts
에서 자동화된 테스트를 실행합니다.
cd project-directory/ npm run start
개발 중에 이 스크립트는 Chrome 및 Node.js 런타임 환경에 로컬로 App Bundle을 제공합니다.
IDENTIFY 핸들러 구현
IDENTIFY
핸들러는 Google Home 또는 Google Nest 기기가 재부팅되고
확인되지 않은 로컬 기기 (허브에 연결된 최종 기기 포함) 확인 이
로컬 홈 플랫폼에서 스캔 구성 정보를 사용하여 로컬 기기를 스캔합니다.
스캔 결과를 사용하여 IDENTIFY
핸들러를 호출합니다.
이
IdentifyRequest
드림
로컬 홈 플랫폼의 검색 결과에는 로컬 호스트의
LocalIdentifiedDevice
인스턴스를 만들 수 있습니다 스캔 구성에 따라 하나의 device
인스턴스만 채워집니다.
확인할 수 있습니다.
스캔 결과가 기기와 일치하면 IDENTIFY
핸들러가
IdentifyResponsePayload
가 포함된 device
객체를 포함합니다.
스마트 홈 메타데이터 (예: 유형, 특성, 보고서 상태)
Google은 다음 경우에 기기 연결을 설정함
IDENTIFY
응답의 verificationId
는
SYNC
응답에서 반환된 otherDeviceIds
값입니다.
예
다음 스니펫은 IDENTIFY
핸들러를 만드는 방법을 보여줍니다.
각각 독립형 기기 및 허브 통합입니다
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; };
허브 뒤에 있는 기기 식별
Google에서 허브 기기를 식별하면 허브를 도관으로 취급합니다. 허브의 연결된 최종 장치에 연결하여 해당 최종 장치 인증을 시도합니다.
Google에서 허브 기기가 있는지 확인할 수 있도록 하려면
IDENTIFY
핸들러에 대한 안내를 참조하세요.
SYNC
응답이 허브의 경우isProxy
를true
로 설정합니다.IdentifyResponsePayload
SYNC
응답이 허브 기기를 보고하지 않는 경우 다음과 같이 설정하세요.isLocalOnly
에서true
(으)로IdentifyResponsePayload
device.id
필드에는 허브 기기 자체의 로컬 기기 ID가 포함됩니다.
REACHABLE_DEVICES 핸들러 구현 (허브 통합만 해당)
REACHABLE_DEVICES
인텐트는 Google에서 전송하는 최종 기기를 확인합니다.
로컬에서 제어할 수 있습니다 이 인텐트는 Google에서
검색 스캔 (1분에 한 번 정도)을 전송합니다.
온라인에 접속해야 합니다.
IDENTIFY
와 유사하게 REACHABLE_DEVICES
핸들러를 구현합니다.
핸들러가 기기 ID를 추가로 수집해야 한다는 점만 다릅니다.
로컬 프록시 (즉, 허브) 장치가 연결할 수 있습니다. 이
device.verificationId
필드에는 최종 기기의 로컬 기기 ID가 포함됩니다.
장치의 역할을 합니다
이
ReachableDevicesRequest
드림
로컬 홈 플랫폼의 홈에는
LocalIdentifiedDevice
이 인스턴스를 통해 프록시 기기 ID와
스캔 결과를 확인할 수 있습니다
REACHABLE_DEVICES
핸들러는
ReachableDevicesPayload
의 배열이 포함된 devices
객체를 포함하는 객체입니다.
허브가 제어하는 최종 기기를 나타내는 verificationId
값입니다. 이
verificationId
값은 otherDeviceIds
SYNC
응답
다음 스니펫은 REACHABLE_DEVICES
를 만드는 방법을 보여줍니다.
처리됩니다.
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 핸들러 구현
앱의 EXECUTE
핸들러는 사용자 명령어를 처리하고
Local Home SDK를 사용하여 기존 프로토콜을 통해 스마트 기기에 액세스할 수 있습니다.
Local Home 플랫폼은 EXECUTE
핸들러에 동일한 입력 페이로드를 전달합니다.
EXECUTE
와 같은 함수
Cloud fulfillment에 인텐트를 배포합니다. 마찬가지로 EXECUTE
핸들러는 다음을 반환합니다.
EXECUTE
인텐트를 처리하는 것과 동일한 형식으로 데이터를 출력합니다.
대답 생성을 간소화하려면
Execute.Response.Builder
드림
클래스에 대해 자세히 알아보세요.
앱이 기기의 IP 주소에 직접 액세스할 수 없습니다. 대신
사용
CommandRequest
드림
인터페이스를 사용하여 UDP, TCP 또는 HTTP 프로토콜 중 하나를 기반으로 명령을 작성합니다. 그런 다음
deviceManager.send()
드림
함수를 사용하여 명령어를 전송합니다.
명령을 기기에 타겟팅할 때는 기기 ID 및
customData
필드(포함된 경우))를 사용하여 SYNC
응답에서 이 필드로부터 전달합니다.
해야 합니다.
예
다음 코드 스니펫은 EXECUTE
핸들러를 만드는 방법을 보여줍니다.
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 핸들러 구현
앱의 QUERY
핸들러는 사용자 요청을 처리하고
Local Home SDK를 사용하여 스마트 기기의 상태를 보고할 수 있습니다.
Local Home 플랫폼은 동일한 요청 페이로드를 'QUERY'에 전달합니다. 핸들러
QUERY
와 같은 함수
Cloud fulfillment에 인텐트를 배포합니다. 마찬가지로 QUERY
핸들러는 데이터를 반환합니다.
QUERY
인텐트를 처리하는 것과 동일한 형식으로 설정해야 합니다.
허브 뒤의 기기로 명령어 전송
허브 뒤에서 최종 기기를 제어하려면 추가 정보를 제공해야 할 수도 있습니다.
프로토콜별 명령어 페이로드를 수신하기 위해
명령어가 어떤 기기를 대상으로 하는지 식별할 수 있습니다. 어떤 경우에는
device.id
값에서 직접 추론되지만 그렇지 않은 경우
이 추가 데이터를 customData
필드의 일부로 포함해야 합니다.
TypeScript를 사용하여 앱을 만들었다면 앱을 다음과 같이 컴파일해야 합니다. 있습니다. 원하는 모듈 시스템을 사용하여 코드를 작성할 수 있습니다. Chrome 브라우저에서 타겟을 지원하는지 확인합니다.