Projects

Air-quality-controlled ventilation

Controlling emissions from wood burning with air-quality-controlled ventilation.

IoTHome AssistantZigBeeValloxAutomation

Wood burning is for many a pleasant and often necessary form of heating, but as a side effect it produces fine particulate matter and gaseous pollutants that degrade outdoor air quality, especially in urban and suburban areas. The problem becomes more pronounced in situations where outdoor air is brought indoors as-is, without its quality being known or taken into account.

This article examines how the adverse effects of wood burning can be mitigated by controlling ventilation — not based on assumptions or schedules, but on measured air quality when it actually matters. At the same time, the text serves as a practical example of an automation solution that combines measurement and control.

Air pollutants and health effects

Incomplete wood combustion produces fine particulate matter—primarily PM2.5 and PM10—as well as various gaseous compounds. These are not merely a nuisance due to odor: fine particles penetrate deep into the respiratory system and can cause irritation, inflammation, and long-term health effects. According to the Finnish Institute for Health and Welfare (THL), wood burning in urban areas is estimated to cause around 200 premature deaths annually in Finland. This is slightly higher than the number of traffic-related fatalities.

Concentrations are measured in µg/m³, i.e., micrograms of particles per cubic meter of air. The EU, WHO, and individual cities have established guidelines and regulatory limits for acceptable levels.

A societal taboo

Wood burning—and wood-fired saunas in particular — likely evoke romantic and harmless associations. The issue is sensitive, and politically it is easier to intervene in almost anything else. Smoking has been addressed through restrictions and taxation; emissions from energy production have been significantly reduced; manufacturers of internal combustion engines have been forced to lower emissions; and the use of studded tires has been restricted in major cities.

It is likely that the relative significance of these emissions will continue to increase as other sources are constrained. As a result, policy measures targeting wood burning will inevitably enter the discussion.

Technical options and challenges

The detached house used as the project site offered favorable starting conditions for mitigating the impact. The building is airtight, and the supply air for ventilation is centralized to a single intake. Air circulation is fully mechanical in both directions. The ventilation unit includes particulate filtration as standard, but it is ineffective against gases and the odors they carry.

The first solution considered was an activated carbon filter. In principle, it could remove chemical compounds and gases produced by incomplete wood combustion, or by burning unsuitable materials in a fireplace.

Adding an activated-carbon-based filter as part of the ventilation system is an appealing idea. In practice, however, it proved problematic due to the pressure drop introduced into the airflow. The ventilation unit would need to operate at higher power levels, resulting in increased noise and continuous additional energy consumption. A correctly sized filter would also have been impractically large for the required air volumes.

An alternative to supply-air filtration would be a standalone air purifier. I will not cover this option further, as such a device would not be sufficiently integrated with the existing building services.

The next solution was to prevent polluted air from entering the building altogether. We therefore move on to its implementation.

The following section requires some understanding of technical details. If these are not of interest, you can skip directly to the Outcome section.

Implementation building blocks

Automation system

The building’s functions are already controlled by the Home Assistant (HA) software platform, with wireless sensors based on the Zigbee standard. Compared to most commercial, consumer-oriented systems, HA allows access closer to the device level and supports the use of a programming language. It is also not dependent on a single ecosystem. Broad compatibility comes at the cost of a higher learning curve. This makes HA a natural place to connect the sensor and the ventilation unit and to implement the control logic.

Raspberry Pi
Raspberry Pi

Particle sensor

For this task, a local, reliable, and fast observation of PM2.5 concentrations is required.

A local sample is necessary because weather data providers are unable to observe or report individual, highly localized events. Smoke emitted from a single household chimney typically lingers in a small area, especially during cold weather.

The basis for reliable data is sampling the exact air that is about to enter the dwelling.

The observation must be fast, as slow reactions allow odors to enter indoors but do not remove them once they are inside.

A suitable sensor was found in an unexpected place. IKEA products are often not known for broad compatibility, and various forms of “misuse” are typically discouraged. Remarkably, the IKEA Vindstyrka turned out to be the only readily available device that fit into the existing ecosystem. It is a consumer-oriented product designed primarily to be viewed on its built-in display, with its smart features playing a secondary role in marketing. The device claims the ability to measure PM2.5 particulate levels as well as tVOC concentrations (total volatile organic compounds). I will return later to how well the device actually meets the requirements for local, reliable, and fast data collection.

IKEA Vindstyrka
IKEA Vindstyrka

Ventilation unit

The ventilation unit used is a Vallox 110 MV. It was connected to the network via its Ethernet port. An account was created for the Vallox cloud service, and HA was connected using the official integration.

The most critical feature is the ability to switch between preset profiles.

In the user interface, the profiles are At home, Away, Boost, and Custom. In the technical interface, the corresponding presets are Home, Away, Boost, and Fireplace.

Because the device does not support creating new profiles, the Custom profile was repurposed to prevent polluted air from entering the building. It was configured via the device’s user interface so that the supply air fan operates at 10% power and the exhaust air fan at 20%. A small amount of supplied air ensures that the particle sensor can continue to take new samples and that the end of a pollution event can be detected. The exhaust fan is set slightly higher so that the building remains under negative rather than positive pressure.

Vallox ventilation unit
Vallox 110 MV

Customization required

Installing and enabling ZHA Toolkit

For the automation, I used HA’s ZHA integration, which adds Zigbee support to Home Assistant. Some prefer the Zigbee2MQTT integration, but here I focus specifically on the ZHA configuration.

ZHA generally assumes that devices behave sensibly out of the box. In this case, however, the default behavior is not sufficiently fast. The Vindstyrka is capable of sampling the air frequently enough, but it does not report changes to HA at a high enough rate. This is understandable for most battery-powered devices, but the Vindstyrka is mains-powered, and conserving such small amounts of energy is unnecessary.

The solution is a tool called ZHA Toolkit, which exposes low-level control over Zigbee. Next, I describe the configuration used to force the Vindstyrka to perform regular, high-frequency sampling.

ZHA Toolkit was installed by first adding the HACS extension—essentially an unofficial app store for Home Assistant add-ons—and then installing ZHA Toolkit from there.

Forced polling using the Force update function

This is best implemented as a dedicated automation.

Choosing an appropriate interval is a compromise between network congestion and device load. I have used a 30-second interval, which has proven stable and sufficiently fast. The configuration below shows the setup used.

alias: Force update (Vindstyrka)
description: Force update particle sensor
triggers:
  - seconds: "30"
    trigger: time_pattern
conditions: []
actions:
  - data:
      ieee: <SENSOR ADDRESS>
      use_cache: false
      force_update: true
      endpoint: 1
      cluster: 1066
      attribute: 0
    action: zha_toolkit.attr_read
mode: single

The most interesting fields are cluster: 1066 and attribute: 0.

These point to a manufacturer-specific attribute: PM25 → measured_value. In the user interface, the same value may be shown in hexadecimal form, i.e., 1066 == 0x042a.

Automation

With the basic components in place, the automation logic determines when the ventilation unit should switch to the Custom preset and when it should return to normal operation.

Below is a simple automation that has been sufficient for my own use. If control based on a single sample proves too sensitive, a Statistics helper can be used to compute an average over multiple samples across a chosen time window.

Activation

alias: Poor air quality detected
description: ""
triggers:
  - value_template: "{{ states('SENSOR_DEVICE_ID') | float > 50 }}"
    trigger: template
conditions:
  - condition: state
    entity_id: fan.vallox
    attribute: preset_mode
    state: Home
    enabled: true
actions:
  - metadata: {}
    data:
      preset_mode: Fireplace
    target:
      device_id: VALLOX_DEVICE_ID
    enabled: true
    action: fan.set_preset_mode
mode: single

When the concentration exceeds 50 and the ventilation unit is in the At home preset, the preset is switched to Fireplace (=Custom).

Deactivation

alias: Clean air quality detected
description: ""
triggers:
  - value_template: "{{ states('SENSOR_DEVICE_ID') | float < 18 }}"
    for:
      hours: 0
      minutes: 3
      seconds: 15
    trigger: template
  - value_template: "{{ states('SENSOR_DEVICE_ID') | float < 35 }}"
    for:
      hours: 1
      minutes: 0
      seconds: 0
    trigger: template
conditions:
  - condition: state
    entity_id: fan.vallox
    attribute: preset_mode
    state: Fireplace
actions:
  - metadata: {}
    data:
      preset_mode: Home
    target:
      device_id: VALLOX_DEVICE_ID
    action: fan.set_preset_mode
mode: single

When the concentration remains below 18 for three minutes and 15 seconds or below 35 for one hour — and the ventilation unit is in the Custom preset — the preset is switched back to At home.

Outcome

At the time of writing, the solution has been in use for approximately two years. Its presence is easy to forget—until, on a cold winter day, the background hum of the ventilation system briefly quiets down.

The automation has responded to changes quickly and reliably. At the same time, the collected measurement data has made it possible to review the phenomenon afterward: when emissions were at their highest, how often guideline thresholds were exceeded, and how effective the interventions were.

In my view, the solution is suitable both for experimental hobbyist use and as part of a larger automation system, but it requires a willingness to understand how the system operates — and it is not a finished product.

Particle sensor data and ventilation preset over time
Particle sensor measurements and ventilation preset shown over time. When a pollution spike is detected, the ventilation preset switches (blue changes to yellow). Typical outdoor levels range from 0–10 µg/m³. In this example, lighting a neighboring fireplace causes a brief spike of approximately ~120 µg/m³, comparable to levels found in smoking areas. Poor combustion practices or unsuitable fuel can raise concentrations to several hundred micrograms.

Images

Home dashboard view
The home dashboard also aggregates weather data. At a glance, it shows how wind direction and speed affect particulate concentrations.
Vallox ventilation unit
Ventilation unit with the service hatch open.
Vallox ventilation unit
The sensor is positioned on its side between the supply air intake and the filters.
IKEA Vindstyrka rear view
Rear view of the sensor. The cleaning interval is effectively the same as for the ventilation unit filters. The sensor is placed against the ventilation duct so that the rear openings sample air flowing directly through the duct.
Projects