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.
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
| Block | What it writes |
|---|---|
esphome / esp32 / esp8266 | Node name, friendly name, board and framework for the chip you picked |
logger / api / ota / wifi | Logger level, API encryption key and OTA password referenced from secrets, Wi-Fi from secrets, and an optional fallback hotspot |
external_components | The community CN105 component, pinned to its GitHub source with a daily refresh |
uart | UART id, TX and RX pins, and the baud rate the port speaks |
climate | The 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 / light | A 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.
| Pin | Signal | What it is for |
|---|---|---|
| 1 | +12 V | Present for the OEM adapter. Nothing in an ESPHome retrofit uses it — do not feed it into a 5 V or 3.3 V rail. |
| 2 | GND | The 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 V | A 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. |
| 4 | Unit TX | The heat pump's transmit line, going to your ESP's RX pin. It swings at 5 V logic. |
| 5 | Unit RX | The 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
- How to add a non-Wi-Fi Mitsubishi AC to Home Assistant— an external ConnectedCasa walkthrough of the retrofit: the adapter you are replacing, the physical install, and the parts list to order before you start.
- Home Assistant automation YAML generator— once the climate entity exists, write the automation that reacts to it without hand-indenting YAML.
- Home Assistant Zigbee gateway— the other end of the same hobby: getting a local radio stack off the cloud.
- Automation that runs every five minutes— the polling pattern people use to nudge a heat pump from Home Assistant.