Mitsubishi AC with Wemos D1 Mini Pro

Looks like it’s only for 5 pin CNS port, interesting there’s a zigbee version of this ac module.

That’s just a generic image from the installation doc. Their site makes you select the exact model you have, so I’m guessing they would send the appropriate cable.

Awesome I got a cable created for the Atom S3 Lite and it’s powering up… Do you have the esp config yaml file you created that works? I see so many different yaml configs in this endless topic :slight_smile:

I’ve recently stumbled up on this project which is promising:

This is the wiring diagram for the Atom S3 Lite which requires reversing the Tx and Rx for anyone looking at this later. This is apparently not required for the non-Lite S3.

Good to hear,

Below my code

substitutions:
  name: m5stack airco
  friendly_name: m5stack airco

esphome:
  name: m5stackairco
  friendly_name: m5stack airco
  name_add_mac_suffix: false
  platformio_options:
    board_build.flash_mode: dio
  project:
    name: esphome.web
    version: '1.0'

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: arduino

logger:
  level: 
    VERBOSE  

api:

ota:
  - platform: esphome

improv_serial:

wifi:
 ssid: 
 password: 

 ap:
    ssid: "m5stack airco Fallback Hotspot"
    password: 

captive_portal:

dashboard_import:
  package_import_url: github://esphome/firmware/esphome-web/esp32s3.yaml@v2
  import_full_config: true

web_server:
  port: 80

time:
  - platform: homeassistant
    id: homeassistant_time

external_components:
  - source: github://afarago/esphome_component_bthome
  - source: github://echavet/MitsubishiCN105ESPHome

uart:
  id: HP_UART
  baud_rate: 2400
  tx_pin: GPIO1
  rx_pin: GPIO2

climate:
  - platform: cn105
    id: hp
    name: "m5stack airco"
    icon: mdi:heat-pump
    visual:
      min_temperature: 15
      max_temperature: 31
      temperature_step:
        target_temperature: 0.5
        current_temperature: 0.1
    vertical_vane_select:
      name: Vertical Vane
    remote_temperature_timeout: 30min
    debounce_delay : 500ms
    update_interval: 4s
    auto_sub_mode_sensor:
      name: Auto submode sensor
    sub_mode_sensor:
      name: Submode sensor
    stage_sensor:
      name: Stage sensor 

Wondering if you can explain some of the config options there:

esphome:
  platformio_options:
    board_build.flash_mode: dio
dashboard_import:
  package_import_url: github://esphome/firmware/esphome-web/esp32s3.yaml@v2
  import_full_config: true

I’m using this project:

with an M5Stack Atom S3 Lite. Tx and Rx are working but I’m having an issue getting the current temperature. It’s always reported as 0C / 32F.

To be clear, other functions work like turning the unit on/off, changing the vane position and changing temps

Screenshot from the web server:
Google Chrome 2024-07-29 14.59.52

Given everything else is working, I’m surprised that just the current temp is not.

My config is as follows:

substitutions:
  name: my-room-climate
  friendly_name: My Room Climate

esphome:
  name: ${name}
  friendly_name: ${friendly_name} 

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: arduino
    version: latest

light:
  - platform: esp32_rmt_led_strip
    name: Led
    id: led
    internal: true
    rgb_order: GRB
    pin: 35
    num_leds: 4
    rmt_channel: 1
    chipset: ws2812
    restore_mode: ALWAYS_ON

uart:
  id: HP_UART
  baud_rate: 2400
  tx_pin: GPIO2
  rx_pin: GPIO1

# Default logging level
logger:
  level: INFO

external_components:
  - source: github://echavet/MitsubishiCN105ESPHome

api:
  encryption:
    key: !secret esp_encryption_key
  services:
    - service: reboot
      then:
        - logger.log: "Reboot in progress..."
        - lambda: |-
            ESP.restart();
ota:
  - platform: esphome
    password: !secret ota_password

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "My-Room-Atom-S3-Lite"
    password: !secret wifi_password

captive_portal:

web_server:
  port: 80

# Sync time with Home Assistant.
time:
  - platform: homeassistant
    id: homeassistant_time

# Create a button to restart the unit from HomeAssistant. Rarely needed, but can be handy.
button:
  - platform: restart
    name: "Restart ${friendly_name}"

# Climate entity configuration
climate:
  - platform: cn105
    name: "My Room Climate"
    icon: mdi:heat-pump
    compressor_frequency_sensor:
      name: ${name} Compressor Frequency
    vertical_vane_select:
      name: ${name} Vertical Vane
    horizontal_vane_select:
      name: ${name} Horizontal Vane
    debounce_delay : 500ms
    update_interval: 4s  # update interval can be ajusted after a first run and logs monitoring* 

text_sensor:
  - platform: wifi_info
    ip_address:
      name: IP
    ssid:
      name: SSID
    bssid:
      name: BSSID

  - platform: version
    name: Version
    hide_timestamp: true
    disabled_by_default: false
    icon: mdi:new-box
    entity_category: diagnostic

# Sensors with general information.
sensor:
  # Uptime sensor.
  - platform: uptime
    name: "Uptime"
    disabled_by_default: false
    force_update: false
    unit_of_measurement: s
    icon: mdi:timer-outline
    accuracy_decimals: 0
    device_class: duration
    state_class: total_increasing
    entity_category: diagnostic
    update_interval: 60s

  - platform: internal_temperature
    name: Internal Esp temperature
    entity_category: diagnostic

  - platform: wifi_signal # Reports the WiFi signal strength/RSSI in dB
    name: Signaal dB
    id: wifi_signal_db
    update_interval: 60s
    entity_category: diagnostic

  - platform: copy # Reports the WiFi signal strength in %
    source_id: wifi_signal_db
    name: Signaal %
    filters:
      - lambda: return min(max(2 * (x + 100.0), 0.0), 100.0);
    unit_of_measurement: " %"
    entity_category: diagnostic
    device_class: ""

switch:
  - platform: template
    id: eps32_s3_led_switch
    name: Led switch #${led_switch}
    optimistic: true
    restore_mode: RESTORE_DEFAULT_ON 
    lambda: return id(eps32_s3_led_switch).state;
    turn_on_action:
      - light.turn_on:
          id: led
          brightness: !lambda |-
            // output value must be in range 0 - 1.0
            return id(led_brightness).state / 100.0;
    turn_off_action:
      - light.turn_off:
          id: led


number:
    ## Set led brightness
  - platform: template
    id: led_brightness
    name: Led brightness #${led_brightness}
    icon: mdi:toggle-switch-variant
    mode: slider
    entity_category: config
    optimistic: true
    min_value: 0
    max_value: 100
    step: 10
    initial_value: 70
    restore_value: yes
    unit_of_measurement: "%"
    on_value:
      then:
        - if:
            condition:
              - light.is_on: led
            then:
              - light.turn_on:
                id: led
                brightness: !lambda |-
                  // output value must be in range 0 - 1.0
                  return id(led_brightness).state / 100.0;

If i turn debug logging on, there’s this portion of output which shows it’s not able to get the current temp:

[20:26:16][D][SETTINGS:098]: [current]-> [power: OFF, target °C: 23.0, mode: COOL, fan: 4, vane: SWING, wvane: |]
[20:26:16][D][SETTINGS:098]: [received]-> [power: OFF, target °C: 23.0, mode: COOL, fan: 4, vane: SWING, wvane: |]
[20:26:16][D][EVT_SETS:057]: [wanted]-> [power: -, target °C: -1.0, mode: -, fan: -, vane: -, wvane: -, hasChanged ? ->  NO, hasBeenSent ? ->  NO]
[20:26:16][D][SETTINGS:079]: [climate]-> [mode: OFF, target °C: 23.0, fan: HIGH, swing: VERTICAL]
[20:26:16][V][CN105:239]: updating action back to espHome...
[20:26:16][D][CN105:267]: Climate mode is: 0
[20:26:16][D][CN105:268]: Climate action is: 0
[20:26:16][D][climate:396]: 'My Room Climate' - Sending state:
[20:26:16][D][climate:399]:   Mode: OFF
[20:26:16][D][climate:401]:   Action: OFF
[20:26:16][D][climate:404]:   Fan Mode: HIGH
[20:26:16][D][climate:416]:   Swing Mode: VERTICAL
[20:26:16][D][climate:419]:   Current Temperature: 0.00°C
[20:26:16][D][climate:425]:   Target Temperature: 23.00°C
[20:26:16][D][CYCLE:285]: 3a: Sending room °C request (0x03)

When i was setting up the m5 stack module in esphome this was in the basic yaml already. I let it there because i see no reason to delete it.

With the basic yaml setup for the airco did the internal temp sensor work ? Or did you dive right into the remote temperature configuration?

It never has worked. I’m starting to wonder if my Rx wire isn’t connected properly

from what i see in the log. You do get information back from unit. It states its settings like power and mode. In the climate entity:

You could try to put this in the entity its what i got in it.

visual:
      min_temperature: 15
      max_temperature: 31
      temperature_step:
        target_temperature: 0.5
        current_temperature: 0.1

Most people are using esphome-mitsubishiheatpump and MitsubishiCN105ESPHome external components based on SwiCago but I saw in esphome changelog that they have a mitsubishi component for couple of months now: esphome/esphome/components/mitsubishi at dev · esphome/esphome · GitHub

Anyone did try it ?

If i’m not mistaken that is only for onee way IR remote control, so you can make IR remote control device with esp module and esphome. This way you don’t have any reverse information from climate, though.
Please correct me if i’m wrong…

Isn’t that just for the visual display in the thermostat? I wouldn’t expect that to change anything about being able to get the current temperature?

Did you ever get this figured out? I have an M5Stack Atom S3 Lite and having the same issue – no current temperature reading.

When you have the logger in debug
Do you see climate:419?
like with mine ?
``
[19:47:54][D][climate:399]: Mode: OFF
[19:47:54][D][climate:401]: Action: OFF
[19:47:54][D][climate:404]: Fan Mode: MEDIUM
[19:47:54][D][climate:416]: Swing Mode: VERTICAL
[19:47:54][D][climate:419]: Current Temperature: 25.00°C
[19:47:54][D][climate:425]: Target Temperature: 21.00°C

Anyone here tried using the Wemos D1 Mini v.4.0 and got it to work? I am currently in the process of purchasing but I noticed the latest is v4.0 and not sure if it will work. Any help is much appreciated!

1 Like

Hi everyone. I have just landed here looking for a solution for my AC which is a Split Mitsubishi MSZ-AP25VGD. Kinda overwhelmed by the different versions or chip and project combo.

I have at hand a ESP-01m transceiver version which I had planned on using with esphome IR protocol. Just thought I google before installing it so now I am here.

Couple of questions.

Is any of the projects better than others etc?
Can I use the ESP-01m transceiver or should I use a Wemos D1 mini or Atom, and any differences?
I think I might need some help with the code given that I am seeing significantly different one reading this thread…

thanks for any assistance in advance.

Should work just fine, you just need this jst cable and connect to the cn105 port

You could flash esphome and use this custom component or mitsubishi2mqtt that fits your needs

Thanks.

So this is the latest fork etc I assume…?

So I am looking at the project and have a question about code for internal/external temps I dont understand which one to use and why?

Also not sure how outside_air_temperature_sensor: and isee_sensor: plays into it. There is also sensors to use as follows.

Get external temperature from a HomeAssistant Sensor through the HomeAssistant API

sensor:
  - platform: homeassistant
    id: current_temp
    entity_id: sensor.my_temperature_sensor
    internal: true
    on_value:
      then:
        - lambda: |-
            id(hp).set_remote_temperature(x);

Get external temperature from a networked sensor with a throttle filter

sensor:
  - platform: pvvx_mithermometer
    mac_address: "A4:C1:38:XX:XX:XX"
    temperature:
      name: Thermometer
      id: temperature
      device_class: temperature
      state_class: measurement
      filters:
        throttle_average: 90s
      on_value:
        then:
          - lambda: 'id(use_your_name).set_remote_temperature(x);'

I ended up with this but not sure if I got it right or missed something.

esphome:
  name: garage-ac
  friendly_name: Garage AC

esp8266:
  board: esp01_1m

# Enable logging
logger:
  hardware_uart: UART1
  level: INFO
  logs:
    EVT_SETS : INFO
    WIFI : INFO
    MQTT : INFO
    WRITE_SETTINGS : INFO
    SETTINGS : INFO
    STATUS : INFO
    CN105Climate: WARN
    CN105: INFO
    climate: WARN
    sensor: WARN
    chkSum : INFO
    WRITE : WARN
    READ : WARN
    Header: INFO
    Decoder : INFO
    CONTROL_WANTED_SETTINGS: INFO
#  level: DEBUG
#  logs:
#    EVT_SETS : DEBUG
#    WIFI : INFO
#    MQTT : INFO
#    WRITE_SETTINGS : DEBUG
#    SETTINGS : DEBUG
#    STATUS : INFO
#    CN105Climate: WARN
#    CN105: DEBUG
#    climate: WARN
#    sensor: WARN
#    chkSum : INFO
#    WRITE : WARN
#    READ : WARN
#    Header: INFO
#    Decoder : DEBUG
#    CONTROL_WANTED_SETTINGS: DEBUG

# Enable Home Assistant API
api:
  encryption:
    key: removed"
  services:
    - service: set_remote_temperature
      variables:
        temperature: float
      then:
# Select between the C version and the F version
# Uncomment just ONE of the below lines. The top receives the temperature value in C,
# the bottom receives the value in F, converting to C here.
        - lambda: 'id(hp).set_remote_temperature(temperature);'
#        - lambda: 'id(hp).set_remote_temperature((temperature - 32.0) * (5.0 / 9.0));'
    - service: use_internal_temperature
      then:
        - lambda: 'id(hp).set_remote_temperature(0);'

ota:
  - platform: esphome
    password: "removed"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Garage-Ac Fallback Hotspot"
    password: "removed"

captive_portal:

# Enable Web server.
web_server:
  port: 80

  # Sync time with Home Assistant.
time:
  - platform: homeassistant
    id: homeassistant_time
    
text_sensor:
  - platform: wifi_info
    ip_address:
      name: "garage-ac IP Address"
 
binary_sensor:
  - platform: status
    name: "garage-ac Connect"

uart:
  id: HP_UART
  baud_rate: 2400
  tx_pin: 1
  rx_pin: 3

# external_components:
#   - source: github://geoffdavis/esphome-mitsubishiheatpump

# External component reference
external_components:
  - source: github://echavet/MitsubishiCN105ESPHome

# Climate entity configuration
climate:
  - platform: cn105
    id: hp
    name: Garage AC
    icon: mdi:heat-pump
    visual:
      min_temperature: 15
      max_temperature: 31
      temperature_step:
        target_temperature: 1
        current_temperature: 0.1
    compressor_frequency_sensor:
      name: garage-ac Compressor Frequency
    outside_air_temperature_sensor:
      name: garage-ac Outside Air Temperature
    vertical_vane_select:
      name: garage-ac Vertical Vane
    horizontal_vane_select:
      name: garage-ac Horizontal Vane
    isee_sensor:
      name: garage-ac ISEE Sensor
    remote_temperature_timeout: 30min
    debounce_delay : 500ms
    update_interval: 4s       # update interval can be adjusted after a first run and logs monitoring* 

 
sensor:
  - platform: homeassistant
    name: "garage-ac-Temp"
    entity_id: sensor.garage_aq_temperature
    id: current_temp
    internal: true
    on_value:
      then:
        - lambda: |-
            id(hp).set_remote_temperature(x);
 
  - platform: wifi_signal
    name: "garage-ac WiFi Strength"
    update_interval: 60s
 
  - platform: uptime
    name:  "garage-ac Uptime"
 
switch:
  - platform: restart
    name: "garage-ac reboot"    

# stage_sensor:
#   name: Stage Sensor
# sub_mode_sensor:
#   name: Sub Mode Sensor
# auto_sub_mode_sensor:
#   name: Auto Sub Mode Sensor

Outside air temperature is added very recently, i think more or les “for fun”… not all climates support it. I have 5 climates and only 2 show it.
I have esp01 on all of my climates, all running perfectly. Echavet’s program is a fork from geoff davis’s one, but with some extra functions (also more actively maintained).
External room sensor function is a very good function, especially when heating. What it does is replace built-in climate’s room sensor whcih is pretty unaccurate, because it’s located inside room unit, thus measuring too high temperautre when heating - consequently it can heat too low so you must set target temperature way higher than actually is for room to be properly heated. Using external sensor, located, say, at the other wall of the room can result in much more accurate room temperature. You can use any sensor you have in the room (connected to HA) - i use xiaomi’s BLE thermo/hygro sensors.

Isee sensor is, if i’m not mistaken an ir sensor in some climates which “looks” for human presence and direct fan flow and climate work accordingly.