Skip to content

paveldn/haier-esphome

Repository files navigation

ESPHome Haier component

This is an implementation of the ESPHome component to control HVAC on the base of the SmartAir2 and hOn Haier protocols (AC that is controlled by the hOn or SmartAir2 application).

Short description

There are two versions of the Haier protocol. The older one is using an application called SmartAir2 and the newer one - is an application called hOn. Both protocols are compatible on the transport level but have different commands to control appliances.

SmartAir2

Older Haier models controlled by the SmartAir2 application are using the KZW-W002 module that looks like this:

This module can't be reused, and you need to replace it with an ESP (RPI pico w) module. The USB connector on the board doesn't support the USB protocol. It is a UART port that just uses a USB connector. To connect the ESP board to your AC you can cut a USB type A cable and connect wires to the climate connector.

Haier UART pinout:

Board USB Wire color ESP module
5V VCC red 5V
GND GND black GND
TX DATA+ green RX
RX DATA- white TX

hOn

You can use this component together with a native Haier ESP32 device: Newer Haier models using a module called ESP32-for-Haier. It is an ESP32 single-core board with an ESP32-S0WD chip. The module board looks like this:

Front:

Back:

In some cases, you can reuse this module and flash it with ESPHome, but some new modules don't support this. They look the same but have encryption enabled.

Warning! The new generation of ESP32-Haier devices has encryption enabled, so they can only be flashed with firmware that is signed with a private key. There is no way to make them work with ESPHome, so if you try to do it, the board will get into a boot loop with the error rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) The only way to recover this board is to flash it with the original image. So before starting your experiments make a backup image: How to backup the original image and flash ESPHome to the ESP32 Haier module

Also, you can use any other ESP32, ESP8266 or a RPI pico W board. In this case, you will need to cut the original wire or make a connector yourself (the board has a JST SM04B-GHS-TB connector)

Configuration

The configuration will be a little bit different for different protocols. For example, the SmartAir2 protocol doesn't support cleaning, setting air direction (just swing on/off) etc.

hOn configuration example

uart:
  baud_rate: 9600
  tx_pin: 17
  rx_pin: 16
  id: ac_port  

climate:
  - platform: haier
    id: haier_ac
    protocol: hOn
    name: Haier AC 
    uart_id: ac_port
    wifi_signal: true           # Optional, default true, enables WiFI signal transmission from ESP to AC
    beeper: true                # Optional, default true, disables beep on commands from ESP
    display: true               # Optional, default true, can be used to turn off LED display
    answer_timeout:: 200ms      # Optional, request answer timeout, can be used to increase the timeout
                                # for some ACs that have longer answer delays
    outdoor_temperature:        # Optional, outdoor temperature sensor
      name: Haier AC outdoor temperature
    visual:                     # Optional, you can use it to limit min and max temperatures in UI (not working for remote!)
      min_temperature: 16 °C
      max_temperature: 30 °C
      temperature_step: 1 °C
    supported_modes:            # Optional, can be used to disable some modes if you don't need them
      - 'OFF'
      - AUTO
      - COOL
      - HEAT
      - DRY
      - FAN_ONLY
    supported_presets:          # Optional, can be used to disable some presets if your AC does not support it
      - AWAY
      - ECO
      - BOOST
      - SLEEP
    supported_swing_modes:      # Optional, can be used to disable some (or all) swing modes if your AC does not support it
      - 'OFF'
      - VERTICAL
      - HORIZONTAL
      - BOTH
    on_alarm_start:
      then:
        - logger.log:
            level: WARN
            format: "Alarm activated. Code: %d. Message: \"%s\""
            args: [ code, message]
    on_alarm_end:
      then:
        - logger.log:
            level: INFO
            format: "Alarm deactivated. Code: %d. Message: \"%s\""
            args: [ code, message]

SmartAir2 configuration example

uart:
  baud_rate: 9600
  tx_pin: 1
  rx_pin: 3
  id: ac_port  

climate:
  - platform: haier
    id: haier_ac
    protocol: smartAir2
    name: Haier AC 
    uart_id: ac_port
    wifi_signal: true           # Optional, default true, enables WiFI signal transmission from ESP to AC
    display: true               # Optional, default true, can be used to turn off LED display
    answer_timeout: 200ms       # Optional, request answer timeout, can be used to increase the timeout
                                # for some ACs that have longer answer delays
    visual:                     # Optional, you can use it to limit min and max temperatures in UI (not working for remote!)
      min_temperature: 16 °C
      max_temperature: 30 °C
      temperature_step: 1 °C
    supported_modes:            # Optional, can be used to disable some modes if you don't need them
      - 'OFF'
      - AUTO
      - COOL
      - HEAT
      - DRY
      - FAN_ONLY
    supported_presets:          # Optional, can be used to disable some presets if your AC does not support it
      - AWAY
      - BOOST
      - COMFORT
    supported_swing_modes:      # Optional, can be used to disable some (or all) swing modes if your AC does not support it
      - 'OFF'
      - VERTICAL
      - HORIZONTAL
      - BOTH

Configuration variables

  • id (Optional, ID): Manually specify the ID used for code generation
  • uart_id (Optional, ID): ID of the UART port to communicate with AC
  • protocol (Required, string): Defines communication protocol with AC. Possible values: hon or smartair2
  • name (Required, string): The name of the climate device
  • wifi_signal (Optional, boolean): If true - send wifi signal level to AC (Olny for devices that support this feature)
  • beeper (Optional, boolean): (supported only by hOn) Can be used to disable beeping on commands from AC
  • answer_timeout (Optional, Time): Can be used to change default answer timeout. It helps in case AC takes longer to answer requests.
  • alternative_swing_control (Optional, boolean): (supported by smartAir2 only) If true - use alternative values to control swing mode. Use only if the original control method is not working for your AC.
  • control_packet_size (Optional, int): (supported only by hOn) Define the size of the control packet. Can help with some newer models of ACs that use bigger packets. Default value: 10.
  • control_method (Optional, list): (supported only by hOn) Defines control method (should be supported by AC). Supported values: monitor_only - no control, just monitor status, set_group_parameters - set all AC parameters with one command (default method), set_single_parameter - set each parameter individually (this method is supported by some new ceiling ACs like AD71S2SM3FA)
  • outdoor_temperature (Optional): (supported only by hOn) Temperature sensor for outdoor temperature
    • name (Required, string): The name of the sensor.
    • id (Optional, ID): ID of the sensor, can be used for code generation
    • All other options from Sensor.
  • supported_modes (Optional, list): Can be used to disable some of AC modes. Possible values: OFF (use quotes in opposite case ESPHome will convert it to False), AUTO, COOL, HEAT, DRY, FAN_ONLY
  • supported_presets (Optional, list): Optional, can be used to disable some presets. Possible values: AWAY, BOOST, COMFORT for SmartAir2, or AWAY, ECO, BOOST, SLEEP for hOn. AWAY preset can be enabled only in HEAT mode, it is disabled by default
  • supported_swing_modes (Optional, list): Can be used to disable some swing modes if your AC does not support it. Possible values: OFF (use quotes in opposite case ESPHome will convert it to False), VERTICAL, HORIZONTAL, BOTH
  • on_alarm_start (Optional, Automation): (supported only by hOn) Automation to perform when AC activates a new alarm. See on_alarm_start
  • on_alarm_end (Optional, Automation): (supported only by hOn) Automation to perform when AC deactivates a new alarm. See on_alarm_end
  • All other options from Climate.

Automations

Haier climate supports some actions and triggers:

on_alarm_start Trigger

This automation will be triggered when a new alarm is activated by AC. The error code of the alarm will be given in the variable "code" (type uint8_t), error message in the variable "message" (type char*). Those variables can be used in lambdas. Supported only by hOn protocol.

climate:
  - protocol: hOn
    on_alarm_start:
      then:
        - logger.log:
            level: WARN
            format: "Alarm activated. Code: %d. Message: \"%s\""
            args: [ code, message]

on_alarm_end Trigger

This automation will be triggered when a previously activated alarm is deactivated by AC. The error code of the alarm will be given in the variable "code" (type uint8_t), error message in the variable "message" (type char*). Those variables can be used in lambdas. Supported only by hOn protocol.

climate:
  - protocol: hOn
    on_alarm_end:
      then:
        - logger.log:
            level: INFO
            format: "Alarm deactivated. Code: %d. Message: \"%s\""
            args: [ code, message]

climate.haier.power_on Action

This action turns the AC power on

on_...:
  then:
    climate.haier.power_on: device_id

climate.haier.power_off Action

This action turns AC power off

on_...:
  then:
    climate.haier.power_off: device_id

climate.haier.power_toggle Action

This action toggles AC power

on_...:
  then:
    climate.haier.power_toggle: device_id

climate.haier.display_on Action

This action turns the AC display on

on_...:
  then:
    climate.haier.display_on: device_id

climate.haier.display_off Action

This action turns the AC display off

on_...:
  then:
    climate.haier.display_off: device_id

climate.haier.health_on Action

Turn on health mode (UV light sterilization)

on_...:
  then:
    climate.haier.health_on: device_id

climate.haier.health_off Action

Turn off health mode

on_...:
  then:
    climate.haier.health_off: device_id

climate.haier.beeper_on Action

(supported only by hOn) This action enables beep feedback on every command sent to AC

on_...:
  then:
    climate.haier.beeper_on: device_id

climate.haier.beeper_off Action

(supported only by hOn) This action disables beep feedback on every command sent to AC (keep in mind that this will not work for IR remote commands)

on_...:
  then:
    climate.haier.beeper_off: device_id

climate.haier.set_vertical_airflow Action

(supported only by hOn) Set direction for vertical airflow if the vertical swing is disabled. Possible values: Up, Center, Down.

on_...:
  then:
    - climate.haier.set_vertical_airflow:
      id: device_id
      vertical_airflow: Up

climate.haier.set_horizontal_airflow Action

(supported only by hOn) Set direction for horizontal airflow if the horizontal swing is disabled. Possible values: Left, Center, Right.

on_...:
  then:
    - climate.haier.set_horizontal_airflow:
      id: device_id
      vertical_airflow: Right

climate.haier.start_self_cleaning Action

(supported only by hOn) Start self-cleaning

on_...:
  then:
    - climate.haier.start_self_cleaning: device_id

climate.haier.start_steri_cleaning Action

(supported only by hOn) 56°C steri-cleaning

on_...:
  then:
    - climate.haier.start_steri_cleaning: device_id

How to backup the original image and flash ESPHome to the ESP32 Haier module

It is strongly recommended to make a backup of the original flash content before flashing ESPHome!

To make a backup and to flash the new firmware you will need to use a USB to TTL converter and solder wires to access UART0 on board (or use something like this: Pogo Pin Probe Clip 2x5p 2.54 mm)

UART0 pinout:

To put the device in the flash mode you will need to shortcut GPIO0 to the ground before powering the device.

Once the device is in flash mode you can make a full backup of the original firmware in case you would like to return the module to its factory state. To make a backup you can use esptool. Command to make a full flash backup:

python esptool.py -b 115200 --port <port_name> read_flash 0x00000 0x400000 flash_4M.bin

After this, you can flash firmware using ESPHome tools (dashboard, website, esphome command, etc)