Profiair (KWL Fraenkische Rohrwerke) Custom Integration

profi-air (Fränkische Rohrwerke) — local KWL integration with self-learning diagnostics

A Home Assistant custom integration for Fränkische profi-air ventilation units (KWL / MVHR). Fully local, no cloud, no firmware changes to the device.

It started because I wanted my profi-air 400 touch in Home Assistant. It ended up doing rather more than that — the interesting part turned out to be not reading the device, but understanding it.


The bug that shaped the project

My summer night-cooling automation ran every night: fans to level 4, bypass open, pull cool night air through the house. But the sensor tracking “how much did we actually cool?” kept showing Unknown for weeks. The automation was clearly working. The measurement was lying.

It turned out the unit silently drops from level 4 after about two hours, and my automation corrects it within seconds. A 30-second poll occasionally landed exactly in that brief correction window — and the session-based measurement treated each blip as the end of a cooling session, shattering one good night into fragments that never crossed the threshold.

The fix was to stop thinking in “sessions” and measure the net temperature drop across a fixed 22:00–07:00 window, regardless of interruptions. If you’ve ever had an automation that works while the metric about it lies to you, you’ll know why that was satisfying to chase down.

That’s the spirit of the whole thing: not just exposing registers, but making the numbers mean something.


What it does

Control & monitoring (all models)

  • Fan level control, bypass control
  • All four air temperatures, humidity, VOC/CO₂ where the hardware has them
  • Filter and annual-maintenance reminders as proper HA repair issues
  • Energy tracking for the HA Energy Dashboard

Self-learning analytics — the part I’m actually proud of

Instead of hard-coded thresholds, the integration builds its own baselines per fan level and per season, then flags deviations from your unit’s normal:

  • Filter clogging detection — rising fan RPM at the same level means rising filter resistance. It catches this before the time-based filter interval does, which matters in dusty or high-pollen homes.
  • Heat-recovery efficiency drift — notices when the exchanger underperforms its own seasonal norm
  • Bearing wear vs. clogging — same RPM baseline, opposite directions, told apart
  • Bypass diagnostics — leak detection, actuator hunting, summer bypass recommendation
  • Night-cooling effectiveness — K cooled per night, efficiency in K/h, plus an “inactive nights” counter that catches a silently broken automation early

Everything self-calibrates over a few weeks. No calibration ritual required from you.


Supported devices

Protocol is auto-detected — HTTP first (touch), then Modbus TCP (flex/flat). You just point it at the unit’s IP.

Device Protocol Status
profi-air 250 / 400 touch HTTP :white_check_mark: Validated on a real 400 touch
profi-air 360 flex Modbus TCP :white_check_mark: Confirmed on real hardware
profi-air 130 flat Modbus TCP :white_check_mark: Confirmed on real hardware
profi-air 250 flex Modbus TCP :gear: From documentation — hardware feedback welcome
profi-air 180 flat Modbus TCP :gear: From documentation — hardware feedback welcome

The flex/flat side was built entirely from the official Fränkische Modbus documentation. Community members with real hardware have since confirmed the 360 flex and the 130 flat — including one register-level bug where newer firmware moved the device-type byte, which took a full register dump to pin down. That’s the kind of help that makes this work.


Install

HACS → custom repository:

https://github.com/johnnyh1975/ha-profiair


Help wanted

If you own a 250 flex or 180 flat — the two models still only validated against documentation — I’d really value a quick report. Even “it sets up and the temperatures look right” is useful data. If setup fails, the error message now shows the raw System-ID, which is usually all I need to add support.

Feedback, issues and register dumps all welcome. :slightly_smiling_face:

[Release] profi-air (Fränkische Rohrwerke) v2.0.0 — now with flex and flat support (Modbus TCP)

Hi everyone,

I'm happy to announce v2.0.0 of my Home Assistant integration for Fränkische Rohrwerke profi-air ventilation units. This is a major release that extends support beyond the touch series to the newer flex and flat devices.


What's new

Supported devices

Device Protocol Status
profi-air 400 touch HTTP XML :white_check_mark: Unchanged
profi-air 250 touch HTTP XML :white_check_mark: Unchanged
profi-air 360 flex Modbus TCP :white_check_mark: New in v2.0.0
profi-air 250 flex Modbus TCP :white_check_mark: New in v2.0.0
profi-air 180 flat Modbus TCP :warning: New — experimental

No manual protocol selection needed. The integration auto-detects your device: it tries HTTP first (touch), then falls back to Modbus (flex/flat). Just enter the IP address and it figures out the rest.


What flex/flat users get

  • Temperatures — all four air streams (outdoor, supply, extract, exhaust) plus optional room temperature via wireless remote
  • Operating mode — read and control from HA: Manual, Demand-controlled, Weekly schedule, Away, Summer, Night, Fireplace
  • Alarm monitoring — all alarm codes E1–E15 as a text sensor, binary alarm_active entity, and a clear button
  • Filter management — remaining days sensor, configurable service interval (30–360 days), reset button
  • Optional sensors — VOC, relative humidity, CO₂ when hardware is installed (auto-detected on first poll)
  • Diagnostics — frost risk, bypass leaking, motor asymmetry, bypass recommendation (same as touch)
  • Annual maintenance alert — repair issue at 8760 operating hours with a fix flow that resets the counter

:warning: Known limitation: fan level control

Fan level changes are not yet available for flex/flat devices. The Modbus FC16 write block format for level changes needs to be confirmed from hardware. Everything else works — reading, mode selection, filter management, alarm handling. Level control will follow in v2.0.1.

If you have a flex device and can capture Modbus traffic while changing the level from the display (e.g. with Wireshark or a Modbus sniffer), that would unblock this immediately — please reach out!


For existing touch users

Nothing changes. Your setup, entities, automations and energy dashboard all carry over. The integration does run an automatic migration on first start (adds a protocol field to the config entry and fixes the fan entity ID if needed) — this is silent and takes under a second.

Installer credentials are now optional: you can skip them at setup time for read-only mode, useful if you don't have the installer password.


Installation

HACS (recommended):

Add as a custom repository:

https://github.com/johnnyh1975/ha-profiair

Category: Integration

Manual: download the release zip, extract custom_components/kwl_fraenkische/ into your HA config folder, restart.

Requires Home Assistant 2026.3 or newer.


Looking for flex testers

This is the initial release for flex and flat devices. I have a profi-air 400 touch for development but no flex hardware — all the Modbus register mapping was built from the official UVC controller documentation.

If you have a profi-air 250 or 360 flex (or a 180 flat), I'd really appreciate you giving it a try and reporting back — even a quick "sensors show up and look right" is helpful. Issues and feedback welcome on GitHub.


Links

Thanks to everyone in the community who provided feedback on earlier versions, and a special thank you to the users who shared their Modbus documentation — this release wouldn't have been possible without it.

Happy ventilating! :wind_face:

Unknown device type 195 on profi-air 360 flex

Hi,

thank you for creating this integration.

I'm trying to connect my Fränkische profi-air 360 flex using version 2.0.3 of the integration.

The connection to the unit works, but setup fails with:

"Unknown device type (Code: 195). Only profi-air 250/360 flex and 180 flat are supported."

Details:

  • Home Assistant: 2026.x
  • Integration: v2.0.3
  • Device: Fränkische profi-air 360 flex
  • Unit firmware: 3.22
  • App version: 1.0.24 build 3
  • Device type returned via Modbus: 195

Would it be possible to add support for device type 195?

If you need any additional information or Modbus register values, I'd be happy to help test.

Thanks!

1 Like

Update: flex & flat now validated on real hardware (v2.0.7)

Following up on the v2.0.0 flex/flat release above — a lot has happened since, mostly driven by people in this community sending real device data. Quick summary of where things stand now.

Real hardware, not just documentation

When v2.0.0 shipped, the flex/flat side was built entirely from the Fränkische Modbus docs and I had no flex/flat hardware myself. That’s changed:

  • A 360 flex on firmware 3.22 was being rejected as “Unknown device type 195”. It turned out newer firmware moved the device-type byte — the official docs put it in the high byte of the System-ID, older code read the low byte. Fixed, and I cross-checked all 23 registers against the documentation while at it (only that one was wrong). The 360 flex now sets up and reads correctly on real hardware.
  • A 130 flat owner sent a full register dump, which confirmed the 130 flat’s register map matches the flex models across the board — temperatures, fan RPM, filter, bypass, mode all read correctly. So the 130 flat is now validated on real hardware too, and its measured watt values ship as defaults.

So two devices are now confirmed on real hardware beyond the touch series: the 360 flex and the 130 flat.

Fan level control works now

The “not yet available, coming in v2.0.1” limitation from the v2.0.0 post is resolved — fan level control works on flex/flat (it’s exposed through the standard fan entity as a slider/presets).

Updated device status

Device Protocol Status
profi-air 250 / 400 touch HTTP :white_check_mark: Validated on a real 400 touch
profi-air 360 flex Modbus TCP :white_check_mark: Confirmed reading correctly on real hardware
profi-air 130 flat Modbus TCP :white_check_mark: Register map confirmed on real hardware
profi-air 250 flex Modbus TCP :gear: From documentation — hardware feedback welcome
profi-air 180 flat Modbus TCP :gear: From documentation — hardware feedback welcome

New since v2.0.0

  • Self-learning analytics — RPM baselines, heat-recovery efficiency drift, filter-clogging detection (rising RPM at the same fan level), bypass diagnostics, night-cooling effectiveness tracking. All of it runs on flex/flat too.
  • Energy tracking for flex/flat — per-level + total kWh for the Energy Dashboard. These units don’t report per-level hours over Modbus, so it’s a poll-based estimate (clearly labelled, disabled by default), but with measured watt values it’s reasonably close.
  • Better diagnostics — “unknown device type” errors now show the raw System-ID so they’re trivial to report, and the diagnostics download includes a full annotated register dump.

Still looking for testers

If you have a 250 flex or 180 flat — the two still only validated against documentation — I’d really value a quick report. Even “sensors show up and look right” helps. If setup fails, the raw System-ID in the error message is all I need to add support.

Repo / install (HACS custom repository): https://github.com/johnnyh1975/ha-profiair

Huge thanks to everyone who’s sent reports and register dumps — every one of these improvements came directly from that. :slightly_smiling_face: