Quality scale: Platinum
A full-featured, modern and high-performance Home Assistant integration for the BUVA EcoStream balanced ventilation unit. Supports live push updates, fan control, boost automation, bypass switch control, diagnostics, WiFi info, and an Apple Home-style dashboard.
- Local push updates (no polling required)
- Automatic WebSocket reconnect
- Eco-friendly throttled update model
- One unified device in the device registry
- Full diagnostics + debug logging
- Modern HA FanEntity API
- Preset-based control (low / mid / high)
- Fast-mode window after manual control actions
- Configurable duration (5/10/15/30/60 min)
- Uses
setpoint_highas boost setpoint source - Remaining override time via sensor (
mode_time_left) - Visual dashboard tile (optional Apple-style card)
- Bypass is exposed as a binary switch (
open/closed) - Includes a diagnostic sensor for current bypass position
- COโ (ppm, whole numbers)
- TVOC (ppb, whole numbers)
- Humidity (%)
- ETA, EHA, ODA temperature (1 decimal)
- RPM supply/exhaust
- Qset (mยณ/h)
- Uptime (
Xd Yh Zm) - WiFi RSSI / SSID / IP
- Reset filter timer
| Device | Supported | Notes |
|---|---|---|
| BUVA EcoStream | โ Yes | All firmware versions |
| BUVA EcoStream+ | โ Yes | All firmware versions |
| Other BUVA models | โ No | Different protocol |
- All known EcoStream firmware versions are supported.
- On some older firmware versions, TVOC data may not be present.
In that case, the sensor will show
unavailablerather than an error. - The device does not expose a native WebSocket endpoint. This integration uses a safe emulated stream model compatible with all firmware versions.
| Entity | Unit | Description | Enabled by default |
|---|---|---|---|
| eCOโ Return | ppm | COโ level in return air | โ |
| TVOC Return | ppb | Total VOC in return air | โ |
| Humidity Return | % | Relative humidity in return air | โ |
| Temperature ETA | ยฐC | Extract air temperature | โ |
| Temperature EHA | ยฐC | Exhaust air temperature | โ |
| Temperature ODA | ยฐC | Outside air temperature | โ |
| Bypass Position | % | Current bypass valve position | โ |
| Qset | mยณ/h | Active ventilation flow setpoint | โ |
| Heat Recovery Efficiency | % | Calculated heat recovery efficiency | โ |
| Mode Time Left | s | Remaining time for active override mode | โ |
| Fan Exhaust Speed | rpm | Exhaust fan speed | โ |
| Fan Supply Speed | rpm | Supply fan speed | โ |
| Summer Comfort Temp | ยฐC | Summer comfort temperature threshold | โ |
| Filter Replacement Date | date | Date of last filter reset | โ (diagnostic) |
| Uptime | - | Device uptime formatted as Xd Yh Zm |
โ (diagnostic) |
| WiFi IP | - | Device IP address | โ |
| WiFi SSID | - | Connected WiFi network name | โ |
| WiFi RSSI | dBm | WiFi signal strength | โ |
| Setpoint Low | mยณ/h | Configured low airflow preset | โ (diagnostic) |
| Setpoint Mid | mยณ/h | Configured mid airflow preset | โ (diagnostic) |
| Setpoint High | mยณ/h | Configured high airflow preset | โ (diagnostic) |
| External COโ | ppm | External COโ sensor value | โ |
| Entity | Platform | Description |
|---|---|---|
| Ventilation | Fan | Preset control (low / mid / high) |
| Preset Low | Switch | Activate low preset override |
| Preset Mid | Switch | Activate mid preset override |
| Preset High | Switch | Activate high preset override |
| Bypass Valve | Switch | Open or close bypass override |
| Schedule | Switch | Enable or disable the ventilation schedule |
| Summer Comfort | Switch | Enable or disable summer comfort mode |
| Boost | Switch | Start or stop boost mode |
| Boost Duration | Select | Configure boost duration (5 / 10 / 15 / 30 / 60) |
| Reset Filter | Button | Reset filter replacement date (if option enabled) |
| Entity | Device class | Description | Enabled by default |
|---|---|---|---|
| Filter Replacement Warning | problem | Primary trigger entity for overdue filters | โ (diagnostic) |
| Frost Protection Active | - | Whether frost protection is active | โ |
| Schedule Enabled | - | Whether a schedule is active | โ |
| Summer Comfort Enabled | - | Whether summer comfort mode is active | โ |
This integration uses a local push model. The EcoStream device sends data to Home Assistant over a persistent HTTP long-poll connection (emulated WebSocket stream), without Home Assistant polling the device.
- On startup, the coordinator opens a persistent connection to the device's HTTP endpoint.
- The device streams JSON state updates whenever its internal state changes.
- The coordinator receives each update and immediately notifies all entities.
- There is no fixed polling interval - updates arrive as fast as the device sends them.
To avoid excessive entity writes during rapid changes (e.g., when adjusting fan speed), the integration applies two throttle windows:
| Mode | Default | When active |
|---|---|---|
| Normal push interval | 10 s | Idle / steady state |
| Fast-mode window | 5 s | After manual control actions |
These are currently fixed in the integration code.
If the connection to the device is lost, the coordinator will
automatically attempt to reconnect using exponential back-off.
Entities are marked unavailable until the connection is restored.
Automatically increase ventilation when COโ levels are elevated and return to normal when air quality improves.
Use the Schedule switch to let the device follow its built-in time schedule overnight, then override to a fixed low level during quiet hours via automation.
Trigger a timed boost when a motion sensor or humidity spike is detected in kitchen or bathroom, and let it auto-cancel when COโ drops back to baseline.
Use the Filter Replacement Warning binary sensor to send a notification when filter replacement is overdue, or create a persistent notification that clears when the filter is reset.
Monitor the outdoor temperature sensor and toggle Summer Comfort mode automatically when conditions are suitable for free cooling via the bypass valve.
- Go to HACS -> Integrations -> Custom repositories
- Add:
https://github.com/epodegrid/ecostream_homeassistant_integration - Category: Integration
- Install & restart Home Assistant
Copy the folder: custom_components/ecostream/ Into: /config/custom_components/ecostream/
Restart Home Assistant.
Home Assistant will automatically find the device via:
-
Zeroconf (
_http._tcp) -
DHCP hostname patterns
-
MAC address prefix
-
When a BUVA EcoStream is detected on the network:
- Home Assistant will show a "BUVA EcoStream discovered" notification.
- The config flow opens with the IP address pre-filled.
- You only need to click Submit.
-
If auto-discovery does not work, unplug your EcoStream unit for 10 seconds and then plug it back in. Home Assistant should discover it within 2 minutes. If needed, add it manually using the IP address. A fixed IP is preferred. In practice, the EcoStream usually keeps the same IP address unless it has been offline from your network for an extended period.
Click the discovered device -> the IP address will now be pre-filled automatically (see section below).
- Go to Settings -> Devices & Services
- Click Add Integration
- Search for EcoStream
- Enter the IP address, if not discovered automatically
The repository includes a ready-to-use Lovelace dashboard template:
custom_components/ecostream/docs/dashboard.yaml
Short answer: not reliably in a supported way.
Home Assistant custom integrations are not intended to auto-create or auto-inject complete Lovelace dashboards during install. Dashboards are user-owned UI configuration (YAML or storage mode), so setup is normally a manual one-time step.
For dashboard.yaml to render correctly, install these Lovelace frontend packages/resources:
mini-graph-cardbutton-cardMushroom(formushroom-title-card)card-mod
Recommended install method: HACS -> Frontend.
Also ensure:
- The EcoStream integration is installed and entities exist.
- You are on a modern Home Assistant version (the dashboard uses
sectionsview layout). - Theme
ios-light-modeis optional; if missing, remove/replace thetheme:line.
- Copy
custom_components/ecostream/docs/dashboard.yamlto your HA config folder, for example:/config/dashboards/ecostream.yaml
- Add a Lovelace dashboard entry to
configuration.yaml:
lovelace:
dashboards:
ecostream:
mode: yaml
title: EcoStream
icon: mdi:fan
show_in_sidebar: true
filename: dashboards/ecostream.yaml- Restart Home Assistant (or reload Lovelace/resources where applicable).
If HACS did not auto-register resources, add them manually in Settings -> Dashboards -> Resources:
/hacsfiles/mini-graph-card/mini-graph-card-bundle.js(type:module)/hacsfiles/button-card/button-card.js(type:module)/hacsfiles/lovelace-mushroom/mushroom.js(type:module)/hacsfiles/lovelace-card-mod/card-mod.js(type:module)
Note: if you use a custom icon set for far:sun,
make sure that icon pack is installed.
Otherwise replace it with an mdi: icon.
- Go to Settings -> Devices & Services
- Find BUVA EcoStream and click on it
- Click the โฎ menu (three dots) in the top right
- Select Delete
- Confirm the removal
- Restart Home Assistant
If you installed manually, also delete the folder config/custom_components/ecostream/.
You can configure:
- Filter replacement interval (days)
- Preset override duration (minutes)
- Boost duration (minutes)
- Summer comfort target temperature (15-30 C)
- Allow override filter date
- Unplug the EcoStream for 10 seconds and plug it back in. HA should detect it within 2 minutes.
- Make sure Home Assistant and the EcoStream are on the same network/VLAN.
- If discovery still fails, add the integration manually using the device IP address.
- Assign a static IP address to the device in your router's DHCP settings to prevent future IP changes.
- The integration lost connection to the device. Check that the device is reachable on your network.
- Go to Settings -> Devices & Services -> EcoStream and check the integration status.
- Enable debug logging (see below) and look for connection errors in the logs.
- Restart Home Assistant. The coordinator will attempt to reconnect automatically.
- This is expected on some older EcoStream firmware versions that do not expose TVOC data.
- Ensure the Schedule switch is off - an active schedule may override manual control.
- Check if Boost mode is active; boost takes priority over manual fan control.
- Boost runs for the configured boost duration.
- You can stop it manually with
switch.ecostream_boost.
Add the following to your configuration.yaml:
logger:
default: info
logs:
custom_components.ecostream: debugThen restart Home Assistant and check Settings -> Logs for detailed log output.
Go to Settings -> Devices & Services -> BUVA EcoStream -> Download Diagnostics for a full state snapshot including connection info, current data, and sanitized WiFi details.
alias: EcoStream - Boost on high COโ
trigger:
- platform: numeric_state
entity_id: sensor.ecostream_eco2_return
above: 1000
condition:
- condition: state
entity_id: switch.ecostream_boost
state: "off"
action:
- service: switch.turn_on
target:
entity_id: switch.ecostream_boostHome Assistant UI steps:
- Go to Settings -> Automations & Scenes -> Create Automation.
- Choose Start with an empty automation.
- For Trigger, choose Device.
- Select your BUVA EcoStream device.
- Select trigger type Filter Replacement Warning turns on.
- Add an action, for example Notifications: Send a notification via mobile_app.
- Save the automation.
YAML example (device trigger):
alias: EcoStream - Filter replacement reminder
description: Notify when filter replacement becomes overdue.
trigger:
- platform: device
domain: binary_sensor
device_id: YOUR_ECOSTREAM_DEVICE_ID
entity_id: binary_sensor.ecostream_filter_replacement_warning
type: turned_on
condition: []
action:
- service: notify.mobile_app
data:
title: Filter replacement needed
message: The EcoStream filter is overdue for replacement.
mode: singleAlternative YAML example (entity state trigger):
alias: EcoStream - Filter replacement reminder (state trigger)
trigger:
- platform: state
entity_id: binary_sensor.ecostream_filter_replacement_warning
to: "on"
action:
- service: notify.mobile_app
data:
title: Filter replacement needed
message: The EcoStream filter is overdue for replacement.alias: EcoStream - Summer comfort on warm days
trigger:
- platform: numeric_state
entity_id: sensor.ecostream_temperature_oda
above: 22
action:
- service: switch.turn_on
target:
entity_id: switch.ecostream_summer_comfortalias: EcoStream - Low ventilation at night
trigger:
- platform: time
at: "23:00:00"
action:
- service: switch.turn_on
target:
entity_id: switch.ecostream_preset_lowalias: EcoStream - Set custom Qset
trigger:
- platform: time
at: "18:00:00"
action:
- service: fan.set_qset
target:
entity_id: fan.ecostream_ventilation
data:
qset: 140
override_minutes: 30Use override_minutes only when you want to override the default preset override duration from integration options.
Note: fan.set_qset is a custom EcoStream fan entity service, not a built-in Home Assistant fan service.
A full snapshot is available under: Device -> โฆ -> Download Diagnostics
This includes:
- Current data
- Connection state
- Push intervals
- Metadata
- Sanitized WiFi info (password removed)
- The unit does not expose a real WebSocket endpoint -> the integration uses a safe emulated stream model
- Some older firmware versions may omit TVOC data
- Original integration architecture and (reverse) engineering: @epodegrid
- Rewrite and quality-scale improvements plus Apple-style UI: @Uber1337NL
- Thanks to contributors and testers: @bartw91, @jelle514 and @ricohageman
- Special thanks to the HA community for guidance
MIT License - see LICENSE file
