만들리에/원클릭수유등 (아마존버튼)

원클릭 수유등 (1/2) - 구상 및 핵심 기능 구현

gamz 2021. 1. 2. 23:27

이제 곧 태어날 아기를 위해 출산 준비가 한창이다. 그러던 중 아내가 수유등이라는게 있단다. 새벽에 자주 깨는 아기를 달래기 위해 켜는 너무 밝지 않은 은은한 조명이다.

조명을 또 새로 사자니 아까워서 마침 쓰고 있는 필립스 Hue 전구를 활용해보자는 생각이 들었다. Hue는 조도나 색상을 원하는 대로 바꿀 수 있지만 막상 이걸 켜려면 어둠속에서 폰을 찾아 들어서 락을 풀고 앱을 실행하고 브릿지 연결 기다렸다가 조명을 켜야한다. 아내말을 빌리자면..

 

촛불을 켜는게 더 쉽겠다..

 

사실 그 정도는 아니지만 형광등 켜는 것 보다 불편한건 사실이다. 라는 핑계와 손가락이 근질거리기도 해서 “원클릭 수유등”을 구성해보기로 했다.

 

구상

어떻게 구성할까 고민하다가.. 프로그래밍 가능한 AWS IOT Button이 있다는걸 본 기억이 나서 이거다 싶었다. 일단 첫번째 방법으로 이 녀석의 클릭이 발생했을때 AWS Lambda로 Trigger하는 Rule을 적용하면 쉽게 되겠구나라는 생각이 들었다. 그런데 좀 더 큰(?) 그림을 그려보자라는 노답근성이 발동해서 놀고있던 라즈베리파이를 끼워넣기로 전격 결정. 최종 컨셉은 이렇다..

 

 

원클릭 수유등 구성

즉, AWS IOT Button 클릭 → 집 공유기(Wireless AP) → 라즈베리파이 → Philips Hue 브릿지 → Hue 전구 “짠”

 

구현

(1) AWS IOT Button 을 구매하자. 한국에는 정식 발매를 안해서 직구를 해야한다. 이부분은 우리집 구매 담당인 아내에게 맡겼다.

 

(2) 버튼이 도착했다. 대략 7일정도 걸렸다. 버튼을 세팅하자. 세팅하려면 앱이 필요한데 정식발매가 아니라 아직 한국 스토어에는 없다. 앱스토어 미국계정이 필요하다. (예전에 만들어둔 계정을 겨우겨우 찾음.. 안드로이드는 확인 안해봤음)

 

(3) 앱에서 버튼을 세팅하는 과정은 아래 3단계다. 그러나 나는 라즈베리파이에서 버튼 동작을 처리할 것이기 때문에 세번째(c) 단계에서 앱을 종료해서 스킵했다.
 a. QR코드로 버튼을 인식하고 AWS IOT Resource에 등록
 b. 버튼이 접속할 Wi-Fi 공유기 (SSID/암호설정)
 c. 클릭시 연동할 기능 설정(기본 제공 템플릿 중에서)

 

(4) 일단 버튼 세팅은 끝났고, 라즈베리파이에서 이 버튼 클릭을 잡아내는지 볼 차례. 먼저 시도하신 우리 선배님들의 조언을 구해보자. 역시다.. https://github.com/hortinstein/node-dash-button 를 이용하자. findbutton을 실행하고 버튼을 클릭하면 아래처럼 mac address 를 얻어낼 수 있다. 저걸 나중에 이용할거니까 잘 적어두시길.

# connect to my raspberry pi
$ ssh pi@my-raspberry# dependancy on libpcap for reading packets
pi@raspberrypi$ sudo apt-get install libpcap-dev
pi@raspberrypi$ npm install node-dash-button
pi@raspberrypi$ sudo ./node_modules/node-dash-button/bin/findbutton
Watching for arp & udp requests on your local network, please try to press your dash now
Dash buttons should appear as manufactured by 'Amazon Technologies Inc.'
Manufacturer: MERCURY CORPORATION Protocol: arp
Possible dash hardware address detected: 88:71:e3:88:28:69 Manufacturer: Amazon Technologies Inc. Protocol: arp

 

* 참고로, 이는 버튼이 Mac Address를 Resolving 하기 위해 Network에 브로드캐스팅하는 ARP 패킷을 Sniffing해서 버튼이 클릭되었음을 인식하는 방식. 똑똑한데?? 그러나 Single Click 만 사용할 수 있음. AWS IOT 서비스에서는 Single / Double / Hold의 3가지 액션을 모두 구분 가능

 

(5) 이제 node 코드로 간단한 버튼 클릭시 핸들러를 작성해보자. 위에서 적어둔 Mac Address 를 여기서 사용하면 된다. 이정도면 다 끝났다고 봐야죠.

var DashButton = require("node-dash-button");
var dash = DashButton("88:71:e3:88:28:69", null, null, 'all');
dash.on("detected", function () {
    console.log("my aws button is clicked!!");
});

 

(6) 그럼 정말 마무리로 Hue Bridge API를 이용해서 조명을 켜고/끄는 로직을 넣어보자. 이 또한 역시 선배님들이 이미 작성해둔 오픈소스가 있다. https://github.com/peter-murray/node-hue-api 이걸 이용해보겠다.

var DashButton = require("node-dash-button");
var hue = require("node-hue-api");
var HueApi = hue.HueApi;
var lightState = hue.lightState;
var hostname = "172.31.2.12";
var username = "dWAksDC1ms0uTSIVlgsD3XbyP4KLodto7o31L7X";
var api = new HueApi(hostname, username);
var state = lightState.create();
var dash = DashButton("88:71:e3:88:28:69", null, null, 'all');
dash.on("detected", function (){
    var bedroomId = 1;
    api.lightStatus(bedroomId)
    .then(function(status) {
        var newStatus = status.state.on ? state.off() : state.on();
        api.setLightState(bedroomId, newStatus)
        .then(function(result) { console.log(result); })
        .fail(function(error) { console.log(error); })
        .done();
    }).done();
});

 

hostname은 Hue Bridge IP이고, username은 API 이용을 위해 생성한 토큰. Hue API 사용 관련해서는 여기를 참조.

데모

 

요약

* 준비물 및 비용
 - Philips Hue 전구 (이미 있던거)
 - Raspberry Pi2 (집에 놀던거)
 - AWS IOT Button 2개 $42.64 (1개당 $19.95 + Tax $2.74)
 - 배송대행 10,663원

 

* 오픈소스 및 참고
 - https://github.com/hortinstein/node-dash-button
 - https://github.com/peter-murray/node-hue-api
 - https://www.developers.meethue.com/documentation/getting-started