A custom Home Assistant integration for Swidget ERV (Energy Recovery Ventilator) controllers. Communicates entirely over the local HTTP API — no cloud required.
Note: The existing
haswidget2integration does not support ERV devices (pesna_fv05host type). This integration was built specifically for them.
- Fan control — Turn the exhaust fan on/off, set speed by preset CFM values or percentage
- Boost mode — Run the fan at full power with a single toggle
- Light control — Toggle the optional light output
- Power monitoring — Real-time and average wattage sensors
- Exhaust CFM — Dedicated sensor for airflow graphing
- Condensation status — Monitor the condensation management module
- Diagnostics — Wi-Fi signal strength and self-diagnostic sensors
- Auto-discovery — Devices are detected via SSDP and DHCP
- Open HACS in Home Assistant
- Go to Integrations → ⋮ (top right) → Custom repositories
- Add this repository URL:
https://github.com/simplytoast1/ha-swidget-fansand select category Integration - Search for "Swidget ERV" and install
- Restart Home Assistant
- Copy the
custom_components/swidget_ervfolder into your Home Assistantconfig/custom_components/directory - Restart Home Assistant
If your Swidget ERV device is on the same network, it may be discovered automatically via SSDP or DHCP. You'll see a notification in Home Assistant prompting you to configure it.
- Go to Settings → Devices & Services → Add Integration
- Search for "Swidget ERV"
- Enter the device's IP address
- Optionally enter the access key (if one was set during device provisioning)
Once configured, the integration creates the following entities:
| Entity | Type | Description |
|---|---|---|
| Exhaust Fan | fan |
Main fan control — on/off, speed presets (CFM), percentage |
| Boost | switch |
Full power mode — turning off also stops the fan |
| Light | switch |
Toggle light output on/off |
| Power | sensor |
Current power consumption (W) |
| Average Power | sensor |
Average power consumption (W) |
| Exhaust CFM | sensor |
Current exhaust airflow rate |
| Wi-Fi Signal | sensor |
RSSI signal strength (dBm) |
| Condensation | sensor |
Condensation module status |
| Self-Diagnostic | sensor |
Device health (0 = healthy) |
| Entities are created dynamically based on what the device reports. If your device doesn't have a particular function (e.g. light), that entity won't be created. |
The ERV only accepts specific CFM values. These are exposed as preset modes on the fan entity:
50 · 60 · 70 · 80 · 90 · 100 · 110 · 120 · 130 · 150
You can also use percentage-based speed control — percentages are mapped to the nearest allowed CFM step. Setting the fan to 0% (or turning it off) sets CFM to 0.
This integration communicates with the device over its local HTTP API:
| Endpoint | Method | Purpose |
|---|---|---|
/api/v1/summary |
GET | Device identity and capabilities |
/api/v1/state |
GET | Current device state (poll interval configurable in UI) |
/api/v1/command |
POST | Send control commands |
No cloud account or internet connection is needed. The device must be reachable on your local network.
- Ensure the device is on the same network/VLAN as Home Assistant
- Try manual setup with the device's IP address
- Check that the device is powered on and connected to Wi-Fi
- Verify the IP address is correct
- Check if the device has an access key set — enter it in the password field
- Ensure no firewall is blocking HTTP traffic to the device
- The device may be offline or unreachable
- Check your network connectivity
- The integration will automatically recover when the device comes back online
Contributions are welcome! Some areas that could use exploration:
- Timer function — The device reports a "timer" function but the command format is unknown
- Raw function — Purpose unknown
- Condensation states — Only "dormant" has been observed so far
This project is licensed under the MIT License.