An OpenHAB 5.x binding for BWT Perla and Rondomat Duo water softeners. It communicates with the device's local REST API to expose real-time status, water consumption statistics, and device diagnostics as OpenHAB channels.
- BWT Perla (all variants including Perla Hybrid)
- BWT Rondomat Duo
The device must have firmware version 2.02xx or higher and the local API must be enabled.
- OpenHAB 5.1.0 or later
- Java 21 runtime
- The BWT device must be on the same local network as OpenHAB
- The local API must be enabled on the device: Einstellungen > Allgemeines > Verbindung
- You need the Login Code (sent via email upon product registration with BWT)
- Download the latest JAR from Releases
- Copy the JAR to your OpenHAB
addons/folder:cp org.openhab.binding.bwtperla-5.1.0-SNAPSHOT.jar /path/to/openhab/addons/ - The binding will be loaded automatically (or restart OpenHAB)
cd org.openhab.binding.bwtperla
mvn clean packageThe JAR is produced in target/org.openhab.binding.bwtperla-5.1.0-SNAPSHOT.jar.
| Parameter | Required | Default | Description |
|---|---|---|---|
hostname |
Yes | - | IP address or hostname of the BWT device |
port |
No | 8080 | HTTP port of the device API |
password |
Yes | - | Login Code for API authentication |
currentDataPollingInterval |
No | 60 | Polling interval for current data (seconds) |
consumptionDataPollingInterval |
No | 3600 | Polling interval for consumption data (seconds) |
- Go to Settings > Things > Add Thing
- Select BWT Perla Binding
- Select BWT Perla Water Softener
- Enter the hostname/IP and Login Code
See examples/bwtperla.things for a complete example.
Thing bwtperla:device:mysoftener "Water Softener" [ hostname="192.168.1.100", password="your-login-code" ]
The binding provides 122 channels organized in 4 channel groups.
Live device status polled at currentDataPollingInterval (default: 60 seconds).
| Channel | Type | Description |
|---|---|---|
current-data#active-error-ids |
String | Comma-separated active error IDs |
current-data#show-error |
Number | Error state: 0=OK, 1=Warning, 2=Error |
current-data#out-of-service |
Switch | Device out of service |
current-data#firmware-version |
String | Firmware version |
current-data#current-flowrate |
Number:VolumetricFlowRate | Current water flow rate (l/h) |
current-data#blended-water-since-setup |
Number:Volume | Blended water since setup (l) |
current-data#water-since-setup |
Number:Volume | Total treated water since setup (l) |
current-data#water-treated-current-day |
Number:Volume | Water treated today (l) |
current-data#water-treated-current-month |
Number:Volume | Water treated this month (l) |
current-data#water-treated-current-year |
Number:Volume | Water treated this year (l) |
current-data#hardness-in-dh |
Number | Input hardness (°dH) |
current-data#hardness-in-fh |
Number | Input hardness (°fH) |
current-data#hardness-in-mmol |
Number | Input hardness (mmol/l) |
current-data#hardness-in-caco3 |
Number | Input hardness (ppm CaCO3) |
current-data#hardness-out-dh |
Number | Output hardness (°dH) |
current-data#hardness-out-fh |
Number | Output hardness (°fH) |
current-data#hardness-out-mmol |
Number | Output hardness (mmol/l) |
current-data#hardness-out-caco3 |
Number | Output hardness (ppm CaCO3) |
current-data#capacity-column1 |
Number | Remaining capacity column 1 (ml*°dH) |
current-data#capacity-column2 |
Number | Remaining capacity column 2 (ml*°dH) |
current-data#regenerativ-level |
Number:Dimensionless | Salt fill level (%) |
current-data#regenerativ-remaining-days |
Number:Time | Days until salt is empty |
current-data#regenerativ-since-setup |
Number:Mass | Salt consumed since setup (g) |
current-data#regeneration-count-column1 |
Number | Regeneration count column 1 |
current-data#regeneration-count-column2 |
Number | Regeneration count column 2 |
current-data#regeneration-count-since-setup |
Number | Total regeneration count |
current-data#last-regeneration-column1 |
DateTime | Last regeneration column 1 |
current-data#last-regeneration-column2 |
DateTime | Last regeneration column 2 |
current-data#last-service-customer |
DateTime | Last customer maintenance |
current-data#last-service-technician |
DateTime | Last technician service |
current-data#holiday-mode |
Number | Holiday mode (-1/0=off, 1=active, >1=scheduled UNIX timestamp) |
current-data#dosing-since-setup |
Number:Volume | Dosing agent consumed since setup (ml, Hybrid only) |
Water consumption per 30-minute slot for the current day, polled at consumptionDataPollingInterval.
Channels follow the pattern daily-data#slot-HHMM-HHMM (e.g., daily-data#slot-0600-0629).
All channels are Number:Volume in liters.
Water consumption per day for the current month.
Channels follow the pattern monthly-data#day-DD (e.g., monthly-data#day-15).
All channels are Number:Volume in liters.
Water consumption per month for the current year.
Channels follow the pattern yearly-data#month-MM (e.g., yearly-data#month-06).
All channels are Number:Volume in liters.
See the examples/ directory for complete .things and .items files covering all channels.
The binding communicates with the BWT device over HTTP on the local network. It uses HTTP Basic Authentication with the username user and the Login Code as the password.
Two independent polling loops run at configurable intervals:
- Current data (default: every 60 seconds) — polls
/api/GetCurrentDatafor live device status. This drives the Thing's ONLINE/OFFLINE status. - Consumption data (default: every 3600 seconds) — polls
/api/GetDailyData,/api/GetMonthlyData, and/api/GetYearlyDatafor historical water consumption. Failures here only log warnings and do not affect the Thing status.
All channels are read-only. The only supported command is REFRESH, which triggers an immediate poll of the relevant data.
The active-error-ids channel contains a comma-separated list of active error IDs. The show-error channel indicates the overall severity (0=OK, 1=Warning, 2=Error). See docs/error-codes.md for a full reference of all 37 device error codes.
This project is licensed under the Eclipse Public License 2.0.