맞춤 기기 작업 등록

기기에 현재특성 이 포함되지 않는 특수 기능이 있을 수 있습니다. 예를 들어 조명이 깜박일 수 있는 기기의 '내 조명 깜박임' 특성과 같은 기능이 있을 수 있습니다. 특수 기능을 트리거하도록 기기로 전송된 명령어를 지정하는 기기의 맞춤 작업을 정의할 수 있습니다.

맞춤 기기 작업을 정의하려면 다음이 필요합니다.

  • 사용자 쿼리와 일치시킬 패턴
  • 일치하는 쿼리와 연결할 맞춤 기기 작업
  • 기기에서 작업을 지원하는 경우 사용자에게 음성으로 안내하는 텍스트
  • 기기로 다시 전송되는 명령어 이름 및 매개변수

이 정보를 작업 패키지에 넣어 맞춤 기기 작업을 만듭니다. 작업 패키지는 어시스턴트 응답의 형식을 정의합니다. Actions SDK와 달리 맞춤 기기 작업은 로컬에서 처리됩니다. 요청을 처리하고 응답을 제공할 엔드포인트를 지정하지 않습니다. 맞춤 기기 작업은 본질적으로 대화형이 아닙니다.

작업 패키지 만들기

예를 들어 LED 깜박임을 테스트하는 테스트 명령어를 정의하는 파일 (예: actions.json)을 만듭니다. 이전 단계에서 다운로드한 샘플 코드에서 복사합니다.

cd assistant-sdk-python/google-assistant-sdk/googlesamples/assistant/grpc/
cp ~/assistant-sdk-python/google-assistant-sdk/actions.json .
예시
{
    "manifest": {
        "displayName": "Blinky light",
        "invocationName": "Blinky light",
        "category": "PRODUCTIVITY"
    },
    "actions": [
        {
            "name": "com.example.actions.BlinkLight",
            "availability": {
                "deviceClasses": [
                    {
                        "assistantSdkDevice": {}
                    }
                ]
            },
            "intent": {
                "name": "com.example.intents.BlinkLight",
                "parameters": [
                    {
                        "name": "number",
                        "type": "SchemaOrg_Number"
                    },
                    {
                        "name": "speed",
                        "type": "Speed"
                    }
                ],
                "trigger": {
                    "queryPatterns": [
                        "blink ($Speed:speed)? $SchemaOrg_Number:number times",
                        "blink $SchemaOrg_Number:number times ($Speed:speed)?"
                    ]
                }
            },
            "fulfillment": {
                "staticFulfillment": {
                    "templatedResponse": {
                        "items": [
                            {
                                "simpleResponse": {
                                    "textToSpeech": "Blinking $number times"
                                }
                            },
                            {
                                "deviceExecution": {
                                    "command": "com.example.commands.BlinkLight",
                                    "params": {
                                        "speed": "$speed",
                                        "number": "$number"
                                    }
                                }
                            }
                        ]
                    }
                }
            }
        }
    ],
    "types": [
        {
            "name": "$Speed",
            "entities": [
                {
                    "key": "SLOWLY",
                    "synonyms": [
                        "slowly",
                        "slow"
                    ]
                },
                {
                    "key": "NORMALLY",
                    "synonyms": [
                        "normally",
                        "regular"
                    ]
                },
                {
                    "key": "QUICKLY",
                    "synonyms": [
                        "quickly",
                        "fast",
                        "quick"
                    ]
                }
            ]
        }
    ]
}

이전 예에서는 다음 정보를 사용하여 맞춤 기기 작업을 정의합니다.

  • 사용자 쿼리와 일치시킬 패턴 (N회 깜박임)
  • 정리 목적으로 일치하는 쿼리 (com.example.actions.BlinkLight)와 연결할 맞춤 기기 작업
  • 기기가 작업을 지원하는 경우 사용자에게 음성으로 안내하는 텍스트(깜박임 N회)
  • 기기로 다시 전송되는 명령어 이름 (com.example.commands.BlinkLight)과 매개변수 (숫자 및 속도 설명)

쿼리 패턴을 정의하려면 다음 사항에 유의하세요.

  • 쿼리 패턴에서 schema.org 정의 유형을 사용할 수 있습니다.
  • types [...] 배열은 커스텀 유형 목록을 정의합니다 (예: $Speed).
  • 쿼리 패턴에서 커스텀 유형을 사용할 수 있습니다. 사용자는 커스텀 유형의 동의어를 쿼리 쿼리와 일치하도록 말할 수 있습니다.
  • 동의어가 일치하면 유형 인스턴스 (speed)가 정규화된 키 (SLOWLY)를 반환합니다. 예를 들어 서로 다른 깜박임 속도를 지원하는 조명이 여러 개 있을 수 있습니다.
  • 요청 TTS 패턴의 일부는 선택사항일 수 있습니다. 예를 들어 쿼리 패턴에서 ($Speed:speed)?를 사용하여 이 부분을 선택사항으로 지정할 수 있습니다.
  • 응답 TTS의 $type.raw(예: $speed.raw)는 사용자가 실제로 말한 단어로 대체됩니다.

이러한 여러 필드의 설명은 ActionPackage 문서를 참조하세요.

작업 패키지 배포

작업 패키지에서 맞춤 기기 작업을 빌드한 후 어시스턴트에서 작업 패키지에 액세스할 수 있도록 할 수 있습니다.

기기에서 이 섹션의 단계를 실행할 수 있지만 개발 시스템에서 하는 것이 더 쉬울 수 있습니다. 다음 명령어는 가상 환경을 실행할 필요가 없습니다.

  1. gactions 명령줄 도구를 다운로드합니다.

  2. gactions 도구와 동일한 디렉터리에서 기존 사용자 인증 정보를 삭제합니다.

    rm creds.data
  3. gactions CLI를 사용하여 작업 패키지를 Google에 저장합니다. project_id를 Actions 콘솔 프로젝트 ID로 바꿉니다.

    ./gactions update --action_package actions.json --project project_id
  4. 이 명령어를 처음 실행하면 URL이 제공되고 로그인하라는 메시지가 표시됩니다. URL을 복사하여 브라우저에 붙여넣습니다 (모든 시스템에서 수행할 수 있음). 페이지에 Google 계정에 로그인하라는 메시지가 표시됩니다. 이전 단계를 따르세요.

  5. API의 권한 요청을 승인하면 브라우저에 '4/XXXX'와 같은 코드가 표시됩니다. 다음 코드를 복사하여 터미널에 붙여넣습니다.

    Enter the authorization code:

    승인이 성공하면 다음과 비슷한 응답이 표시됩니다.

    Your app for the Assistant for project my-devices-project was successfully
    updated with your actions.
    
  6. gactions CLI를 사용하여 작업 패키지를 테스트 모드로 배포합니다. 이 명령어를 실행하기 전에 작업 패키지를 Google에 한 번 이상 저장한 적이 있어야 합니다. 테스트 모드에서는 사용자 계정에서만 작업 패키지를 사용 설정합니다.

    ./gactions test --action_package actions.json --project project_id

    현재는 작업 시뮬레이터를 사용하여 프로젝트를 테스트할 수 없습니다.

  7. 작업 패키지를 업데이트하려면 gactions update 명령어를 사용합니다.

  8. (선택사항) 현지화된 작업 패키지를 만들면 단일 프로젝트에서 여러 다양한 언어 및 언어를 동시에 지원할 수 있습니다.

샘플 수정

기기에서 이 섹션의 단계를 따릅니다.

nano pushtotalk.py

맞춤 작업의 핸들러를 추가합니다. 아래 핸들러는 위의 샘플 작업 패키지의 샘플 코드에 이미 추가되었습니다.

...

device_handler = device_helpers.DeviceRequestHandler(device_id)

@device_handler.command('com.example.commands.BlinkLight')
def blink(speed, number):
    logging.info('Blinking device %s times.' % number)
    delay = 1
    if speed == "SLOWLY":
        delay = 2
    elif speed == "QUICKLY":
        delay = 0.5
    for i in range(int(number)):
        logging.info('Device is blinking.')
        # GPIO.output(25, 1)
        time.sleep(delay)
        # GPIO.output(25, 0)
        time.sleep(1)

샘플 실행

소스 코드를 실행합니다.

python pushtotalk.py

검색어를 입력해 보세요. 위의 예에서 다음을 시도해 보세요.

5번 깜박입니다.

쿼리는 작업 패키지의 쿼리 패턴과 일치해야 합니다.