라즈베리파이로 슬랙 봇 개발(a.k.a JARVIS)

마지막 학기에 임베디드 시스템 설계라는 과목을 들었다.

그동안 관심있던 라즈베리파이를 사용한다는 강의계획서를 보고 바로 신청하게 되었는데 과목 이름만 보면 하드웨어도 엄청 다뤄야할 것 같은 과목이지만 특이하게 라즈베리파이르 사용해서 챗봇을 만들게 되었다.

사실 페이스북 메세지와 라즈베리파이를 사용해 챗봇을 개발해본 경험이 있어 손쉽게날로먹으려고 개발할 수 있겠다 싶었다.

개발 과정

Slack Bot User

슬랙 봇을 사용하는 방법은 아주 간단하다.
링크에 들어가면 봇 이름을 적으면 끝!
jarvis

그러면 다음과 같이 토큰을 발급해 주는데 이 토큰으로 API를 사용할 수 있다.

jarvis

python-rtmbot

Real Time Messaging API 를 사용하기 위해 python-rtmbot라이브러리를 사용했다.
사용방법은 Github페이지에 매우 자세하고도 간단하게 나와있다.
아래 그림처럼 플러그인을 추가하면 봇을 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
class Jarvis(plugin):
def process_message(self, data):
try:
self.send_message(data)
except Exception as e:
text = ":shit: Error : " + str(e)
slack.slack_client.api_call(
"chat.postMessage",
channel=data.get("channel"), text=text, as_user=True
)

개발 중 에러가 발생하면 로그에 에러메세지가 뜨지만 슬랙에서는 아무런 반응이 없어서 이것이 오래 걸리는 작업이라 그런건지 에러가 난건지 알 수 없었다. 그래서 에러가 발생하면 에러 메세지를 슬랙으로 전송해 개발 효율을 높일수 있었다.

jarvis

Django

봇 기능중에 온습도를 측정하는 기능이 있었는데 센서에서 값을 실시간으로 불러오면 시간이 조금 걸렸다.
그래서 어딘가에 주기적으로 기록하고 그 값을 가져오야 겠다 싶기도 했고, 옵습도 값 변화를 한눈에 보면 좋겠다싶어 웹 서버 하나를 만들어 그래프를 만들었다.
그래서 웹서버로 Django를 사용했다.

Django-crontab

온습도 값을 센서에서 읽어와 데이터베이스에 저장하는 스크립트를 crontab으로 하려했는데 찾아보니 Django-crontab이란것을 발견했다.
이것의 장점은 Django의 ORM기능을 그대로 사용할 수 있다는 것이다.
덕분에 아래와 같이 코드량이 매우 감소해 개발시간을 줄일 수 있었다.
Django-crontab 역시 Github에 문서화가 잘 되어있어 사용법을 참고하면 된다.

1
2
3
4
5
6
7
8
9
10
import Adafruit_DHT
from common import models
from datetime import datetime

def add_dht():
sensor = Adafruit_DHT.DHT11
pin = 4
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
dht = models.DHT(humidity=humidity, temperature=temperature, created_at=datetime.now())
dht.save()

기능

온습도 조회

jarvis

날씨 검색

jarvis

사실 기능이 더 있지만 궁금하신 분은 슬라이드를…(거의 없겠지만)

그리고

이 프로젝트를 진행하고 있던 학기 중에는 몰랐지만 이 글을 쓰고 있는 시점에 갑자기 저커버그가 실제로 자비스를 개발했다고 기사가 나왔다.

그 기사를 보는 순간 내가 한 프로젝트가 초라해지기 시작해서 이 글도 올리지 말아야겠다 하고 있었는데, 뭐 어짜피 보는 사람도 별로 없는 블로그이므로 그냥 올려보기로 했다. ㅠ.ㅠ

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

집이 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

×