Comfee/Trotec tower fan remote with ESPHome

Hi all,

I bought a Comfee fan a while ago from Lidl (this one) , I’ve seen exactly the same model for sale as the Trotec PAE 30 ([eg here] https://www.bol.com/nl/nl/p/trotec-aircooler-ventilator-bevochtiger-pae-30 ) and it is probably available under different names too.

At first I had hoped I could use a simple Zigbee plug to turn this fan on and off when needed, but it does not run when you plug it in, so I needed a different solution. The fan has an IR remote, which I could mimic with an ESPhome device. I’m sharing the code here for anyone else who has a similar device and would like to control it from Home Assistant. This will save you the trouble of sniffing the codes.

My solution is based on a Wemos D1 mini board with IR shield (IR Controller Shield — WEMOS documentation) , purchased for a total price of 8 euros at Hackerstore. They come with headers (which you do have to solder on yourself) and fit nicely together, little chance of connecting the wrong pin.
If you use a different ESP and/or IR board, you may need to adjust the pin numbers.

Have fun building!

Allard

Here’s the code (the first bit with the censored passwords should be generated by your own ESPhome device builder addon, I include it for completeness):

esphome:
  name: ir-fan-remote
  friendly_name: IR_fan_remote

esp8266:
  board: d1_mini

# Enable logging
logger:
  level: DEBUG

# Enable Home Assistant API
api:
  encryption:
    key: "YOUR KEY HERE"

ota:
  - platform: esphome
    password: "YOUR PASSWORD HERE"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Ir-Fan-Remote Fallback Hotspot"
    password: "RANDOM PASSWORD HERE"

captive_portal:

remote_receiver:
  pin: D4
  dump: all

remote_transmitter:
  pin: D3
  carrier_duty_percent: 50%

button:
  - platform: template
    name: "on-off"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0032 0000 015A 00AB 0017 003F 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0016 0014 0017 0014 0017 0014 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 0014 0017 0015 0016 0015 0016 0015 0016 0015 0016 0015 0016 0015 0016 0015 0016 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 0180"

  - platform: template
    name: "swing"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0032 0000 015A 00AB 0017 003F 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 0014 0017 0014 0017 003F 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 003F 0017 003F 0017 0014 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 0015 0016 0015 0016 003F 0017 0015 0016 0015 0016 0015 0016 0015 0016 0015 0016 003F 0017 003F 0017 0015 0016 003F 0017 003F 0017 003F 0017 0180" 

  - platform: template
    name: "mode"
    on_press:
      - remote_transmitter.transmit_pronto: 
          data: "0000 006D 0032 0000 015A 00AB 0017 003F 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 003F 0017 003F 0017 003F 0017 003F 0017 0180"

  - platform: template
    name: "water"
    on_press:
      - remote_transmitter.transmit_pronto: 
          data: "0000 006D 0032 0000 015B 00AB 0017 003F 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 0014 0017 003F 0017 003F 0017 0014 0017 003F 0017 0014 0017 0014 0017 0014 0017 003F 0017 0014 0017 0014 0017 003F 0017 0014 0017 003F 0017 003F 0017 003F 0017 0014 0017 003F 0017 003F 0017 0014 0017 003F 0017 0014 0017 0014 0017 0014 0017 003F 0017 0014 0017 0014 0017 003F 0017 0014 0017 003F 0017 003F 0017 0180"

  - platform: template
    name: "minus"
    on_press:
      - remote_transmitter.transmit_pronto: 
          data: "0000 006D 0032 0000 015A 00AB 0017 003F 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 0014 0017 0014 0017 0014 0017 003F 0017 0014 0017 0014 0017 0014 0017 0014 0017 003F 0017 003F 0017 003F 0017 0014 0017 003F 0017 003F 0017 003F 0017 003F 0017 0014 0017 0014 0017 0014 0017 003F 0017 0014 0017 0014 0017 0014 0017 0014 0017 003F 0017 003F 0017 003F 0017 0014 0017 003F 0017 003F 0017 003F 0017 0180"
      - remote_transmitter.transmit_pronto: 
          data: "0000 006D 0002 0000 0159 0055 0017 0180"

  - platform: template
    name: "plus"
    on_press:
      - remote_transmitter.transmit_pronto: 
          data: "0000 006D 0032 0000 015A 00AB 0017 003F 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 0014 0017 003F 0017 003F 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 003F 0017 0014 0017 0014 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 0014 0017 003F 0017 003F 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 003F 0017 0014 0017 0014 0017 003F 0017 003F 0017 003F 0017 003F 0017 0180"
      - remote_transmitter.transmit_pronto: 
          data: "0000 006D 0002 0000 0159 0055 0017 0180"

  - platform: template
    name: "timer"
    on_press:
      - remote_transmitter.transmit_pronto: 
          data: "0000 006D 0032 0000 015A 00AB 0017 003F 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 0014 0017 003F 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 003F 0017 0014 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 003F 0017 0014 0017 003F 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 0014 0017 003F 0017 0014 0017 003F 0017 003F 0017 003F 0017 003F 0017 0180"