VMC Aldes EasyHOME PureAIR Premium -> Passerelle MQTT

Du coup tu peux mettre des trames et les valeurs du cloud aldes?

Regarde ce que j’ai entouré en jaune. L’intégration en créé bien 13.

Par contre, elle les associée mal à l’appareil donc il faut passer par là pour toutes les voir. D’où le 2 que tu as plus bas.

Par contre si tu regarde en rouge, l’intégration n’arrive pas à récupérer l’adresse mac et probablement aussi les autres sensors.

Est-ce que tu as le modèle Compact PREMIUM ou un autre ? Si c’est un autre, je vais modifier l’intégration pour qu’elle accepte ton modèle.

Oui oui j’ai édité mon commentaire avant suite à mon erreur lol :

Si c’est bien la Aldes EasyHome PureAir Compact Premium. C’est juste que je n’ai pas renseigné le numéro de série où autre au moment où je l’ai enregistré sur l’application, donc c’est peut-être le problèmes.

Mais j’ai bien les 13 entités regarde :

Exemple capteur salle de bain :

On voit clairement ici que la box n’a pas demandé à repasser en mode quotidien au lieu de 21 tu devrais avoir 43.

Trop bien. On va pouvoir trouver les valeurs dans les trames envoyées par la VMC :slight_smile:

Peux-tu m’envoyer une trame actuelle envoyée par la VMC et une capture des 3 temperatures et des 3 humidités stp ? Je pense que j’ai trouvé :slight_smile:

Et également l’adresse mac de ton aldes éventuellement en PM stp ?

Ici, pour la première fois, on envoie d’abord une commande de mode qui vaut 10 en hexa suivi d’une commande avec 21. Quelque soit la valeur du mode qu’on passe (10, 21, 43, 65 et 87) les bits 2 et 3 codent le mode (0 = holiday, 1 = daily, 2 = boost, 3 = guest, on n’a pas encore fait de trame pour le programming). Le bit 4 est toujours à 0 donc il fait peut-être aussi partie aussi du codage du mode. Par contre, que veulent dire les autres bits qui diffèrent entre la valeur 10 et le 21 ? Serait-ce le codage de la durée du mode holiday ?

PS :

Je m’interroge si c’est la VMC qui gère la durée pour repasser en mode normal ou si c’est la box…

Le mode AIR PROG ne change aucune trames, sinon je l’aurais posté :confused:

Oui je pense que ca doit être le codage de la durée du mode VACANCES car avant de le lancer, il faut définir une plage, peut-être un compteur ? je ne sais pas

Selon moi, c’est la box qui est maître et qui donne l’ordre à l’appareil à intervalle régulier (et encore plus en mode vacances d’où les trames coupées !)

Alors voilà un échantillon de trames + 3 temp + 3 hum :

# Date/Heure Trame Taille Module Type
29 10/01/2026 19:50:29.794 87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 62 32 66 2C 5D 29 64 03 17 08 90 01 4A 2D 28B VMC EasyHome RX
28 10/01/2026 19:50:29.790 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
27 10/01/2026 19:50:19.690 87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 61 32 66 2C 5D 29 64 03 17 05 90 01 4A 31 28B VMC EasyHome RX
26 10/01/2026 19:50:19.686 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
25 10/01/2026 19:50:09.586 87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 60 31 66 2C 5D 29 64 03 17 05 90 01 4A 33 28B VMC EasyHome RX
24 10/01/2026 19:50:09.583 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
23 10/01/2026 19:49:59.490 87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 5F 30 66 2C 5D 29 64 03 17 05 90 01 4A 35 28B VMC EasyHome RX
22 10/01/2026 19:49:59.486 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
21 10/01/2026 19:49:49.388 87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 5E 2F 66 2C 5C 29 64 03 17 02 90 01 4A 3B 28B VMC EasyHome RX
20 10/01/2026 19:49:49.384 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
19 10/01/2026 19:49:39.281 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
18 10/01/2026 19:49:28.175 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
17 10/01/2026 19:49:18.093 87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 5C 2D 65 2C 5C 29 64 03 17 01 90 01 4A 41 28B VMC EasyHome RX
16 10/01/2026 19:49:18.090 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
15 10/01/2026 19:49:08.995 87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 5C 2D 65 2C 5C 29 64 03 17 01 90 01 4A 41 28B VMC EasyHome RX
14 10/01/2026 19:49:08.992 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
13 10/01/2026 19:48:58.891 87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 5C 2C 65 2B 5C 29 64 03 17 01 90 01 4A 43 28B VMC EasyHome RX
12 10/01/2026 19:48:58.888 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
11 10/01/2026 19:48:48.792 87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 5B 2C 65 2B 5C 29 64 03 17 01 90 01 4A 44 28B VMC EasyHome RX
10 10/01/2026 19:48:48.788 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX






Ce que j’avais en tête semble se confirmer. Difficile de te dire avec certitude car on a des updates de la VMC toutes les 10 secondes alors que dans le cloud c’est mis à jour toutes les x minutes.

Si on regarde les dernières données reçues, on retrouve les températures en octets 15, 17 et 19 et les % d’humidité en 16, 18 et 19. Comme @yanoooou nous l’avait dit

Par contre, la méthode de conversion des données du T.Flow ne se confirme pas. Pour les % d’humidité, on a juste à convertir d’héxa en décimal et ca correspond.

Pour les températures, plus dur à dire. En utilisant la méthode dont je parlais (division par 10), on obtient des chiffres trop bas. Il faudrait ajouter une base entre 9 et 10 mais là encore, ca ne permet pas d’avoir une formule ax+b qui fonctionne pour les 3 températures que l’on retrouve dans HA

87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 5B 2C 65 2B 5C 29 64 03 17 01 90 01 4A 44
9,10 44 10,10 43 9,20 41

Pour les temperatures, si on ajoute environ 9.5 à 9.1, 10.1 et 9.2 on est pas loin de ce que l’on retrouve dans HA avec 18.2 19.2 et 18.3

1 « J'aime »

Je peux fournir davantage de trames + capteurs

Le polluant dominant à commuté, il reste le capteur de CO2, sensor.easyhome_pureair_compact_premium_n_a_air_quality_index qui doit, je pense donner la valeur en % du polluant dominant etc.

Mais oui, ça avance c’est cool :smiley:

Par contre, la méthode de calcul, je n’ai pas trop d’idées sur ce sujet. @yanoooou te sera beaucoup d’une plus grande aide que moi :confused:

Les octets suivant pourraient donner ceci d’après Claude :

ITEMS_MAPPING = {
    # Températures (formules de conversion différentes par capteur)
    "Temp_1": {"Index": 14, "Type": 1, "Publish": True},  # Formule: valeur / 4.55
    "Temp_2": {"Index": 16, "Type": 1, "Publish": True},  # Formule: valeur / 5.66
    "Temp_3": {"Index": 18, "Type": 1, "Publish": True},  # Formule: à déterminer (pas de données)
    
    # Humidités (conversion directe hexa → décimal)
    "Hygro_1": {"Index": 17, "Type": 0, "Publish": True},  # Valeur directe en %
    "Hygro_2": {"Index": 19, "Type": 0, "Publish": True},  # Valeur directe en %
    "Hygro_3": {"Index": 15, "Type": 0, "Publish": True},  # Valeur directe en %
    
    # CO2 (16-bit little-endian)
    "CO2": {"Index": 20, "Type": 2, "Publish": True},  # Octets 20-21 en ppm
    
    # Qualité de l'air
    "Indice_polluant": {"Index": 17, "Type": 0, "Publish": True},  # Identique à Hygro_1
    "Type_polluant": {"Index": 4, "Type": 0, "Publish": True},     # Code type (à vérifier)
    
    # Système
    "Puissance": {"Index": 23, "Type": 0, "Publish": True},  # Valeur directe en W
}

Vérifications avec vos données :

Trame 22:06:50

Octets: 5B 28 67 4E 5F 29 F0 02 17 F4
Index:  14 15 16 17 18 19 20 21 22 23
  • Temp_2 (16): 67 = 103 → 103/5.66 = 18.2°C :white_check_mark:
  • Hygro_3 (15): 28 = 40% :white_check_mark:
  • Hygro_2 (19): 29 = 41% ≈ 42% :white_check_mark:

Trame 22:11:03

Octets: 5C 28 67 55 60 29 F0 02 17 FF
Index:  14 15 16 17 18 19 20 21 22 23
  • Temp_1 (14): 5C = 92 → 92/4.55 = 20.2°C :white_check_mark:
  • Hygro_1 (17): 55 = 85% ≈ 85.91% :white_check_mark:
  • CO2 (20-21): F0 02 → 0x02F0 = 752 ppm :white_check_mark:
  • Puissance (23): FF = 255 W :white_check_mark:
  • Indice (17): 55 = 85 ≈ 84 :white_check_mark:

D’après ce message :

    Hygro_1 : 85,9145184053275% (22:10:57)
    Hygro_2 : 42% (22:05:57)
    Hygro_3 : 40% (22:05:57)
    Temp_1 : 20,2°C(22:10:57)
    Temp_2 : 18,2°C (22:05:57)
    Temp_3 : ?°C (pas de rafraichissement)
    CO2 : 752 ppm (22:10:57)
    Indice polluant : 84 (22:10:57)
    Type polluant : toujours humidité
    Puissance : 255 W (22:10:57)

Trame VMC la plus proche de 22:05:57 -> 22:06:50:145 : 87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 5B 28 67 4E 5F 29 F0 02 17 F4 90 01 4A A2
Trame VMC la plus proche de 22:10:57 -> 22:11:03:642 : 87 00 1B 4B 03 01 00 01 EE 02 65 00 00 00 5C 28 67 55 60 29 F0 02 17 FF EE 02 4A AE

Le problème c’est que tous les capteurs sous HA s’actualisent pas en même temps donc c’est le b*rdel lol

EDIT:

Après sniffage etc, bonne lecture :sweat_smile:

Voici un document récapitulatif prêt à partager sur le forum :


Décodage des trames VMC Aldes EasyHome PureAir Compact Premium

:white_check_mark: Mapping confirmé

Structure de la trame

87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 5D 29 6E 2D 61 27 97 02 17 05 90 01 4A 01
0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

Capteurs identifiés

Humidités (conversion directe hexa → décimal)

Capteur Index Conversion Exemple
Hygro_1 17 Valeur directe en % 2D = 45%
Hygro_2 19 Valeur directe en % 27 = 39%
Hygro_3 15 Valeur directe en % 29 = 41%

Températures (formules de division)

Capteur Index Formule Exemple
Temp_1 14 valeur / 4.55 5C (92) → 20.2°C
Temp_2 16 valeur / 5.66 67 (103) → 18.2°C
Temp_3 18 valeur / 5.48 61 (97) → 17.7°C

:warning: Note importante : Les trois capteurs de température utilisent des facteurs de division différents, ce qui est inhabituel. Cela pourrait indiquer une calibration individuelle par capteur.

CO2

Capteur Index Conversion Exemple
CO2 20-21 16-bit little-endian en ppm F0 0202F0 = 752 ppm

Puissance ventilateur

Capteur Index Conversion Exemple
Puissance 23 Valeur directe en W FF = 255 W

Capteurs non identifiés

Les capteurs suivants existent dans Home Assistant mais leur position dans la trame n’est pas encore identifiée :

  • Air Quality Index (AQI) - actuellement observé à 25
  • Humidity Variation - variation d’humidité en %, actuellement ~6-8%
  • Type de polluant dominant - ex: « humidité », « monoxyde », etc.
  • Indice du polluant - quand le polluant n’est pas l’humidité

Octets non mappés

Position Valeur observée Observations
4 03 Constant - Type de polluant ?
6 01 ou 00 Binaire - État système ?
22 17 Constant
24-25 90 01 ou EE 02 Varie - 16-bit ?
26 4A (74) Varie
27 Variable Probablement checksum

Difficultés rencontrées

  • :stopwatch: Mises à jour asynchrones : Les capteurs HA ne se rafraîchissent pas en même temps ni à fréquence régulière
  • :bar_chart: Décalage temporel : Difficile de corréler exactement une trame avec les valeurs HA
  • :1234: Formules variables : Les températures utilisent des facteurs de division différents par capteur

:laptop: Exemple de code Python pour décodage

def decode_vmc_frame(frame):
    """
    Décode une trame VMC Aldes EasyHome PureAir Compact Premium
    frame: bytes de 28 octets
    """
    if len(frame) != 28:
        return None
    
    data = {}
    
    # Humidités (conversion directe)
    data['hygro_1'] = frame[17]  # %
    data['hygro_2'] = frame[19]  # %
    data['hygro_3'] = frame[15]  # %
    
    # Températures (avec formules spécifiques)
    data['temp_1'] = frame[14] / 4.55  # °C
    data['temp_2'] = frame[16] / 5.66  # °C
    data['temp_3'] = frame[18] / 5.48  # °C
    
    # CO2 (16-bit little-endian)
    data['co2'] = (frame[21] << 8) | frame[20]  # ppm
    
    # Puissance
    data['power'] = frame[23]  # W
    
    return data

:memo: Exemple de trame décodée

Trame brute :

87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 5C 28 67 55 60 29 F0 02 17 FF EE 02 4A AE

Décodage :

  • Hygro_1 : 85% (octet 17 = 55)
  • Hygro_2 : 41% (octet 19 = 29)
  • Hygro_3 : 40% (octet 15 = 28)
  • Temp_1 : 20.2°C (octet 14 = 5C = 92 → 92/4.55)
  • Temp_2 : 18.5°C (octet 16 = 67 = 103 → 103/5.66)
  • Temp_3 : 18.0°C (octet 18 = 60 = 96 → 96/5.48)
  • CO2 : 752 ppm (octets 20-21 = F0 0202F0)
  • Puissance : 255 W (octet 23 = FF)

Je retrouve la même chose pour les valeurs d’hygrométrie, par contre je ne vois pas pour la température.

"Hygro_kitchen": {"Index": 15, "Type": 0, "Publish": True},

"Hygro_bath_1": {"Index": 17, "Type": 0, "Publish": True},

"Hygro_bath_2": {"Index": 19, "Type": 0, "Publish": True}

@Quentin57520: Tu pourrais utiliser le soft du T.Flow et l’adapter pour enregistrer toutes les valeurs en MQTT.

Ça devrait être plus facile pour identifier les paramètres et les calculs.

@yanoooou il est sur le topic de T.Flow ?

EDIT: Ce projet de ton github ?

Oui, la partie du raspberry pico W : https://github.com/YannDoublet/Open-connect-box/tree/main/Software/Raspberry%20Pico%20W/uAldes

J’ai modifié ce qu’il faut mais les trames ne tombent pas forcément au même moment que l’actualisation des capteurs avec le dépôt de @Frederic_Duloum (les capteurs ne s’actualisent pas tous en même temps) donc ça fausse le tout, j’ai du mal très sincérement, après j’en suis ici :

ITEMS_MAPPING = {
    # Système
    "Soft": {"Index": 4, "Type": 0, "Publish": True},
    "Etat": {"Index": 6, "Type": 0, "Publish": True},
    
    # Humidités (conversion directe hexa → décimal)
    "Hygro_1": {"Index": 17, "Type": 0, "Publish": True},
    "Hygro_2": {"Index": 19, "Type": 0, "Publish": True},
    "Hygro_3": {"Index": 15, "Type": 0, "Publish": True},
    
    # Températures (diviseurs spécifiques par capteur)
    "Temp_1": {"Index": 14, "Type": 10, "Diviseur": 4.55, "Publish": True},
    "Temp_2": {"Index": 16, "Type": 10, "Diviseur": 5.66, "Publish": True},
    "Temp_3": {"Index": 18, "Type": 10, "Diviseur": 5.48, "Publish": True},
    
    # CO2 (16-bit little-endian)
    "CO2": {"Index": 20, "Type": 11, "Publish": True},
    
    # Puissance et Humidity Variation (même octet - valeurs liées)
    "Puissance": {"Index": 23, "Type": 0, "Publish": True},
    "Humidity_Variation": {"Index": 23, "Type": 0, "Publish": True},
}

Formules de décodage

  • Type 0 : Valeur directe
  • Type 10 : valeur / diviseur
  • Type 11 : 16-bit little-endian (octet[index+1] << 8) | octet[index]

Exemple de trame décodée

Trame: 87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 5D 27 6B 3F 61 26 13 03 17 8B EE 02 4A 14

Résultat:
- Hygro_1: 63%  | Hygro_2: 38%  | Hygro_3: 39%
- Temp_1: 20.4°C | Temp_2: 19.0°C | Temp_3: 17.7°C
- CO2: 787 ppm
- Puissance: 139 W | Humidity_Variation: 139%

D’après ChatGPT, car j’ai du mal.

EDIT: @Frederic_Duloum peut-être que si tu arrives à faire fonctionner le dépôt Aldes2MQTT, je pourrais avoir des remontées plus régulières pour pouvoir décoder les trames ?

Salut, rien à voir, mais en attendant vos retours, j’ai déjà fais une carte pour la VMC, qui s’inscrit dans le style mushroom que j’ai déjà et je vous la partage :

Si VMC connecté = icône principale verte/ déconnectée = rouge
On y retrouve les différents capteurs en secondary
des pop-up card pour les différentes pièces
Les 5 modes avec des icônes proches de celle de l’application et leur couleur respective

Code :

type: custom:vertical-stack-in-card
cards:
  - type: custom:mushroom-template-card
    entity: fan.central_ventilation
    icon: mdi:hvac
    primary: VMC Aldes PureAir
    secondary: >-
      {{ states('sensor.easyhome_pureair_compact_premium_n_a_current_mode') }} W
      • {{ states('sensor.easyhome_pureair_compact_premium_n_a_carbon_dioxyde')
      }} ppm •  AQI {{
      states('sensor.easyhome_pureair_compact_premium_n_a_air_quality_index') }}
      •  {{
      states('sensor.easyhome_pureair_compact_premium_n_a_polluant_dominant') }}
    tap_action:
      action: more-info
    hold_action:
      action: toggle
    color: |
      {% if is_state('binary_sensor.aldes_n_a_connectivity', 'on') %}
        green
      {% else %}
        red
      {% endif %}
    features_position: bottom
  - type: custom:mushroom-chips-card
    chips:
      - type: template
        entity: sensor.easyhome_pureair_compact_premium_n_a_kitchen_temperature
        icon: mdi:chef-hat
        icon_color: yellow
        tap_action:
          action: fire-dom-event
          browser_mod:
            service: browser_mod.popup
            data:
              title: Cuisine
              content:
                type: custom:stack-in-card
                mode: horizontal
                cards:
                  - type: custom:mushroom-template-card
                    entity: >-
                      sensor.easyhome_pureair_compact_premium_n_a_kitchen_temperature
                    icon: mdi:thermometer
                    icon_color: orange
                    primary: Température
                    secondary: "{{ states(entity) }}°C"
                    layout: vertical
                    card_mod:
                      style: |
                        ha-card {
                          border: none !important;
                          background: none !important;
                          box-shadow: none !important;
                        }
                  - type: custom:mushroom-template-card
                    entity: >-
                      sensor.easyhome_pureair_compact_premium_n_a_kitchen_humidity
                    icon: mdi:water-percent
                    icon_color: blue
                    primary: Humidité
                    secondary: "{{ states(entity) }}%"
                    layout: vertical
                    card_mod:
                      style: |
                        ha-card {
                          border: none !important;
                          background: none !important;
                          box-shadow: none !important;
                        }
      - type: template
        entity: sensor.easyhome_pureair_compact_premium_n_a_bathroom_1_temperature
        icon: mdi:shower
        icon_color: >
          {% set hum =
          states('sensor.easyhome_pureair_compact_premium_n_a_bathroom_1_humidity')
          | int(0) %}

          {% if hum > 70 %}
            red
          {% elif hum > 60 %}
            orange
          {% else %}
            #03A9F4
          {% endif %}
        tap_action:
          action: fire-dom-event
          browser_mod:
            service: browser_mod.popup
            data:
              title: Salle de bain
              content:
                type: custom:stack-in-card
                mode: horizontal
                cards:
                  - type: custom:mushroom-template-card
                    entity: >-
                      sensor.easyhome_pureair_compact_premium_n_a_bathroom_1_temperature
                    icon: mdi:thermometer
                    icon_color: orange
                    primary: Température
                    secondary: "{{ states(entity) }}°C"
                    layout: vertical
                    card_mod:
                      style: |
                        ha-card {
                          border: none !important;
                          background: none !important;
                          box-shadow: none !important;
                        }
                  - type: custom:mushroom-template-card
                    entity: >-
                      sensor.easyhome_pureair_compact_premium_n_a_bathroom_1_humidity
                    icon: mdi:water-percent
                    icon_color: blue
                    primary: Humidité
                    secondary: "{{ states(entity) }}%"
                    layout: vertical
                    card_mod:
                      style: |
                        ha-card {
                          border: none !important;
                          background: none !important;
                          box-shadow: none !important;
                        }
      - type: template
        entity: sensor.easyhome_pureair_compact_premium_n_a_bathroom_2_temperature
        icon: mdi:toilet
        icon_color: >
          {% set hum =
          states('sensor.easyhome_pureair_compact_premium_n_a_bathroom_2_humidity')
          | int(0) %}

          {% if hum > 70 %}
            red
          {% elif hum > 60 %}
            orange
          {% else %}
            #03A9F4
          {% endif %}
        tap_action:
          action: fire-dom-event
          browser_mod:
            service: browser_mod.popup
            data:
              title: WC
              content:
                type: custom:stack-in-card
                mode: horizontal
                cards:
                  - type: custom:mushroom-template-card
                    entity: >-
                      sensor.easyhome_pureair_compact_premium_n_a_bathroom_2_temperature
                    icon: mdi:thermometer
                    icon_color: orange
                    primary: Température
                    secondary: "{{ states(entity) }}°C"
                    layout: vertical
                    card_mod:
                      style: |
                        ha-card {
                          border: none !important;
                          background: none !important;
                          box-shadow: none !important;
                        }
                  - type: custom:mushroom-template-card
                    entity: >-
                      sensor.easyhome_pureair_compact_premium_n_a_bathroom_2_humidity
                    icon: mdi:water-percent
                    icon_color: blue
                    primary: Humidité
                    secondary: "{{ states(entity) }}%"
                    layout: vertical
                    card_mod:
                      style: |
                        ha-card {
                          border: none !important;
                          background: none !important;
                          box-shadow: none !important;
                        }
      - type: template
        entity: sensor.easyhome_pureair_compact_premium_n_a_humidity_variation
        icon: mdi:chart-line-variant
        icon_color: |
          {% set var = states(entity) | float(0) %}
          {% if var > 5 %}
            red
          {% elif var > 2 %}
            orange
          {% else %}
            green
          {% endif %}
        tap_action:
          action: fire-dom-event
          browser_mod:
            service: browser_mod.popup
            data:
              title: Graphiques VMC
              content:
                type: vertical-stack
                cards:
                  - type: custom:mini-graph-card
                    entities:
                      - entity: >-
                          sensor.easyhome_pureair_compact_premium_n_a_humidity_variation
                        name: Variation humidité
                        color: "#03A9F4"
                    hours_to_show: 24
                    line_width: 2
                    animate: true
                    show:
                      legend: true
                      fill: fade
                  - type: custom:mini-graph-card
                    entities:
                      - entity: >-
                          sensor.easyhome_pureair_compact_premium_n_a_carbon_dioxyde
                        name: CO2
                        color: orange
                    hours_to_show: 24
                    line_width: 2
                    animate: true
                    show:
                      legend: true
                      fill: fade
    alignment: end
    card_mod:
      style: |
        ha-card {
          --chip-height: 34px;
          --chip-icon-size: 17px;
          padding-top: 4px;
          margin-top: -8px;
          padding-bottom: 9px;
          padding-left: 4px;
          padding-right: 4px;
        }
        .chip-container {
          gap: 4px !important;
        }
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-template-card
        icon: mdi:beach
        icon_color: >-
          {% if
          is_state('select.aldes_easyhome_pureair_compact_premium_n_a_mode','Holidays')
          %}
            blue
          {% else %}
            grey
          {% endif %}
        tap_action:
          action: call-service
          service: select.select_option
          service_data:
            entity_id: select.aldes_easyhome_pureair_compact_premium_n_a_mode
            option: Holidays
        card_mod:
          style: |
            ha-card { 
              border: none !important; 
              background: none !important;
              box-shadow: none !important; 
              padding: 4px;
              display: flex;
              justify-content: center;
              align-items: center;
            }
      - type: custom:mushroom-template-card
        icon: mdi:account-group
        icon_color: >-
          {% if
          is_state('select.aldes_easyhome_pureair_compact_premium_n_a_mode','Guest')
          %}
            purple
          {% else %}
            grey
          {% endif %}
        tap_action:
          action: call-service
          service: select.select_option
          service_data:
            entity_id: select.aldes_easyhome_pureair_compact_premium_n_a_mode
            option: Guest
        card_mod:
          style: |
            ha-card { 
              border: none !important; 
              background: none !important;
              box-shadow: none !important; 
              padding: 4px;
              display: flex;
              justify-content: center;
              align-items: center;
            }
      - type: custom:mushroom-template-card
        icon: mdi:sofa
        icon_color: >-
          {% if
          is_state('select.aldes_easyhome_pureair_compact_premium_n_a_mode','Daily')
          %}
            green
          {% else %}
            grey
          {% endif %}
        tap_action:
          action: call-service
          service: select.select_option
          service_data:
            entity_id: select.aldes_easyhome_pureair_compact_premium_n_a_mode
            option: Daily
        card_mod:
          style: |
            ha-card { 
              border: none !important; 
              background: none !important;
              box-shadow: none !important; 
              padding: 4px;
              display: flex;
              justify-content: center;
              align-items: center;
            }
      - type: custom:mushroom-template-card
        icon: mdi:clock-outline
        icon_color: >-
          {% if
          is_state('select.aldes_easyhome_pureair_compact_premium_n_a_mode','Air
          Prog') %}
            yellow
          {% else %}
            grey
          {% endif %}
        tap_action:
          action: call-service
          service: select.select_option
          service_data:
            entity_id: select.aldes_easyhome_pureair_compact_premium_n_a_mode
            option: Air Prog
        card_mod:
          style: |
            ha-card { 
              border: none !important; 
              background: none !important;
              box-shadow: none !important; 
              padding: 4px;
              display: flex;
              justify-content: center;
              align-items: center;
            }
      - type: custom:mushroom-template-card
        icon: mdi:fire
        icon_color: >-
          {% if
          is_state('select.aldes_easyhome_pureair_compact_premium_n_a_mode','Boost')
          %}
            red
          {% else %}
            grey
          {% endif %}
        tap_action:
          action: call-service
          service: select.select_option
          service_data:
            entity_id: select.aldes_easyhome_pureair_compact_premium_n_a_mode
            option: Boost
        card_mod:
          style: |
            ha-card { 
              border: none !important; 
              background: none !important;
              box-shadow: none !important; 
              padding: 4px;
              display: flex;
              justify-content: center;
              align-items: center;
            }

J’ai peux-être une piste pour les températures:

def decode_temperature_bcd(value):
    """
    Decodes a temperature value encoded with BCD (Binary Coded Decimal) 
    and 0.25°C precision using the 2 least significant bits.
    
    The temperature is encoded as follows:
    - The 2 least significant bits (bits 0-1) represent the decimal part: 
      0b00 = 0.00°C, 0b01 = 0.25°C, 0b10 = 0.50°C, 0b11 = 0.75°C
    - The remaining bits (bits 2-7) are shifted right by 2 and decoded as BCD
      for the integer part of the temperature.
    
    Parameters:
        value (int): The encoded temperature byte (0x00 to 0xFF).
    
    Returns:
        float: The decoded temperature in degrees Celsius.
    
    Example:
        >>> decode_temperature_bcd(0x62)  # Binary: 0110 0010
        18.5
        # Bits 0-1: 0b10 = 2 -> 2 x 0.25 = 0.5°C
        # Bits 2-7: 0x62 >> 2 = 0x18 -> BCD 18 = 18°C
        # Result: 18 + 0.5 = 18.5°C
    """
    
    # Extract the 2 least significant bits for decimal part
    decimal_bits = value & 0b11
    decimal_part = decimal_bits * 0.25
    
    # Shift right by 2 bits to get the BCD encoded integer part
    bcd_value = value >> 2
    
    # Decode BCD: extract tens and units
    tens = (bcd_value >> 4) & 0x0F
    units = bcd_value & 0x0F
    integer_part = tens * 10 + units
    
    # Combine integer and decimal parts
    temperature = integer_part + decimal_part
    
    return temperature
1 « J'aime »

Salut,

Ah très bonne nouvelle ! donc chaque température serait codé sur deux bits ?

Tu as pu télécharger le pack Wetransfer que je t’ai envoyé en mp ? :slight_smile:

Non que sur sur un byte.

  • les deux bits de poids faible correspondent à la valeur après la virgule (valeur x 0.25)
  • les 6 bits de poids fort correspondent à la valeur entière en (codage BCD)

Non, je n’ai pas eu de lien Wetransfer…

Essayons avec un échantillon de trames :

# Date/Heure Trame Taille Module Type
13557 12/01/2026 19:17:24.212 87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 5D 2D 5C 28 5C 28 1F 03 17 04 90 01 4A 90 28B VMC EasyHome RX
13556 12/01/2026 19:17:24.209 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
13555 12/01/2026 19:17:14.118 87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 5D 2D 5C 28 5C 28 1F 03 17 04 90 01 4A 90 28B VMC EasyHome RX
13554 12/01/2026 19:17:14.115 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
13553 12/01/2026 19:17:04.021 87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 5D 2D 5C 28 5C 28 1F 03 17 04 90 01 4A 90 28B VMC EasyHome RX
13552 12/01/2026 19:17:04.018 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
13551 12/01/2026 19:16:54.915 87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 5D 2D 5C 28 5C 28 1F 03 17 04 90 01 4A 90 28B VMC EasyHome RX
13550 12/01/2026 19:16:54.912 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
13549 12/01/2026 19:16:44.808 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
13548 12/01/2026 19:16:34.713 87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 5D 2C 5C 28 5C 28 1F 03 17 03 90 01 4A 92 28B VMC EasyHome RX
13547 12/01/2026 19:16:34.710 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
13546 12/01/2026 19:16:24.610 87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 5D 2C 5C 28 5C 28 1F 03 17 03 90 01 4A 92 28B VMC EasyHome RX
13545 12/01/2026 19:16:24.607 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
13544 12/01/2026 19:16:14.505 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
13543 12/01/2026 19:16:04.401 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
13542 12/01/2026 19:15:54.304 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
13541 12/01/2026 19:15:43.209 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
13540 12/01/2026 19:15:33.103 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
13539 12/01/2026 19:15:23.006 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX
13538 12/01/2026 19:15:13.906 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18B AldesBox RX

Prenons la dernière : 87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 5D 2D 5C 28 5C 28 1F 03 17 04 90 01 4A 90

Ah mince, les sensors sous HA se sont actualisés pour la dernière fois il y a 14 minutes, je n’ai pas pris les trames de ce moment.

Je viendrais poster trames + sensors si j’arrive à les voir s’actualiser plus au moins en même temps pour vérifier ta théorie !

Trame avec actualisation :

# Date/Heure Trame Taille Module Type
13633 12/01/2026 19:25:29.030 87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 5D 2E 5B 27 5C 27 BE 02 17 05 90 01 4A F3 28 VMC EasyHome RX
13634 12/01/2026 19:25:39.125 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18 AldesBox RX
13635 12/01/2026 19:25:39.129 87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 5D 2E 5B 27 5C 27 BE 02 17 08 90 01 4A F0 28 VMC EasyHome RX
13636 12/01/2026 19:25:49.218 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18 AldesBox RX
13637 12/01/2026 19:25:49.222 87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 5D 2E 5B 27 5C 27 BE 02 17 08 90 01 4A F0 28 VMC EasyHome RX
13638 12/01/2026 19:26:00.321 FD 87 11 4B 02 02 00 00 43 FF 00 00 FF FF FF FF 4A 94 18 AldesBox RX
13639 12/01/2026 19:26:00.324 87 00 1B 4B 03 01 00 01 90 01 43 00 00 00 5C 2E 5B 27 5C 27 BE 02 17 08 90 01 4A F1 28 VMC EasyHome RX

température 1 : 17,2°C à 19:25:07

sur la trame de 19:25:29.030:

0x5D me donne 17.25°C avec mon calcul.

1 « J'aime »