라즈베리파이와 페이스북 메신저를 사용한 온습도 모니터링 봇 개발

집이 1층인데 햇빛도 잘 안들어오고 환기도 잘 안되서 거의 항상 습하고 곰팡이도…
어느 주말에 그날도 역시 습한 집에 누워있다가 갑자기 집이 도대체 얼마나 습한건지 궁금해졌다.
어떻게 할까 고민하던 중 작년에 IoT관련 세미나에서 받은 라즈베리파이와 키트를 살펴보니 온습도 센서를 발견했다.(이거다!)
그래서 무작정 개발해보기로 했다.

개발 구상

  • 라즈베리파이와 온습도 센서를 통해 데이터 가져오기
  • 온습도 데이터를 저장하고 웹에서 간단히 보여줄 수 있는 웹 서버 개발
  • (후에 추가된) 온습도 모니터링해서 알려주는 봇 개발

이렇게만 하면 되겠지..?

라즈베리파이

일단 라즈베리파이에 Thing+가 셋팅되어 있었는데, 그 API를 활용해서 데이터를 불러오려고 시도했다. 하지만 뭔가 잘못된것인지 라즈베리파이와 연동이 안되서 실패했다.
그래서 그냥 빵판에 연결해서 데이터를 뽑아보는 방법으로 바꿨는데 하다보니 좋은 오픈소스도 있어서 쉽게 할 수 있었다.

회로도

[출처] Adafruit

위 그림처럼 회로를 연결하고 테스트를 해봤다. 필요한 소스는 Adafruit_Python_DHT 여기에서 구할 수 있었다.

1
2
$ python AdafruitDHT.py 11 4
Temp=31.0* Humidity=42.0%

그리고 저 라이브러리를 사용해서 얻은 온습도 데이터를 10초마다 보낼 수 있게 crontab을 사용했다.

1
2
3
4
5
6
7
8
9
10
11
12
import Adafruit_DHT
import requests
import datetime

humidity, temperature = Adafruit_DHT.read_retry(11, 4)

data = {'humidity': humidity, 'temperature': temperature, 'ticktime': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}

url = 'SERVER_URL'

res = requests.post(url, data=data)
res.content

웹 개발

라즈베리파이로 자체 웹서버를 올려서 사용할까도 생각했었는데 공유기로 연결을 해둬서 그런가 IP포워딩등 여러가지 설정할것이 있어서 그냥 Microsoft의 Azure를 사용하기로 했다.
기본적으로 Node.js + Express 로 웹서버를 구축하고 라즈베리파이에서 전송한 데이터를 몽고디비에 저장하는 API하나를 만들고, 웹 페이지에서 마지막 업데이트 시간과 온도, 습도를 보여주는 페이지를 개발했다.
시간대별로 온습도가 어떻게 변하는지 보고싶어서 plotly.js 라이브러리를 사용해서 그래프를 쉽게 만들었다.
다만 모바일 화면에서 너무 찌그러져보이는 단점이 있는데 커스터마이징을 할 수 있는 d3.js로 나중에 바꿀 생각이다.

생각보다 빠르고 쉽게 구축을 했는데, 막상 웹 페이지에서 보는것만 있으니 조금 별로였다. 쾌적한 온습도 범위를 벗어나면 내가 알 수 있는 어떤 장치가 필요하다고 생각했다.

OMSH WEB

메신저 개발

사실 처음에는 (이미 해봤던)슬랙 API를 활용해서 만들려고했다.
하지만 좀 새로운 것이 없을까 하다가 슬랙과 유사한 서비스인 잔디에도 비슷한 기능이 있을 것 같아서 찾아보니 역시 있었다.
그래서 내가 원하는 습도가 넘어가면 알림을 Jandi Webhook 을 통해 알림을 줄 수 있게 해놨다.

Jandi Webhook Noti

오예!

그런데 이렇게 막상 만들고나니 습도가 높아졌을 때 알림이 오는건 좋은데 내가 원할 때마다 웹 페이지에 접속하고 보는게 생각보다 불편했다.
그래서 뭔가 대안이 없을까 생각을 하다가 요즘 핫하다는 Facebook Messenger 로 온습도를 알려주는 Bot을 만들기로 했다.

막상 한다곤 했지만 아는게 없어서 일단 이 링크를 따라했다.
생각보다 훨씬 빠르고 간단하게 개발이 완료되었는데, 여기에 뭐 쓰기도 애매한 수준이라 생략하겠다.(저 링크에 더 자세히 나온다.)

OMSH Bot

Refer

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×