Klimatyzacja HAIER - jak zintegrować z HA

Może się dołączę, bo przechodziłem przez te problemy jakiś rok temu. Zastosowałem gotowy komponent z ESPHome. Ale jedna dziwna sprawa. Mam klimatyzacje Haier, którą przed przeróbką sterowałem z aplikacji SmartAir2. Z hOn nie działało. Jednak w pliku konfiguracyjnym musiałem zaznaczyć hOn, aby było OK, Tak używam od dłuższego czasu i jest OK. Poniżej mój plik yaml , zostawiłem linijki, które pokazują z czego nie korzystam.

esphome:
  name: "ac-haier-01"
  friendly_name: AC-Haier-01

esp8266:
  board: esp01_1m

# Enable logging
logger:
  baud_rate: 0

# Enable Home Assistant API
api:
  encryption:
    key: "VlVVlpqugety4dBBOx/mPMp6xzENi1lcHMdTUQFmLQk="

ota:
  - platform: esphome
    password: "ca03b567cecf740b9cdc380e1d0bd5f4"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp01 Fallback Hotspot"
    password: "XWECE6nHtpKR"

#captive_portal:
uart:
  baud_rate: 9600
  tx_pin: 1
  rx_pin: 3
  id: haier_uart



climate:
  - platform: haier
    id: haier_ac
    protocol: hOn
    name: Haier SmartAir2 Climate
    uart_id: haier_uart
    wifi_signal: true
    visual:
      min_temperature: 16 °C
      max_temperature: 30 °C
      temperature_step: 1 °C
    supported_modes:
      - 'OFF'
      - HEAT_COOL
      - COOL
      - HEAT
      - DRY
      - FAN_ONLY
    supported_swing_modes:
      - 'OFF'
      - VERTICAL
      - HORIZONTAL
      - BOTH
    supported_presets:
      - BOOST
      - AWAY
#    control_method:
#      - SET_SINGLE_PARAMETER
#      - SET_GROUP_PARAMETERS


switch:
#  - platform: template
#    id: haier_ac_health_mode
#    name: Haier SmartAir2 Climate health mode
#    icon: mdi:leaf
#    restore_mode: RESTORE_DEFAULT_OFF
#    lambda: |-
#      return id(haier_ac).get_health_mode();
#    turn_on_action:
#      climate.haier.health_on: haier_ac
#    turn_off_action:
#      climate.haier.health_off: haier_ac
  - platform: template
    id: haier_ac_display_switch
    name: Haier SmartAir2 Climate display
    icon: mdi:led-on
    entity_category: config
    restore_mode: RESTORE_DEFAULT_ON
    lambda: |-
      return id(haier_ac).get_display_state();
    turn_on_action:
      climate.haier.display_on: haier_ac
    turn_off_action:
      climate.haier.display_off: haier_ac

        

To oznaczałoby, że przed przeróbką korzystałeś z dongla wifi z oryginalnym firmware’m i jednocześnie NIE miałeś integracji z HA. Jeśli tak było, to wszystko się zgadza i mogę potwierdzić, że u mnie też tak było. Chcąc mieć klimę z SmartAir2 zintegrowaną z HA musiałem wywalić oryginalnego dongla i wstawić w jego miejsce ESP z własnym firmwarem.

Z łatwością mogę sobie wyobrazić też i takie rozwiązanie, w którym od pewnego czasu elektronika Haier jest już fabrycznie przygotowana na oba protokoły. I to ona decydowałaby o sposobie komunikacji po rozpoznaniu protokołu wymuszanego przez firmare. Bowiem wstawienie bramki XOR między dwa protokoły to przecież żaden problem.
No ale to tylko luźne dywagacje i przypuszczenia. Aż tak blisko jeszcze nie zakolegowałem się z Haierem, żeby mieć od nich potwierdzenie czarno na białym… :wink:

Powyższa uwaga @macek’a też daje do myślenia… Okazuje się, że istnieje zbyt wiele odmian i wersji nawet w obrębie tego samego modelu urządzenia, aby jednoznacznie zawyrokować, co u kogo będzie chodzić. Pozostają więc wyłącznie wyniki własnych, indywidualnych prac doświadczalnych.

Coś strasznie przepłacasz za te moduły wifi… Donlge Haier WiFi widziałem niedawno w Leroy Merlin w cenie 99,- Używają ich w klimatyzatorach sprzedawanych tam pod własną marką Equation.
Wiem, że działają z Haierem, bo kiedyś ich używałem.

Breaking News: Dziś (20.01.2025) te dongle są po niecałe 58 zł! Właśnie sprawdziłem. To są oryginalne Haier’y (taki przynajmniej jest nadruk wytrawiony na płytce).

Dziękuję Wam dobrzy ludzie za ten temat - żyłem w przeświadczeniu, że A/C Haiera da się podłączyć do HA tylko przez tę ich chmurę, a tu taka miła niespodzianka :slight_smile:

Zatem informacyjnie: mój model to “Revive Plus” (jedn. wewn. AS25RBAHRA-PL), oryginalnie z płytką ESP32-for-Haier, podłączoną przez małe gniazdo 4-pinowe. Wczoraj zastąpiłem ją modułem esp32-cam (tym małym za 35 zł, akurat taki miałem w domu). Skopiowałem config z “maksymalnego przykładu” dla protokołu hon, musiałem tylko dodać “answer_timeout: 200ms” (widziałem timeouty na poziomie max 100ms, więc dałem 2x dla pewności). Moja wersja ESPhome: 2024.10.0; wersja Home Assistant: 2024.10.4.

Na ile sprawdziłem, wszystkie funkcje tej klimy zarówno pokazują się w HA po zmianie pilotem, jak i dają się zmieniać z poziomu HA. Na wyświetlaczu klimy świeci się symbol WiFi. Co ciekawe, mam w HA więcej ustawień nawiewu pionowego, niż mogę wybrać na pilocie: pilot nie ustawia położenia “Max Down”, na które klima reaguje prawie pionowym ustawieniem łopatek. W poziomie jest 5 pozycji (nie licząc “auto”) i z pilota też.

2 polubienia

Tak, inżynieria odwrotna daje czasem zaskakująco dobre wyniki w porównaniu z tą klasyczną. Bywa, że prowadzi ona do ciekawego wniosku, że: 1+2 != 2+1 :wink:

Choć ostateczna decyzja należy do moderatora, to myślę, że powoli możemy zamykać ten wątek, który ‘nieopatrznie’ utworzyłem ponad 3 lata temu. Już chyba niewiele można tu dodać… Cieszę się razem z Wami, że wspólnie ogarnęliśmy temat. Ja także dziękuję Wam wszystkim za cenne pomysły i inspiracje! :slight_smile:

1 polubienie

To jeszcze ja na koniec, jeśli miałoby to znaczenie…
Dzisiaj ukonczyłem nowego ‘dongla’ na bazie najmniejszego esp8266 ‘esp01s’ - akurat takie mialem w domu. U mnie też oryginalnie siedział ESP32-for haier na mini złączu (nie usb A)

I teraz wyglada to w ten sposob.

Zrobilem małego moda na adapterze 5v-3.3V by zasilanie sie zgadzało i wgrałem takie oto ustawienia:

esphome:
  name: haier-salon
  friendly_name: Haier Salon
  min_version: 2024.11.0
  name_add_mac_suffix: false

esp8266:
  board: esp01_1m

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  manual_ip:
    static_ip: 192.168.111.47
    gateway: 192.168.111.1
    subnet: 255.255.255.0
  ap:
    ssid: "Haier Salon Fallback Hotspot"
    password: !secret wifi_password

external_components:
  - source: github://esphome/esphome@dev
    components: [ haier ]

api:

ota:
  - platform: esphome
    password: ""


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

logger:
  baud_rate: 0

#web_server:

climate:
  - platform: haier
    id: haier_climate
    protocol: hOn
    name: Climate
    uart_id: ac_port
    wifi_signal: true
    visual:
      min_temperature: 16 °C
      max_temperature: 30 °C
      temperature_step: 1 °C
    supported_modes:
    - 'OFF'
    - HEAT_COOL
    - COOL
    - HEAT
    - DRY
    - FAN_ONLY
    supported_swing_modes:
    - 'OFF'
    - VERTICAL
    - HORIZONTAL
    - BOTH
    supported_presets:
    - AWAY
    - BOOST
    - SLEEP
    
switch:
  - platform: template
    id: haier_climate_display_switch
    name: Wyświetlacz
    icon: mdi:led-on
    entity_category: config
    restore_mode: RESTORE_DEFAULT_ON
    lambda: |-
      return id(haier_climate).get_display_state();
    turn_on_action:
      climate.haier.display_on: haier_climate
    turn_off_action:
      climate.haier.display_off: haier_climate
  - platform: template
    id: haier_climate_beeper_switch
    entity_category: config
    name: Beep
    icon: mdi:volume-high
    restore_mode: RESTORE_DEFAULT_ON
    lambda: |-
      return id(haier_climate).get_beeper_state();
    turn_on_action:
      climate.haier.beeper_on: haier_climate
    turn_off_action:
      climate.haier.beeper_off: haier_climate
  - platform: restart
    name: Restart AC Salon

sensor:
  - platform: haier
    haier_id: haier_climate
    outdoor_temperature:
      name: Outdoor Temperature
    humidity:
      name: Indoor Humidity
    compressor_current:
      name: Compressor Current
    compressor_frequency:
      name: Compressor Frequency
    expansion_valve_open_degree:
      name: Expansion Valve Open Degree
    indoor_coil_temperature:
      name: Indoor Coil Temperature
    outdoor_coil_temperature:
      name: Outdoor Coil Temperature
    outdoor_defrost_temperature:
      name: Outdoor Defrost Temperature
    outdoor_in_air_temperature:
      name: Outdoor In Air Temperature
    outdoor_out_air_temperature:
      name: Outdoor Out Air Temperature
    power:
      name: Power
  - platform: wifi_signal
    name: WiFi Signal
    update_interval: 30s

binary_sensor:
  - platform: haier
    haier_id: haier_climate
    compressor_status:
      name: Outdoor Compressor Status
    defrost_status:
      name: Defrost Status
    four_way_valve_status:
      name: Four Way Valve Status
    indoor_electric_heating_status:
      name: Indoor Electric Heating Status
    indoor_fan_status:
      name: Indoor Fan Status
    outdoor_fan_status:
      name: Outdoor Fan Status

# Funkcje dodatkowe
button:
  - platform: template
    name: Self Cleaning
    icon: mdi:spray-bottle
    on_press:
      - climate.haier.start_self_cleaning: haier_climate
# Introduced in (some) models starting from 2021
  - platform: template
    name: Stericleaning
    icon: mdi:spray-bottle
    on_press:
      - climate.haier.start_steri_cleaning: haier_climate

text_sensor:
  - platform: template
    name: Cleaning Status
    icon: mdi:spray-bottle
    lambda: return id(haier_climate).get_cleaning_status_text();


select:
  - platform: template
    id: haier_climate_vertical_direction
    name: Airflow Vertical
    entity_category: config
    icon: mdi:arrow-expand-vertical
    update_interval: 5s
    options:
      - Health Up
      - Max Up
      - Up
      - Center
      - Down
      - Max Down
      - Health Down
      - Auto
    lambda: >-
      switch (id(haier_climate).get_vertical_airflow().value_or(esphome::haier::hon_protocol::VerticalSwingMode::CENTER))
      {
          case esphome::haier::hon_protocol::VerticalSwingMode::HEALTH_UP:
              return std::string("Health Up");
          case esphome::haier::hon_protocol::VerticalSwingMode::MAX_UP:
              return std::string("Max Up");
          case esphome::haier::hon_protocol::VerticalSwingMode::UP:
              return std::string("Up");
          default:
          case esphome::haier::hon_protocol::VerticalSwingMode::CENTER:
              return std::string("Center");
          case esphome::haier::hon_protocol::VerticalSwingMode::DOWN:
              return std::string("Down");
          case esphome::haier::hon_protocol::VerticalSwingMode::MAX_DOWN:
              return std::string("Max Down");
          case esphome::haier::hon_protocol::VerticalSwingMode::HEALTH_DOWN:
              return std::string("Health Down");
          case esphome::haier::hon_protocol::VerticalSwingMode::AUTO:
          case esphome::haier::hon_protocol::VerticalSwingMode::AUTO_SPECIAL:
              return std::string("Auto");
      }
    set_action:
      - climate.haier.set_vertical_airflow:
          id: haier_climate
          vertical_airflow: !lambda >-
            if (x == "Health Up")
                return esphome::haier::hon_protocol::VerticalSwingMode::HEALTH_UP;
            else if (x == "Max Up")
                return esphome::haier::hon_protocol::VerticalSwingMode::MAX_UP;
            else if (x == "Up")
                return esphome::haier::hon_protocol::VerticalSwingMode::UP;
            else if (x == "Down")
                return esphome::haier::hon_protocol::VerticalSwingMode::DOWN;
            else if (x == "Max Down")
                return esphome::haier::hon_protocol::VerticalSwingMode::MAX_DOWN;
            else if (x == "Health Down")
                return esphome::haier::hon_protocol::VerticalSwingMode::HEALTH_DOWN;
            else if (x == "Auto")
                return esphome::haier::hon_protocol::VerticalSwingMode::AUTO;
            else
                return esphome::haier::hon_protocol::VerticalSwingMode::CENTER;
  - platform: template
    id: haier_climate_horizontal_direction
    name: Airflow Horizontal
    entity_category: config
    icon: mdi:arrow-expand-horizontal
    update_interval: 5s
    options:
      - Max Left
      - Left
      - Center
      - Right
      - Max Right
      - Auto
    lambda: >-
      switch (id(haier_climate).get_horizontal_airflow().value_or(esphome::haier::hon_protocol::HorizontalSwingMode::CENTER))
      {
          case esphome::haier::hon_protocol::HorizontalSwingMode::MAX_LEFT:
              return std::string("Max Left");
          case esphome::haier::hon_protocol::HorizontalSwingMode::LEFT:
              return std::string("Left");
          default:
          case esphome::haier::hon_protocol::HorizontalSwingMode::CENTER:
              return std::string("Center");
          case esphome::haier::hon_protocol::HorizontalSwingMode::RIGHT:
              return std::string("Right");
          case esphome::haier::hon_protocol::HorizontalSwingMode::MAX_RIGHT:
              return std::string("Max Right");
          case esphome::haier::hon_protocol::HorizontalSwingMode::AUTO:
              return std::string("Auto");
      }
    set_action:
      - climate.haier.set_horizontal_airflow:
          id: haier_climate
          horizontal_airflow: !lambda >-
            if (x == "Max Left")
                return esphome::haier::hon_protocol::HorizontalSwingMode::MAX_LEFT;
            else if (x == "Left")
                return esphome::haier::hon_protocol::HorizontalSwingMode::LEFT;
            else if (x == "Right")
                return esphome::haier::hon_protocol::HorizontalSwingMode::RIGHT;
            else if (x == "Max Right")
                return esphome::haier::hon_protocol::HorizontalSwingMode::MAX_RIGHT;
            else if (x == "Auto")
                return esphome::haier::hon_protocol::HorizontalSwingMode::AUTO;
            else
                return esphome::haier::hon_protocol::HorizontalSwingMode::CENTER;

niestety moduł ESP01s łapał straszne zwiechy i sie restartował do jakies 20s ze wzgledu na mała wydajnosc procka, wiec musialem zrezygnować z webservera (odchaczony w kodzie) i działa pieknie i stabilnie.

Wszystkie funkcje działają poprawnie oprócz sensora wilgotnosci powietrza ktory pokazuje ciągłe 0%

Moja jednostka to: AS50S2SF1FA-BH

Pozdrawiam i serdecznie dziekuje za pomoc!

2 polubienia

Co to za adapter dla ESP-01?

A czemu wciąż siedzisz w dev, skoro mamy już wersję stabilną? Wg mnie ta sekcja konfigu jest raczej do usunięcia…

ESP01 nie ma wbudowanego regulatora napięcia 3.3V, a Haier podaje 5V. Bez tego adaptera ESP8266 na pokładzie by sie uzmażył. Adapter taki ma tylko 4 piny wyprowadzone +3.3V/GND/TX/RX wiec to akurat siadło…

kupione za pare PLN na portalu aukcyjnym - i teraz po małych przeróbkach idealnie miesci sie w kieszeni wifi haiera.

No tak, w sumie to do usunięcia :slight_smile:

Podpowiedź dla zainteresowanych: do mini złącza, do którego jest podpięty esp32-for-haier, można kupić gotowe gniazdo na płytce. Nawet wyprowadzenia można sobie wybrać.

Płyta transferowa GH1.25 1,25 do 2,54

Kupiłem, podłączyłem do tego gniazda ESP-01s na adapterze 5V-3.3V (tak jak u @tykasan - dziękuję za koncepcję i gotowy YAML) i działa jak marzenie. Tylko jeszcze trzeba to trochę pougniatać bo na razie dynda na kabelkach pod klimatyzatorem. Ale ja z tych co sami nie lutują, teraz muszę poszukać podwykonawcy z lutownicą :slightly_smiling_face:

PS Piszę pierwszy raz na forum, ale oglądam od dawna. Dziękuję za wiele cennych porad!

4 polubienia