[DefiDIY25] Module wifi pour climatiseur AIRTON/TEKNOPOINT (remplacement du module ACW02 de tuya)

Contexte & Objectif

Les climatiseurs Airton et Teknopoint utilisent en grande partie le module ACW02 de Tuya pour contrôler les unités intérieures des climatiseurs.
Toutefois, l’intégration Tuya ou Tuya Local, bien qu’elle permette un certain contrôle de ces appareils dans Home Assistant, reste dépendante du cloud chinois de Tuya. De plus, l’intégration peut s’avérer complexe pour une entité climatique avancée.

En disposant du module ACW02 officiel, j’ai sniffé la communication UART entre celui-ci et la climatisation afin de recréer un module complet, 100 % local et sans cloud, grâce à ESPHome.

Matériel (BOM) & Schéma de câblage

Le projet utilise :

  • ESP32 D1 Mini WROOM 32 ou LOLIN ESP32 C3 mini ou XIAO C3 ou XIAO C6

  • Pololu D24V10F5 (alimentation)

  • Convertisseur logique bidirectionnel, 2 options disponibles (pour la communication UART, car les climatiseurs utilisent du 5V):

    • Convertisseur logique bidirectionnel 4 canaux CYT1076

    • Convertisseur logique basé sur le SN74LVC2T45DCUR, afin d’avoir une carte plus fiable (gerber, BOM et pick and place dispo sur mon github)

  • Connecteurs JST XA 2.5

:backhand_index_pointing_right: Voici le schéma de base pour ESP32 D1 MINI WROOM 32 :

:backhand_index_pointing_right: Voici le schéma de base pour LOLIN C3 MINI, XIAO C3 et XIAO C6 :

J’ai également créé un PCB pour ESP32 D1 MINI WROOM 32 (il y a 2 version du PCB) pour simplifier le montage ainsi que des fichiers 3D pour le boîtier :

J’ai également créé un autre PCB pour les lolin C3 mini, xiao c3 et xiao c6 :

Je fournis aussi le YAML complet :

  • en version française et anglaise, compilable en local
    version fr :
substitutions:
  dev_name: acw02-salon
  dev_friendly: ACW02 salon
  lang: "fr"
  api_encrypted_key: "D2oldc0VP++fni6src89tCSC0UwBhNPgyc8vgYN8/mA="
  ota_password: "REPLACE_WITH_YOUR_PASSWORD"
  ap_password: "fallbackpassword"
  web_server_username: admin
  web_server_password: admin
  # ESP32 D1 mini WROOM 32
  board: esp32dev
  TX: GPIO17
  RX: GPIO16
  
  ## LOLIN ESP32 C3 MINI
  # board: lolin_c3_mini
  # TX: GPIO21
  # RX: GPIO20

  ## XIAO (seeeds studio) ESP32 C3
  # board: seeed_xiao_esp32c3
  # TX: GPIO21
  # RX: GPIO20

  ## XIAO (seeeds studio) ESP32 C6
  # board: seeed_xiao_esp32c6
  # TX: GPIO16
  # RX: GPIO17

  acw02_ref: main

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

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: INFO
  
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: !secret wifi_ssid
  password: !secret wifi_password
  power_save_mode: none
  # networks:
  #   - ssid: !secret wifi_ssid
  #     password: !secret wifi_password
  #   - ssid: !secret wifi_ssid2
  #     password: !secret wifi_password2
  #   - ssid: !secret wifi_ssid3
  #     password: !secret wifi_password3
  ap:
    ssid: ${dev_friendly}
    password: ${ap_password}

mqtt:
  broker: "" 
  username: ""
  password: ""
  enable_on_boot: false
  discovery: false
  keepalive: 30s
  log_topic: null
  clean_session: false
  idf_send_async: false
  wait_for_connection: false
  topic_prefix: ${dev_name}
  birth_message:
    topic: ${dev_name}/status
    payload: online

  will_message:
    topic: ${dev_name}/status
    payload: offline

captive_portal:

uart:
  id: uart_acw02
  tx_pin: ${TX}
  rx_pin: ${RX}
  baud_rate: 9600
  stop_bits: 1
  rx_buffer_size: 1024

external_components:
  - source:
      type: git
      url: https://github.com/devildant/acw02_esphome
      ref: ${acw02_ref}

packages:
  acw02_entities: github://devildant/acw02_esphome/components/acw02/acw02_fr.yaml@${acw02_ref}

acw02:
  id: ac_ctrl
  uart_id: uart_acw02

  • ainsi qu’une version directement utilisable dans ESPHome Builder sur Home Assistant

Ressources

Tous les fichiers sont disponibles sur mon GitHub :

  • fichiers 3D

  • BOM

  • Gerber

  • etc.

voici mon github:

QRCODE generator

En complément, je fournis un générateur de QRCODE (le qrcode est générer a partir du yaml choisi), afin de l’imprimer et le placer sur le module en cas d’oublie des identifiants

Photo coté HA

Note :

Attention le module n’est pas compatible avec les AC qui utilise le module officiel 409945 (mais compatible avec les models qui utilise le module officiel 409729)

Les unites incompatiblr que j’ai trouvé qui utilise se module sont :

  • 409942
  • 409943
  • 409944

Je ne peux pas faire de compatibilité n’ayant ni l’un des climatiseurs ni ce module

après les deux modules semble partager l’hardware, donc si quelqu’un possède ses elements, et est motiver pour faire le reverse engineering uart je serais ravis d’intégrer ca dans la mesure du possible :slight_smile: avec citation bien sur dans la doc

12 « J'aime »

Salut,

Super projet :+1:

On essaie de faire pareil pour la passerelle du T.One d’Aldes. On arrive à le piloter via le modbus mais la passerelle officielle communique via UART USB CDC. Avec quoi as-tu sniffé les trames ?

Hello,

Pour analyser les trame j’ai utiliser un esp32 et des optocoupleur que jai connecter au module d’origine en tx/rx pour voir les trame qu’il recevait et envoyait.

Il est important d’avoir une masse commune, et les opto il inverse la logique, mais au moins on peut espionner sans perturber.

Mais c’etait de l’uart tx/rx toi la en usb ca va etre plus compliquer, il existe peut etre des module qui feront office de proxy

Par contre je ne vais pas pouvoir t’aiguillé plus je n’ai jamais fait ce genre de chose.

essai chatgpt ou autre tu trouvera peut etre des piste.

Rien que la espionner l’uart c’était la premiere fois que je faisais ca ^^

1 « J'aime »

Je viens de mettre a jour ma doc pour partager le PCB V1.1 avec zone sans cuivre sous l’antenne pour esp32 D1 mini WROOM 32. (aucun gains de wifi constaté ^^)
j’ai aussi partager le gerber, DOM et pick and place pour la réalisation du module (basé sur 2 SN74LVC2T45DCUR) pour remplacer le Channels Logic Level Converter Bi-Directional Shifter : CYT1076

2 « J'aime »

bon j’ai reçu les pcb :

  • xiao C3 => Fonctionnel
  • Lolin C3 => Fonctionnel
  • xiao C6 => pas encore reçu

gain de 12 a 15 dBm sur le wifi c’est pas négligeable (même sur le lolin C3 du a la distance entre les composant)

Edite 27/09/2025:

Nouvelle Version dispo (support ESPHOME 2025.9.1) :

J’ai ajouté le nouveau PCB et les fichiers 3D pour la nouvelle carte pour les ESP32 LOLIN C3, XIAO C3 et XIAO C6
J’ai également modifier les yaml principaux, donc comme la release précédente il faut re prendre le dernier yaml (attention aux 2 nouvelles substitutions ajouté TX et RX)

Perso, quand je dois lire des trames sur une UART, j’utilise un convertisseur TTL USB vers RS32. Il te permet de lire le signal sur un PC via son port USB. Sur le PC, j’utilise le logiciel Termit qui permet de visualiser les informations reçues sur une série RS232. Il te faudra alors trouver / renseigner dans Termit le port de la clé sur le PC et les paramètres de la liaison série (ex : 1200 bds, 7 bits data, 1 stop, parité « even »). A trouver dans la doc du fabriquant ou en essayant différentes valeurs autrement, en commençant par la vitesse de transmission.

1 « J'aime »

Nouvelle Version dispo :

Support:

1 « J'aime »

Ce sujet a été automatiquement fermé après 30 jours. Aucune réponse n’est permise dorénavant.