[Concours] VMC double flux au doigt et à l'oeil

Bonjour
j’ai depuis 15 ans une VMC double flux duolixMAX, pilotée via une télécommande qui remonte pas mal d’info


mais pas très paramétrable ni domotisable : réduire les ventilateurs quand il n’y a personne, augmenter le débit quand l’humidité monte dans la SDB pour ainsi optimiser la conso. La bébête consommait 50w 24h/24h ! Très utile quand on a tempo en jour rouge ou il faut optimiser sa conso.
j’ai donc démonté la carte interne, regarder la ref des ventilateurs :des embpapast, qui se pilotent par PWM ! bingo c’est pilotable via un ESP.
j’utilise donc une alim 230V/10V qui alimente une carte ESP32 4 relay :

  • les relais me permettent de piloter le bypass et le grand début cuisine
  • 2 sorties pwm pour piloter les ventilateurs (je peux ainsi piloter différemment l’aspiration ou le soufflage de manière à être bien à l’équilibre dans la maison). Il faut utiliser 2 transistors pour convertir le pwm qui sort de l’esp en 3v en pwm 10v. Ce convertisseur se trouve facilement sur Amazon ou alim pour qq euros. C’est souvent utilisé pour convertir le 3.3v en 5v.
  • 2 entrées pour récupérer leur vitesse reel (RPM / rotation par minute)
  • 4 sondes Dallas pour les températures des entrées/sorties d’air de la VMC
  • 3 entrée analogique pour mesurer la tension d’alim + relire les tensions pwm.
    Le tout monte dans un boîtier plastique a l’extérieur de la Vmc pour pouvoir intervenir facilement. Déjà 6 mois que ça tourne sans soucis.

Quelques automatisation pour déclencher un boost Sdb quand l’humidité est élevé, et me prévenir quand les filtres sont salles ( la conso augmente que c’est salle): ca m’a servie hier soir, il y avait un bouchon dans mes gaines → légère surconso détectée par une automatisation

input_number.yaml :

Résumé
######################
## VMC
#####################
#VMC debit ventilateur
vmc_debit_ventilateur:
  name: VMC Debit ventilateur
  min: 50
  max: 250
  step: 10
  #initial: 80
  mode: box
#VMC debit ventilateur extraction en +
vmc_extraction_en_plus:
  name: VMC extraction en plus
  min: -70
  max: 150
  step: 10
# BOOST surventilation en mode bypass
vmc_debit_sup_surventilation_bypass:
  name: VMC Debit Sup surventilation Bypass
  min: 0
  max: 50
  step: 10
# BOOST surventilation SDB et cuisine
vmc_debit_sup_turbo:
  name: VMC Debit Sup Turbo
  min: 0
  max: 50
  step: 10
vmc_duree_turbo:
  name: VMC Durée Turbo
  min: 0
  max: 120
  step: 10
  initial: 60
vmc_duree_turbo_cuisine:
  name: VMC Durée Turbo cuisine
  min: 0
  max: 120
  step: 10
  initial: 30

Sensor.yaml

Résumé
## rendemement VMC
##ηt = (T°C Air insufflé – T°C Air Neuf) / (T°C Air Extrait – T°C Air Neuf)
- platform: template
  sensors:
    rendement_vmc:
      value_template: > 
        {% if (states.sensor.esp32_vmc_vmc_temp_air_extrait.state|float(0) - states.sensor.esp32_vmc_vmc_air_neuf_ext.state|float(0)) | float(0) > 0 %} 
        {{((states.sensor.esp32_vmc_vmc_temp_air_insufle.state|float(0) - states.sensor.esp32_vmc_vmc_air_neuf_ext.state|float(0)) / (states.sensor.esp32_vmc_vmc_temp_air_extrait.state|float(0) - states.sensor.esp32_vmc_vmc_air_neuf_ext.state|float(0)) * 100) |round(2) }}
        {% else %}
        {{100}} 
        {% endif %}
      unit_of_measurement: '%'

switchs.yaml:

Résumé
###################
# VMC
###################
    vmc_turbo:
      friendly_name: VMC Turbo
      unique_id: vmc_turbo
      turn_on:
        - action: input_number.set_value
          target:
            entity_id: input_number.vmc_debit_ventilateur
          data:
            value: >-
              {{ (states('input_number.vmc_debit_ventilateur'))|int(0) + (states ('input_number.vmc_debit_sup_turbo'))|int(0) }}
      turn_off:
        - action: input_number.set_value
          target:
            entity_id: input_number.vmc_debit_ventilateur
          data:
            value: >-
              {{ (states('input_number.vmc_debit_ventilateur'))|int(0) - (states ('input_number.vmc_debit_sup_turbo'))|int(0) }}

    vmc_bypass:
      friendly_name: VMC BYPASS
      unique_id: vmc_bypass
      turn_on:
        - action: input_number.set_value
          target:
            entity_id: input_number.vmc_debit_ventilateur
          data:
            value: >-
              {{ (states('input_number.vmc_debit_ventilateur'))|int(0) + (states ('input_number.vmc_debit_sup_surventilation_bypass'))|int(0) }}
        - action: switch.turn_on
          target:
            entity_id: switch.esp32_vmc_bypass
      turn_off:
        - action: input_number.set_value
          target:
            entity_id: input_number.vmc_debit_ventilateur
          data:
            value: >-
              {{ (states('input_number.vmc_debit_ventilateur'))|int(0) - (states ('input_number.vmc_debit_sup_surventilation_bypass'))|int(0) }}
        - action: switch.turn_off
          target:
            entity_id: switch.esp32_vmc_bypass

Automations.yaml:

Résumé
- id: '1731158018178'
  alias: VMC boost SdB
  description: ''
  triggers:
  - entity_id:
    - switch.vmc_turbo
    to: 'on'
    trigger: state
  - entity_id:
    - sensor.salle_de_bain_humidity
    above: 70
    trigger: numeric_state
  - entity_id:
    - sensor.salle_de_bain_humidity
    above: 75
    trigger: numeric_state
  - entity_id:
    - sensor.salle_de_bain_humidity
    above: 80
    trigger: numeric_state
  - entity_id:
    - sensor.salle_de_bain_humidity
    above: 85
    trigger: numeric_state
  conditions: []
  actions:
  - if:
    - condition: state
      entity_id: switch.vmc_turbo
      state: 'off'
    then:
    - action: switch.turn_on
      metadata: {}
      data: {}
      target:
        entity_id: switch.vmc_turbo
  - delay:
      minutes: '{{states("input_number.vmc_duree_turbo")}}'
  - if:
    - condition: state
      entity_id: switch.vmc_turbo
      state: 'on'
    then:
    - action: switch.turn_off
      metadata: {}
      data: {}
      target:
        entity_id: switch.vmc_turbo
  mode: single
- id: '1731316033460'
  alias: Filtre bouche VMC
  description: ''
  triggers:
  - trigger: numeric_state
    entity_id:
    - sensor.vmc_power
    for:
      hours: 0
      minutes: 10
      seconds: 0
    above: 40
  conditions:
  - condition: state
    entity_id: switch.vmc_turbo
    state: 'off'
  actions:
  - action: input_boolean.turn_on
    metadata: {}
    data: {}
    target:
      entity_id: input_boolean.filtre_bouche_vmc

- id: '1725189267288'
  alias: VMC turbo
  description: ''
  trigger:
  - platform: state
    entity_id:
    - switch.vmc_turbo
    to: 'on'
  - platform: template
    value_template: '{{ states(''sensor.salle_de_bain_humidity'')|float(0)  > 70 }}'
    for:
      hours: 0
      minutes: 0
      seconds: 10
  - platform: numeric_state
    entity_id:
    - sensor.salle_de_bain_humidity
    above: 70
  - platform: numeric_state
    entity_id:
    - sensor.salle_de_bain_humidity
    above: 75
  - platform: numeric_state
    entity_id:
    - sensor.salle_de_bain_humidity
    above: 80
  - platform: numeric_state
    entity_id:
    - sensor.salle_de_bain_humidity
    above: 85
  condition: []
  action:
  - if:
    - condition: state
      entity_id: switch.vmc_turbo
      state: 'off'
    then:
    - action: switch.turn_on
      metadata: {}
      data: {}
      target:
        entity_id: switch.vmc_turbo
  - delay:
      minutes: '{{states("input_number.vmc_duree_turbo")}}'
  - data: {}
    target:
      entity_id: switch.vmc_turbo
    action: switch.turn_off
  mode: single
- id: '1725193283439'
  alias: VMC cuisine
  description: ''
  trigger:
  - platform: state
    entity_id:
    - switch.esp32_vmc_turbo_cuisine
    to: 'on'
  condition: []
  action:
  - delay:
      minutes: '{{states("input_number.vmc_duree_turbo_cuisine")}}'
  - data: {}
    action: switch.turn_off
    target:
      entity_id: switch.esp32_vmc_turbo_cuisine
  mode: single
- id: '1724341953261'
  alias: VMC BYPASS marche
  description: ''
  trigger:
  - platform: numeric_state
    entity_id:
    - sensor.delta_temperature_exterieur_moins_interieur
    below: -2
    for:
      hours: 0
      minutes: 0
      seconds: 20
  condition:
  - condition: state
    entity_id: switch.vmc_bypass
    state: 'off'
  action:
  - action: switch.turn_on
    target:
      entity_id: switch.vmc_bypass
    data: {}
  mode: single
- id: '1724342028798'
  alias: VMC BYPASS Arret
  description: ''
  trigger:
  - platform: numeric_state
    entity_id:
    - sensor.delta_temperature_exterieur_moins_interieur
    for:
      hours: 0
      minutes: 1
      seconds: 0
    above: -1
  condition:
  - condition: state
    entity_id: switch.vmc_bypass
    state: 'on'
  action:
  - action: switch.turn_off
    target:
      entity_id: switch.vmc_bypass
    data: {}
  mode: single

La partie pilotage:


et

la partie contrôle :

et un affichage (image issue d’un autre post :))

code de l’ESP :

Résumé
esphome:
  name: esp32-vmc
  friendly_name: ESP32-VMC
  on_boot:
    priority: 600
    then:
      - output.set_level:
          id: pwm_extraction
          level: "20%"
      - output.set_level:
          id: pwm_insertion
          level: "20%"
      - switch.turn_off: relais1
      - switch.turn_off: relais2
      - switch.turn_off: relais3
      - switch.turn_off: relais4
esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "1Iq5/NWe6JTwkEOU0hekxBtY9MOoOHs/KgjigJUkD6M="

ota:
  - platform: esphome
    password: "bd190d8325db3f67478f98241d3f373b"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  manual_ip:
    static_ip: 192.168.1.87
    gateway: 192.168.1.1
    subnet: 255.255.255.0
    
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp32-Vmc Fallback Hotspot"
    password: "FwtY86Teh3ew"

captive_portal:
web_server: # creates a web server where you can access all this stuff without home assistant (good for debugging or working headless (no HA))
  port: 80
  include_internal: true
  ota: true


#pour sonde Dallas
one_wire:
  - platform: gpio
    pin: 18

sensor:

## tension alim
  - platform: adc
    pin: 34 # entre analogique ADC1_CH6 entree 0-1V
    name: "Alim PWM"
    update_interval: 120s
    filters:
     - sliding_window_moving_average:
         window_size: 10
         send_every: 10
     - multiply: 15.87 # resistance 15k + 220k
  - platform: adc
    pin: 39 # entre analogique ADC1_CH6 entree 0-1V
    name: "Alim PWM out"
    update_interval: 1ms
    filters:
     - sliding_window_moving_average:
         window_size: 10000
         send_every: 10000
     - multiply: 15.87 # resistance 15k + 220k
  - platform: adc
    pin: 36 # entre analogique ADC1_CH6 entree 0-1V
    name: "Alim PWM in"
    update_interval: 1ms
    filters:
     - sliding_window_moving_average:
         window_size: 10000
         send_every: 10000
     - multiply: 15.87 # resistance 15k + 220k



  # Send WiFi signal strength & uptime to HA
  - platform: wifi_signal
    name: WiFi
    update_interval: 120s

  - platform: dht
    pin: 19
    temperature:
      name: "Temperature air SDB "
    humidity:
      name: "Humidity air SDB "
    update_interval: 60s
  - platform: dallas_temp
    address: 0xdc00000e68dd4c28
    name: "VMC temp air insufle"
    id: vmc_temp_air_insufle
    update_interval: 60s
    filters:
    - offset: 0.0
  - platform: dallas_temp
    address: 0x9a00000e6a1aee28
    name: "VMC temp air extrait"
    id: vmc_temp_air_extrait
    update_interval: 60s
    filters:
    - offset: -0.0
  - platform: dallas_temp
    address: 0x2400000e69845128
    name: "VMC air neuf ext"
    id: vmc_temp_air_neuf_ext
    update_interval: 60s
    filters:
    - offset: 0.0
  - platform: dallas_temp
    address: 0xcf00000e6a26a928
    name: "VMC temp vicie ext"
    id: vmc_temp_vicie_ext
    update_interval: 60s
    filters:
    - offset: -0.0
  


  
  - platform: homeassistant
    name: "vmc pwm extraction de HA"
    entity_id: sensor.vmc_pwm_extraction 
    unit_of_measurement: "%"
    accuracy_decimals: 0
    id: vmc_pwm_extraction_de_ha
    on_value:
      then:
        - output.set_level:
            id: pwm_extraction
            level: !lambda |-
              return id(vmc_pwm_extraction_de_ha).state ;            
  - platform: homeassistant
    name: "vmc pwm insertion de HA"
    entity_id: sensor.vmc_pwm_insertion
    unit_of_measurement: "%"
    accuracy_decimals: 0
    id: vmc_pwm_insertion_de_ha
    on_value:
      then:
        - output.set_level:
            id: pwm_insertion
            level: !lambda |-
              return id(vmc_pwm_insertion_de_ha).state ;

  - platform: pulse_counter
    pin:
      number:  21  # Connect to any input PIN on the ESP
      mode:
        input: true
        pullup: true
    unit_of_measurement: 'RPM'
    id: fan_speed_extraction
    name: Fan Speed extraction
    accuracy_decimals: 0
    update_interval: 10s
    filters:
      - multiply: 1  # Depending on how many pulses the fan sends per round - should be 0.5 or 1 - try...
  - platform: pulse_counter
    pin:
      number: 22   # Connect to any input PIN on the ESP
      mode:
        input: true
        pullup: true
    unit_of_measurement: 'RPM'
    id: fan_speed_insertion
    name: Fan Speed insertion
    accuracy_decimals: 0
    update_interval: 10s
    filters:
      - multiply: 1  # Depending on how many pulses the fan sends per round - should be 0.5 or 1 - try...



output:
## commande ventilateur extraction air
  - platform: ledc
    pin: 16
    frequency: 10000 Hz
    channel: 0
    id: pwm_extraction
    #inverted: true
    # my fans stop working below 10% powerful.
    # also they're  powerful and loud, cap their max speed to 80%
    # At 0, actually turn it off, otherwise the power keeps going.
    zero_means_zero: true
    min_power: 0
    max_power: 1
## commande ventilateir insertion air
  - platform: ledc
    pin: 17
    frequency: 10000 Hz
    channel : 5
    id: pwm_insertion
    #inverted: true
    # my fans stop working below 10% powerful.
    # also they're  powerful and loud, cap their max speed to 80%
    # At 0, actually turn it off, otherwise the power keeps going.
    zero_means_zero: true
    min_power: 0
    max_power: 1

switch:
#relais 1
  - platform: gpio
    name: "relais1"
    pin: 32
#    inverted: True
    id: relais1
  - platform: gpio
    name: "relais2"
    pin: 33
#    inverted: True
    id: relais2
  - platform: gpio
    name: "relais3"
    pin: 25
#    inverted: True
    id: relais3
  - platform: gpio
    name: "relais4"
    pin: 26
#    inverted: True
    id: relais4
# bypass (= boost des ventilateur + le volet by pass se ferme)
  - platform: template
    name: "Bypass"
    optimistic: True
    on_turn_on:
      then:
        - switch.turn_on: relais1
        - switch.turn_off: relais2
        - delay: 60s
        - switch.turn_off: relais1
        - switch.turn_off: relais2

    on_turn_off:
      then:
        - switch.turn_on: relais1
        - switch.turn_on: relais2
        - delay: 60s
        - switch.turn_off: relais1
        - switch.turn_off: relais2


# turbo Cuisine (= boost des ventilateur + le volet salle de bain se ferme)
  - platform: template
    name: "turbo Cuisine"
    optimistic: True
    on_turn_on:
      then:
        - switch.turn_on: relais3
        - switch.turn_on: relais4
        - delay: 60s
        - switch.turn_off: relais3
        - switch.turn_off: relais4

    on_turn_off:
      then:
        - switch.turn_on: relais3
        - switch.turn_off: relais4
        - delay: 60s
        - switch.turn_off: relais3
        - switch.turn_off: relais4

Et la partie électronique ( je sais peut mieux faire en routage de fil!) a droite l’entrée 230v et l’alim 230/10v et a gauche l’esp avec ses 4 relais.

edit :
ajout du schéma elec (désolé je n’ai pas de super logiciel pour de la schématique)

edit 10/01/25 :
nomenclature :
esp : ESP32-RELAY04 (voir https://fr.rs-online.com/web/p/modules-de-developpement-de-communication-et-sans-fil/2863996?gb=s ou il y a des eq chez ALi)
alim : HDR-15-12 (mais n’importe quelle alim 230V AC → 10V convient)
résistances : 220k et 15k
convertisseur 3V → 5V : 5V à 3.3V Module Convertisseur Bidirectionnel de Niveau Logique de IIC 4 Canaux : Amazon.fr: Commerce, Industrie et Science

14 « J'aime »

Salut, beau projet.
Comment fais tu pour récupérer la vitesse des moteurs ?
Merci.

Bonsoir
Merci
Pour la vitesse les ventilateurs ont une sortie faite pour ça ( 1 pulse par tour) qu’il suffit de mettre sur une gpio de l’esp et de la configurer en mesure pulse_counter

Bonjour

Aurais tu une photo de ton installation pour l’ESP ?

Bonne journée et bonne fête

Bonjour
Je ne suis pas chez moi, je te fais une photo demain! Bonnes fêtes aussi

Bonjour
Photo ajoutée au premier post.

Merci pour les photos. A quoi te servent les résistances que tu as rajouté ?

Bonne journée

Je sais c’est un peu moche…
C’est 3 ponts diviseur de tension (220k et 15k) pour diviser par 16 pour mesurer

  • la tension de mon alim qu il sort du 10v afin de pouvoir la surveiller
  • Les 2 signaux pwm qui sont aussi en 0/10v. Mais là ça marche pas bien car l’adc de l’esp n’est très performant / rapide donc je n’arrive pas en moyennant a mesurer la tension moyenne du pwm. ( La vitesse des ventilo est proportionnelle a cette tension). Via ha et donc les sorties pwm de l’esp je joue sur la rapport cyclique ce qui fait bouger cette valeur moyenne. J’aurais aimé la remesurer pour être sûr de ce qui sort de l’esp. Il existe des adc en i2c qui j’espère font l’affaire, ça sera pour une prochaine évolution m’

Merci pour ta réponse, je cherche a faire quelque chose de similaire sur ma Helios double flux. Mais mes compétences dans les esp ou autres sont très limitées. Donc je cherche des projets similaires a ce que je veux faire et le tiens en fais partie.

Merci et bonne fête

J’ai pas encore eu le temps de faire le schéma mais ça ne saurait tarder ( semaine prochaine normalement).
Pour la partie programmation c’est simple et le forum sera la pour t’aider. Par contre pour les soudures on ne peut pas le faire a distance !
Il te faut aussi un peu de matos pour vérifier que tout va bien ( multimètre, idéalement un oscillo pour voir la gueule du pwm, fer a souder, …).
Tu peux commencer par monter un esp avec 4 sondes dallas pour te familiariser et faire remonter les 4 températures ( une par bouche de ta Vmc) a home assistant. Pour ça il ne te faut que qq composant qui se trouve sur le net ( ali ou autre), y a plein de tuto sur internet.

On ne peux pas récupérer les sondes de la Vmc ?

Salut, non sur la duolixmax (Atlantic) le protocol de communication est propriétaire donc impossible de simuler la télécommande via ha.
Pour ce qui est des sondes d’origine ceux sont des sondes type pt100 dont il faut la courbe de mesure et une entree analogique par sonde! Alors qu’avec les sondes dallas, c’est du numérique, tu peux en mettre plusieurs sur un entrée numérique de l’esp.
Suffit juste des les alimenter en 3v et de mettre une résistance ( 1 pour toutes les sondes) entre le + et le fil de data des sondes. Toutes les fils de data des sondes peuvent être relier entre eux, puis reliés à une entrée de l’esp.
C’est quoi la ref de ta Vmc?

C’est une Helios kwl 270 pro

Bonjour
Ta Vmc semble avoir une connexion ethernet, elle est peut être facilement interfacable avec ha!

Bonjour

Non ça c’est la nouvelle version. La mienne ne l’a pas. Il devais sortir un adaptateur rs485/USB mais il n’a jamais vu le jour

Ta Vmc a donc une sortie rs485? Ça se récupère via un esp ça;) ( comme pour les clims Mitsubishi)
Reste a te trouver une ame charitable pour t’aider pour le code ( ou y a peut être des choses toute faite sous esphome ou directement en c ( via Arduino))?
J’ai trouvé un vielle notice je ne vois pas de liaison série mais tes ventilo semble se règler aussi en 0-10v, et il y a un retour de leur vitesse donc c’est comme la mienne. Mon montage s’adapterait sans pb!. Mais comme toute modif de matériel existant y a des petits risque de casser un truc et donc tu te retrouveras sans Vmc. Si t’es pas « très dégourdi » en électronique je te déconseille de toucher a un truc qui marche. Mais si tu es motivé je serai dispo pour aider!

La sortie RS 485 est relié à la commande de contrôle

bjr
edit : ajout du schéma

Si je comprends bien ton schéma, tu as remplacé la platine d’origine par ton montage ?

Oui c’est tout a fait ça.