이전에 글로 샤오미 로봇청소기에 관한 홈킷 등록방법을 다루긴 했었지만 HA에 등록하는 방법은 생략을 했었습니다.
오늘은 샤오미 1세대 로봇청소기를 Home Assistant(HA)에 등록해 보도록 하겠습니다.

HA에 등록을 위해서는 샤오기 기기의 토큰(Token)을 알아야 합니다.
해당 내용은 HA 공식 홈페이지의 자료를 참고하였습니다.
여러가지 방법들이 존재하는데 제가 사용할 방법은 아이폰을 이용한 방법입니다.
제가 안드로이드 스마트폰이 없어서 안드로이드 폰을 이용한 방법을 사용할 수가 없어요.
그리고 휴대폰(아이폰이든 안드로이드든)을 사용하지 않고 라즈베리파이에서 바로 찾아내는 방법도 존재합니다만 생략했습니다.
이전 글에서 설명했다시피 최대한 라즈베리파이에는 접속을 안하려고 노력 중입니다. (콘솔화면 어려워요!)
그리고 라즈베리파이에서 바로 찾는 방법은 실패하는 경우도 있더라고요. (전 실패했어요. 못찾더라고요.)

이제 본격적으로 시작을 해봅시다.


아이폰(iOS)과 맥(혹은 윈도우)를 이용한 방법

시작하기 앞서 저는 컴퓨터로 맥을 이용하기 때문에 맥 화면을 캡쳐해서 보여드리지만, 윈도우용 프로그램도 똑같기 때문에 
문제가 생기지는 않을겁니다. 


1. 우선은 아이폰에 샤오미 앱(Mi Home)을 설치하고 가이드에 따라서 설정을 완료합니다.

(아마 이 글을 보는 분들은 이미 설정을 완료했을겁니다.)

2. 아이튠즈를 이용하여 컴퓨터에 아이폰 백업을 합니다.

아이튠즈에서 폰 설정에 들어간다음 수동으로 백업을 하면 됩니다. 
(굳이 앞에 자동뱁업 부분을 건드릴 필요없이 오른쪽 부분의 ‘지금 백업’을 누르면 됩니다. )

<iTunes 휴대폰 설정 화면 - 백업>


3. iBackup Viewer 를 다운 받아서 설치합니다.


4. iBackup Viewer 를 실행하고 백업 파일을 불러옵니다.

4-1. 맥
맥에서는 파일 접근권한 문제로 백업파일을 불러올 수가 없습니다.
시스템 환경설정 - 보안 및 개인 정보 보호 - 개인 정보 보호 탭으로 이동하 여
전체 디스크 접근 권한 에 iBackup Viewer 앱을 등록합니다.
그리고 iBackup Viewer 를 실행하면 백업파일을 자동으로 불러오게 됩니다.
4-2. 윈도우
윈도우는 별다른 문제없이 자동으로 백업파일을 불러올겁니다. 
<iBackup Viewer 실행화면 초기>

폰의 배경화면으로 백업이 되어 있군요. (엄한 사진은 지웠습니다.)
배경화면을 클릭하면 백업파일을 불러옵니다.
<iBackup Viewer - 백업파일을 불러온 화면>

5. 맨 마지막 아이콘인 Raw Data를 선택하고 파일을 선택합니다.

아래 캡쳐의 번호에 맞춰 123456789_mihome.sqlite 파일을 저장합니다. 
<iBackup Viewer - Raw Data 화면>

①-②-③ 순으로 파일을 찾고 ④의 Export를 클릭하여 Selected 를 클릭하면 저장이 됩니다.
(파일앞에 숫자는 계정마다 다르니 숫자 뒤에 mihome.sqlite 이 붙었는지 확인하세요.)


6. DB Browser for SQLite 를 다운받아 설치하고 따라하세요.


<DB Browser for SQLite 실행 화면>

①을 누르고 iBackup Viewer에서 저장한 파일을 선택합니다.
②를 누르고 ③ 에 다음을 적습니다.
SELECT ZTOKEN FROM ZDEVICE WHERE ZMODEL LIKE "%vacuum%"
④를 누르면 ⑤의 목록이 뜹니다. 그 내용을 마우스 오른쪽을 눌러서 복사합니다.

7. 다음 사이트에서 디크립션을 해줍니다.



①에 위에서 복사한 내용을 붙혀넣습니다.
②(Hex)를 선택합니다.
③에 0을 32개 넣어줍니다.
④(Decrypt)를 누릅니다.
⑤에 나오는 글자를 차례대로 적습니다. 두줄로 나오는데요. 각각 16개씩 총 32개입니다.

그걸 주욱 붙힌게 토큰입니다. (우리가 HA 설정에 적을 내용입니다.)

이렇게 해서 토큰을 얻게 되었습니다. 이제 이 토큰으로 HA에 등록을 하면 됩니다.


HA에 로봇청소기 등록하기

Filezilla와 Atom을 이용하여 configuration.yaml 설정 파일을 불러옵니다.

적당한 위치에 다음을 추가합니다.
#
vacuum:
- platform: xiaomi_miio
host: rockrobo
token: []
들여쓰기는 꼭 신경써서 적도록 합니다.
host 에는 ip를 적게 되어 있는데 보통 로봇청소기에 인터넷을 등록될 때 rockrobo라는 이름으로 공유기에 등록을 하기 때문에 
아이피가 아니라 rockrobo 라고 적어도 됩니다. 
토큰에는 위에서 얻은 32글자를 적어줍니다.

그리고 재시작을 하면 로봇청소기가 등록이 됩니다. 
끝!

토큰얻기만 어렵지 등록은 참 쉽네요. ㅎㅎ


오늘은 Home Assitant 설정 파일에 대해서 얘기를 해보려고 합니다.
이전에 다룬 방법을 이용하여 FileZilla로 hassbian에 접속하여 HA 설정 폴더로 이동을 합니다.

거기에서 configuration.yaml 파일이 기본 설정 파일입니다. 편집을 해서 Atom으로 열어보세요.
homeassistant:
# Name of the location where Home Assistant is running
name: Home
# Location required to calculate the time the sun rises and sets
latitude: []
longitude: []
# Impacts weather/sunrise data (altitude above sea level in meters)
elevation: 0
# metric for Metric, imperial for Imperial
unit_system: metric
# Pick yours from here: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
time_zone: Asia/Seoul
# Customization file
customize: !include customize.yaml
http:
api_password: []
base_url: []
...
# Sensors and Switches
sensor: !include_dir_merge_list sensors/
binary_sensor: !include_dir_merge_list binary_sensors/
switch: !include_dir_merge_list switches/
automation: !include_dir_merge_list automations/
group: !include groups.yaml
script: !include scripts.yaml
...
다음과 같은 형식으로 되어 있는데요. ([삭제]는 제 개인 설정이라 지운겁니다.)
저기에 자신의 설정을 입력해주면 됩니다.
# 으로 시작하는 줄은 주석입니다. 실행은 되지 않는 설명을 적는 줄이라고 생각하시면 되요.
여러분들이 원하는 글로 바꾸워도 상관은 없습니다. 물론 지워도 되고요.
그리고 들여쓰기를 지켜주어야 합니다. 들여쓰기로 설정간의 구분을 하기 때문인데요.
예를 들어서 homeassistant: 다음에 들여쓰기가 된 name: 이나 latitude: 는 homeassistant: 설정 내에 존재하는 세부설정입니다.
아래에 위치한 http:는 homeassistant: 와는 별개의 설정을 뜻하죠.
http: 설정에는 api_password:와 base_url:이라는 세부설정이 존재하는 거고요.
이렇게 들여쓰기를 지켜줘야 합니다. 꼭 잊지 마세요.
제일 처음 적히는 애들을 보통 컴포넌트라고 부릅니다. 

이제 차근차근 하나씩 알아보죠.
homeassistant 컴포넌트는 HA의 가장 기본이 되는 설정입니다.
세부설정 name 은 Home Assistant를 설치하고 사용하는 집의 이름을 적는 겁니다. 원하는 이름을 적어주세요.
latitude와 longitude는 현재 집의 위치(위도와 경도)를 나타냅니다.
구글 지도(https://www.google.com/maps)로 이동해서 자신의 집 위치에 마우스를 클릭하면 아래에 그 위치의 정보가 뜹니다.


<경복궁 근처 - 구글맵>


이때 주소 및에 적힌 숫자가 위도와 경도입니다.
latitude에 왼쪽 숫자(여기서는 37.576080), longitude에 오른쪽 숫자(여기서는 126.976011)를 입력해줍니다.

elevation은 높이를 나타냅니다. 아파트라면 높이를 따로 지정을 해줄 수 있는데요. 저는 딱히 지정해두진 않았습니다.
unit_system과 time_zone은 각각 단위와 시간 설정인데요. metric과 Asia/Seoul 로 해주면 됩니다.. 딱히 건드릴 필요가 없어요. 
customize는 차후에 다룰 예정입니다. 그냥 두세요.

아래에 있는 http 컴포넌트는 HA 홈페이지 접속을 위한 설정입니다. 
api_password는 로그인을 하지 않고 암호만을 입력하여 쉽게 접속할 수 있게 해주는 설정입니다. 
원하는 암호를 설정해두면 앞으로는 그냥 암호만으로 로그인이 가능합니다. 물론 아이디,패스워드를 이용한 로그인도 됩니다.
base_url은 홈페이지의 기본 접속 주소를 나타냅니다. duckdns를 이용하여 만들어준 주소를 적어주면 됩니다.
test라는 이름으로 8080포트에 만들었다면 
http://test.duckdns.org:8080 
이러한 식으로 입력해두면 됩니다.

그다음 …으로 표시를 한 곳에 설정들이 있는데 지금은 딱히 건들지 않아도 되어서 그냥 패스하도록 하겠습니다.
좀더 설정을 만지는데 익숙해 지면 그때 다뤄볼까 합니다.

그다음에 sensor,binary_sensor,switch 컴포넌트가 있는데요.
각각 센서와 바이너리센서(켜짐센서), 스위치를 뜻합니다.
센서 컴포넌트는 다양한 상태에 대해서 알려줄수 있는 컴포넌트입니다.
바이너리센서 컴포넌트는 켜짐,꺼짐 두가지 상태만 얘기할 수 있어요. 센서 컴포넌트의 축소형이라고 할 수 있지요.
스위치 컴포넌트는 말그대로 스위치를 뜻합니다. 스위치와 바이너리센서의 차이점은 스위치는 직접 켜고 끌 수 있고 
바이너리센서는 어떠한 상황(센서등을 생각해보면 쉬워요)에 따라 켜지고 꺼지고가 됩니다.

여기서 우리가 눈여겨 볼 명령은 !include 와 !include_dir_merge_list 입니다.
각각의 의미가 다릅니다.

우선 !include는 파일을 불러오는 명령입니다. 뒤에 파일이름을 적으면 됩니다.
!include scripts.yaml 이러한 방식으로요.

하지만 센서나 스위치는 한개만 존재하지 않고 여러 개가 존재하는 경우가 많습니다.
HA 설정 파일에 모든 센서와 스위치를 적으면 보기가 불편할 수도 있고 헷깔리는 경우가 생길 수 있습니다.
이럴 경우에 따로 파일을 만들어서 거기에 센서만 따로 입력해 두고 그 파일을 설정 파일에서 !include 명령을 통해 불러들이는 거죠.
다만 센서와 스위치의 갯수가 더 많이 존재한다면 따로 만들어준 파일도 복잡하게 많은 설정들이 적히게 될겁니다.

예를 들어보죠. 방3개의 보통의 아파트의 스위치를 한번 생각해 보겠습니다. 
그러면 안방,방1,방2 의 등 스위치가 존재하겠죠 베란다가 있다면 베란다 스위치도 있을거예요. 
거실과 부엌, 현관 스위치도 필요할 겁니다. 거기에 화장실도 있을거예요. 
이걸 전부다 파일 하나에 입력하면 어떤거가 무엇을 의미하는지 알기가 상당히 어려워집니다.
아직 설명을 하지 하지 않았지만 스위치 하나당 각각 하나씩 설정을 해줘야 되거든요.

그럴 때 헷깔리지 않게 파일을 여러개 쪼개는 방법을 사용합니다.
안방에 해당하는 스위치 파일을 하나 만들어서 안방등, 안방베란다, 화장실, 화장대 이러한 식으로 묶어서 적습니다.
방1에 해당하는거도 파일을 만들고, 거실과 부엌, 현관등은 같이 묶어서 파일을 만들고..
이렇게 파일을 쪼개서 설정을 해둔다면 나중에 보기도 편하고 관리하기도 편할 겁니다.
그럴 때 쓰는 명령이 !include_dir_merge_list 입니다. 이 명령은 해당 폴더에 있는 모든 파일을 불러오라는 명령입니다.
!include_dir_merge_list sensors/
는 sensors 폴더에 있는 모든 파일을 불러오는 명령입니다.

처음 시작할 때는 구매한 기기가 얼마 없어서 include 만으로도 충분히 사용이 가능하지만 갯수가 늘어나면서 점점 설정이 늘어나면 
관리가 어려워 질겁니다. 그걸 미리 대비하기 위해서 자주 사용할만한 컴포넌트는 !include_dir_merge_list 를 이용하여 
폴더를 미리 지정해 두는게 좋습니다. 물론 서버에도 폴더를 만들어주면 되겠죠?
<HA 설정 폴더>


다음 시간에는 샤오미 로봇청소기 등록방법과 예전에 적어놨던 홈킷 등록방법에 대해서 얘기해보도록 할게요.


지금까지 Home Assistant 설치와 접속을 위한 설정을 했는데요.

오늘은 설정 파일 수정을 위하여 필요한 프로그램에 관한 이야기를 해보려고 합니다. 

  • sftp 접속을 위한 프로그램 소개
  • 설정 파일 수정을 위한 프로그램 소개

1. sftp 접속을 위한 프로그램 소개

우선 ftp 라는 말을 먼저 설명해야되는데요.
File Transfer Protocol, 즉 파일 전송에 관련한 놈입니다. 
이걸 이용해서 서버(Hassbian)와의 파일을 주고 받을 수 있죠.
우리는 여기서 secured가 붙은 sftp를 이용할 겁니다.
ftp보다 보다 안전하고 무엇보다 ssh를 이용하여 파일을 전송하는 방법이기 때문에 따로 프로그램을 설치할 필요가 없어요.
(ftp만 쓰려면 또 프로그램을 설치해야되요…)

저번 시간에 sftp 설정을 대충(?) 마쳐놨기 때문에 이제 sftp 접속을 위한 프로그램을 소개할까 합니다.
무료면서 많은 사람들이 쓰는 FileZilla 입니다.
해당 사이트에 가서 filezilla client 를 받으면 됩니다. 영어라서 무서울 수도 있지만..
한글을 지원합니다!!

<FileZilla 실행화면>


설치를 끝내고 다음을 입력해서 빠른 연결을 해주면 됩니다.
  • 호스트: hassbian.local  (혹은 OpenWRT에서 고정시킨 IP 주소)
  • 사용자명: pi
  • 비밀번호: (비밀번호)
  • 포트: 22

이렇게 접속을 하면 hassbian 접속이 완료가 되죠. 
이전에 만들어준 링크로 HA 설정 폴더로 바로 이동이 가능합니다.

화면 왼쪽은 컴퓨터 목록이고, 오른쪽은 hassbian의 목록입니다.
파일을 끌어서 넣거나 더블클릭을 하면 서로 파일을 교환할 수 있습니다.

2. 설정 파일 수정을 위한 프로그램 소개

이번엔 Home Assistant 설정 파일 수정을 위한 프로그램을 소개해 보겠습니다.
Atom 이라는 프로그램입니다.
Atom은 yaml 확장자(HA 설정파일)를 인식해서 자동 들여쓰기와 문구 등을 보다 쉽게 쓰고 볼 수 있게 해줍니다.
다운받아서 설치를 합니다.
<Atom 실행 화면>

오른쪽 상단에 뭐가 하나 뜨는데요. 하고 싶은거 하면 됩니다. 보통 yes 하면 됩니다.
그리고 아래에 있는 ‘Install a Package’ 를 클릭하고 korean 을 검색하세요.
<Package 검색화면>

한글 메뉴를 설치하면 메뉴를 한글로 볼 수 있습니다.


이제 준비는 모두 끝났습니다. 
파일질라(FileZilla)에서 컴퓨터로 파일을 옮기고 아톰(Atom)으로 수정한 다음에 다시 서버(hassbian)으로 옮기는 작업을 하면 됩니다.

파일을 옮겨서 수정하는 방법 보다 좀 더 쉽게 할 수 있기도 합니다.
서버에서 수정할 파일을 마우스 오른쪽 클릭으로 편집을 하면 파일을 컴퓨터에 다운 받을 필요없이 바로 아톰이 떠서 수정이 가능합니다.
파일을 저장하면 파일질라가 알아서 파일을 업로드 해줘요.

다음에는 본격적으로 설정 파일들을 건드려 보겠습니다.


Home Assistant의 권한 변경

오늘은 Home Assistant 설정 두번째 이야기입니다.
이전시간에 Hassbian 접속과 관리자 비밀번호 변경에 대해서 알아봤는데요.

우리는 ssh 를 이용하여 ftp 서비스를 사용할겁니다. 보통 sftp 라고 하는데요.
이 방법을 이용하여 Home Assistant의 설정을 수정하려고 합니다.
하지만 이 이야기를 하기 앞서 꼭 다루어야 할 사항이 있는데요. 

오늘은 그 이야기에 대하여 해보려고 합니다. 오늘 할 내용은 다음과 같습니다.

  1. 소유권과 권한 설명
  2. Home Assistant 의 소유권과 권한(퍼미션) 변경 방법
  3. 직접 적용하기
  4. (옵션)Home Assistant 설정 폴더 링크 만들기
(다  아는 설명이면 바로 3번으로 이동하면 됩니다.)


1. 소유권과 권한 설명

Hassbian은 운영체제입니다. 그리고 Home Assistant 는 운영체제 안에 깔려있는 프로그램이고요.
Hassbian은 데비안 운영체제를 기반으로 이루어져 있고 그 데비안은 리눅스 운영체제 중 하나이죠.

왜 이러한 얘기를 하느냐? 
리눅스 운영체제는 항상 소유권과 권한(퍼미션)이라는 걸 중요시 합니다.
이 파일은 누구꺼냐 누가 볼 수 있냐 누가 실행할 수 있냐 부터 시작해서
파일의 소유자와 소유자가 아닌 자가 가진 권한도 각각 다르게 설정이 가능합니다.
따라서 프로그램을 설치를 하면 그 프로그램의 소유자가 누구인가? 소유자 외에 누가 그 설정을 건드릴 수 있느냐 등을 알아야 되고 
필요에 따라서 따로 설정을 해 주어야 하죠.

권한(퍼미션)은 크게 3가지로 구분됩니다. 읽기(Read), 쓰기(Write), 실행(eXecute).. rwx 로 표현을 합니다.
이 rxw는 다시 각각 숫자로 표시하기도 하는데 r=4, w=2, x=1로 씁니다.
만약 파일에 읽기와 쓰기 권한이 있다면 rw 혹은 6(=4+2)으로 표현합니다. 
읽기,쓰기,실행 전부 권한이 있다면 rwx, 7로 표현하죠.

이러한 권한 부여는 총 3가지 종류로 부여가 가능합니다.
소유자/그룹/미소유자

소유자는 말그대로 그 파일(혹은 프로그램)의 소유자를 뜻합니다. 
그룹은 말그대로 한 집단을 뜻합니다. 그 그룹에 속하는 사용자 전원이 권한을 갖게 됩니다.
마지막 미소유자는 소유자나 그룹에 속하지 않은 사용자를 뜻합니다.

따라서 파일에는 총 3가지 형태의 권한이 부여가 되어 있죠.
아래를 캡쳐를 보면 권한 부여 형태가 나옵니다.

<ls -al 명령 (현재 폴더의 파일을 보는 명령 - 숨긴파일과 소유권,권한이 나온다)>


.bashrc 라는 파일은 rw-r—r—  이렇게 되어 잇죠. 세개씩 떼서 소유자/그룹/미소유자의 권한을 뜻합니다.
사용자는 읽기,쓰기가 가능하고 그룹은 읽기만 가능하며, 미소유자도 읽기만 가능하군요. 숫자로 644가 됩니다.
그리고 pi,homeassistant, root 사용자 들이 적혀있는데 왼쪽이 소유자를 뜻하고 오른쪽이 그룹명을 뜻합니다.
그룹과 소유자 이름이 같아서 헷깔릴 수 있는데 서로 다른 이름입니다. 
pi 라는 사용자, pi라는 그룹명 .. 각각 다른 의미를 갖죠.

groups 라는 명령을 이용하면 pi 사용자가 속해 있는 그룹목록들이 나옵니다.

<groups 명령>
pi 사용자는 pi 라는 그룹과 adm, dialout,cdrom,… 마지막으로 homeassistant 라는 그룹까지 속해 있다는 얘기예요.
homeassistant 사용자는 homeassistant 그룹과, dialout,… 해서 gpio 그룹까지 속해 있군요.


2. Home Assistant 의 소유권과 권한(퍼미션) 변경 방법

간략하게 소유권과 권한에 대해 알아봤는데요.
그렇다면 Home Assistant(이하 HA) 라는 프로그램은 누가 소유자인가? 그 설정을 누가 할 수 있는가? 이걸 알아야 될텐데요.
그 소유자는 homeassistant 라는 사용자(계정)입니다.
우리가 hassbian에 접속할 때 사용한 pi라는 사용자는 HA를 수정을 하지 못해요.
hassbian을 설치한 사람은 나인데 내가 따로 설정해 놓지도 않은 homeassistant 사용자가 소유권을 가지냐 의문이 들죠.

우선 homeassistant 계정은 가상의 사용자입니다. 보안 혹은 실수방지(파일을 지운다던지 등)를 위해서 ssh 접속을 하는 pi 사용자와 구분을 해둔거죠.
하지만 이 점 때문에 상당히 귀찮아지게 도는데요.
소유자가 본인(pi)가 아니기 때문에 HA의 설정을 수정할 수가 없기 때문이죠.

이 문제를 해결을 위해 세가지를 선택할 수 있습니다.
1) Hassbian 접속을 pi에서 homeassistant 계정으로 바꾸기
2) 관리자 계정으로 강제로 HA 권한 접근
3) pi 사용자에게 HA 수정 권한을 갖게 그룹 권한 변경하기 

1) Hassbian 접속을 pi에서 homeassistant 계정으로 바꾸기

homeassistant 계정은 외부 로그인이 금지된 계정입니다. 리눅스 운영체제에서는 이러한 로그인 금지 계정이 종종 나오는데요.
보안 상의 이유나 불필요 때문에 꺼두기 때문입니다. 
그래서 ssh로 접속할 때 pi 대신 homeassistant 로 로그인 자체를 할 수가 없죠. 
외부 접속이 금지되어 있기 때문에 어쩔 수 없이 내부에서 로그인해 들어가야합니다.
pi 로 먼저 로그인을 한 후에 계정을 바꿔주는 작업을 해주면 됩니다.
pi 사용자가 homeassistant 계정으로 접근하는건 hassbian에서 아주 쉽게 할 수가 있습니다.
hashell 명령을 이용하면 됩니다.


프롬프트를 통해서 homeassistant로 사용자가 변경된게 보이죠? 

~는 해당 사용자의 홈폴더를 의미하기 때문에 사용자가 변경되면서 /home/pi로 표시가 됩니다.
이제 이 상태로 HA 설정을 해주면 됩니다. (우리가 원하는 방식은 아니라서 자세한 설명은 생략합니다.)
다 완료가 되면 exit 명령으로 빠져나오면 되죠.

2) 관리자 계정으로 HA 권한 접근

관리자 계정(슈퍼유저라고도 함)은  root 라는 아이디를 갖습니다.
이 사용자는 모든 권한을 무시하고 데이터에 접근이 가능하죠.
하지만 권한 남용(?)이나 보안의 이유로 이러한 root 사용자의 사용은 기본적으로 금지가 되어 있습니다.
금지를 풀어서 관리자 계정을 사용해 보려면 2가지 방법이 있는데요.
하나는 root의 사용 금지 자체를 풀어주는 것과 나머지 하나는 관리자 실행명령만 따로 사용하는겁니다.
root의 사용 금지를 풀어버리면 보안 상 큰 문제가 발생할 우려가 많습니다.
우리는 후자인 관리자 실행명령을 사용해 보겠습니다.
관리자 실행명령이라는게 조금 헷깔릴 수도 있는데 쉽게 설명하면 '이 명령은 관리자가 실행하는 명령으로 인식해라’라는 명령을 쓰겠다는 겁니다.
sudo 라는 명령인데요. 모든 명령에 sudo 를 입력하면 관리자가 실행하는 걸로 인식을 합니다.
참 간단한 명령이죠? 하지만 이것도 너무 남발을 하면 좋지 않으니 필요할 때만 sudo 명령을 쓰기를 추천합니다.

하지만 이 방법의 치명적인 문제가 있습니다.
관리자가 실행하는 걸로 인식을 하기 때문에 파일을 생성하면 소유자를 관리자로 지정해 버리기 때문이죠. 

나중에 소유자 변경 작업이 필요하게 됩니다. 
(이방법도 우리가 원하는 방식은 아니라서 자세한 설명은 생략합니다.)

3) pi 사용자가 HA 권한 갖게 하기

HA의 소유권은 homeassistant가 가지고 있습니다. 그리고 homeassistant 그룹이 할당되어 있습니다.
설정 폴더의 권한을 775로 바꾼다면 그룹도 모든게 가능해집니다. 위에서 pi는 homeassistant 그룹에도 속해 있다고 했었죠.
따라서 pi 또한 쓰기가 가능해지죠. 다음 명령을 쓰면 됩니다.
pi@hassbian:~ $ sudo chmod -R 775 /home/homeassistant/.homeassistant/

<권한 변경후 목록 보기 명령 사용>

이렇게 사용하면 pi 라는 계정으로 파일을 수정할 수 있습니다.
(물론 여기서 무엇을 수정하고 이럴 생각은 없어요. 차후에 쉽게 수정하는 방법도 얘기해볼게요.)
파일을 수정하는데는 아무런 문제가 없지만 없는 파일을 만들어주는 경우 문제가 발생하게 됩니다.
pi가 만들면 소유자와 그룹이 각각 pi,pi 로 바뀌게 됩니다.
물론 pi 사용자가 수정하고 그러는데는 아무런 문제가 없지만 homeassistant 계정은 pi 그룹이 아니기 때문에 그 파일을 수정할 권한이 없습니다.
그래서 homeassistant 계정을 pi 그룹에 추가해서 이 문제를 해결할 겁니다.

3. 직접 적용하기

이제 위에 설명한 3)의 내용을 토대로 서버에 적용해 보도록 해요.

우선 pi 계정으로 hassbian에 로그인하고 다음 명령을 입력합니다.
$ sudo chmod -R 775 /home/homeassistant/.homeassistant/
$ sudo usermod -aG pi homeassistant
1줄 의미: HA 설정 폴더 권한 변경
2줄 의미: homeassistant 계정을 pi 그룹에 추가

나중에 sftp에서 파일을 올렸을때 자동으로 775 퍼미션이 되도록 /etc/ssh/sshd_config 파일을 수정합니다.
$ sudo nano /etc/ssh/sshd_config

<콘솔화면에서 nano 에디터 실행화면>

115번째(혹은 그 근처.. 거의 맨 밑에 위치해 있어요) 줄에 -u 0002 를 추가해 주세요. 

# override default of no subsystems
Subsystem       sftp    /usr/lib/openssh/sftp-server -u 0002

그리고 컨트롤+X를 누르고 저장(Y)를 누른 후 엔터를 눌러 종료하면 됩니다. 
그리고 다음 명령을 이용하여 ssh 서버를 재시작 해줍니다.
sudo service ssh restart
이러면 소유자와 권한 문제가 해결이 됩니다.


4. (옵션)Home Assistant 설정 폴더 링크 만들기

나중에 sftp 접속을 할 때 귀찮은 점이 하나 있는데요. 바로 HA 설정 폴더의 위치로 이동입니다.
/home/homeassistant/.homeassistant 라는 폴더로 이동하는게 클릭질이 좀 필요합니다. (한 세번..?)
이걸 한번에 처리할 수 있게 하려고 합니다. 링크를 만들어서요.
다음 명령을 치면 됩니다.
$ ln -s /home/homeassistant/.homeassitant homeassistant

<링크 생성후 파일 확인 장면>

이러면 나중에 sftp 접속시 간단하게 폴더 이동이 가능해집니다.


오늘은 참 많은 얘기를 했는데요. 리눅스 운영체제 자체가 윈도우와는 달라서 사용하기 불편해서 접속이 꺼려집니다.
오늘 이렇게 접속해서 설정을 마쳤으니 업데이트 할때를 제외하고 따로 접속할 일은 없을겁니다.

쉽게 설명한다고 적어봤는데 뭔가 상당히 어수선하고 정신이 없는거 같아요 ㅠㅠ
글솜씨가 영 꽝이라…. ㅠㅠ

다음시간에는 sftp 를 이용하여 파일을 업로드하고 바로 수정하는 방법에 대해서 해보겠습니다.


Hassbian 접속과 비밀번호 변경

이젠에 Hassbian 설치방법에 대해서 알아봤었는데요.

오늘은 Home Assistant 접속과 비밀번호변경에 대해서 얘기해 보려고 합니다.

  • Hassbian 접속
  • 간단한 터미널 화면 설명
  • Hassbian 로그인 비밀번호 변경


접속은 ssh(Secure SHell)을 이용할 겁니다. ssh 접속을 지원하는 프로그램을 사용하면 되는데요.
흔히 사용하는 PuTTY(https://www.putty.org)를 이용하면 됩니다. 무료예요.

PuTTY를 실행하고 Host Name과 Port를 입력하고 Connect 버튼으로 접속하면 됩니다.
접속 아이디(username)와 비밀번호는 아래에 적힌걸로 하고요.
접속은 같은 네트워크(같은 공유기) 상에서 해야됩니다.
  • ​Host Name: hassbian.local
  • Port: 22
  • username: pi
  • password: raspberry
다만 접속중에 비밀번호를 적으면 **과 같은게 안나오고 아예 적지 않은거 처럼 나옵니다. 
정상이니까 그냥 그대로 치고 엔터를 치면 접속이 됩니다. 다음처럼 말이죠.

<Hassbian ssh 접속화면>


보통 윈도우처럼 그래픽 화면에 마우스 조작이 가능한 방법을 GUI(Graphical user interface)라고 합니다.
Hassbian은 글자로만 표현하고 키보드로만 조작이 가능하죠. 이런걸 CUI(Character User Interface; 혹은 CLI:Command-Line Interface)라고 합니다. 그리고 외부에서 접속하여 들어간 저화면을 콘솔화면 또는 터미널 등으로 얘기를 하기도 해요.


처음 Hassbian에 접속하면 위 화면처럼 나오지는 않아요. 영어로 비밀번호를 변경하라는 경고가 나올겁니다.
(전 변경을 벌써 해서 안떠요.)

터미널 화면에서 맨 아랫줄이 현재의 상태를 알려주는 프롬프트 라고 하는데요.
위 캡쳐화면의 'pi@hassbian: ~ $ ‘는 전부다 의미를 가지고 있습니다.
@ 왼쪽에 위치한 pi는 현재 접속한 id입니다. (접속할때 username에 pi 입력해서 들어왔었죠? 그겁니다.)
@ 오른쪽에 위치한 hassbian은 컴퓨터 이름입니다. (네트워크에서 나오는 그 이름입니다.)
: 오른쪽에 위치한 ~ 는 현재 폴더의 위치를 뜻합니다. 바탕화면이냐 내문서냐 이런거 말이죠.
마지막으로 $ 는 명령을 입력받을 준비가 됐다는 뜻입니다. 저 $뒤에 명령을 입력하는거죠.
pwd 를 입력해보세요.
<pwd 명령>
pwd는 현재 폴더를 알려줍니다. ~는 홈폴더로 사용자의 기본폴더를 나타냅니다. 
pi라는 사용자는 /home/pi 라는 폴더를 기본 폴더로 갖는다는 뜻이죠.

명령어를 배우는 목적이 아닌지라 모든 명령에 대해서 설명하긴 힘들고..
가면서 필요한 명령들만 조금씩 설명하는 식으로 글을 적으려고 해요.
만약 명령어가 무슨 뜻인지 모를때엔 구글링을 하시면 됩니다. 
다만 앞에 우분트 (혹은 리눅스) 를 붙히고 명령어를 검색하면 훨신 찾기 수월할거예요.
이런 식으로요.

<구글 검색화면>



이제 pi 사용자의 비밀번호를 변경해보도록 하죠. 
hassbian은 기본설치 비밀번호가 만국공통(?)이기 때문에 보안을 위해서라도 비밀번호를 바꾸어주는게 좋습니다.
비밀번호를 바꾸는 명령은 passwd 입니다. 기존 비밀번호를 먼저 적고 새비밀번호를 두번 적어주면 비밀번호가 바뀝니다.
이것도 로그인과 마찬가지로 입력 시 아무런 표시를 하지 않아요. 그냥 치고 엔터를 누르면 됩니다.


아직 해야할 얘기가 많아요. 
설정은 이제부터가 시작이거든요.
다음에는 Home Assistant의 소유권과 권한 등에 관해서 얘기해볼게요.



이전에 우리는 DuckDNS를 이용하여 DDNS 등록을 했었는데요.
오늘은 Home Assistant 외부 접속을 위하여 OpenWRT 설정을 하는 방법에 대하여 얘기해 보겠습니다.


해야 할 작업목록

  • Hassbian 의 IP 고정
  • 포트포워딩 


처음 해야할 작업은 Hassbian이 깔려있는 라즈베리파이의 IP를 고정하는겁니다.
IP는 이전에 설명했듯이 그 컴퓨터가 누군가를 판별해주는 주소의 역할을 하기 때문에 무조건 부여가 되어야 하는데요.
공유기는 외부(인터넷망)에서 IP를 부여받아서 내부에 인터넷이 가능하게 해줍니다. 
그리고 공유기에 연결된 기기(스마트폰,컴퓨터 등)에 내부에서만 판별 가능한 주소(IP)를 부여하는데 DHCP(Dynamic Host Configuration Protocol)라고 하는 방식을 이용하는데 IP가 고정이 되어 있지 않고 무작위로 분배를 하는 방식입니다.

우리는 이러한 무작위로 바뀌는 IP를 고정해보려고 합니다.
우선 공유기 설정 메뉴에서 네트워크 - DHCP와 DNS 로 이동하여 맨 아래로 내려가보면 Static Lease 가 있는데요. 

<LuCI DHCP 설정화면>


여기에 MAC 주소에서 hassbian.lan 이 적혀있는 걸로 선택을 합니다.
IPv4 주소는 페이지 위에 있는 Active DHCP 임대목록을 참고하여 hassbian에 해당하는 IP를 선택하면 됩니다.
그리고 저장 & 적용을 해주면 IP 고정이 완료가 됩니다.


이제 포트포워딩 작업을 해봅시다.
컴퓨터는 통신작업을 포트를 이용하여 하게 됩니다.
통신작업은 인터넷 웹페이지를 보여주는 웹서비스 뿐아니라 메일서비스, 프린트서비스 외부접속서비스 등 다양한대요.
기본적으로 웹서비스는 80, ssh는 22 등 이러한 포트명을 가지고 있습니다.
Home Assistant의 웹서비스도 포트가 따로 존재합니다. 바로 접속 주소 http://hassbian.local:8123 에 나와있는 숫자 8123 입니다.

이걸 공유기를 통해 외부에서 들어오는 통신을 받아서 보내주는 작업을 하게 될텐데요.

관리페이지 상단 메뉴의 네트워크 - 방화벽 으로 이동합니다.
그 페이지에서 Port Forwards 탭으로 이동하면 다음이 나오죠.
<LuCI 포트포워딩 설정화면>

밑에 New port forward 에 입력을 하면 됩니다.
이름은 원하는걸로 아무거나 적으면 됩니다.
프로토콜은 할얘기가 좀 있지만 여기서는 그냥 두도록 하죠.
External zone 과 Internal zone은 그냥 두면 됩니다. 
External port는 80을 입력해주고
Internal IP address는 Hassbian의 고정시킨 IP를 선택해줍니다.
Internal port는 HA의 포트인 8123을 입력하고 추가를 하면 모든 작업이 끝나게 됩니다.

이제 외부에서 DuckDNS에서 만들어준 주소로 접속을 하면 HA 홈화면이 나올 겁니다.
끝~!


여기서 한가지 좀 얘기하고 싶은게 있는데요. 80 포트는 웹서비스를 표시하는 대표적인 포트입니다.
따라서 난 외부에 내 페이지가 공개되는게 싫다라고 생각하거나 보안 상의 이유로 80포트가 아닌 다른 포트를 사용하는 경우도 많이 있습니다.
다만 다른 포트로 바꿔서 쓰는 경우에는 항상 주소 뒤에 포트번호를 입력해주어야 합니다.
예를 들어 DuckDNS로 만들어준 주소가 http://test.duckdns.org 이고 포트포워딩에서 포트를 8080으로 설정했다면
접속을 위해서 http://test.duckdns.org:8080 이라는 주소를 입력을 해야됩니다.


DuckDNS를 이용하여 OpenWRT에 DDNS 등록

준비물
  • ​OpenWRT가 설치된 공유기
  • DuckDNS 가입

인터넷을 사용하기 위해서는 항상 IP가 필요합니다.
IP는 3자리 숫자를 4개 합하여 구성이 됩니다. 123.456.789.101 이러한 형태로 말이죠.
우리가 sk나 kt, lg와 같은 인터넷 제공업체에서 기가 인터넷망 등을 사용하게 되면 꼭 IP라는 걸 부여받게 됩니다.
이 IP는 누가 어디에서 접속하고 있는가를 알려주는 주소의 역할을 하게 되죠.
외부에서 집으로 내가 쓰는 컴퓨터(혹은 공유기) 등으로 접속을 하려면 이 IP를 알면 됩니다.
물론 이러한 숫자를 외우기는 쉽지는 않기 때문에 DNS(Domain Name System) 등록 작업을 하게 됩니다.
흔히 알고 있는 문자로 된 인터넷 주소는 이러한 IP를 알기쉬운 문자로 바꾸어 주는 DNS 등록을 해서 만들어진겁니다.
물론 접속의 편리함 때문에 DNS 등록을 하는거지 하지않고 숫자 그대로 써도 상관이 없기는 합니다.

따라서 집에서 사용하는 인터넷망의 IP를 알고 있다면 외부에서 내부로 바로 접속이 가능하죠.(물론 몇가지 작업이 필요하긴 합니다.)
다만 여기에선 가장 큰 문제가 있는데요.
인터넷업체에서 제공해주는 IP는 동적IP라고 해서 고정되어 있지 않고 일정 시간이 지나면 바뀌게 된다는 거죠.
그럼 바뀔때마다 DNS 등록을 다시 하거나 IP를 다시 외우던지 해야되는데 여간 귀찮은게 아닙니다.

이러한 불편함을 없앤 것이 DDNS(Dynamic DNS)입니다.
IP가 바뀌면 자동으로 DNS 등록을 갱신해줘서 문제없이 인터넷 주소를 사용할 수 있게 해주는 서비스입니다.
다만 IP가 바뀌는 상황을 알아야 하기 때문에 일반 DNS 등록과는 다르게 집 컴퓨터(공유기)에 관련 프로그램의 설치가 필요해요.

DDNS를 서비스하는 업체는 많이 있지만 무료로 서비스하는 duckdns를 사용해 보겠습니다.


<DuckDNS 접속화면>


상단에 있는 5개 계정 중 하나를 이용하면 됩니다. 저는 google 계정을 이용하였습니다.

<DuckDNS 등록작업>

로그인 후 상단에 나오는 sub domain 상자에 자신이 원하는 인터넷 주소를 적고 add domain 버튼을 클릭하면 됩니다.
그럼 하단에 추가한 이름과 현재 집에서 사용중인 인터넷망의 ip가 등록되죠.

이제 공유기 설정을 건들여봅시다.
우선 공유기로 ssh 접속을 합니다.

그리고 ddns-scripts 패키지 설치를 합니다.
$ opkg update
$ opkg install ddns-scripts
그리고 /etc/config/ddns 파일을 수정하여 안에 내용을 다 지우고 다음으로 바꿉니다. 
config service "duckdns"
option enabled "1"
option domain "<duckdns Domain>.duckdns.org"
option username "<duckdns Domain>"
option password "<duckdns Token>"
option ip_source "network"
option ip_network "wan"
option force_interval "72"
option force_unit "hours"
option check_interval "10"
option check_unit "minutes"
option update_url "http://www.duckdns.org/update?domains=[USERNAME]&token=[PASSWORD]&ip=[IP]"
<duckdns Domain> 에 아까 만들어준 sub domain 값을 넣어주고, <duckdns Token>에는 duckdns 로그인했을 때 가운데 뜨는 Token을 입력해줍니다.
그리고 파일을 저장한 후 다음 명령어를 그대로 적어줍니다.
$ sh
$ . /usr/lib/ddns/dynamic_dns_functions.sh # (.) .
$ start_daemon_for_all_ddns_sections "wan"
$ exit
그러면 모든 설정이 끝나게 됩니다. 
잘 돌아가는지 확인해 보려면 다음의 명령어를 쳐봅시다.
$ /usr/lib/ddns/dynamic_dns_updater.sh -v 1 start

이제 http://<가입한id>.duckdns.org 로 집에서 쓰는 인터넷망으로 접속이 가능하게 됩니다.


다음엔 공유기에서 Home Assistant 페이지로 포트 포워딩하는 방법에 대해서 해보죠.

이전에 샤오미 로봇청소기 1세대에 대한 홈킷 등록에 대해서 다루었는데요.


오늘은 청소기에 문제가 있을 때 알려주는 작업을 해보려고 합니다.


우선 사용할 것은 바이너리 센서(binary sensor)입니다. 

바이너리 센서는 간단하게 온오프 만 알려주는 센서인데요.

모션, 재실, 빛, 가스 등 있다,없다를 알려주는 센서 컴포넌트입니다.

자세한 설명은 HA 홈페이지를 참고하세요.


우리가 사용할 건 바이너리 센서의 problem 클래스 입니다.

사실 problem이 아니고 그냥 일반 다른 센서로 선택해도 큰 상관은 없을거 같아요.

홈킷이 바이너리 센서를 딱히 세세히 분류를 안하는거 같더라고요.

그냥 단순히 켜지면 "작동됨"이라는 글이 올라 올 뿐입니다.

물론 아직 많이 실험을 해보지 않아서 다를지도 모르겠지만 우선 재실(presence) 클래스하고는 별 차이가 없더라고요.


configuration.yaml 파일에 다음을 추가합니다.

- platform: template
sensors:
vacuum_problem:
device_class: problem
friendly_name: " "
value_template: "{{ not (is_state('vacuum.xiaomi_vacuum_cleaner','docked') or is_state('vacuum.xiaomi_vacuum_cleaner','cleaning') or is_state('vacuum.xiaomi_vacuum_cleaner','returning'))}}"

value_template 부분은 한줄이에요.


대략적인 설명은 docked, cleaning 또는 returning 상태가 아니면 센서를 켜라는 명령입니다.

docked는 독에서 충전 혹은 대기중인 상태, cleaning은 청소 중, returning은 독으로 돌아가는 상태죠.


이렇게 해두면 저 3가지 상태가 아닐때 센서가 켜지게 됩니다. 

그런데 켜지는거 까지는 좋은데 푸시 알림을 안해주더라고요.

직접 켜야되는 모양입니다.

홈 앱을 실행해 봐요. 그리고 왼쪽 위에 집모양 아이콘을 클릭해서 홈 설정으로 들어가세요.

     


알림 쪽에 센서가 있죠? 그걸 클릭하면 우리가 만들어둔 센서가 있을겁니다.

그걸 키면 센서가 켜질때 푸시로 알려주게 됩니다.


나름 괜찮죠?


사실 문제알림은 필요가 없을 수도 있어요. 왜냐면 미홈앱이 푸시를 해주니까요.

하지만 저희집 상황처럼 저 혼자만 미홈앱을 쓰고 와이파이님은 홈앱으로 컨트롤을 한다면 문제가 생긴걸 저밖에 알 수가 없으니까 

그게 좀 불편하지 않을까 싶어 만들어 봤습니다.



오늘도 어김없이 홈킷을 가지고 놀고 있었습니다.

그런데 폰으로 설정을 해놓으니 밖에 나갈때는 접속이 끊겨 버리더라고요.


아이패드를 홈허브로 사용하면 밖에서도 컨트롤 가능하다고 해서 아이패드로 옮길려고 보려고 시도했죠.

같은 애플 아이디면 아이패드에서 바로 설정이 가능한데 와이파이님이 사용중이시라 홈 공유로는 불가능하더라고요.



아무생각없이 제 폰에서 HA 브릿지를 삭제하고 와이프의 아이패드로 새로 등록하려니 목록에 안떠요.. 

재부팅도 해보고 configuration.yaml 파일도 수정해보고 해도 등록화면이 안뜹니다.


HA의 홈킷 문서를 뒤져보니 원인을 알 수 있었습니다.

홈킷을 활성화 하면 .homekit.state 이라는 설정 파일이 생성이 되는데 이 파일 때문에 새로운 기기로 등록이 안됐던 거예요.

리눅스 운영체제에서 파일앞에 .(마침표)가 찍혀있으면 숨김파일 처리를 하는데요. 그래서 못찾고 헤매고 있었던 거죠.


이제 .homekit.state 파일을 삭제해보죠. putty나 기타 터미널 앱으로 hassbian에 접속합니다.


$ cd /home/homeassistant/.homeassistant          (HA 설정 파일 있는 곳으로 이동)

$ ls -a                                                  (숨김파일까지 보여주는 명령)

$ sudo rm .homekit.state                             (.homekit.state 파일 삭제 명령)



그리고 HA를 재시작 해주면 홈킷 설정 화면이 뜨게 되죠.


이제 다시 등록을 해주면 됩니다.

이전에 Home Assistant의 기기를 Homekit에 등록하는 방법을 해봤었는데요.



그런데 말입니다.

제가 샤오미 1세대 로봇청소기를 쓰고 있는데요. 얘는 등록이 안되어 있어요... 

https://www.home-assistant.io/components/homekit/ 에 보면 이유가 나와있는데요.


지원되는 컴포넌트에 vacuum이 없어요.


그래서 좀 다른 접근이 필요해요. 


우리가 할 작업은 가상 스위치를 이용하는 겁니다. 

가상의 스위치를 만들고 그 스위치를 켜면 로봇청소기를 작동시키고, 끄면 집으로 돌아가게 설정을 하는거죠.

스위치에 다음을 추가합니다.

- platform: template
switches:
mivacuum:
friendly_name: ""
value_template: "{{ is_state('vacuum.xiaomi_vacuum_cleaner','cleaning') }}"
turn_on:
service: vacuum.start
data:
entity_id: vacuum.xiaomi_vacuum_cleaner
turn_off:
service: vacuum.return_to_base
data:
entity_id: vacuum.xiaomi_vacuum_cleaner

잠깐 설명하자면 friendly_name 은 사용하고자 할 이름입니다.

value_template은 스위치의 상태를 나타내는데 True면 켜짐이고 False 면 꺼짐이에요.

is_state('vacuum.xiaomi_vacuum_cleaner','cleaning') 는 로봇청소기의 상태가 cleaning 즉, 청소중 인지를 물어보는 명령이에요. 청소 중이면 True 가 되어 켜짐 상태가 되고, 아니면 False 가 되어 꺼짐 상태가 되죠.

밑에 있는 turn_on 은 켜있을 때 할 작업, turn_off 는 꺼져있을 때 작업이에요.


이렇게 저장하고 HA를 재시작하면..


짜잔!! 로봇청소기가 등록이 되었어요. 저걸 키면 로봇청소기가 작동을 하게 됩니다. 


참 쉽죠? 이제 시리에게 "로봇청소기 켜" 로 명령을 할 수가 있어요!!



물론 여기에 좀더 다양한 옵션들을 넣을 수도 있을거예요. 하지만 로봇청소기에 기능은 켜고 끄고말고는 거의 안써서 저렇게만 등록해도 사용하는데 전혀 문제가 없을거예요. 


아직은 연구 중이라서 켜고 끄고만 해뒀는데 기기에 문제가 생겼을때의 처리도 한번 생각을 해봐야 될거 같기도 하더라고요.

그건 차후에 알아보고 수정해 두겠습니다.



+ Recent posts