Skip to content

Latest commit

 

History

18 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Paul Novus — Home Assistant integration

Read a Paul / Zehnder Novus (F) 300 / 450 heat-recovery ventilation unit in Home Assistant over its internal RS485 bus, via a cheap USB-RS485 adapter.

Modern config-flow integration (added from the UI, no YAML), passive read only — nothing is ever written to the bus.

Validate

Entities

Entity Type Notes
Supply air temperature sensor (°C) air blown into the rooms
Outdoor air temperature sensor (°C) fresh air intake
Extract air temperature sensor (°C) stale air pulled from the rooms
Exhaust air temperature sensor (°C) air rejected outside
Heat recovery efficiency sensor (%) (supply − outdoor) / (extract − outdoor) × 100
Bypass binary_sensor on = bypass open (heat recovery off, e.g. summer free-cooling)
Ventilation level sensor 1 / 2 / 3, 4 = boost. The unit only broadcasts this on change, so the value is restored across restarts.
Total service time sensor (h) lifetime hours; a formatted attribute gives Y years D days H h M min
Fan operating time sensor (h) lifetime fan hours; same formatted attribute
Reconnect button reloads the integration — re-opens the port and re-detects the framing (e.g. after re-plugging the adapter)

All entities are grouped under a single Paul Novus device and update by push as soon as a frame is decoded from the bus.

Device details (model / bus version / serial number) are filled in automatically the next time the ventilation unit reboots (power cycle) while Home Assistant is running — the unit then broadcasts its identification on the bus and the integration enriches the device page.

Hardware & wiring

You only need a USB-RS485 adapter (FT232 / CH340 / CP210x all work). Two that were used with this integration:

  • Waveshare USB TO RS485/422 (Isolated, industrial grade)recommended for a permanent install. Galvanic isolation + TVS protection guard against bus shorts and ground loops, and it is DIN-rail / wall mountable (FT232RL + SP485EEN). It enumerates as an FTDI device, which needs MARK-parity framing — detected automatically (see Serial framing below).
  • RUNCCI-YUN USB to RS485 (CH340-based) — inexpensive, used during the initial development.

Any equivalent A / B (/ GND) adapter works.

Connecting to the bus — the Novus exposes its internal RS485 bus on RJ45 connectors (the CAT5 "internal RS485-BUS", see the Novus manual). Tap it in parallel via a free RJ45 / an RJ45 splitter on the bus:

  • Wire the adapter's A and B to the bus RS485 data pair. On the units seen so far it is the centre pair, RJ45 pins 4 & 5. ⚠️ Don't trust wire colours — patch cables don't always follow T568A/B, so the data pair can be blue + white/blue on one cable and, say, orange + blue on another. Go by the pins, or simply try pairs until frames decode.
  • A/B are interchangeable — if no frames are read, swap them (that, or the framing, is by far the most common issue).
  • Add GND if your adapter has one — recommended for isolated adapters, which otherwise float and may receive bytes that never pass CRC.
  • Reading is passive: the adapter only listens, it never drives the bus.
  • If your unit uses the Paul "adapter board" (the small clear box that links the control panels to the bus), it has two RJ45 jacks: one goes to the unit, the other is a convenient free jack to tap — the RS485 pair is on pins 4-5 there too.

Serial framing (auto-detected) — the protocol is emitted as 9600 8-MARK-1. Depending on the USB-serial chip and OS, the bytes only decode with MARK parity (e.g. FTDI on Linux) or plain 8N1 (e.g. CH340, or macOS which rejects PARITY_MARK — there MARK is the idle/stop level, so 8N1 still yields valid CRCs). You don't have to pick: the integration auto-detects the framing at connect — it tries 8-MARK-1 then 8N1 and locks onto whichever produces CRC-valid frames. If it can't read anything for ~5 min it stops retrying; press the Reconnect button (see the entities table) or reload the integration to try again.

⚠️ Power / USB warning. Some USB-RS485 adapters draw enough inrush current to disturb the host's USB controller when hot-plugged. If you run other USB dongles (e.g. a Zigbee coordinator) on the same machine, plugging the adapter can momentarily knock them offline. Prefer a powered USB hub, avoid hot-plugging on a busy port, and reference the adapter by its stable /dev/serial/by-id/... path.

Installation (HACS, custom repository)

  1. HACS → ⋮ → Custom repositories → add https://github.com/lbaey/ha-paul-novus, category Integration.
  2. Install Paul Novus, then restart Home Assistant.
  3. Settings → Devices & Services → Add Integration → Paul Novus, pick the serial port (or paste a /dev/serial/by-id/... path).

How it works

The unit continuously broadcasts frames on the bus. This integration sniffs them passively and decodes the CRC-valid ones (all cmd 0x85, CRC16-CCITT):

  • Temperaturessub 0x44, 25 bytes, four 4-byte blocks; each value = byte[2] / 10 + signed(byte[3]) × 25.6.
  • Bypasssub 0x1a; the high nibble of the state byte marks it open.
  • Ventilation levelsub 0x28, last byte = level (1-3, 4 = boost). Sent only on change.
  • Service / fan hourssub 0x26 (periodic); a duration = [min][hour] [days u16 LE][years]. Register 0x26 = total service time, register 0x85 in the same frame = fan operating time.
  • Identificationsub 0x00 (at boot): bus version + master serial number, used to enrich the device page.

Roadmap

Only validated decodings are shipped. Known but not yet exposed (config data is only broadcast at unit boot, or possibly on TFT-panel navigation):

  • Filter life — preset interval lives in a boot register (e.g. 180 days); the "days remaining" register can only be pinned once it reads a non-zero value (i.e. after a filter reset).
  • Configured level percentages (e.g. 20/50/80 %) and boost duration — present in the boot register dump; a live airflow % would instead come from measuring the 0-10 V output on the X10 terminal.
  • Defroster / fault status — need a capture in the matching condition.
  • Control (boost, airflow, setpoints) — would require writing to the bus; intentionally out of scope for now (this integration is read-only).

Credits

This work stands on the community reverse-engineering of the Paul Novus RS485 protocol:

License

MIT © 2026 Laurent Baey. Not affiliated with Paul, Zehnder, or Home Assistant.

About

Home Assistant integration for Paul/Zehnder Novus 300/450 ventilation over RS485 (config flow, read-only)

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages