Bouw een slimme ventilator-besturing

Voor frisse lucht in onze slaapkamer hadden we een decentrale WTW-unit, maar die maakt te veel lawaai om bij in slaap te vallen…
Omdat we toch graag frisser slapen, is warmteterugwinning hier ook niet zo nuttig. Ook omdat de ruimte beperkt is, heb ik heb een lijn-ventilator gemonteerd die met een ESP32 automatisch harder gaat afzuigen als het CO2-niveau te hoog wordt. Dit is mijn oplossing:

De complete ventilator in gebruik
De complete ventilator

Benodigde hardware

  • Buisventilator Ø125mm met traploos verstelbare snelheid EC-motor, bijv. de Whisper Gold Line EC. Je hebt de 10V handregelaar niet nodig, maar wel wat stalen buizen, een geluiddemper en koppelstukken.
  • M5 Stack Atom Lite. Dit is een compacte 25x25mm SOC met ingebouwde RGB-led en drukknop. Ik kocht hem hier
  • USB-A naar USB-C kabel
  • Een IRF520 MOSFET breakout om het PWM-signaal van de Atom te versterken naar 10V= voor de ventilator
  • HomeAssistant met ESPHome Add-on IDE om de code op de Atom te installeren en de gegevens te bekijken
  • Automatiseringen op de Atom Lite (ESP32), ingesteld met ESPHome, die reageren op
  • CO2-sensor met integratie in HomeAssistant, bijv. Netatmo Healthy Home Coach (kan via HomeAssistant met de HomeKit Bridge ook nog in Apple HomeKit verschijnen. Andersom - via HomeKit in HomeAssistant - kan niet)

CO2 meten

Plaats de CO2-meter in de slaapkamer en installeer in HomeAssistant de HomeKit Controller integratie om de metingen in HomeAssistant te tonen en ze te kunnen gebruiken voor de besturing.

Healthy Home integratie in HomeAssistant
Healthy Home integratie in HomeAssistant
Originele CO2-meting in HomeAssistant
CO2-meting zonder ventilator
CO2-meting in HomeAssistant met automatische ventilator
CO2-meting met automatische ventilator

Ventilator aansluiten

Monteer de ventilator, -kanalen en demper buiten je slaapkamer. Ik heb ze bovenin een kast in een aanpalende logeerkamer ingebouwd, die ook wordt afgezogen.

Naast de 230V contactdoos voor de Whisper Gold Line ventilator heb je een wcd nodig voor de USB-adapter die de M5 Stack Atom voedt.

Bij de ventilator wordt een aansluitkastje geleverd, waarin zowel de 230V voeding als 4 besturingsdraadjes uitkomen:

Whisper aansluitschema
Whisper aansluitschema uit handleiding
Whisper aansluitingen
Whisper aansluitingen
Volledig aansluitschema
Volledig aansluitschema

M5 Atom Lite aansluiten

Connector achter de Atom Lite
Connector achter de Atom Lite
Atom Lite ESP32 controller gemonteerd voor de kast
Atom Lite ESP32 controller gemonteerd voor de kast

Ik hab vanaf de ventilator 2x2 draadjes uit een UTP-kabel gebruikt om de Atom te voeden met 5V= en de 2 contacten naar de fan aan te sluiten. Dat kan in 1 rij pinnetjes aan de achterzijde van de Atom, zie foto. GPIO25 (oranje) is de PWM-uitgang. GPIO21 (oranje/wit) is de toerenteller-puls vanaf de ventilator.

Na installatie geeft de kleur van de Lite de CO2-waarde weer (groen < 500, rood > 800). De helderheid van de led geeft de snelheid van de ventilator aan: hoe sneller hoe feller. Klik je op de knop, dan gaat de ventilator op Manual en 1 stapje harder. Na 80% gaat hij bij het volgende klikje op Automatisch, en daarna op 10% = Uit.

Code voor Atom Lite

Download de yaml code en installeer die op de M5Stack Atom Lite (ESP32) via de HomeAssistant ESPHome IDE. Als je de Atom Lite voor het eerst gebruikt, ga dan eerst in de Chromebrowser naar ESPhome Web, sluit via de USB-kabel de Atom aan op je computer, klik op Connect en dan op je USB-poort.

In ESPhome Web select Connect
In ESPhome Web kies Connect
Kies de USB-poort van je PC
Kies de USB-poort van je PC waarop de Atom is aangesloten
Voortgang van de 1e installatie
Voortgang van de 1e installatie

De essentie van de ESP32 configuratie bestaat uit:

Basis-instellingen:

esphome:
  name: m5atomlite-whisper
  friendly_name: M5Atom Lite Whisper

globals:
  - id: speed_set_int
    type: int
    restore_value: yes
    initial_value: '4'
  - id: automatic_co2
    type: int
    restore_value: yes
    initial_value: '1'

esp32:
  board: m5stack-atom
  framework:
    type: arduino

Een speed_fan object aanmaken:

fan:
  - platform: speed
    id: whisper_fan
    name: "Slaapkamer Ventilator"
    output: whisper_fan_pwm
    speed_count: 10
    on_turn_on:
      # publish set speed
      - sensor.template.publish:
          id: whisper_speed_step
          state: !lambda 'return id(whisper_fan).speed;'
    on_turn_off:
      # publish set speed
      - sensor.template.publish:
          id: whisper_speed_step
          state: 0
      # set brightness
      - light.turn_off:
          id: led
    on_speed_set:
      # publish set speed
      - sensor.template.publish:
          id: whisper_speed_step
          state: !lambda 'return id(whisper_fan).speed;'
      # set brightness
      - lambda: |-
          // adjust brightness for any speed change
          auto call = id(led).make_call();
          call.set_state(true); // turn the light on if it was off
          auto n = 0.05 * id(speed_set_int);
          call.set_brightness(n);
          call.perform();

Een PWM output aanmaken om de snelheid van de fan met PWM te sturen:

output:
  - platform: ledc
    # Fan PWM
    # Connect MOS-SIG to GPIO25, MOS-GND to GND; Whisper yellow to MOS V-, black to OUT-GND, red to OUT+10V
    id: whisper_fan_pwm
    pin:
      number: GPIO25
      inverted: true # MOS V+ did not work, V- did, so inverted PIN
    frequency: 10000Hz # lower if it whines

Een knop (switch) voor de automatische stand:

switch:
  - platform: template
    id: automatic
    name: Automatische regeling
    lambda: |-
      if (id(automatic_co2) == 1){
        return true;
      } else {
        return false;
      }
    turn_on_action:
      then:
      - fan.turn_on:
          id: whisper_fan
      - lambda: |-
          id(automatic_co2) = 1;
          // next block to match thresholds in sensor.co2_measurement block above
          ESP_LOGD("ATOM", "Whisper Auto ON, CO2: %d", id(co2_measurement).state);
          if (id(co2_measurement).state > 1300) {
            id(speed_set_int) = 8;
          } else if (id(co2_measurement).state > 800.0){
            id(speed_set_int) = 7;
          } else if (id(co2_measurement).state > 700.0){
            id(speed_set_int) = 6;
          } else if (id(co2_measurement).state > 600.0){
            id(speed_set_int) = 5;
          } else if (id(co2_measurement).state > 450.0){
            id(speed_set_int) = 4;
          } else if (id(co2_measurement).state > 350.0){
            id(speed_set_int) = 3;
          } else {
            id(speed_set_int) = 0;
          }
          id(whisper_fan).speed = id(speed_set_int);
    turn_off_action:
      then:
      - lambda: |-
          id(automatic_co2) = 0;

Een sensor om de gegevens van de CO2-sensor uit HomeAssistant naar de ESP32 kopiëren:

sensor:
  - platform: homeassistant
    id: co2_measurement # this is the ID for a new local sensor, and copies:
    entity_id: sensor.healthy_home_coach_netatmo_carbon_dioxide_sensor  # this points to the front end (Netatmo) entity
    unit_of_measurement: 'ppm'
    filters:
      - round: 0
    on_value_range: # next block to match thresholds in switch.automatic_co2 block below
      - above: 0
        below: 350.0
        then:
          - if:
              condition:
                lambda: return id(automatic_co2) == 1;
              then:
                fan.turn_off:
                  id: whisper_fan
          - light.turn_off:
              id: led
          #- logger.log: CO2 < 350 ppm
      - above: 350.1
        below: 450.0
        then:
          - if:
              condition:
                lambda: return id(automatic_co2) == 1;
              then:
                fan.turn_on:
                  id: whisper_fan
                  speed: 3
          - light.turn_on:
              id: led
              red: 0
              green: 100%
              blue: 0
          #- logger.log: 350 < CO2 < 450 ppm
      # ETC.
      - above: 1300.1
        then:
          - if:
              condition:
                lambda: return id(automatic_co2) == 1;
              then:
                fan.turn_on:
                  id: whisper_fan
                  speed: 8
          - light.turn_on:
              id: led
              red: 100%
              green: 0%
              blue: 50%
          #- logger.log: WARNING CO2 > 1300 ppm

Als de ventilator op Automatisch staat, checkt deze code de snelheid van de ventilator bij elke nieuwe CO2-meting uit de slaapkamer en past ook de kleur van de LED aan (van groen = schoon naar bruin = vuil).

Een sensor die als toerenteller informatie geeft over de werkelijke snelheid van de Whisper ventilator (3 pulsen per omwenteling, vandaar *0.33 filter):

sensor:
  - platform: pulse_counter # -meter too many data points
    # toerenteller Whisper witte draad
    name: Toerental
    id: whisper_toerental
    pin:
      number: GPIO21
      # inverted: true
      mode:
        input: true
        pullup: true
    unit_of_measurement: 't/min'
    internal_filter: 5us
    update_interval: 10s
    filters:
      - multiply: 0.33 # (3 ticks per revolution as per Whisper Gold manual)
      - round: 0

Home Assistant instellingen

Voeg in HomeAssistant in de Code-editor modus van een nieuw Dashboard deze yaml code toe om een dashboard voor de bediening van je fan te maken.

Pas evt. de code aan voor jouw situatie, bijv.

  • De gegevens van jouw CO2-sensor
  • De namen van je speed_fan, ventilator-sensors en -switches
HA Dashboard Whisper ventilator
Dashboard Whisper ventilator in HomeAssistant
Snelheid van de ventilator reageert op CO2-meting
Snelheid van de ventilator reageert op CO2-meting

Veel gezonde slaap gewenst!




Verder lezen?

Deze stukjes zijn misschien ook interessant:

  • Engelse wissel op een JMRI Control Panel
  • Bouw zelf een AGA Display
  • Allerlei
  • Website is verhuisd
  • Reading EXIF tags in Jekyll with exiftools