이산화탄소 CO2 값에 따라 자동으로 환풍기 가동하기 잉여개발

[서론] 

밀폐가 잘 안되는 창(문)을 갖고 있다면 별로 신경쓸 필요가 없지만, 요즘은 밀폐력이 우수한 창호를 설치하는 경우가 많다보니 자신의 호흡에 의해 이산화탄소(CO2) 농도가 올라갈 수 있습니다. 
  • 집에 귀가하면 보통 600언저리에 있는데, 시간이 지나면 800, 1000, 1200까지 올라가게 됩니다. 
  • 보통 1000이 넘으면 민감한 사람들은 피로를 느낄 수 있다고 하네요. 
  • 특히 집중력을 높일 필요가 있는 프로그래머, 학생이나 수험생이라면, CO2 농도를 관리하는 것이 좋을 것 같습니다. 
미세먼지만 없다면 적당히 열어놓고 살면 되지만, 요즘같이 미세먼지가 수시로 공습(?)하는 경우 애로사항이 발생합니다. 
  • 아무래도 CO2를 맞추어 주려면, 가습기능이 떨어지게 되고 미세먼지량이 증가하겠지요.~
  • 그래서 창문은 적당히 밀폐시킨 상태에서 간접적으로 화장실의 팬을 가동하면 음압이 발생하여 창틈으로 조금 더 외부 공기가 유입되는 것 같습니다.  
(환기를 위해 닫힘 열림을 어느 정도 조절이 가능한 창문, 12시 방향으로 하지 않고, 9~10시 방향 근방으로 유지하면 좋습니다.)


지난번에 나름대로 가격이 괜찮아 보이는 아래 USB 이산화탄소 센서 제품을 구입했습니다. 일반적으로 다 비쌉니다. 


사실, 위 제품이 이미 녹색/노란색/적색의 표시를 해주기는 하지만, 저 값에 의존하여 환기를 해보려고 한다면 그 값을 읽어야 하겠지요. 

문제는 저 제품은 윈도우용 프로그램을 제공해주긴 하지만, 저는 라즈베리파이로 (초)미세먼지 센서를 사용 중이라서 거기에 연결해야 하는데, 소스코드가 없다는 것입니다(아래에 해결).

[USB로 값 읽어들이기]

지난번에 몇 시간 동안 오래간만에 USB HID장치 해킹을 해보려니 잘 안되어서 포기하고 있었는데, 오늘 검색해 보니까 다행히 다른 분들이 감사하게도 이미 작업해주셨네요^^ 
udev rule을 추가하고 plugdev에 현재 로그인한 계정을 추가하고 나니, 아래와 같이 액세스가 가능해졌습니다. 
  • pip install git+https://github.com/heinemml/CO2Meter
  • /etc/udev/rules.d/90-co2mini.rules 에다가 udev rule 내용을 넣고 저장 
  • sudo gpasswd -a 현재로그인명 plugdev 

Python 3.5.2 (default, Nov 12 2018, 13:43:14) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from CO2Meter import *
>>> import time 
>>> sensor = CO2Meter("/dev/co2mini1")
>>> while True:
...     time.sleep(2)
...     sensor.get_data()
... 
{'temperature': 24.912500000000023, 'co2': 626}
{'temperature': 24.912500000000023, 'co2': 626}
{'temperature': 24.912500000000023, 'co2': 626}
{'temperature': 24.912500000000023, 'co2': 625}
{'temperature': 24.912500000000023, 'co2': 625}
{'temperature': 24.912500000000023, 'co2': 625}

[환풍 스위치 원격 제어]

이제 환풍기의 스위치를 원격 제어할 수 있는 것으로 바꾸어야겠습니다. 사실, 이미 얼마 전 SKT의 스마트홈 스위치로 바꿨는데, 이게 외부에서 제어할 방법이 (찾아본 바로는) 없는 것 같습니다. 왜 저런 정책을 쓰고 있는 지 이해가 안되지만,,, 새로 사야겠습니다. 
  • 현재는 새벽 시간에 2시간 가동, 1시간 휴식 등으로 시간을 정해놓고 돌리고 있어서, 거의 CO2는 800이하를 유지하고 있기는 합니다. 다만, 필요없이 계속 돌리게 되니까 전기세와 환풍기의 수명이 아까운 셈이겠습니다. 
  • 사실 SKT에서도 이산화탄소 측정기가 있지만 10만원 후반대네요.~ 
일단은, 이미 24시간 가동 중에 있는 미세먼지 말해주는 장치에 위 CO2 장치 읽기 기능을 통합한 후, 값이 높을 때 환기를 하라고 말하는 기능부터 구현해 놓아야겠습니다. 

대략 찾아보니까, 우리나라 벽스위치에는 중성선이라는 것이 없어서 Sonoff와 같은 것들을 쓰기가 어려워 보입니다. 전기공사를 하면 가능은 하겠지만, 그 정도까지 필요한 것은 아닌 것 같고... 좀 더 고민해야겠습니다. 

마침 한 5년된 환풍기가 (베어링 손상으로 추정되는) 소음이 심해져서, 올라가보니까 전원선이 클립으로 연결되어 있더군요. 그래서, WiFi로 IoT제어 가능한 Sonoff(AC선 2개 연결하는 방식)를 쓰기로 결심했습니다. 
  • 알리익스프레스의 싱가폴에서의 배송을 선택했는데, 너무 늦어서 거의 1달반만에 받았습니다. 

(우측의 입력 교류AC와 좌측 출력 교류AC를 연결한 모습입니다. 교류는 선의 구별이 없지만, 같은 색상이 서로 연결되도록 합니다. 다행히 화장실에서도 Sonoff제어를 위한 WiFi연결이 잘 되네요. 연결 시에는 전원이 통하지 않고 앱에 연결하여 켜주어야 전기가 통하게 됩니다.)

[Sonoff 스위치 제어하기] 

이제는 CO2값이 좋지 않을 때, 저 화장실에 있는 팬을 작동시켜야 합니다. 구글 AIY Voice Kit로 구글 어시스턴트를 통해 구글 홈에 등록한 Sonoff스위치를 제어할 수 있을텐데, 자료를 쉽게 찾기 어려워서 아래의 방법으로 했습니다. 

의외로 파이썬으로 Sonoff Simple스위치를 직접 제어하는 것이 간단하지 않았습니다. 보통 Sonoff의 펌웨어를 교체하는 방식을 쓰는데, 아래 방식은 그러지 않아도 작동한다고 하여 시도해보았습니다. 클라우드를 통해 제어되는 것을 해킹(?)해서 하는 방식입니다.
위 소스에서 sonoff.py를 복사해서 사용하거나 설치해서 사용하면 됩니다. 
  • pip install websocket만 하면 오류가 나와서 pip install websocket-client도 해줍니다. 

최종적으로 제어하는 Python 코드(3.5 기준)는 다음과 같이 하면 작동되었습니다. 

import sonoff

# id와 password는 실제로 eWeLink앱에서 가입한 아이디와 패스워드를 사용합니다. as는 아시아의 약자인 듯하네요. 
s = sonoff.Sonoff('id', 'password', 'as')
devices = s.get_devices()
if devices:
    # We found a device, lets turn something on
    device_id = devices[0]['deviceid']
    # 예제와는 달리 0이 아닌 None을 사용해야 에러가 나지 않습니다. 
    s.switch('on', device_id, None)

다만 이렇게 장치가 로그인하면, 안드로이드 앱에서는 자동으로 로그아웃이 되더군요. 

작동하는 로직은 간단하게 이산화탄소가 1,000이 넘으면 환기를 켜고, 800미만이면 끄는 방식으로 간단히 제어해보고 있습니다. 저 위의 장치는 15분에 1번씩 작동합니다.  

좀 불편한 점이 있습니다. 이제 환풍기를 켜려면 구글 AIY 보이스키트에 "환기 켜줘"라고 말을 하거나, eWeLink앱으로 켜야 한다는.. 또한, 수동으로 켜놓았지만 CO2가 낮을 경우 15분 내로 자동으로 꺼질 확률이 높겠죠? ㅎㅎ 

핑백

덧글

댓글 입력 영역