Module WIFI climatisation AIRTON

Tu n’aura pas la partie mqtt, ca c’est que dans mon fw, la tu utilise l’implementation tuya de esphome, tu peux eventuellement activer la partie mqtt d’esphome pour que ca passe par ca, mais tu n’aura pas les même option que je proposait a moins que tu les codes :slight_smile:

ok merci pour ton retour @devildant.

Pour être sûr de bien comprendre (désolé si ce sont des questions stupides, mais c'est hors de mon domaine de compétences), avec les nouvelles clim Airton, est-on obligé d'utiliser l'implémentation Tuya et de perdre ainsi ce que tu proposais ? Ou est-il possible d'adapter tes développements pour les rendre compatibles ? Dans mon cas le contrôle via MQTT est essentiel, l'objectif est d'avoir les mêmes fonctionnalités que sur mes autres clim avec un contrôle via la domotique.

En gros oui, la version que je propose coté logiciel c’est quelque chose que j’ai coder entièrement avec esphome, l’ancien module etait compatible tuya mais ce n’etait pas du tuya mcu, j’avais donc du decoder chacune des trames rx/tx pour pouvoir communiquer avec la clim et j’avais construit le fw autour de ca et j’ai implementer au fur et a mesure tout se qui pouvait me sembler utils, comme tout faire passer par mqtt pour avoir un controle logique entre les fonctions (par exemple en desactiver certaines en fonction des modes et d’autre options pour respecter le comportement de la telecommande…) et pour rendre le module compatible jeedom et autre…

Toutes les option pour configurer mqtt sans devoir reflasher, c’est pareil, ainsi que la fonction de commande memorisé ou la gestion des erreurs…

Tuya mcu n’est qu’une implementation disponible en open source sur esphome, donc il est tout a fait possible de le fork pour faire les modifs voulu dessus, mais c’est quelque chose qu’ils va falloir maintenir au file des maj d’esphome…

Mais c'est faisable, contrairement a la version que je propose ou rien n'était documenter ou autre la tout le code est disponible

Une autre possibilité ca serait de comprendre la logique des trames de tuya mcu et modifier la partie logique rx/tx de mon code pour faire du tuya mcu :slight_smile: tu pourrais ainsi retrouver des fonctionnalité similaire a l’exception du mute de commande car si elle existe faut la trouver

Merci beaucoup Devildant et Forhorse ! Grâce à vos indications, on a pu relier les 5 clims Airton de notre Atelier. J’ai commandé les cartes sur JLCPCB et en suivant le GitHub, j’ai pu avancer sans me prendre la tête. Un grand merci pour votre aide et votre travail ! :folded_hands::rocket:

Salut, peut-être discuté ailleurs (ou hors sujet) et dans ce cas là m'excuser mais.... Je viens d'activer mon esp8285 qui peut scanner/transmettres des codes IR.

Il faut savoir comment 'progammer' un ESP mais c'est pas super difficile non plus.

Matériel

  • FT232 d'Aliexpress (< 10EUR) pour la programmation
  • ESP8285 d'Aliexpress (<5 EUR)
  • prise usb ou sorte pour l'alimentation 5V

Logiciel:

  • ESPHOME

ADUM3201 FT232 Module de Port série d'isolation photoélectrique USB 3.3V 5.5V vers adaptateur TTL Isolation FT232RL FTDI

Module émetteur-récepteur infrarouge ESP8285, module émetteur-récepteur WIFI sans fil, module de commutation à télécommande, carte d'apprentissage et de développement - AliExpress

Example de code:


# Board: Generic ESP8285 Module (Espressif)
# Definition: definitions/boards/esp8285/manifest.yaml

esphome:
  name: esp-infrared
  friendly_name: ESP_INFRARED

esp8266:
  board: esp8285

logger:
  level: DEBUG
  baud_rate: 115200

api:

ota:
  - platform: esphome

wifi:
  ssid: !secret wifi_ssid2
  password: !secret wifi_password2
  manual_ip: 
    static_ip: 192.168.1.160
    gateway: 192.168.1.1 
    subnet: 255.255.255.0

remote_receiver:
  pin:
    number: GPIO14
    inverted: true
  dump:
    - raw

remote_transmitter:
  pin:
    number: GPIO4
    inverted: false
  carrier_duty_percent: 50
  id: airton_tx

button:
  - platform: template
    name: "Airco OFF"
    on_press:
      - remote_transmitter.transmit_raw:
          code: [6657, -3325, 429, -1268, 402, -1268, 404, -402, 428, -411, 425, -1266, 402, -410, 424, -1268, 400, -1268, 401, -1269, 401, -407, 428, -405, 429, -406, 428, -1267, 403, -380, 451, -407, 429, -407, 426, -409, 425, -408, 428, -1268, 401, -407, 
                428, -405, 428, -406, 429, -405, 429, -406, 428, -405, 430, -1267, 401, -1268, 401, -406, 428, -407, 428, -407, 427, -407, 453, -381, 429, -405, 428, -406, 426, -408, 426, -408, 429, -405, 428, -407, 427, -408, 427, -406, 428, -407, 426, -408, 428, 
                -1267, 401, -407, 426, -406, 431, -405, 428, -1268, 400, -1269, 400, -1268, 404, -404, 431, -406, 426, -407, 430, -404, 426, -1269, 401, -1268, 400, -1269, 401]
          repeat:
            times: 5
            wait_time: 16ms
          carrier_frequency: 38kHz
  - platform: template
    name: "Airco Cool 22°C"
    on_press:
      - remote_transmitter.transmit_raw:
          code: [6655, -3332, 424, -1247, 424, -1245, 425, -408, 425, -409, 427, -1246, 424, -407, 427, -1265, 404, -1270, 400, -1274, 396, -408, 426, -410, 425, -408, 426, -1270, 400, -408, 426, -408, 427, -408, 426, -1270, 400, -408, 426, -409, 426, 
            -1270, 400, -408, 426, -409, 426, -408, 426, -409, 426, -408, 427, -1269, 400, -1269, 401, -407, 427, -408, 427, -408, 427, -407, 427, -408, 427, -407, 426, -409, 426, -409, 426, -408, 426, -408, 426, -409, 426, -408, 426, -409, 426, -408, 426, -409, 
            426, -1268, 401, -408, 427, -408, 426, -408, 427, -1268, 401, -1269, 402, -407, 427, -408, 426, -1269, 400, -409, 426, -408, 427, -1268, 401, -1269, 400, -1271, 398] 
          repeat:
            times: 5
            wait_time: 16ms
          carrier_frequency: 38kHz
  - platform: template
    name: "Airco Cool 23°C"
    on_press:
      - remote_transmitter.transmit_raw:
          code: [6659, -3329, 428, -1267, 403, -1267, 402, -406, 429, -406, 430, -1268, 400, -406, 430, -1266, 402, -1245, 425, -1268, 402, -406, 428, -406, 429, -406, 428, -1268, 402, -406, 428, -407, 428, -406, 428, -1269, 402, -405, 429, -406, 428, 
            -1268, 402, -406, 428, -407, 428, -406, 428, -407, 428, -1268, 402, -1268, 401, -1268, 402, -406, 429, -406, 428, -407, 427, -407, 428, -406, 429, -406, 429, -406, 429, -405, 428, -407, 428, -406, 428, -407, 428, -407, 427, -407, 428, -406, 428, -407, 
            428, -1267, 403, -407, 427, -406, 431, -406, 427, -1266, 402, -1269, 402, -1267, 402, -1268, 402, -406, 428, -1268, 428, -380, 428, -1269, 401, -1272, 397, -1268, 402] 
          repeat:
            times: 5
            wait_time: 16ms
          carrier_frequency: 38kHz
  - platform: template
    name: "Airco Cool 24°C"
    on_press:
      - remote_transmitter.transmit_raw:
          code: [6650, -3351, 401, -1245, 424, -1243, 425, -411, 423, -411, 423, -1243, 425, -411, 422, -1245, 424, -1244, 427, -1242, 424, -411, 423, -411, 423, -410, 424, -1247, 422, -409, 424, -410, 423, -412, 424, -1243, 424, -410, 424, -410, 424, 
            -1236, 433, -409, 424, -410, 424, -410, 427, -408, 422, -411, 422, -412, 423, -411, 423, -1268, 400, -411, 425, -409, 423, -410, 422, -412, 423, -411, 423, -411, 426, -407, 424, -410, 425, -409, 423, -411, 424, -410, 423, -411, 422, -412, 423, -410, 
            424, -1266, 401, -411, 423, -411, 424, -410, 423, -1267, 400, -1267, 402, -411, 423, -1266, 402, -412, 422, -1267, 401, -411, 422, -1268, 401, -1267, 401, -1267, 402] 
          repeat:
            times: 5
            wait_time: 16ms
          carrier_frequency: 38kHz
  - platform: template
    name: "Airco Cool 25°C"
    on_press:
      - remote_transmitter.transmit_raw:
          code: [6652, -3328, 427, -1267, 401, -1267, 401, -406, 428, -406, 428, -1267, 401, -406, 429, -1267, 400, -1269, 400, -1268, 401, -406, 428, -406, 429, -406, 428, -1266, 402, -405, 429, -407, 426, -406, 428, -1267, 401, -407, 427, -407, 428, 
            -1266, 402, -408, 425, -405, 430, -407, 427, -409, 425, -1266, 401, -407, 428, -405, 429, -1266, 402, -408, 426, -408, 423, -411, 426, -406, 427, -407, 428, -408, 425, -406, 452, -382, 428, -405, 428, -408, 427, -408, 424, -408, 426, -409, 427, -404, 
           430, -1265, 401, -407, 428, -405, 429, -406, 426, -1269, 398, -1270, 400, -1268, 401, -407, 429, -407, 426, -1266, 401, -407, 427, -1267, 401, -1268, 377, -1291, 406] 
          repeat:
            times: 5
            wait_time: 16ms
          carrier_frequency: 38kHz           
```

Content que ce soit utilisé (le cloud tuya c'est le mal haha) Amusez-vous bien avec les automatisations !

c'est toujours utiles, par contre faut un décodage complet des trames IR pour les recomposer, car la télécommande envoi normalement sont état complet à chaque commande IR, donc se que tu capture contient beaucoup de chose (vitesse de ventilateur, position des volets, les mode...)

Oui... oublié car il faut scanner tout les options et ce n'est pas facile à combiner tous, p.e. fan mi-force, 24C et swing....le même avec 22C, 23C, etc. et trops de boutons en résultat.

Entretemps, j'ai trouvé ça [airton] Add support to climate for Airton IR A/C units by Procsiab · Pull Request #7753 · esphome/esphome

!Il faut le modifier un petit peut (j'ai commenté le PR) mais ça marche pas mal comme 'climate' entity dans HA J'ai modifié le code et Procsiab l'a accepté donc on peut utiliser ça comme 'external component'

Hello ! Je me permet de demander un peu d'aide car finalement 2 des 4 Clims sont en USB..
J'ai le PCB de Forhorse et dessus il y a un header +5V RX/TX GND, je peux pas simplement souder un vieux cable USB et ensuite utiliser le mode TUYA MCU ?

Hello,
j'aurais envi de dire oui pour le re picage sur le header mais il faut que @Forhorse le confirme, et pour le fw oui, et @frixo avait deja fait une première pass fonctionnel : Module WIFI climatisation AIRTON - #632 par frixo

pour rappel la conf pour le pcb de Forhorse :
board: lolin_c3_mini
TX: GPIO21
RX: GPIO20

par contre je ne sais plus si sur sont PCB si le RX/TX fait référence au coté AC ou ESP, car dans le miens j'avais suivi la logique de l'acw02 d'origine qui faisait référence au TX/RX coté AC...

au pire si ca marche pas dans un sens essayer dans l'autre pour TX/RX :p, mais je pense que Forhorse pourra éclaircir ce point.

Oui tu peux te brancher directement sur le header +5V/RX/TX/GND.

Les pin RX/TX et GND sont tout simplement en parallèle de celle du connecteur JST qui va normalement à la clim (signaux série TTL 5V).

La pin +5V est en amont du régulateur +3.3V (et donc en aval du convertisseur 12V-5V) ça ne pose pas spécialement de soucis d'alimenter le circuit par là (c'est comme de l'alimenter par le connecteur USB)
Si le régulateur à découpage U2 se met à chauffer (ce qui ne devrait pas arriver) il faudrait enlever le transistor Q1 ou court-circuiter la diode D2 pour couper la liaison entre le 12V et le 5V mais c'est normalement pas nécessaire.

EDIT : Et pour le TX et RX c'est la notation conventionnelle, c'est à dire que le TX du module est celui qui émet du point de vue du module (et donc le RX c'est par là que le module reçoit)

ok super merci !
Je fais ça et vous tiens au courant :slight_smile:

Tout fonctionne avec ESPHome 2026.6.4 et le composant tuya natif (aucun composant custom nécessaire).

Matériel

  • Clim Airton SMVH24B-4A2A3NA(I), 6200 W mono → protocole Tuya MCU (55 AA 03 …).

  • PCB de Forhorse.

  • Alimentation +5 V directpar l'USB de la clim, relié au header +5 V du PCB

Firmware

  • ESPHome 2026.6.4, composant tuya stock (natif).

  • Le fork/patch de frixo (tuya_patched en external_components) n'est pas nécessaire dans mon cas : le tuya natif gère tout (init complète, lecture et écriture des datapoints).

Câblage à partir d'un vieux câble USB coupé

Fil USB Norme USB PCB
Rouge +5 V +5 V
Noir GND GND
Vert D+ TX
Blanc D- RX

J'ai debug pendant 1h avant de simplement inverser TX et RX physiquement ^^

Alimentation / activation

Le +5 V n'est pas toujours présent sur le port. Il faut appuyer sur le bouton WiFi de la télécommande pour le libérer (tension mesurée plutôt ~3,3 V, LED du PCB qui clignote). Sans ça, le module ne s'alimente pas.

Configuration UART (YAML)

substitutions:

board: lolin_c3_mini
TX: GPIO21
RX: GPIO20
# Pas d'external_components : composant tuya natif d'ESPHome
uart:
id: uart_acw02
tx_pin: ${TX} # GPIO21
rx_pin:
number: ${RX} # GPIO20
baud_rate: 9600
rx_buffer_size: 1024
tuya:

Et tout est bon ! Merci encore pour tout le taff :slight_smile:

Merci pour le retour, vous auriez le reste du yaml pour la commu ? (Et je pourrais le fournir dans mon github)

Sans vos identifiants bien sur :slight_smile:

Bien sur ! Dans cet exemple j'ai le tuya patched parce qu'au final mon autre clim de 5100W avait le double 55...

substitutions:
  dev_name: clim_XX
  dev_friendly: Climatisation XXX
  lang: "fr"
  api_encrypted_key: ****
  ota_password: ****
  ap_password: ****
  web_server_username: admin
  web_server_password: admin
  # ESP32 D1 mini WROOM 32
  board: lolin_c3_mini
  TX: GPIO21
  RX: GPIO20
  


esphome:
  name: ${dev_name}
  friendly_name: ${dev_friendly}
  platformio_options:
    build_flags:
      - -DDLOCALE_LANG=\"${lang}\"
      - -DDBOARD=\"${board}\"

# Fork tuya (frixo) : filtre le double 0x55 que ce MCU envoie (55 55 AA...)
external_components:
  - source:
      type: local
      path: tuya_patched
    components: [tuya]


esp32:
  board: ${board}
  framework:
    type: esp-idf

web_server:
  port: 80
  auth:
    username: ${web_server_username}
    password: ${web_server_password}
  version: 3
  log: true
  local : true
  include_internal: true
  
logger:
  level: DEBUG
  
api:
  encryption:
    key: ${api_encrypted_key}
  reboot_timeout: 0s #in test for not forcing using esphome native

ota:
  - platform: esphome
    password: ${ota_password}
  - platform: web_server

wifi:
  ssid: Domo-EntreMakers
  password: CLMDPdelaDOMO
  power_save_mode: none
  ap:
    ssid: ${dev_friendly}
    password: ${ap_password}



captive_portal:

uart:
  id: uart_acw02
  tx_pin: ${TX}
  rx_pin:
    number: ${RX}
  baud_rate: 9600
  rx_buffer_size: 1024
  # --- DEBUG TEMPORAIRE : affiche les trames UART brutes (a retirer ensuite) ---
  debug:
    direction: BOTH
    dummy_receiver: false
    after:
      timeout: 15ms
    sequence:
      - lambda: UARTDebug::log_hex(direction, bytes, ' ');
  #marche pas 9600  57600  115200
  # stop_bits: 1
  # rx_buffer_size: 1024



tuya:
  id: tuya_clim

climate:
  - platform: tuya
    id: acw02
    name: "Climatiseur"
    switch_datapoint: 1
    supports_heat: true
    supports_cool: true
    target_temperature_datapoint: 2
    current_temperature_datapoint: 3
    temperature_multiplier: 0.1
    on_state:
      - lambda: |-
          if (x.target_temperature < 10) {
            id(acw02).target_temperature = x.target_temperature * 10;
          }
    visual:
      min_temperature: 16
      max_temperature: 31
      temperature_step: 1
    active_state:
      datapoint: 4
      heating_value: 3
      cooling_value: 1
      drying_value: 2
      fanonly_value: 4
select:
  - platform: tuya
    name: "Ventilation"
    enum_datapoint: 5
    options:
      0: "Auto"
      1: "20%"
      2: "40%"
      3: "60%"
      4: "80%"
      5: "100%"
      6: "Silencieux"
      7: "Turbo"
  - platform: "tuya"
    name: "Oscillation Vertical"
    enum_datapoint: 107
    options:
      0: "Désactivé"
      1: "Activé"
      2: "Position 1"
      3: "Position 2"
      4: "Position 3"
      5: "Position 4"
      6: "Position 5"  
  - platform: "tuya"
    name: "Unité"
    enum_datapoint: 105
    options:
      0: "°C"
      1: "°F"
  - platform: "tuya"
    name: "Oscillation Horizontal"
    enum_datapoint: 106
    options:
      0: "Désactivé"
      1: "Activé"

switch:
  - platform: "tuya"
    name: "Affichage"
    switch_datapoint: 13
  - platform: "tuya"
    name: "Purificateur"
    switch_datapoint: 110
  - platform: "tuya"
    name: "Nuit"
    switch_datapoint: 109

Merci :slight_smile:

Pour le souci du 55 en double j’avais trouvé un repo qui avait fork tuya mcu d’esphome pour corriger pas mal de souci, frixo n’a pas tu le temps de tester :GitHub - szupi-ipuzs/esphome-external-uyat · GitHub

Bonjour à tous, désolé je suis pas venu sur le forum depuis longtemps

Cette histoire de double 55 c'est quand même vraiment de la merde !

Bon avec le recul, mon truc marche très bien à une exception près, la température relevée dans la pièce des fois déconne, il me dit que des fois qu'il fait 2 degrés

Sinon je reviens sur cette histoire du double 55. Je mettais quand même demandé si cela ne pouvait pas venir de la piètre qualité des ESP que j'utilise, on va pas se mentir j'ai pris des trucs chinois à 2 € pièces qui normalement ne m'ont pas trop déçu

Je pense que j'ai compris le bug

55:AA:03:07:00:08:03:02:00:04:00:00:00:FA:14 → 250 = 25.0°C ✓

En mode clim Off

55:AA:03:07:00:08:03:02:00:04:00:00:00:04:1E → 4 = 0.4°C ✗ 55:AA:03:07:00:08:03:02:00:04:00:00:00:0E:28 → 14 = 1.4°C ✗

Lorsque la clim est éteinte , j'ai un bug dans la trame !!! il me manque un F a la place du 0

je teste le correctif, mais ca correspondrait a la température de ma sonde que j'ai mis a côté

On dirait que tu as du parasitage, faudrait essayer de mettre le blindage du cable usb a la masse voir si ca fait quelque chose ou rien dutout

Bonjour

j'ai modifier le tuya_patched :

j'ai normalement corrigé le soucis de la température, il y a deux bug,
lorsque la clim est éteinte, elle bug dans la tram qu'elle envoit et ... elle envoit deux trame a 10ms d'interval
j'en prend qu'une (sinon tuya s'emballe) et je la corrige, faudrait que je teste sur des température en dessous de 20deg mais c'est pas possible avec le climat actuel. pour l'instant, j'ai enfin des valeurs cohérente !

ca reste du beta !!!