Salut à tous 
Je voulais partager mon retour d’expérience, parce que j’ai littéralement passé une journée entière à galérer pour comprendre comment piloter ma PAC gainable HEIWA avec module zoning depuis Home Assistant, sans dépendre du cloud ni des modules Wi-Fi propriétaires.
Contexte
-
Modèle : HEIWA PRO gainable, avec plénums motorisés (zoning)
-
Tablette murale “Ernest” (propriétaire, app mobile HEIWA / Gree-like)
-
Objectif : tout piloter localement via RS485 / Modbus, sans passer par leur API fermée
-
Environnement : Home Assistant 2025.10, sur Home Assistant Green
-
Interface : clé USB RS485 à ~15 € (type FTDI FT232R)
Tentatives et galères
J’ai d’abord essayé de sniffer les API cloud de la tablette Ernest (via mitmproxy, Wireshark et capture de paquets).
Mauvaise nouvelle : tout est chiffré (TLS + signature interne) et les commandes sont encapsulées dans un protocole propriétaire non documenté.
Impossible à rejouer ni à détourner proprement sans reverse complet du firmware Android.
Donc, j’ai bifurqué vers le bus Modbus RTU présent à la fois sur :
Et là… victoire 
Après pas mal de sniff et de tests, j’ai pu cartographier les registres Modbus et construire une intégration 100 % locale.
Ce que je pilote aujourd’hui
PAC principale
-
ON / OFF
-
Température de consigne
-
Modes : off, fan, cool, heat, dry, auto
Zoning (AirZone / Plénums)
- 4 plénums indépendants avec position en % (0 à 100)
Tout fonctionne en temps réel depuis Home Assistant, sans passer par le cloud.
Matériel & branchement
-
Clé RS485 branchée sur /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_*
-
Fils du bus : A+ / B- directement sur le bornier du module zoning
-
Protocole : Modbus RTU, 9600 bauds, 8N1
-
Les plénums répondent sur slave: 201, la PAC sur slave: 1
Configuration complète (YAML à coller dans
/config/packages/heiwa.yaml
)
modbus:
- name: heiwa_bus
type: serial
method: rtu
port: /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_B001GGXG-if00-port0
baudrate: 9600
stopbits: 1
bytesize: 8
parity: N
timeout: 2
sensors:
- name: Heiwa PAC Flag
slave: 1
address: 2
input_type: holding
scan_interval: 5
input_boolean:
heiwa_pac_power:
name: Heiwa PAC Marche/Arrêt
icon: mdi:power
input_number:
heiwa_pac_setpoint:
name: Heiwa PAC Consigne (°C)
min: 16
max: 30
step: 1
mode: slider
icon: mdi:thermometer
heiwa_plenum_bureau:
name: Plénum Bureau (%)
min: 0
max: 100
step: 5
icon: mdi:valve
heiwa_plenum_chambre:
name: Plénum Chambre (%)
min: 0
max: 100
step: 5
icon: mdi:valve
heiwa_plenum_sejour:
name: Plénum Séjour (%)
min: 0
max: 100
step: 5
icon: mdi:valve
heiwa_plenum_sejour2:
name: Plénum Séjour 2 (%)
min: 0
max: 100
step: 5
icon: mdi:valve
input_select:
heiwa_pac_mode:
name: Mode de la PAC
options:
- off
- fan
- cool
- heat
- dry
- auto
icon: mdi:alpha-m-box
automation:
# Marche / arrêt
- alias: Heiwa PAC - Power
trigger:
- platform: state
entity_id: input_boolean.heiwa_pac_power
action:
- variables:
reg_value: "{{ 170 if is_state('input_boolean.heiwa_pac_power','on') else 85 }}"
- service: modbus.write_register
data:
hub: heiwa_bus
slave: 1
address: 2
value: [ "{{ reg_value|int }}" ]
# Consigne température
- alias: Heiwa PAC - Setpoint
trigger:
- platform: state
entity_id: input_number.heiwa_pac_setpoint
action:
- variables:
tset: "{{ states('input_number.heiwa_pac_setpoint')|int }}"
- service: modbus.write_register
data:
hub: heiwa_bus
slave: 1
address: 20
value: [ "{{ tset }}" ]
- delay: "00:00:00.5"
- service: modbus.write_register
data:
hub: heiwa_bus
slave: 1
address: 20
value: [ "{{ tset }}" ]
# Mode (off, fan, cool, heat, dry, auto)
- alias: Heiwa PAC - Mode
trigger:
- platform: state
entity_id: input_select.heiwa_pac_mode
action:
- variables:
mode: "{{ states('input_select.heiwa_pac_mode') }}"
mode_code: >
{% if mode == 'cool' %}1{% elif mode == 'heat' %}2
{% elif mode == 'dry' %}3{% elif mode == 'fan' %}4
{% elif mode == 'auto' %}5{% else %}0{% endif %}
- choose:
- conditions: "{{ mode == 'off' }}"
sequence:
- service: modbus.write_register
data:
hub: heiwa_bus
slave: 1
address: 2
value: [85]
- conditions: "{{ mode in ['cool','heat','dry','auto','fan'] }}"
sequence:
- service: modbus.write_register
data:
hub: heiwa_bus
slave: 1
address: 2
value: [170]
- delay: "00:00:00.3"
- service: modbus.write_register
data:
hub: heiwa_bus
slave: 1
address: 17
value: [ "{{ mode_code|int }}" ]
# Plénums
- alias: Plénum Bureau
trigger:
- platform: state
entity_id: input_number.heiwa_plenum_bureau
action:
- service: modbus.write_register
data:
hub: heiwa_bus
slave: 201
address: 101
value: [ "{{ states('input_number.heiwa_plenum_bureau')|int }}" ]
- alias: Plénum Chambre
trigger:
- platform: state
entity_id: input_number.heiwa_plenum_chambre
action:
- service: modbus.write_register
data:
hub: heiwa_bus
slave: 201
address: 201
value: [ "{{ states('input_number.heiwa_plenum_chambre')|int }}" ]
- alias: Plénum Séjour
trigger:
- platform: state
entity_id: input_number.heiwa_plenum_sejour
action:
- service: modbus.write_register
data:
hub: heiwa_bus
slave: 201
address: 301
value: [ "{{ states('input_number.heiwa_plenum_sejour')|int }}" ]
- alias: Plénum Séjour 2
trigger:
- platform: state
entity_id: input_number.heiwa_plenum_sejour2
action:
- service: modbus.write_register
data:
hub: heiwa_bus
slave: 201
address: 401
value: [ "{{ states('input_number.heiwa_plenum_sejour2')|int }}" ]
Structure Modbus découverte
Élément
Slave
Registre
Description
Valeurs
Power
1
2
ON/OFF
85=OFF / 170=ON
Mode
1
17
Mode PAC
1=cool, 2=heat, 3=dry, 4=fan, 5=auto
Fan speed
1
19
Vitesse ventilo
1..5 ou 3=auto
Setpoint
1
20
Consigne °C
16–30
Plénum Bureau
201
101
% d’ouverture
0–100
Plénum Chambre
201
201
% d’ouverture
0–100
Plénum Séjour
201
301
% d’ouverture
0–100
Plénum Séjour 2
201
401
% d’ouverture
0–100
Ce que j’envisage ensuite
Créer une intégration HACS “Heiwa Local” pour simplifier tout ça
Ajouter un climate template HA pour unifier la consigne et le mode dans un thermostat
Publier la doc complète sur GitHub avec schéma de câblage
Si vous galérez avec une config similaire (PAC gainable HEIWA avec zoning / tablette Ernest), je peux partager le YAML complet et les adresses fonctionnelles.
Et si quelqu’un veut m’aider à en faire un vrai HACS, je suis chaud 
bon courage.
Nico