Tools

ESPHome CN105 Climate Config Generator

Describe the retrofit — board, UART pins, temperature source, the extras you want — and get back an ESPHome node configuration for the CN105 service port on a Mitsubishi heat pump, the matchingsecrets.yaml entries, and a wiring and parts checklist. The YAML is assembled in this page from your answers: nothing is uploaded, and nothing is compiled, flashed or checked against a real unit.

1. The two names

The node name becomes the hostname, so it decides the mDNS address and the ESPHome dashboard entry. The entity name is what you will read in Home Assistant.

Lower-case letters, digits and hyphens — it has to survive DNS.

Shown in Home Assistant, and used to prefix the diagnostic sensors.

2. Board and serial link

The CN105 port is a 9600-baud serial link. Everything here is about getting it onto pins your board can actually drive.

TX goes to the port's pin 5, RX to pin 4 — crossed over.

The port is 5 V logic and the ESP pins are not rated for it.

3. Temperature

Where the number in Home Assistant comes from. The heat pump regulates on its own intake thermistor either way.

Temperature source

4. Climate capabilities

Narrowing these lists is how you stop Home Assistant offering a mode your indoor unit does not have — a ducted unit with no vane, for instance.

Minimum, maximum and step in °C. Most Mitsubishi indoor units accept 16–31 °C.

Modes to expose
Fan speeds to expose
Vane positions to expose

5. Extras

Optional blocks. Each one is another entity in Home Assistant, so take what you will actually look at.

Your configuration

Rebuilt on every change. Nothing leaves the browser.

Wiring checklist

Port pinSignalYour end

Parts checklist

    How to use the generator

    Work down the five groups on the left; the configuration on the right rewrites itself as you go. The two names and the pin numbers are the only things you have to get right by hand — the rest is choosing what you want to see in Home Assistant. Copy the YAML into aheatpump.yaml next to your other ESPHome files, merge the secrets entries into secrets.yaml, then runesphome config heatpump.yaml before you install anything. That command is the first real check of this file: it is ESPHome's validator, not this page, that decides whether a key is accepted.

    What the generated configuration contains

    BlockWhat it writes
    esphome / esp32 / esp8266Node name, friendly name, board and framework for the chip you picked
    logger / api / ota / wifiLogger level, API encryption key and OTA password referenced from secrets, Wi-Fi from secrets, and an optional fallback hotspot
    external_componentsThe community CN105 component, pinned to its GitHub source with a daily refresh
    uartUART id, TX and RX pins, and the baud rate the port speaks
    climateThe mitsubishi_heatpump entity: hardware UART, update interval, temperature range and step, and the mode, fan and vane lists you chose
    sensor / text_sensor / binary_sensor / button / lightA room temperature probe if you asked for one, plus the diagnostics you ticked

    Here is the whole thing, produced by the same code the page runs, for an ESP32 on UART2 with the heat pump's own temperature sensor:

    esphome:
      name: hp-living-room
      friendly_name: "Living room heat pump"
    
    esp32:
      board: esp32dev
      framework:
        type: arduino
    
    logger:
      level: INFO
    
    api:
      encryption:
        key: !secret api_encryption_key
    
    ota:
      - platform: esphome
        password: !secret ota_password
    
    wifi:
      ssid: !secret wifi_ssid
      password: !secret wifi_password
      ap:
        ssid: "hp-living-room fallback"
        password: !secret ap_password
    
    external_components:
      - source: github://geoffdavis/esphome-mitsubishiheatpump
        refresh: 1d
    
    uart:
      id: hp_uart
      tx_pin: GPIO17
      rx_pin: GPIO16
      baud_rate: 9600
    
    climate:
      - platform: mitsubishi_heatpump
        name: "Living room heat pump"
        hardware_uart: UART2
        update_interval: 500ms
        visual:
          min_temperature: 16
          max_temperature: 31
          temperature_step: 0.5
        supported_modes:
          - HEAT
          - COOL
          - DRY
          - FAN_ONLY
        supported_fan_modes:
          - "AUTO"
          - "QUIET"
          - "1"
          - "2"
          - "3"
          - "4"
        supported_swing_modes:
          - "AUTO"
          - "1"
          - "2"
          - "3"
          - "4"
          - "5"
    
    sensor:
      - platform: wifi_signal
        name: "Wi-Fi signal"
        update_interval: 60s
      - platform: uptime
        name: "Uptime"
    
    text_sensor:
      - platform: wifi_info
        ip_address:
          name: "IP address"
    
    binary_sensor:
      - platform: status
        name: "Status"
    
    button:
      - platform: restart
        name: "Restart"

    The CN105 service port

    CN105 is the five-pin service connector on the indoor unit's control board — the socket the OEM Wi-Fi adapter plugs into. It is an ordinary serial port once you are on it, which is why an ESP board costing a few euros can do what the vendor adapter does, locally and without an account. The pinout below is the one published by the SwiCago/HeatPump project; check it against your own unit's service manual before you crimp anything, because the unit is the authority and this page is not.

    PinSignalWhat it is for
    1+12 VPresent for the OEM adapter. Nothing in an ESPHome retrofit uses it — do not feed it into a 5 V or 3.3 V rail.
    2GNDThe common ground. Every CN105 build joins this to the ESP's GND, and a missing ground is the usual cause of a link that reads nothing.
    3+5 VA small 5 V supply from the indoor board. Usable for a bare ESP board at low current, but a separate USB supply is the calmer choice.
    4Unit TXThe heat pump's transmit line, going to your ESP's RX pin. It swings at 5 V logic.
    5Unit RXThe heat pump's receive line, fed from your ESP's TX pin. A 3.3 V push is normally read as a high.

    What it does not do

    • It does not compile or flash anything. The output is text assembled from your answers. Whether ESPHome accepts it is decided by esphome config, and whether the heat pump answers is decided by your wiring.
    • It does not talk to a heat pump. No device is contacted, no port is opened, and there is no scan of your network.
    • It cannot pick your pins for you. It flags the ones that are claimed by flash, USB, the boot strapping latch or the logger, and it refuses the ones that are physically incapable — but it has never seen your board or your enclosure.
    • It does not fix the 5 V question. The port's serial lines are 5 V logic. Plenty of builds connect them straight to a 3.3 V board and work; the generator offers a level shifter in the parts list because that is how you stay inside the datasheet.
    • The climate component is not ESPHome core. It is loaded from GitHub as an external component, so its options can change between releases. The generated header says so and tells you to read its README first.
    • It does not cover multi-head systems or the outdoor unit.One indoor unit, one serial link, one climate entity.

    Questions people ask before wiring one up

    Will this configuration work with my heat pump?
    It gives you the shape of a working CN105 configuration — node, UART, external component, climate entity, secrets — for the board and pins you chose. What it cannot do is compile or flash it. Run esphome config on the file first; that is ESPHome's validator, and it is the first real check. After that, whether your indoor unit answers depends on the wiring and on which CN105 firmware revision it runs, which is why the generated header tells you to read the component's README before you rely on it.
    Do I have to unplug the vendor Wi-Fi adapter?
    Yes, if one is fitted. The CN105 port is a single serial link, so the OEM adapter and your ESP board cannot both own it. Unplug the adapter, leave its mounting bracket in place, and keep it somewhere you can find it — a heat pump with no adapter and a working local integration is the point of the retrofit, but the adapter is your fallback if the build does not work out.
    Which pins should I use?
    Whichever pins your chosen UART actually has, which is why the board select sets defaults and the generator flags the rest. On a classic ESP32 it starts at GPIO17 and GPIO16, the default UART2 pair, and warns you that WROVER modules with PSRAM use those two pins. On an ESP8266 D1 mini it starts at GPIO4 and GPIO5, which is D2 and D1 on the silkscreen. Avoid the pins it marks as flash, USB, input-only or boot strapping — those are read at reset or owned by another peripheral, and a config that drives them produces a board that will not boot.
    Is the CN105 port 5 V or 3.3 V?
    The port's serial lines are 5 V logic, and neither the ESP32 nor the ESP8266 datasheet rates its pins for a 5 V input. In practice a great many builds connect them directly through a short jumper and work for years, because the drive is weak and the receiver threshold is low — but that is a tolerance, not a specification. Tick the level shifter box and the parts checklist gains a bidirectional shifter, which is how you do it inside the datasheet. Do not power the board from the port's 5 V pin as a first choice; a USB supply keeps that question out of the build.
    Why does Home Assistant still show the intake temperature?
    Because that is the sensor the heat pump regulates on. The CN105 component reports the indoor unit's intake-air thermistor, and in heating that number reads a few degrees warm since the air passes over the coil before the sensor sees it. Adding a DHT22 or DS18B20 gives you an honest room temperature in Home Assistant and is worth doing, but it does not feed the unit's control loop: the setpoint you send is still compared against the intake thermistor, so expect to nudge the setpoint to get the room where you want it.
    Can I run two indoor units from one board?
    Not with this generator. Each indoor unit has its own CN105 port and its own serial link, so the clean arrangement is one small board per unit and one ESPHome node per board. You can put both nodes in one Home Assistant install — they appear as two climate entities — and if you want them to agree, that is a Home Assistant automation rather than an ESPHome one.
    Is my configuration uploaded anywhere?
    No. The form is read by JavaScript in this page and the YAML is assembled in memory. There is no upload, no account and no request to any server, and no device is contacted: the page cannot see your heat pump, your network or your board. You can generate a configuration, disconnect from the internet and the output is identical.
    Does the board need internet access once it is running?
    It needs your Wi-Fi network, not the internet. The API, OTA and the Home Assistant connection all run on the local network, so a heat pump controller on an isolated VLAN with no outbound access still works — which is usually the reason people do this retrofit in the first place. The one thing that does need outbound access is the ESPHome build itself, because the external component is fetched from GitHub the first time you compile.

    Where to go next