휴가철 빈집털이 방지를 위한 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).

웹 애플리케이션 개발

아무래도 릴레이를 컨트롤하는 라이브러리가 파이썬으로 되어 있으니 같은 환경에서 개발하는게 좋을 것 같습니다. 파이썬 웹 프레임워크로는 크게 djangoflask가 있습니다. 조금이나마 익숙한 django로 진행해 보겠습니다. Django Girls의 튜토리얼을 많이 참조하였습니다.

개발환경 준비

django를 설치합니다. 파이썬 패키지 관리자인 pip를 사용합니다.
$ pip install django

개발 진행

  1. Django 프로젝트 만들기 : django 커맨드로 프로젝트를 시작합니다. 프로젝트명은 homeauto로 정했습니다.
    $ django-admin startproject homeauto
  2. 프로젝트 디렉터리(homeauto)로 이동해 일단 웹 서버가 정상적으로 뜨는지 확인해 봅니다. 서버가 정상적으로 가동되면 브라우저에 locahost의 8000번 포트로 접속합니다. 환영 페이지가 나올꺼예요.
    $ python manage.py runserver
  3. 몇 가지 설정을 수정합니다.
    settings.py
    LANGUAGE_CODE = 'ko'
    TIME_ZONE = 'Asia/Seoul'
  4. Django 앱을 만듭니다. 이 부분은 구조가 독특하네요. 하나의 모델을 앱으로 취급하는 것 같습니다. 전등 제어이므로 이름을 light_control로 정했습니다.
    $ python manage.py startapp light_control
  5. 만들어진 앱의 코드들은 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
  6. 모델을 간단하게 설명하면 위치/상태(켜짐/꺼짐)/마지막상태변경시간을 속성으로 가지고 있으며 2개의 액션(켬/끔)이 있습니다.
  7. 만들어진 모델을 테이블에 반영하려면 migration을 해야 합니다.
  8. django 관리(admin)기능에 모델을 추가합니다. 관리기능을 기본적으로 제공하는 것도 독특하네요. 관리기능을 사용하려면 관리자계정을 만들어야 합니다. 계정관리도 기본 기능으로 제공하는게 편한 것 같습니다.
    1. 관리자 계정 추가
      $ python manage.py createsuperuser
    2. 관리 앱에 모델 추가
      admin.py
      from .models import LightControl
      admin.site.register(LightControl)
    3. 마이그레이션
      $ python manage.py makemigrations light_control
      $ python manage.py migrate light_control
  9. 다시 서버를 올리고 관리자 페이지에서 테스트를 해봅니다.
  10. 나머지로 작동하는 기능을 만들면 됩니다. 완성된 버전은 깃허브에 올려두었습니다.
  11. 마지막으로 위의 릴레이 코드 테스트와 모델을 합치면 됩니다.

인터넷 접속을 위한 설정

여러 웹 서버 중 nginx를 사용해서 인터넷을 통한 접속을 설정해 보겠습니다.
  1. 도메인 설정 : 도메인 서비스 회사에서 보유한 도메인을 설정합니다. 저의 경우 godaddy를 사용합니다.
  2. nginx 설정 : 라즈베리 파이로 라우팅되도록 합니다. 해당 도메인의 설정파일에 해당 내용을 추가합니다.
    /etc/nginx/conf-available/xxxx.conf
    server {
        listen 80;
        server_name home.xxx.com;
        location / {
            proxy_pass http://라즈베리파이IP:8000;
        }
    }
  3. django 설정 : 설정한 도메인 이름을 수용하도록 설정합니다.
    settings.py
    ALLOWED_HOSTS = ['라즈베리파이IP', 'home.xxx.com']
  4. 접속 확인
여기까지 집안의 전등을 제어하는 라즈베리파이 프로젝트를 진행해 보았습니다. 상용으로 나온 제품들도 있으나 개발자의 본성에 따라 직접 만들어 보았습니다.

그럼 전기 조심하시고 즐거운 여름휴가 보내세요~

댓글

주간 인기글

[정보] 인스타그램은 당신의 소리를 '듣고' 있을 수도 있습니다

[Angular] 모델, 값이 바뀌었는데 화면 template 이 업데이트 되지 않을 때 조치 팁

AWS Lambda - API Gateway로 S3 파일 업로드 API 만들기 #3 - API Gateway - Lambda 연결 및 테스트

[AWS] Lambda + API GateWay를 이용해 간단한 RESTful API 만들기 #1

[AWS] Lambda + API GateWay를 이용해 간단한 RESTful API 만들기 #2