회사 사무실에는 에어컨이 3대 설치되어 있습니다. 출퇴근시 에어컨 세대를 끄고 켜는데 불편한 점이 많습니다. 특히 3대중에 한대만 다른 모델이라 각각의 리모컨 찾는데 시간이 걸리는 경우가 많습니다. 이번 발표에서는 3대의 에어컨을 음성으로 동시에 제어할 수 있는 시스템을 구축하기 위한 A부터 Z까지 세세한 과정을 소개합니다. 요즘에는 아마존 에코와 라즈베리파이라는 훌륭한 제품들이 나와있어 음성 인식으로 하드웨어를 제어하기가 매우 쉬워졌습니다. 에코의 명령을 처리하기위한 서버로 django/celery를 이용하였습니다. 하드웨어 지식이 없어도 이해할 수 있는 수준이며 django와 도커가 무엇인지는 알면 좋지만 모르더라도 최대한 쉽게 이해할 수 있도록 발표를 진행할 예정입니다. 소스코드까지 모두 공개했기 때문에 발표를 듣고나서 똑같은 시스템을 구축하거나 다른 방식으로 응용하는데에 도움이 되었으면 좋겠습니다.
발표 순서는 다음과 같습니다.
적외선 신호 송수신을 위한 라즈베리파이 회로 설계
LIRC를 이용한 적외선 회로 제어
아마존 에코와 Django 서버 연동하기
ngrok 무료 버전을 활용한 고정 public url 생성하기 - celery 활용
Docker/Ansible로 Django/Celery 패키징하기
진행중인 프로젝트는 아래 github repository에 공개되어 있습니다
https://github.com/Buzzvil/hardware-lab
1 of 50
Downloaded 60 times
More Related Content
아마존 에코를 활용한 음성 인식 에어컨 제어 A to z
2. 프로젝트 목표
2Copyright ⓒ All Right Reserved by Buzzvil
● 사무실에 있는 에어컨을 쉽게 끄고 켤 수 있는 방법은
없을까?
○ 무려 3대의 에어컨이 존재
○ 심지어 모델마저 제각각이라 2개의 리모콘이 필요
3. 프로젝트 목표
3Copyright ⓒ All Right Reserved by Buzzvil
● 에코를 이용한 에어컨 제어
○ Alexa, turn on the AC.
○ Alexa, turn off the air conditioner.
○ Alexa, could you please turn on the AC?
4. 프로젝트 목표
4Copyright ⓒ All Right Reserved by Buzzvil
● Slack 커맨드 만들기
○ /acon - 에어컨 끄기
○ /acoff - 에어컨 켜기
○ /acwarm - 에어컨 약하게
○ /acmedium - 에어컨 중간
○ /accool - 에어컨 세게
5. 하드웨어 만들기
5Copyright ⓒ All Right Reserved by Buzzvil
● 리모컨
○ 적외선 통신
○ 단방향 통신
○ 에어컨의 상태는 리모컨에
저장되어 있다
6. 하드웨어 만들기
6Copyright ⓒ All Right Reserved by Buzzvil
● 적외선 발신기
○ LED의 일종
○ 전기에너지를 빛 에너지로
○ 적외선/가시광선/자외선
○ 깜빡임의 주기를 통해
데이터를 전달
7. 하드웨어 만들기
7Copyright ⓒ All Right Reserved by Buzzvil
● 리모컨 프로토콜 알아내기
○ IR receiver 이용해 캡쳐
8. 하드웨어 만들기
8Copyright ⓒ All Right Reserved by Buzzvil
Echo
● Echo: Amazon Echo
● RPI: Raspberry pi
● AC: Air conditioner
RPI IR emitter AC
Slack
12. LIRC
12Copyright ⓒ All Right Reserved by Buzzvil
● LIRC (Linux Infrared Remote Control)
○ 적외선 신호를 보내고 받을 수 있게 해주는 패키지
○ sudo apt-get install lirc
○ LIRC commands
■ mode2
■ irsend
■ irrecord
○ LIRCD
■ Client application이 Unix domain socket을 통해
쉽게 적외선 신호 송수신을 해주는 데몬
13. LIRC
13Copyright ⓒ All Right Reserved by Buzzvil
● irrecord
○ irrecord -d /dev/lirc0 lircd.conf
15. LIRC
15Copyright ⓒ All Right Reserved by Buzzvil
● LG 에어컨 프로토콜 분석
○ 온도/바람 세기는 왼쪽
값에서 설정
○ 오른쪽 값은 누른
버튼에 대한 값
○ 단방향 통신의
제약으로 인해
에어컨의 모든
상태값을 항상
전송해야함
○ 전원 on 커맨드 = 전원
on + 온도 + 바람세기
16. LIRC
16Copyright ⓒ All Right Reserved by Buzzvil
● 삼성 에어컨 프로토콜 분석
○ irrecord로 분석이 안됨
○ 체크섬 로직이 있다고 함
● mode2 사용
○ 저수준의 IR waveform capture command
○ 결과를 lircd.conf 포맷으로 출력해주는 -m 옵션
사용
○ sudo mode2 -m -d /dev/lirc0 > lirc.conf
18. LIRC
18Copyright ⓒ All Right Reserved by Buzzvil
● irsend
○ irsend SEND_ONCE lg-ac BTN_1
■ lg-ac 디바이스에 BTN_1에 해당하는 신호를 한 번
보내라
○ irsend SEND_ONCE samsung-ac BTN_2
23. 에코
23Copyright ⓒ All Right Reserved by Buzzvil
● 에코가 요청한 명령 핸들러 구현
○ AWS Lambda라는 serverless computing service와
연동
● 다양한 연동방식
○ Custom Skills
○ Smart Home Skills
○ Flash Briefing Skills
○ Video Skills
Echo
AWS
Lambda
24. 에코
24Copyright ⓒ All Right Reserved by Buzzvil
● Smart Home Skill API
○ 클라우드 연동된 스마트 홈 디바이스 제어
○ 일반적으로 사용하는 명령들이 잘 정의되어 있음
■ TurnOnRequest
■ TurnOffRequest
■ SetTargetTemperatureRequest
○ Account Linking을 필수로 요구한다
25. 에코
25Copyright ⓒ All Right Reserved by Buzzvil
● Account Linking
○ OAuth 서버가 필요
○ 사용자가 에코를 구입하고 셋업하는 시점에 Alexa
Service가 Access token을 받아옴
○ 팁: OAuth 서버를 직접 만드는 대신 페이스북 OAuth
서버 활용
Echo
AWS
Lambda
Alexa
Service
OAuth
Server
Access Token
RPI
26. Device discovery
26Copyright ⓒ All Right Reserved by Buzzvil
● Device discovery
○ 디바이스는 공유기 내부 네트워크에 숨어있음
Echo
AWS
Lambda
Alexa
Service
OAuth
Server
RPI
?!
27. Device discovery
27Copyright ⓒ All Right Reserved by Buzzvil
● ngrok
○ Secure tunnels to localhost
○ "I want to expose a local server behind a NAT or
firewall to the internet."
33. Device discovery
33Copyright ⓒ All Right Reserved by Buzzvil
● 비용 절약
○ 유료 플랜 고정 도메인 3개 가격 한달에 5 불
○ DynamoDB 버지니아 기준 월 별 가격 = 0.47 불(1
write/sec) + 0.09 불(1 read/sec) = 0.56 불
○ ngrok Basic 플랜에 비해 1/10의 가격으로 무제한
도메인 사용 가능
○ 더 아끼고 싶으면 S3에 저장하자
○ 간단한 환경에서는 공유기의 DDNS/포트 포워딩 기능
이용
34. Slack 연동
34Copyright ⓒ All Right Reserved by Buzzvil
● Slack 연동
○ Slash Commands
■ /acon - 에어컨 끄기
■ /acoff - 에어컨 켜기
■ /acxxx - 온도 조절
○ HTTP 요청을 통해 Lambda를 실행하기 위해 API
Gateway 사용
/acon
Slack
Server
API
Gateway
Lambda
HTTP Request
35. Slack 연동
35Copyright ⓒ All Right Reserved by Buzzvil
● Temperature state aware command
○ 에어컨 ON명령에는 온도값도 항상 포함이 되어있어야
한다
○ /acon를 /acwarm, /acmedium, /accool 로 변환이 필요
○ /acwarm, /acmedium, /accool 중 마지막에 호출된
커맨드를 저장해야함
○ DynamoDB에 상태값을 저장
36. 최종 설계도
36Copyright ⓒ All Right Reserved by Buzzvil
raspberry pi
API Gateway Lambda
Echo
Slack
ngrok server
Air Conditioner
Django Celery worker
ngrok api
http://localhost:4040/api/
DynamoDB
Public URL Table
public url
https://d9.ngrok.io
irsend
DynamoDB
Temp State Table
37. 배포 자동화
37Copyright ⓒ All Right Reserved by Buzzvil
● AC controller application을 설치하기 위한 단계
○ IR 핀 설정
○ ngrok 설치
○ pip 패키지 설치 및 django project 소스코드 복사
○ supervisord를 이용해 ngrok, django web server,
celery worker daemonize
38. 배포 자동화
38Copyright ⓒ All Right Reserved by Buzzvil
● 도커
○ 쉽게 말하면 윈도우의 포터블 앱과 비슷
○ 컨테이너 안에 필요한 애플리케이션을 설치하고
이미지를 만들어 라즈베리파이에서는 단순히
이미지를 받아 실행
39. 배포 자동화
39Copyright ⓒ All Right Reserved by Buzzvil
supervisord
Docker Container Django web server
Celery worker
ngrok
Entry Point
40. 배포 자동화
40Copyright ⓒ All Right Reserved by Buzzvil
● Ansible
○ 서버 셋업 자동화 툴
○ Puppet, Chef 등과 비슷하나 Agent가 필요없고
SSH 프로토콜 사용
41. 배포 자동화
41Copyright ⓒ All Right Reserved by Buzzvil
● 업그레이드된 AC controller setup하기
○ ansible 명령으로 application 설치
■ ansible-playbook -i hosts setup_rpi.yml
○ 완성!
43. One more thing
43Copyright ⓒ All Right Reserved by Buzzvil
● 조도 센서를 이용한 자동 어에컨 끄기
❏ 조도 센서를 폴링하여
조명이 on -> off
상태로 변경이 됐는지
체크
❏ 마지막 조명 on/off
상태값을 저장해야함
❏ 상태값은 sqlite3 db에
저장하고 Django
ORM을 통해 접근
44. Summary
44Copyright ⓒ All Right Reserved by Buzzvil
● 재료비
○ 라즈베리파이3 + 공식케이스 + 방열판 = 53,350원
○ SD카드 = 4,410원
○ 트랜지스터 = 700원
○ 적외선 LED = 400원
○ 저항 = 100원
○ 만능기판 = 1,300원
○ 만능기판 다리 = 100원
○ 점퍼 케이블 = 300원
○ 총 = 60,660원
● 라즈베리파이 zero W 가 나왔습니다
○ 해외 판매가 10불
45. Summary
45Copyright ⓒ All Right Reserved by Buzzvil
● 납땜을 위한 준비물 비용
○ 라즈베리파이 입출력 키트 = 14,600
○ 테프론 와이어 AWG30 = 5,380원
○ Kester 유연납 1.0mm /50g = 4,400원
○ 멀티미터 FLUKE-101 = 43,500원
○ HAKKO FX-888D 디지털인두기 = 143,550원
○ 교체용인두팁 T18-K = 11,880원
○ 니퍼 = 집에 있는거
○ 총 = 223,310원
● 에코
○ 에코닷 = 55,000원
?!
48. Summary
48Copyright ⓒ All Right Reserved by Buzzvil
● 마무리하며
○ Python/Django/Celery를 활용해 필요한
애플리케이션 로직을 빠르게 개발
■ HTTP 서버 구축
■ ngrok 무료 사용
■ 에어컨 온도 설정상태 보관
■ 조도센서 상태 변경 캐치
○ Django/Celery 조합을 활용해 하나의 프로젝트로
서버부터 주기적인 태스크까지 다양한 일을 수행
○ Python을 활용해 빠르게 프로토타이핑을 하고
시간이 많이 걸리는 다른 부분에 집중할 수 있었음