Home Assistant custom integration for BUVA QStream 2.0 WiFi-enabled ventilation fans.
Fan Entity (fan.qstream_fan)
- Percentage-based speed control (0-100%)
- Four preset modes (Low, Medium, High, Turbo) mapped to device levels
- Turn on/off control
Switch Entity (switch.qstream_fan_demand_control)
- Toggle automatic speed adjustment based on air quality sensor
- Preserves current fan speed when toggled
Sensors
sensor.qstream_fan_air_quality- Air Quality Index (AQI) from device sensorsensor.qstream_fan_analog_flow- Flow demanded by analog sensor (%)sensor.qstream_fan_set_flow- Target flow percentage (%)sensor.qstream_fan_actual_flow- Current actual flow (%)sensor.qstream_fan_timer_remaining- Timer remaining (minutes)sensor.qstream_fan_schedule_mode- Current schedule mode (DAY/NIGHT)sensor.qstream_fan_schedule_remaining- Schedule remaining (minutes)
Binary Sensors
binary_sensor.qstream_fan_valve- Valve position (open/closed)binary_sensor.qstream_fan_timer_active- Timer active statebinary_sensor.qstream_fan_schedule_enabled- Schedule enabled state
- Home Assistant 2025.10 or later
- QStream 2.0 device on local network
- Device IP address or hostname
- Open HACS in Home Assistant
- Click on "Integrations"
- Click the three dots menu (top right)
- Select "Custom repositories"
- Add repository URL:
https://github.com/bramd/qstream-ha - Category: Integration
- Click "Add"
- Search for "QStream Ventilation Fan"
- Click "Download"
- Restart Home Assistant
- Add integration via Configuration → Integrations → Add Integration
- Copy the
custom_components/qstream/directory to your Home Assistantconfig/custom_components/directory - Restart Home Assistant
- Add integration via Configuration → Integrations → Add Integration
- Navigate to Configuration → Integrations
- Click "+ Add Integration"
- Search for "QStream"
- Enter your device's IP address or hostname (e.g.,
192.168.1.100) - Optionally provide a friendly name (defaults to "QStream Fan")
- Click Submit
The integration will validate the connection and create all entities automatically.
Turn on fan at 75% when humidity exceeds 70%:
automation:
- alias: "Bathroom Fan Auto On"
trigger:
- platform: numeric_state
entity_id: sensor.bathroom_humidity
above: 70
action:
- service: fan.set_percentage
target:
entity_id: fan.qstream_fan
data:
percentage: 75Enable demand control during the day:
automation:
- alias: "Enable Demand Control Morning"
trigger:
- platform: time
at: "07:00:00"
action:
- service: switch.turn_on
target:
entity_id: switch.qstream_fan_demand_controlNotify when air quality is poor:
automation:
- alias: "Poor Air Quality Alert"
trigger:
- platform: numeric_state
entity_id: sensor.qstream_fan_air_quality
above: 150
action:
- service: notify.mobile_app
data:
message: "Air quality is poor (AQI: {{ states('sensor.qstream_fan_air_quality') }})"- Verify device IP address is correct
- Ensure device is powered on and connected to network
- Check firewall rules allow communication on port 80
- Try pinging the device from Home Assistant host
- Check Home Assistant logs for connection errors
- Verify device hasn't changed IP address (consider DHCP reservation)
- Restart integration from Configuration → Integrations
Preset modes map to device levels 1-4, which are user-configurable on the device itself. Check device settings and adjust levels as needed.
This repository includes project-specific skills for Claude Code to help with development workflows.
Setup: See .claude/README.md for installation instructions.
Available skills:
/qstream:cutting-a-release- Automate releases with safety checks and version management
See docs/skills/README.md for detailed documentation.
pytest tests/ -vruff check custom_components/qstream/mypy custom_components/qstream/- Report bugs: GitHub Issues
- Feature requests: GitHub Discussions
MIT License - see LICENSE file for details
- Built using the qstream Python library
- Community reverse-engineered QStream 2.0 API (not officially supported by BUVA)
This integration is not affiliated with or endorsed by BUVA. Use at your own risk.