This is a set of components to read out and control Mitsubishi Ecodan heatpumps. I have an ERST20D-VM2D and it is also confirmed to work with EHSD20D-YM9D. It probably works for many air-water heatpumps with CN105 connector.
It is highly inspired by https://github.com/BartGijsbers/CN105Gateway.
Info about the hardware can be found at https://github.com/SwiCago/HeatPump. I used the following:
- https://www.aliexpress.com/item/1005003547145418.html (take the PH2.0 to Dupont, 5P variant of the connector, it fits by cutting away some plastic)
- https://www.aliexpress.com/item/32582736130.html (take the ESP-01S, it has some more memory)
- https://www.aliexpress.com/item/4001165244572.html
- if you don't already have an adapter to connect it to your PC for initial programming: https://www.aliexpress.com/item/32688280601.html
- Create a new ESP8266 device in the ESPHome web UI
- Update your Secrets file with wifi_ssid, wifi_password, heatpump_ota_password and heatpump_encryption_key
- Edit your device yaml-code and replace the template code with the contents in heatpump.yaml
- Attach your ESP8266 to the USB-adapter and connect to your PC. Open ESPHome Web and install the ESP-device
- Connect the ESP to your Ecodan CN105-port and it will be auto-detected by Home Assistant. Add the device and all the sensors will appear with updated values.
- Install ESPHome in HomeAssistant by following this instruction
- Open ESPHome from Settings / Add-ons. Klick OPEN WEB UI
- Click NEW DEVICE in the bottom right corner
- Give your device a new name, for example Ecodan Heatpump, and select SKIP THIS STEP
- Select ESP8266 and your device will be created
- Copy the Encryption key to a scratch-pad so you can access it later. It looks something like this pgdlhjfgkasdhfgeury3874iuygjg748gjhgfds32=
- Click SKIP
- Now your screen should have a device with the name you selected and state OFFLINE
- Click *Edit to open the device specific yaml-file
- Copy the OTA: password to the scratch-pad you used for the encryption key. It looks something like this: "a248d5bc6dae01010101670250c1aadadac1"
- Replace all of the template yaml code with the contents in heatpump.yaml located in the examples folder of this repository
- Click SAVE in the upper right corner and close the file with the X on the left side, next to the filename.
- Open the secrets file by clicking SECRETS in the upper right corner of the ESPHome Web UI. Add your Wi-Fi credentials along with the OTA password and the encryption key. It should look something like this;
# Your Wi-Fi SSID and password
wifi_ssid: "MySSID"
wifi_password: "MyWiFiPassword"
heatpump_ota_password: "a248d5bc6dae01010101670250c1aadadac1"
heatpump_encryption_key: "pgdlhjfgkasdhfgeury3874iuygjg748gjhgfds32="
- Save and close the file.
- Back in the ESPHome Web UI, click the three dots in the bottom right corner of your device and select Install
If you have an USB-to-ESP device, it should be possible to install directly from ESPHome.
Note: make sure that you connect your web-browser to the local IP of the HomeAssistant server. If you connect via internet, for example connect via nginx or Apache, it will not be possible to connect to the COM-port of your computer.
-
Select Plug into this computer and in the next step, Open ESPHome Web
Make sure your ESP is connected via USB to the computer where you opened the browser (it does not have to be on the HomeAssistant server) and click CONNECT
You should see a list of COM ports (If you do not, you probably need to install an updated FTDI driver)
-
Select the port with the ESP connected and click Connect
In the next step you should see an option like below, Select Prepare for first time use
-
Once installed, click Close
-
Power-cycle your ESP and return to the ESPHome Web UI, your Heatpump device should now say ONLINE in the upper right corner.
It is auto-detected by HomeAssistant so just open Settings / Devices & Services and it will appear
-
Configure and add the ESPHome node to Home Assistant and it will appear as a Device.
-
Now we need to connect it to the Ecodan Heatpump for the values will populate
Cutting the cable to fit takes a few attempts. Luckily, the link above gets you 10 cables so don't worry if you happen to break one!
I recommend to cut the black cable off completely so you do not accidentally connect 12V to the ESP
The cable should look something like this when trimmed dow to fit the socket for the CN105 port (if you have a Wi-Fi dongle connected you may need to remove that from the port and connect the ESP-device in its place)
- Connect it to the ESP and CN105 port of your Ecodan-system as illustrated in the pictures below.
- Within a minute or two, numbers will populate on all the sensors generated by your Ecodan Heater device in Home Assistant
Note that this didn't work for me, I have an external Mitsubishi control panel connected. Maybe it only works when there's no external panel connected.
It is possible to use an external temperature sensor to tell the heat pump what the room temperature is, rather than relying on its internal temperature sensor. You can do this by calling setRemoteTemperature(float temp)
on the ecodan
object in a lambda. Note that you can call setRemoteTemperature(0)
to switch back to the internal temperature sensor.
There are several ways you could make use of this functionality. One is to use a sensor automation:
ecodan:
id: ecodan_instance
uart_id: ecodan_uart
sensor:
# You could use a Bluetooth temperature sensor
- platform: atc_mithermometer
mac_address: "XX:XX:XX:XX:XX:XX"
temperature:
name: "Lounge temperature"
on_value:
then:
- lambda: 'id(ecodan_instance).set_remote_temperature(x);'
# Or you could use a HomeAssistant sensor
- platform: homeassistant
name: "Temperature Sensor From Home Assistant"
entity_id: sensor.temperature_sensor
on_value:
then:
- lambda: 'id(ecodan_instance).set_remote_temperature(x);'
Alternatively you could define a service that HomeAssistant can call:
api:
services:
- service: set_remote_temperature
variables:
temperature: float
then:
- lambda: 'id(ecodan_instance).set_remote_temperature(temperature);'
- service: use_internal_temperature
then:
- lambda: 'id(ecodan_instance).set_remote_temperature(0);'
Inspired by https://github.com/geoffdavis/esphome-mitsubishiheatpump#remote-temperature.
Let me know if there is anything you are missing or if you have improvement ideas.
Join the discussions on Gitter