본문 바로가기

홈어시스턴트 IoT

구형에어컨 제습운전 자동화 홈어시스턴트 ESPHome DIY 적외선리모콘

에어컨을 적외선으로 직접 제어하는 것은 오래 전부터 생각해 왔는데, 이번에 한번 만들어 보았습니다. 물론, 굳이 이렇게까지 하지 않고 아래에 보듯이 간단하므로 리모콘으로 제어하면 되기는 합니다 :-) 

 

온도는 29도가 넘고 습도가 80%가 넘을 때 장마 기간 평소 루틴

  1. 제습 운전으로 25도 설정 
  2. 습도가 72%로 떨어지면 온도를 28도로 올린 후 2분 후 끄기 

요즘 에어컨은 자동으로 송풍 운전 후 종료하지만 2004년 LG 휘센 모델(LPNC151BUA)인데 별도로 송풍 기능이 리모콘 버튼에 없어서(오리지널 리모콘 분실) 온도를 올리거나 실외기 작동이 멈춘 후 기다리다가 끄고 있습니다. 바로 이 부분을 자동화하고 싶은 것입니다.

 

참고로, 실외기 작동 LED에 빛 센서를 조합하신 분도 있었습니다.(https://blog.naver.com/PostView.naver?blogId=ohminy11&logNo=222422518082&parentCategoryNo=&categoryNo=7&viewDate=&isShowPopularPosts=true&from=search) 저도 일단 빛 센서는 주문했는데, 그냥 온도 올려서 하는 것이 더 간편해 보이기는 합니다. 혹은 두꺼비집에 클램프로 연결하는 IoT CT 전력량계를 연동할 수도 있습니다. 예를 들면, 소비 전력이 1kWh이하로 감소한 후 증가하면 곧 바로 끄기를 통해 충분한 시간 동안 송풍을 할 수 있겠습니다.  

 

여담이지만 벌써 20년이 다 되어 가네요. 몇 년 전에 한번 캐패시터(복합콘덴서)가 고장나서 DIY 수리한 적은 있습니다. 증상은 어느 날 갑자기 실외기 운전 시 크게 딸깍하던 소리가 사라지고 송풍만 되었습니다. 실외기를 뜯어서 부품 확인한 후 "에어컨 복합콘덴서 6/45 370 400VAC"로 검색해서 교체했었습니다. 아니면 여름이라 밀려서 3주간 A/S를 기다릴 뻔 했었지요. 

 

[참고한 블로그] 

 

위에 링크한 기존 제품을 활용하고자 했는데, 갖고 있던 제품은 뜯어 보니까 ESP8266이 아니었습니다. 알리익스프레스에서 찾아봤더니 이제는 ESP8266으로 되어 있는 제품이 거의 없었습니다. 

 

[하드웨어 준비] 

 

다행히 ESP8266 보드와 적외선 송수신 보드는 이미 갖고 있어서 한번 만들어 보았습니다. 

  • D1(GPIO5) - 적외선 수신부 DAT핀 
  • D5(GPIO14) - 적외선 송신부 DAT핀 
  • D2(GPIO4) - Home Assistant에서 제어할 수 있는 LED 연결(220옴 저항) 

참고로 어떤 USB 방식 D1 mini 보드는 알 수 없는 이유로 부트 모드로 진입이 안되는 경우가 있는데, 이 때에는 D3(GPIO0)를 GND에 연결한 후 USB를 꼽으면 됩니다. 

Wemos D1 mini 호환보드와 Ywrobot의 적외선 송수신보드 활용

기성품은 몇 m의 거리에서도 작동하는 반면, 위 송신기는 신호가 약하여 2미터 이내에서 작동합니다. 참고로 아래의 yaml에서 carrier_duty_percent가 50인데 100으로 바꾸면 작동이 안되었습니다(자세한 건 알아보지 않음). 

[스크립트 준비]

일단 위와 같이 와이어로 연결만 하고 나면 프로그램은 짤 필요도 없이 아래 스크립트를 참조하면 됩니다. 물론 저도 위 블로그를 보고 연결한 후 스크립트도 참고 했습니다. 

 

물론 그 전에 ESPHome 설치가 필요합니다. https://esphome.io/index.html

 

참고로 저 위에 있는 D1 mini보드는 뒤집어진 상태입니다. 보통은 다리를 보드 밑에 붙이는데 저는 위로 붙여서... 

 

ESPHome을 위해 만든 irremocon.yaml 의 내용 

esphome:
  name: irremocon

esp8266:
  board: d1_mini

# Enable logging
logger:

# Enable Home Assistant API
api:
  password: ""

ota:
  password: ""

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  domain: !secret domain

  manual_ip:
    # Set this to the IP of the ESP
    static_ip: 192.168.0.77
    # Set this to the IP address of the router. Often ends with .1
    gateway: 192.168.0.1
    # The subnet of the network. 255.255.255.0 works for most home networks.
    subnet: 255.255.255.0

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "irremocon Fallback Hotspot"
    password: !secret wifi_password

captive_portal:
    
# D1 
remote_receiver:
  pin: 
    number: GPIO5
    inverted: true
    mode: INPUT_PULLUP
  tolerance: 55%
  dump: lg #lg, all, raw
  
# D5 
remote_transmitter:
  pin: GPIO14
  # Infrared remotes use a 50% carrier signal
  carrier_duty_percent: 50%
  
# D2 
output:
  - platform: esp8266_pwm
    id: esphome_ir1_led
    pin:
      number: GPIO4
      inverted: false 

light:
  - platform: monochromatic
    name: "White LED"
    output: esphome_ir1_led
    id: light_led

sensor:
  - platform: homeassistant 
    entity_id: sensor.a4c1383321fe_temperature
    id: room_temperature

climate:
  - platform: climate_ir_lg
    name: "Living Room AC"
    sensor: room_temperature

switch: 
  - platform: template
    name: Raw_0 Power
    turn_on_action:
      - remote_transmitter.transmit_raw:
          carrier_frequency: 38kHz
          code: [9039, -4416, 627, -531, 599, -1620, 627, -1620, 626, -530, 599, -531, 599, -531, 598, -533, 595, -1628, 618, -536, 593, -1652, 594, -1653, 594, -538, 592, -1653, 594, -536, 594, -1652, 595, -536, 593, -1653, 594, -537, 594, -536, 593, -537, 593, -537, 593, -537, 593, -537, 593, -1653, 594, -537, 593, -1653, 594, -1653, 594, -1652, 594, -1653, 594, -1654, 593, -1653, 594, -537, 593]
  - platform: template
    name: Raw_1 Dry Mode
    turn_on_action:
      - remote_transmitter.transmit_raw:
          carrier_frequency: 38kHz
          code: [9064, -4391, 652, -504, 626, -1594, 653, -1594, 652, -504, 625, -505, 624, -506, 623, -508, 620, -1602, 644, -511, 617, -1628, 618, -1629, 618, -513, 617, -1629, 617, -513, 617, -1629, 618, -513, 617, -1629, 618, -513, 617, -513, 617, -1629, 618, -512, 617, -513, 617, -513, 618, -1629, 617, -513, 617, -1629, 617, -1630, 618, -513, 617, -1629, 617, -1629, 618, -1629, 618, -512, 618]
  - platform: template
    name: Raw_2 Plazma
    turn_on_action:
      - remote_transmitter.transmit_raw:
          carrier_frequency: 38kHz
          code: [9064, -4390, 654, -503, 626, -1593, 653, -1594, 653, -503, 627, -503, 626, -504, 625, -505, 623, -1598, 647, -509, 595, -1649, 596, -1651, 595, -538, 592, -1652, 594, -537, 594, -1652, 594, -537, 593, -533, 597, -536, 594, -1652, 594,-1653, 594, -537, 593, -536, 594, -536, 593, -1653, 594, -1653, 594, -1652, 594, -537, 593, -537, 594, -1652, 594, -1652, 594, -1653, 594, -537, 593]
  - platform: template
    name: Raw_3 Up
    turn_on_action:
      - remote_transmitter.transmit_raw:
          carrier_frequency: 38kHz
          code: [9065, -4389, 655, -503, 626, -1592, 655, -1592, 654, -503, 627, -503, 627, -503, 627, -503, 626, -1594, 651, -506, 623, -1598, 647, -1601, 644, -511, 593, -1652, 594, -537, 593, -1653, 594, -537, 593, -537, 593, -1653, 594, -1652, 594,-537, 593, -1653, 594, -537, 593, -537, 593, -1653, 594, -1652, 594, -537, 593, -537, 594, -1652, 594, -537, 593, -1653, 594, -1652, 594, -537, 593] 
  - platform: template
    name: Raw_4 Down
    turn_on_action:
      - remote_transmitter.transmit_raw:
          carrier_frequency: 38kHz
          code: [9064, -4389, 655, -503, 627, -1591, 655, -1592, 654, -504, 626, -504, 626, -503, 626, -504, 626, -1594, 651, -506, 623, -1598, 646, -1602, 619, -536, 593, -1652, 594, -538, 592, -1653, 594, -537, 593, -1653, 594, -1653, 594, -1653, 593, -537, 594, -1652, 594, -537, 593, -537, 593, -1653, 594, -537, 593, -537, 593, -536, 593, -1655, 592, -537, 593, -1653, 594, -1653, 594, -537, 593]

아래에 있는 remote_transmitter.transmit_raw 명령들은 제가 갖고 있는 리모콘으로 작동시켜서 수신(esphome logs irremocon.yaml) 한 내용입니다. 

  • remote_receiver와 remote_transmitter의 내용은 일단 바꾸지 않는 것고 테스트하는 것이 좋습니다. 
  • dump: lg #lg, all, raw에서 raw로 바꾸면 갖고 있는 리모콘의 코드 값들을 확인할 수 있으며, 로그에서는 2줄로 나뉘더라도 숫자 끝에 콤마가 있다면 한 줄로 합쳐서 code: [ ]에 넣어주면 됩니다. 
  • 저는 room_temperature에 Home Assistant의 다른 센서인 sensor.a4c1383321fe_temperature를 매핑시켰습니다. 거실에 있는 샤오미 블루투스 온도계입니다. 

raw로 하는 것은 잘 작동하고 있는데, lg로 하는 것(아래 참조)은 일단 잘 안되었습니다. 

  - platform: template 
    name: LG Cold Mode
    turn_on_action:
      - remote_transmitter.transmit_lg:
          data: 0x656AF14E # Cold button 
          nbits: 32

 

[홈어시스턴트에서 제어하기] 

Climate로 통합되어 켜고 끄는 기능을 호출하면 적외선으로 송신됩니다.
기본으로 보통 냉방이 선택될 수 있으므로 제습 기능으로 바꿉니다.

저희 에어컨의 경우에는 온도 설정이 작동이 안되고 15도로 리셋되어 나옵니다. 

온도 설정이 가능하지만 에어컨은 반응이 없이 15도입니다.

어쩔 수 없이 아래와 같이 Up 버튼을 10번 누르는? 혹은 켤 때 Raw_1 Power로 켜면 기존 설정 온도가 덮어 써지지 않았습니다. 하지만 그 전 상태가 얼마인지 모르니까 10번 누르는 무식한 방법이 더 확실할 지도 모르겠네요. 

LG A/C 리모콘으로부터 직접 수신(esphome logs irremocon.yaml)한 Up 버튼 Raw 값을 ESPHome의 yaml에 넣어서 스위치로 작동시키는 방법

켤 때 사용하는 스크립트입니다. 

15도로 출발하므로 10번 눌러서 25도를 만듭니다.

Set HVAC mode에서는 dry 즉 제습 모드를 선택합니다. 공기 정화(플라즈마) 기능도 켭니다. 

 

끌 때 사용하는 스크립트입니다. 

 

25도에 있으므로 28도까지 올려서 송풍을 시킵니다.

위 대기 코드에는 내부적으로 15분 동안 대기하다가 습도가 내려오지 않으면(혹은 처음부터 습도가 그 보다 낮았다면) 그냥 꺼지도록 하여 필요 이상의 전기를 쓰지 않도록 했습니다. 

 

이제 자동화 쪽에 가서 온도와 습도 조건을 달고 위 스크립트들을 호출하면 됩니다.  잘 작동하네요.~ 

 
 

 

[추가 작업] 

 

A0핀에 연결할 광센서 부품을 추가했습니다. 목적은 "실외기" 작동 LED를 감지하려는 것입니다. 실외기 작동 중에 전원이 꺼지면 습한 상태가 되어서 나중에 켤 때 냄새가 더 나는 것을 방지하기 위합입니다. 지금은 없지만 IoT 무선 스위치를 추가하여 켜기/냉방/제습/끄기를 할 수 있게 하면 좋을 것 같네요. 

 

ESP8266의 A0 입력은 0~1V로 들어온다고 합니다. 꺼져 있을 때 0.03V가량 나오고 있습니다. 일단, 현재 잘 작동하지 않고 있습니다. 송풍은 온도 올려서 처리 중이라 별로 필요 없기도 합니다... => 7/27 체크해 보니까 스마트폰 손전등을 켜니까 3.5V가량 나오고 약간 어두운 형광등에서는 0.2V만 나옵니다. 냉장고의 LED가 빛이 약해서 잘 인지하지 못하는 것으로 보입니다.  

sensor:
  - platform: adc 
    pin: A0 
    name: "Outdoor Unit Operation"
    filters:
      - multiply: 3.3
    id: outdoor_operation
    
binary_sensor: 
  - platform: analog_threshold
    name: "On operation"
    sensor_id: outdoor_operation 
    threshold: 0.5

 

위 광센서를 쓰기 위해 만능기판에 옮기고 에어컨에 부착(?)했습니다. 실외기 LED 위에 광센서를 투명매직테이프로 고정했습니다. 보드의 좌측은 그냥 LED이고 위에는 적외선 수신부, 아래에는 적외선 송신부가 위치합니다. 

 

이렇게 설치하니까 안됩니다.

 

 

이렇게 설치하니까 잘 수신됩니다. 검은색 정사각형 부분이 수신부인 듯...
홈어시스턴트에서 본 장치 정보

 
 

 

오늘(7/26) 특히 온도가 높아서 29.0도를 넘겨서 자동으로 5번 작동했습니다. 두 번은 수동으로 켰습니다. 그 결과 2kWh쯤 소비한 것 같네요. 서큘레이터를 계속 가동 중이고 어느 정도 온도에 적응해서 28.4도 이하로 내려오면 춥습니다... 

 

온도 조건에 의해 10~15분씩 자동 작동한 결과 온도와 습도 그래프

 

 
 

에어컨 작동을 위한 대시보드