Python 으로 Sonoff 제어 하기 (feat 라즈베리파이)


안녕하세요 라이프온룸 호그룰루 입니다. ?????

오늘은 라즈베리파이에서 파이썬으로 Sonoff를 제어하는 코드를 만들어 보겠습니다. 만들게 될 코드는 eWeLink App 과 비슷한 역할을 하게 됩니다. 그러니까 Python 코드가 eWeLink Cloud 에 연결되어 sonoff를 제어하는 것이지요 !

들어가기 전에 저는 왜 라즈베리파이로 Sonoff를 제어 하려 할까요 ???? ㅋㅋㅋ 이미 Alexa와 폰으로 제어가 가능한데 말이죠 ! 

그 이유는 그냥 재미? 인 것도 있지만 라즈베리파이는 GPIO를 사용할 수 있기 때문입니다. 즉 터치센서, 리모컨 수신기, 소리 인식 센서, 빛 감지 센서 등등등 다양한 입력 부품을 통해 Sonoff를 제어할 수 있기 때문이지요 !!

리얼 유니크한 울트라 신박한 스마트 홈이 탄생할지도 모르잖아요 ? ㅋㅋㅋㅋㅋ … 

뭐 여튼 바로 방법을 알아 봅시다. ~

1. 라이브러리 

일단 환경은 Python 2.7 로 진행하겠습니다. 기존에 echowemoclient 코드 가 2.7로 되어 있어서요 !

가상환경을 Enable 하고 pip 명령어로 아래 라이브러리를 설치해 주세요 !!

  1. pip install sonoff-python
  2. pip install websocket (중간에 gevent build 하는데 엄청 오래걸리더라고요 참고하시기 바랍니다.)
  3. pip install websocket-client
  4. pip install config

여기서 eWeLink App 의 백엔드 역할을 해주는 라이브러리가 sonoff-python 입니다. 근데 이 라이브러리는 https://github.com/peterbuga/HASS-sonoff-ewelink이 코드를 참고해서 만들어 졌다는데요 최근에 나와서 그런지 바로 돌리면 안되더라고요……

그래서 라이브러리를 좀 수정해줘야 합니다…. 하지만 걱정하지 마세요 전역변수만 선언해 주면 되니까요 위에 echowemoclient 폴더에서 아래 파일을 vim 편집기 혹은 Pycharm으로 열어줍니다. 

vim ecvenv\lib\python2.7\site-packages\sonoff\sonoff.py

저는 Samba를 이용해 Pycharm으로 열었는데요 위에 코드 보시면 빨간색 네모박스내용을 추가하시면 됩니다. 

HTTP_MOVED_PERMANENTLY = 301
HTTP_NOT_FOUND = 404
HTTP_BAD_REQUEST =400
HTTP_UNAUTHORIZED = 401

이렇게 변경을 하고 코드를 짠 뒤 실행하면 정상 실행 될 겁니다. 

참고로 이 라이브러리가 eWeLink Cloud 로그인을 시도할때 app 정보를 주게 되어 있는데(코드에 박혀 있음) 그 정보가 iPhone으로 되어 있더라고요 ! 저도 iPhone을 쓰고 있어서 그런지 라이브러리를 실행 시킨뒤 핸드폰에서 eWeLink APP 에 들어가면 로그아웃이 되있어서 로그인을 다시 해줘야 하더라고요 … 이 부분은 감안을 하시고 사용해야 될 것 같습니다. 

2. 기본 코드 테스트 

sonoffLibTest 라는 폴더를 만들고 그 안에 account.cfg, simple_test.py 를 만듭니다. 그리고 account.cfg 에 다음 내용을 입력해 줍니다. api_region은 그대로 “cn” 으로 입력해 줍니다.

username: "ewelink 계정"
password: "ewelink 패스워드"
api_region: "cn"

다음 simple_test.py 에 아래 내용을 입력해 줍니다. 

# -*- coding: utf-8 -*-
import sonoff
import sys
from config import Config

f = file('account.cfg')
cfg = Config(f)

username = cfg.username
password = cfg.password
api_region = cfg.api_region

# -- Dictionary 를 예쁘게 Print 해 줌 (기능에는 필요 없는 함수)--
def dump(obj, nested_level=0, output=sys.stdout):
    spacing = '   '
    if type(obj) == dict:
        print >> output, '%s{' % ((nested_level) * spacing)
        for k, v in obj.items():
            if hasattr(v, '__iter__'):
                print >> output, '%s%s:' % ((nested_level + 1) * spacing, k)
                dump(v, nested_level + 1, output)
            else:
                print >> output, '%s%s: %s' % ((nested_level + 1) * spacing, k, v)
        print >> output, '%s}' % (nested_level * spacing)
    elif type(obj) == list:
        print >> output, '%s[' % ((nested_level) * spacing)
        for v in obj:
            if hasattr(v, '__iter__'):
                dump(v, nested_level + 1, output)
            else:
                print >> output, '%s%s' % ((nested_level + 1) * spacing, v)
        print >> output, '%s]' % ((nested_level) * spacing)
    else:
        print >> output, '%s%s' % (nested_level * spacing, obj)


s = sonoff.Sonoff(username, password, api_region)
devices = s.get_devices()
if devices:
    # We found a device, lets turn something on
    for dev in devices:
        dump(dev)
        # print dev

    device_id = devices[0]['deviceid']
    s.switch('on', device_id, None)

 

이 코드가 하는 일은 eWeLink Cloud 에 본인의 계정으로 등록된 모든 Sonoff 장치의 정보를 찾아서 받아오며 그 정보를 출력해 줍니다. 

그리고 가장 첫번째 장치의 전원을 켜는 거죠 !!!!

저의 경우에는 이렇게 하니 Lamp 가 켜졌어요 !!!!!?

 

자 오늘의 포스팅은 여기까지 이구요 다음에는 기존에 작업하던 프로젝트에 연동해서 코드를 짜봐야 겠네요 여러분도 이 방법을 이용해서 본인만에 특별한 방법으로 Sonoff 를 제어해 보세요 !!!! 아 그리고 위에서 언급했다 싶이 이 파이썬 코드를 사용하면 실제 폰에서 ewelink 가 로그아웃 되는 문제가 있는데 해결방법도 알아 봐야 겠어요 혹시 아시는 분있으시면 댓글 달아주시면 정말 감사하겠습니다. ㅋㅋㅋ 

굿 밤 되세열 ~~~ ?

 

You may also like...