YOGYUI

광교아이파크::Bestin 홈네트워크 - 안드로이드 기기 연동 (Home Assistant + Google Assistant) 본문

홈네트워크(IoT)/광교아이파크

광교아이파크::Bestin 홈네트워크 - 안드로이드 기기 연동 (Home Assistant + Google Assistant)

요겨 2022. 2. 20. 20:20
반응형

 

앞선 글에서 Raspberry Pi 4에 Home Assistant(HA) 컨테이너(도커) 환경을 구축한 뒤, 기존에 구현해둔 Bestin 홈네트워크와 연동된 MQTT 토픽들을 HA와 연동하는 방법을 알아보았다

라즈베리파이 - Home Assistant 컨테이너 설치하기

라즈베리파이 - MQTT 액세서리 추가하기 (Bestin 홈네트워크 연동)

 

Bestin 홈네트워크 - MQTT 환경구축은 기존에 Apple HomeKit과 연동하는 방법은 링크를 참고하면 된다

광교아이파크::Bestin Apple HomeKit 연동 Summay (1)

 

광교아이파크::Bestin ↔ Apple HomeKit 연동 Summary (1)

Bentin 홈네트워크 월패드에서 제어 가능한 디바이스 대부분을 Apple Homekit에 액세서리로 연동하는데 성공했다 주방 및 서재, 침실, 컴퓨터방 조명 On/Off 거실, 침실, 컴퓨터방 난방 On/Off 및 온도 설

yogyui.tistory.com

 

이제 안드로이드 모바일 기기와 연동하기 위해 구글 홈(구글 어시스턴트)과 연동해보자

1. iOS 혹은 안드로이드에서 '구글 홈' 앱 설치

책상 한구석에서 먼지만 쌓여가던 갤럭시탭 S7 (SM-T870)을 오랜만에 켜서 구글스토어(Play 스토어)에서 '구글 홈'을 검색한 후 다운로드받았다

 

이것저것 지시사항대로 설정을 완료하면

텅 빈 화면이 나오게 된다

2. 구글 어시스턴트(Google Assistant) 연동

Home Assistant의 공식 문서를 참고하여 진행하면 된다

https://www.home-assistant.io/integrations/google_assistant/

 

Google Assistant

Setup for Google Assistant integration

www.home-assistant.io

Home Assistant Cloud에 가입(유료)된 유저라면 쉽게 자동화할 수 있다 (과연 과금 유저가 많을지는 의문)

2.1. 외부접속 설정

※ 중요한 것은 구글 서비스는 구글 서비스는 https(HTTP secure)를 사용하므로 SSL 인증서가 필요하다는 점이다! 

결국 DNS에 SSL 인증서를 결합해줘야 되는데, Synology 계열은 Let's Encrypt같은 무료 SSL 발급 서비스를 플러그인으로 접근할 수 있지만, ipTime 계열은 DDNS (xxx.iptime.org)에 SSL 발급이 잘 안되는게 문제다

ipTime 계열 공유기에서 구동되는 웹서버에 Let's Encrypt로 발급받은 SSL 인증서를 적용하는 방법은 다른 글에 소개

https://yogyui.tistory.com/entry/ipTime-%EA%B3%B5%EC%9C%A0%EA%B8%B0-SSL-%EC%9D%B8%EC%A6%9D%EC%84%9C-%EB%B0%9C%EA%B8%89-Lets-Encrypt

 

ipTime 공유기 SSL 인증서 발급 (Let's Encrypt)

ipTime 공유기에 연결된 웹서버에 HTTPS (HTTP Secure) 연동을 위해 SSL(Secure Sockets Layer) 인증서를 발급받아보자 ※ Home Assistant와 Google Assistant 연동할 때 반드시 필요한 작업 Synology 계열 제품..

yogyui.tistory.com

2.2. 구글 클라우드 플랫폼 (Google Close Platform) 설정

구글의 Actions Console 웹페이지로 접속하자

https://console.actions.google.com 

 

설정 과정이 상당히 길고 지루하니 마음의 준비를 단단히 하고 시작하도록 하자

[1] 구글 계정으로 로그인한 뒤에 'New Project' 버튼 클릭

[2] 이용 약관 동의

'Terms of Service'만 Yes 클릭해도 된다

[3] 프로젝트명 기입 후 생성

프로젝트명은 아무렇게나 지어도 상관없다

별다른 이유가 없다면 언어 및 지역 선택은 한글 및 한국으로 선택해주자

[4] Smart Home 클릭 후 'Start Building' 클릭

[5] Name Your Smart Home action 클릭

[6] Display Name 지정 후 Save 버튼 클릭

추후 구글 홈 앱에서 "[test]<Display Name>"으로 서비스 추가하게 된다

이것 역시 아무렇게나 지어넣으면 된다

[7] Overview - Build your Action 클릭

[8] Add Action(s) 클릭

[9] Home Assistant 외부접속 URL 입력 후 Save 버튼 클릭

Fullfillment URL에 https://{HA Remote Access URL}/api/google_assistant 포맷으로 입력

중요: 공유기의 DHCP 주소 (ex: 192.168.xxx.xxx)를 입력하면 안된다
또한, HA의 포트 (default 8123)는 포트포워딩해줘야한다 (경우에 따라서는 방화벽 설정도 해야함)

[10] Project setting 클릭

[11] Project ID 확인

노트패드 등에 복사-붙여넣기해두자

[12] Overview - Setup account linking 클릭

Home Assistant와 상호작용하기 위한 설정 시작

[13] OAuth Client 정보 입력 후 Next 버튼 클릭

  • Client ID: https://oauth-redirect.googleusercontent.com/r/{프로젝트 ID}
    프로젝트 ID는 앞서 [11]에서 복사해둔 'Project ID' 기입
  • Client Secret: 아무 문자열이나 입력 (ex: test)
  • Authorization URL: https://{HA Remote Access URL}/auth/authorize
  • Token URL: https://{HA Remote Access URL}/auth/token

[14] Use your app for account linking

그냥 Next 버튼 클릭

[15] Configure your client

Scopes에 이메일 주소 입력한 뒤 'Add Scope' 버튼 클릭

사용자 이름 입력한 뒤 'Add scope' 버튼 클릭

체크박스 (Google to transmit clientID and secret via HTTP basic auth header) 클릭하지 말고 Next 버튼 클릭

 

Save 버튼 클릭

입력한 정보의 summary를 확인할 수 있다

(잘못 입력한 경우 여기서 수정 후 Save 버튼 클릭)

[15] Develop - Account linking - Test 버튼 클릭

테스트화면 확인 (HA에 등록하지 않았으므로, 아직 아무 행동도 할 수 없음)

Setting 버튼 클릭

'On device testing' 활성화 (기본값으로 활성화되어 있다)

[16] Manage user access 클릭

- Google Cloud Platform URL로 리다이렉트(새 창)된다

[17] 서비스 계정 - '서비스 계정 만들기' 클릭

[18] 계정 이름 및 설명 기입

본인이 알아볼만한 문자열로 기입하면 된다

기입 완료 후 '만들고 계속하기' 클릭

[19] 액세스 권한 부여 (토큰 생성)

역할 선택 클릭 - 서비스 계정 - 서비스 계정 토큰 생성자 클릭

'계속' 버튼 클릭

'완료' 버튼 클릭

[20] 생성된 서비스 계정에서 작업 - 키 관리 클릭

[21] '키 추가' - '새 키 만들기' 클릭

[22] 'JSON' 선택된 상태에서 '만들기' 버튼 클릭

비공개 키가 로컬에 저장되었다 (확장자: json)

json 파일 내용은 다음 템플릿으로 구성되어 있다

{
  "type": "service_account",
  "project_id": "{프로젝트 ID}",
  "private_key_id": "{비공개 키 ID}",
  "private_key": "-----BEGIN PRIVATE KEY-----\{비공개 키 문자열}\n-----END PRIVATE KEY-----\n",
  "client_email": "{클라이언트 이메일 주소}",
  "client_id": "{클라이언트 ID}",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "{x509 인증 URL}"
}

json 파일은 추후 HA configuration.yaml 설정 시 사용해야 하니 따로 저장해두자

[23] Home Graph API 설정

링크 접속 후 사용 버튼 클릭

[24] Local Fullfillment 설정

Actions on Google Console 접속

'Develop' 탭 - 'Actions' 선택 - Upload JavaScript Files 선택

Node, Chrome 둘 다 아래 첨부된 파일 업로드

app.js
0.01MB

'Add device scan configuration' - 'New scan config' 클릭

'MDNS' 선택 - MDNS service name에 _home-assistant._tcp.local 입력

'Add field' 클릭 - 'Name' 선택 - .*\._home-assistant\._tcp\.local 입력

'Add capabilities' - 'Support local query' 체크

'Save' 버튼 클릭

 

이제 구글 클라우드 플랫폼 설정은 끝났다~(헥헥...)

2.2. HA HTTPS 접속 환경 구성

HTTPS로 HA에 접근하기 위해 Let's Encrypt로 발급받은 SSL 인증서 파일 2개(.pem)를 HA 설치경로의 /ssl 디렉터리로 복사해준다

sudo cp /letsencrypt/live/xxxx.duckdns.org/fullchain.pem ~/homeassistant/ssl/fullchain.pem
sudo cp /letsencrypt/live/xxxx.duckdns.org/privkey.pem ~/homeassistant/ssl/privkey.pem

Home Assistant 설정 파일(configuration.yaml) 파일을 열어서 다음 스크립트를 추가해주자

http:
  ssl_certificate: ssl/fullchain.pem
  ssl_key: ssl/privkey.pem
  base_url: https://xxxx.duckdns.org:8123

HA를 재시작한 후 https:// 로 접속하여 페이지가 제대로 로딩되는지 확인

URL 창 왼쪽에서 자물쇠 모양이 제대로 나타나는지 확인

2.3. HA google_assistant 통합 환경 추가

Home Assistant 설정 파일(configuration.yaml) 파일을 열어서 다음 스크립트를 추가해주자

템플릿은 다음과 같다

google_assistant:
  project_id: YOUR_PROJECT_ID
  service_account: !include SERVICE_ACCOUNT.JSON
  report_state: true
  exposed_domains:
    - switch
    - light
  entity_config:
    switch.kitchen:
      name: CUSTOM_NAME_FOR_GOOGLE_ASSISTANT
      aliases:
        - BRIGHT_LIGHTS
        - ENTRY_LIGHTS
    light.living_room:
      expose: false
      room: LIVING_ROOM

여기서 YOUR_PROJECT_ID, SERVICE_ACCOUNT.JSON 에는 앞서 저장해둔 서비스 계정 비공개 키 JSON 파일의 내용을 적어넣어야 한다

HA OS를 설치했다면 'File Editor' 애드온을 설치해서 json 파일을 UI 상에서 그대로 업데이트해주면 되고, 나처럼 컨테이너 기반으로 구축했다면 수동으로 옮겨주면 된다

json 파일을 gcp_service_account.json 으로 바꿔준 뒤 configuration.yaml이 존재하는 경로로 옮겨주자

(HA가 구동중인 플랫폼 상에서 파일을 만들어서 그대로 복사-붙여넣기해도 된다)

 

나처럼 Raspbian OS - HA Container 시스템을 구축했다면, nano같은 에디터로 파일을 만들어주면 된다

cd {HA 설치경로}
sudo nano gcp_service_account.json

에디터에 json 파일 내용 그대로 기입 후 저장

이제 configuration.yaml 파일을 다음과 같이 수정

google_assistant:
  project_id: xxxxx
  service_account: !include gcp_service_account.json
  report_state: true
  expose_by_default: true
  exposed_domains:
    - switch
    - light
    - sensor
    - fan
    - button
    - climate

※ project_id는 본인이 앞서 구성한 project id 기입

  • exposed_by_default: Google Home 초기 동기화 시 HA 내의 디바이스를 자동으로 연동
  • exposed_domains: 내가 설정한 아이템들의 도메인 리스트

2.4. 구글 홈 앱 - 서비스 추가하기

[1] 안드로이드 기기에서 구글 홈 앱 실행 후 좌측 상단 + 선택

[2] '기기 설정' 선택

[3] 'Google 호환 가능' 선택

[4] '[test] {Actions Console에서 설정한 Display Name}' 선택

특수문자 '['로 시작하므로, 상단에서 찾을 수 있다 ([test]로 검색해도 됨)

[5] Chrome 관련 설정 (기기에 따라 Skip될 수 있음)

갤럭시탭을 거의 쓰지 않다보니 구글 크롬을 한번도 안열어봤던 것 같다... ㅎㅎ

[6] Home Assistant 로그인

HTTPS가 제대로 적용되었다면 정상적으로 로그인할 수 있다

[7] Link

링크가 끝나면 내 디바이스들이 동기화되어서 리스트업된다

 

이제 메인 화면으로 나가보면 기기들을 제어할 수 있다

3. 동작 확인

거실 조명 제어 예시

 

그리고 많은 아이파크 거주자(Bestin) 분들이 부러워(?)하시는 엘리베이터 호출! ㅋㅋ

어차피 핵심은 "RS485 패킷 파싱 - MQTT"이기 때문에, 제대로 동작할 수 밖에 없다 (?)

4. 결론

너무너무 시간이 오래 걸렸다 ㅋㅋㅋ

Home Assistant를 처음 써봤기에 인프라 구축 - 디바이스 설정에 거의 이틀이상 잡아먹었고, 구글 어시스턴트랑 연동하려니 HTTPS가 필요하다고 해서 DNS 발급, SSL 인증서 발급하는데 하루정도 소모했고, 구글 액션/클라우드 설정하는데 또 하루가 걸렸다... 

 

그래도 구석에 박혀서 눈물만 흘리던 갤럭시탭을 다시 소생시켜서 쓸모를 찾아주게 된 것이 의미가 있다랄까? 나름 보람찬 일주일이었다 (HA 관련해서 이것저것 찾아보니 이것도 참 재미있는 플랫폼이라는 느낌이 들었다 - Homebridge에 비해 그다지 사용하기 편하진 않았다)

반응형
Comments