ESP8266, espeasy, HA, MQTT를 이용하여 에어컨 자동화하기(1)



제일 비싸고 편한 방법은 IOT붙은 에어컨을 새로 사면된다. 근데 에어컨을 이렇게 막 바꾸는 집은 잘 없고...10년된 에어컨도 잘돌아가는데 굳이 바꾸기도 뭐하고..수십만원 쓰기엔(iot 붙은 에어컨이 이정도는 더 비싸게 나오는것같다) 아까운 사람들도 많을것이다. 이런사람들을 위해 다른 방법으로 싸게(약 6천원 + 많은 시간) 에어컨 자동화할 수 있는 방법이다.




1. esp8266 준비

이전글 참고

글쓴이는 에어컨 옆에 쉽게 붙이기 위해서 ESP-12S+adapter plate를 사용하였다. 마침 남는 3.3v 어댑터도 하나 있고 해서.


2. esp8266에 올릴 펌웨어 준비

기본적으로는 espeasy를 사용한다

다만 적외선관련해서 문제가 있는데..espeasy 최근 정식릴리즈(2.0)에는 에어컨관련해서 가장 중요한 irremoteesp8266이라는 라이브러리가 매우 구버전으로 들어가있어서 그대로 사용이 안된다.


그런관계로 espeasy에서 저 라이브러리를 최신버전으로 바꿔주고, 관련된 플러그인을 좀 손봐줘야 한다.

이부분은 나중에 글을 따로 쓰던지 하겠다. 여기 다 쓰기엔 너무 길고 복잡하다.

포인트는 라이브러리 최신버전 업글, lg 에어컨의 경우 타이밍 손봐주기이다(저 라이브라리 그대로 쓰면 신호 받는건 되는데 보내는게 안먹더라).
2018. 7. 17.수정. irremoteesp8266에서 lg 에어컨 타이밍 안받는 부분은 수정되어 그대로 사용가능하다. 이제 espeasy에서 최신라이브러리로 업데이트만 해주면좋겠다.

또한, espeasy 중 _p35_IRTX.ino 플러그인을 조금 수정해서 함수를 하나 추가해줘야 한다.

여기 글쓴이가 작업해놓은 소스가 있으니 필요하면 컴파일해서 사용할 수 있다(github 첨써보는거라 이렇게 하는게 맞는지 모르겠다...혹시 잘아시는분 있으면 정리해주시면 더 좋겠다)
이미 espeasy 다른버전을 올려두었다면 tools-firmware-load에서 올려주면 유선 시리얼 연결할필요 없이 펌웨어 바꿔줄 수 있다.

3. esp8266에 led, 센서연결

2가지를 연결해야 한다. 적외선 led, tsop1838이다.

적외선 led는 940nm적외선용 led이면 뭐든 사서 써도 된다(몇백원정도)

tsop1838은 주파수가 3.8khz이고, 작동전압이 3.3v, 5v를 모두 포함하는것을 확인하고 사는게 좋다. esp8266은 3.3v로 작동하는데 전원공급은 5v인경우가 많아서 애초에 전압 둘다 먹는걸로 사는게 편하다(적외선 led는 어차피 1.5v정도가 작동전압이라 암거나 사도 된다).



이제 이놈들을 esp8266에 연결한다. nodemcu라면 암-암 점퍼선을 사용하면 편하다(나중에 완성되면 글루건이나 납땜으로 안빠지게 고정해야된다)



이 그림을 참고해서

적외선 led는 다리가 긴것과 짧은 것이 있는데 긴것은 GPIO중에서 빈것(글쓴이는 GPIO14 사용)으로, 짧은것은 GND로 이어준다.

원래는 과전압이 걸리기 때문에 저항을 하나 달아주지 않으면 led가 금방 죽는데... esp8266은 아웃풋 전류자체가 약해서 그런지 안죽고 잘 살아있다. 나중에 문제생기면 gpio-적외선led긴다리 사이에 200옴정도의 저항을 하나 붙일 예쩡이다.

tsop1838는 다리가 3개인데, 그림을 참조해서 vcc는 nodemcu의 3.3v 또는 esp12의 vcc에 연결하고, gnd는 gnd에, out은 빈 GPIO에 연결한다(글쓴이는 GPIO12 사용)

대충 이런모양이 나온다
















그럼 이걸 에어컨 옆에 붙이고(우리의 친구 양면테이프나 덕트테이프, 스카치테이프중에서 적당히 사용하자), 적외선 LED는 에어컨의 적외선 수신부(눈으로 보면 보인다. TSOP랑 비슷한게 안에 붙어있다) 앞에 스카치테이프로 고정한다. TSOP는 그냥 늘어뜨려놔도 되고, 저 수신부 부근에 붙여도 된다.

그럼 이런모양이 된다.





4. espeasy 설정

이제 espeasy를 설정해야한다. 컨트롤러1과 디바이스 1, 2,3, 4를 사용한다. 아래그림 참고.



콘트롤러 ip는 mqtt가 설치된 ip(라즈베리파이의 ip), user, password는 mqtt의 사용자와 암호이다.






적외선 led설정



적외선수신센서 설정.



변수저장용 더미디바이스 설정












mqtt값 받아오기용 mqtt import 설정


5. espeasy에서 rule을 설정해야 한다.
espeasy에 rule 탭이 있으면 아래 내용을 rule에 추가하고 submit 하면되고, rule이 없으면 tools-advanced-rules에 체크박스를 체크하고 새로고침하면 rule탭이 생긴다.

rule set 1

on sniffer#temper do
  Publish /%sysname%/temper/get,[sniffer#temper]
  TaskValueSet 3,3,[sniffer#temper]
  if [variable#mode]=1 and [variable#fanspeed] = 4
    event High
  endif
  if [variable#mode]=1 and [variable#fanspeed] = 0
    event Low
  endif
endon

on Off do
  IRSEND,LG,0x88c0051,28
  TaskValueSet 3,1,0
  Publish /%sysname%/mode/get,event Off
  TaskValueSet 3,2,4
  Publish /%sysname%/fan/get,event High
  Publish /%sysname%/swing/get,event Swing_On
endon
on Cooling do
  Publish /%sysname%/mode/get,event Cooling
  if [variable#mode]=0
    TaskValueSet 3,1,1
    IRSEND,LG_w_temp,0x8800549,28,[variable#temper]
    TaskValueSet 3,2,4
    Publish /%sysname%/fan/get,event High
  endif
  if [variable#mode]=2 and [variable#fanspeed] = 4
    TaskValueSet 3,1,1
    event High
  endif
  if [variable#mode]=2 and [variable#fanspeed] = 0
    TaskValueSet 3,1,1
    event Low
  endif
endon

on Dry do
  IRSEND,LG,0x8809801,28
  Publish /%sysname%/mode/get,event Dry
  TaskValueSet 3,1,2
endon
on High do
  IRSEND,LG_w_temp,0x880864a,28,[variable#temper]
  TaskValueSet 3,2,4
  Publish /%sysname%/fan/get,event High
endon
on Low do
  IRSEND,LG_w_temp,0x880860a,28,[variable#temper]
  TaskValueSet 3,2,0
  Publish /%sysname%/fan/get,event Low
endon
on Swing_Off do
  IRSEND,LG,0x8810001,28
  Publish /%sysname%/swing/get,event Swing_Off
endon
on Swing_On do
  IRSEND,LG,0x8810001,28
  Publish /%sysname%/swing/get,event Swing_On
endon

rule set 2
on IR_RC#IR do
  //power on signal
  if [IR_RC#IR] <= 142610251 and [IR_RC#IR] >= 142607175
    TaskValueSet 3,1,1
    Publish /%sysname%/mode/get,event Cooling
    TaskValueSet 3,2,4
    Publish /%sysname%/fan/get,event High
    TaskValueSet 3,3,([IR_RC#IR]-142606400)/256+15
    Publish /%sysname%/temper/get,[variable#temper]
    Publish /%sysname%/swing/get,event Swing_On
  endif
  //power off signal
  if [IR_RC#IR] = 143392849
    Publish /%sysname%/mode/get,event Off
    TaskValueSet 3,1,0
    TaskValueSet 3,2,4
    Publish /%sysname%/fan/get,event High
    Publish /%sysname%/swing/get,event Swing_Off
  endif
  //dry mode signal
  if [IR_RC#IR] = 142645249
    Publish /%sysname%/mode/get,event Dry
    TaskValueSet 3,1,2
  endif
  //running-temp change or fanspeed change signal
  if [IR_RC#IR] <= 142643019 and [IR_RC#IR] >= 142639883
    TaskValueSet 3,1,1
    Publish /%sysname%/mode/get,event Cooling
    TaskValueSet 3,3,([IR_RC#IR]-142639104)/256+15
    Publish /%sysname%/temper/get,[variable#temper]
    event HighLow
  endif
endon

on HighLow do
  TaskValueSet 3,4,([IR_RC#IR]-142639104-([variable#temper]-15)*256)/16
  if [variable#tempswing] > 2
  TaskValueSet 3,2,4
  Publish /%sysname%/fan/get,event High
  else
    TaskValueSet 3,2,0
    Publish /%sysname%/fan/get,event Low
  endif
endon


6. HA 준비

여러가지 방법으로 자동화가 가능한데 글쓴이는 Home Assistant라는걸 사용할 예정이다. HA의 설치는 다른글(1), (2)을 참고하기 바란다

HA에는 mqtt가 기본설치되어있고(HBMQTT), 다른 mqtt를 설치할 수도 있다. 모스키토를 쓰자. 설치법등은 기존글 참고.

configuration.yaml에

climate: !include climates.yaml

을 추가

climates.yaml에

 - platform: mqtt
    name: RoomAC
    retain: False
    qos: 1
    send_if_off : False 
    initial: 21
    modes: 
      - "event Off"
      - "event Cooling"
      - "event Dry"
    swing_modes:
      - "event Swing_Off"
      - "event Swing_On"
    fan_modes:
      - "event High"
      - "event Low"
    mode_command_topic: "/hvac_room/cmd"
    temp_command_topic: "/hvac_room/cmd"
    fan_mode_command_topic: "/hvac_room/cmd"
    swing_mode_command_topic: "/hvac_room/cmd"
    mode_state_topic: "/hvac_room/mode/get"
    temp_state_topic: "/hvac_room/temp/get"
    fan_mode_state_topic: "/hvac_room/fan/get"
    swing_mode_state_topic: "/hvac_room/swing/get"  
    temperature_command_topic: "/hvac_room/temper/cmd"
    temperature_state_topic: "/hvac_room/temper/get"
    # current_temperature_topic: "/hvac_room/temper/get"

을 추가


7. 결과
HA에서 사용가능하다. 또 한가지 중요한포인트. 기존 에어컨 리모콘도 그대로 사용가능하고, 에어컨으로 명령 보낸것이 그대로 HA에 반영되어서 동기화된다. 아는사람은 이게 나름 의미 있는거란걸 아실것이다.



댓글

이 블로그의 인기 게시물

Home Assitant 설치(2)

ESP8266, espeasy, HA, MQTT, 센서를 이용하여 실내공기질을 측정하자(1)