휴가철 빈집털이 방지를 위한 IoT 전등. 2편.
휴가철 빈집털이 예방을 위한 IoT 전등(2/2)
인터넷을 통해 집안의 전등을 켜고 끄는 프로젝트를 진행하고 있습니다. 지난 회에서는 하드웨어를 준비했습니다. 이번 마지막 회에서는 S/W를 개발하는 부분을 진행해 보겠습니다. 업무 부분이라고 할 수 있는 전등을 켜고 끄는 코드는 아주 간단합니다. 상대적으로 웹 개발 부분이 훨씬 큽니다.
릴레이 테스트 코드
일단 링크를 참조해서 GrovePi 라이브러리와 예제를 라즈베리파이에 설치합니다. GrovePi 보드의 디지털 3번 포트에 연결한 경우입니다.- 스위치 켜는 코드
import grovepi
grovepi.digitalWrite(3, 1) - 스위치 끄는 코드
import grovepi
grovepi.digitalWrite(3, 0)
보시다시피 아주 간단합니다. 라이브러리를 가져오고 보드의 API를 통해 특정 포트에 디지털 신호를 주거나(1) 끊습니다(0).
웹 애플리케이션 개발
아무래도 릴레이를 컨트롤하는 라이브러리가 파이썬으로 되어 있으니 같은 환경에서 개발하는게 좋을 것 같습니다. 파이썬 웹 프레임워크로는 크게 django와 flask가 있습니다. 조금이나마 익숙한 django로 진행해 보겠습니다. Django Girls의 튜토리얼을 많이 참조하였습니다.
개발환경 준비
django를 설치합니다. 파이썬 패키지 관리자인 pip를 사용합니다.
$ pip install django
개발 진행
- Django 프로젝트 만들기 : django 커맨드로 프로젝트를 시작합니다. 프로젝트명은 homeauto로 정했습니다.
$ django-admin startproject homeauto - 프로젝트 디렉터리(homeauto)로 이동해 일단 웹 서버가 정상적으로 뜨는지 확인해 봅니다. 서버가 정상적으로 가동되면 브라우저에 locahost의 8000번 포트로 접속합니다. 환영 페이지가 나올꺼예요.
$ python manage.py runserver - 몇 가지 설정을 수정합니다.
settings.py
LANGUAGE_CODE = 'ko'
TIME_ZONE = 'Asia/Seoul' - Django 앱을 만듭니다. 이 부분은 구조가 독특하네요. 하나의 모델을 앱으로 취급하는 것 같습니다. 전등 제어이므로 이름을 light_control로 정했습니다.
$ python manage.py startapp light_control - 만들어진 앱의 코드들은 stub이므로 수정이 필요합니다. 일단 모델 코드를 수정합니다.
homeauto/light_control/models.py# -*- coding: utf-8 -*-from __future__ import unicode_literals from django.db import modelsfrom django.utils import timezone # Create your models here.class LightControl(models.Model): location = models.CharField(max_length=100) switch_on = models.BooleanField() last_date = models.DateTimeField(default=timezone.now) def on(self): self.last_date = timezone.now() self.switch_on = True self.save() def off(self): self.last_date = timezone.now() self.switch_on = False self.save() def __str__(self): return self.location
- 모델을 간단하게 설명하면 위치/상태(켜짐/꺼짐)/마지막상태변경시간을 속성으로 가지고 있으며 2개의 액션(켬/끔)이 있습니다.
- 만들어진 모델을 테이블에 반영하려면 migration을 해야 합니다.
- django 관리(admin)기능에 모델을 추가합니다. 관리기능을 기본적으로 제공하는 것도 독특하네요. 관리기능을 사용하려면 관리자계정을 만들어야 합니다. 계정관리도 기본 기능으로 제공하는게 편한 것 같습니다.
- 관리자 계정 추가
$ python manage.py createsuperuser - 관리 앱에 모델 추가
admin.py
from .models import LightControl
admin.site.register(LightControl) - 마이그레이션
$ python manage.py makemigrations light_control
$ python manage.py migrate light_control - 다시 서버를 올리고 관리자 페이지에서 테스트를 해봅니다.
- 나머지로 작동하는 기능을 만들면 됩니다. 완성된 버전은 깃허브에 올려두었습니다.
- 마지막으로 위의 릴레이 코드 테스트와 모델을 합치면 됩니다.
인터넷 접속을 위한 설정
여러 웹 서버 중 nginx를 사용해서 인터넷을 통한 접속을 설정해 보겠습니다.
- 도메인 설정 : 도메인 서비스 회사에서 보유한 도메인을 설정합니다. 저의 경우 godaddy를 사용합니다.
- nginx 설정 : 라즈베리 파이로 라우팅되도록 합니다. 해당 도메인의 설정파일에 해당 내용을 추가합니다.
/etc/nginx/conf-available/xxxx.conf
server {
listen 80;
server_name home.xxx.com;
location / {
proxy_pass http://라즈베리파이IP:8000;
}
} - django 설정 : 설정한 도메인 이름을 수용하도록 설정합니다.
settings.py
ALLOWED_HOSTS = ['라즈베리파이IP', 'home.xxx.com'] - 접속 확인
여기까지 집안의 전등을 제어하는 라즈베리파이 프로젝트를 진행해 보았습니다. 상용으로 나온 제품들도 있으나 개발자의 본성에 따라 직접 만들어 보았습니다.
그럼 전기 조심하시고 즐거운 여름휴가 보내세요~
댓글
댓글 쓰기