Python 으로 Sonoff 제어 하기 (feat 라즈베리파이)
안녕하세요 라이프온룸 호그룰루 입니다. ?????
오늘은 라즈베리파이에서 파이썬으로 Sonoff를 제어하는 코드를 만들어 보겠습니다. 만들게 될 코드는 eWeLink App 과 비슷한 역할을 하게 됩니다. 그러니까 Python 코드가 eWeLink Cloud 에 연결되어 sonoff를 제어하는 것이지요 !
들어가기 전에 저는 왜 라즈베리파이로 Sonoff를 제어 하려 할까요 ???? ㅋㅋㅋ 이미 Alexa와 폰으로 제어가 가능한데 말이죠 !
그 이유는 그냥 재미? 인 것도 있지만 라즈베리파이는 GPIO를 사용할 수 있기 때문입니다. 즉 터치센서, 리모컨 수신기, 소리 인식 센서, 빛 감지 센서 등등등 다양한 입력 부품을 통해 Sonoff를 제어할 수 있기 때문이지요 !!
리얼 유니크한 울트라 신박한 스마트 홈이 탄생할지도 모르잖아요 ? ㅋㅋㅋㅋㅋ …
뭐 여튼 바로 방법을 알아 봅시다. ~
1. 라이브러리
일단 환경은 Python 2.7 로 진행하겠습니다. 기존에 echowemoclient 코드 가 2.7로 되어 있어서요 !
가상환경을 Enable 하고 pip 명령어로 아래 라이브러리를 설치해 주세요 !!
- pip install sonoff-python
- pip install websocket (중간에 gevent build 하는데 엄청 오래걸리더라고요 참고하시기 바랍니다.)
- pip install websocket-client
- 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 가 로그아웃 되는 문제가 있는데 해결방법도 알아 봐야 겠어요 혹시 아시는 분있으시면 댓글 달아주시면 정말 감사하겠습니다. ㅋㅋㅋ
굿 밤 되세열 ~~~ ?