No description
  • C++ 85.3%
  • C 14.7%
Find a file
2026-05-31 20:31:21 +00:00
include Add VP230 CAN transceiver firmware variant 2026-05-31 20:31:21 +00:00
src Add VP230 CAN transceiver firmware variant 2026-05-31 20:31:21 +00:00
.gitignore init 2026-05-31 21:35:54 +02:00
platformio.ini Add VP230 CAN transceiver firmware variant 2026-05-31 20:31:21 +00:00
README.md Add VP230 CAN transceiver firmware variant 2026-05-31 20:31:21 +00:00

Zehnder ComfoAir Q ⇄ KNX bridge for OpenKNX PiPico BCU Connector

Firmware for a Raspberry Pi Pico on the OpenKNX PiPico BCU Connector. It talks wired KNX through the NanoBCU/MicroBCU and talks to a Zehnder ComfoAir Q unit on its 50 kbit/s extended CAN bus.

There are now two CAN hardware variants:

  1. pipico_bcu_connector_mcp2515 — external MCP2515 CAN controller module.
  2. pipico_bcu_connector_vp230 — direct 3.3 V SN65HVD230/VP230 CAN transceiver module using RP2040 PIO via can2040.

Default wiring

KNX / OpenKNX PiPico BCU Connector

Already provided by the connector PCB:

  • KNX UART TX: GP0
  • KNX UART RX: GP1
  • Prog LED: GP21
  • Prog button: GP22

Variant A: MCP2515 CAN module

Defaults in include/Config.h:

  • SCK: GP2
  • MOSI/TX: GP3
  • MISO/RX: GP4
  • CS: GP5
  • INT: GP6, optional/polled
  • MCP2515 clock: 8 MHz by default (CAN_MCP_CLOCK = MCP_8MHZ)
  • CAN bitrate: 50 kbit/s

If your MCP2515 module has a 16 MHz crystal, change CAN_MCP_CLOCK to MCP_16MHZ.

Variant B: SN65HVD230 / VP230 transceiver module

Defaults in include/Config.h for pipico_bcu_connector_vp230:

  • Pico GP2 (CAN_PIN_RX) ← VP230 R / RXD
  • Pico GP3 (CAN_PIN_TX) → VP230 D / TXD
  • Pico 3V3 → VP230 VCC
  • Pico GND → VP230 GND and ComfoAir GND
  • VP230 CANH/CANL → ComfoAir CANH/CANL
  • If your board exposes RS, tie it to GND for high-speed/normal mode.

Check whether your VP230 board includes a 120 Ω termination resistor. Do not add unnecessary extra termination if the ComfoAir bus is already correctly terminated.

This variant uses can2040, a software CAN implementation using RP2040 PIO. At 50 kbit/s this should be fine, but it is more interrupt-latency-sensitive than MCP2515 hardware.

KNX addresses

All group addresses are hardcoded in include/Config.h and can be changed there.

Important command objects:

  • 7/0/1 fan level, DPT 5.010, values 0..3
  • 7/0/2 boost minutes, DPT 5.010, values 0,10,20,30,60
  • 7/0/5 extract/exhaust-only, DPT 1.001, 1=on for 1h, 0=reset
  • 7/0/6 supply-only, DPT 1.001
  • 7/0/8 update all, DPT 1.017 trigger

Status objects are under 7/1/x, temperatures/humidity under 7/2/x, fan telemetry under 7/3/x, and timers/filter under 7/4/x.

Build / flash

MCP2515 variant:

pio run -e pipico_bcu_connector_mcp2515
pio run -e pipico_bcu_connector_mcp2515 -t upload

SN65HVD230 / VP230 variant:

pio run -e pipico_bcu_connector_vp230
pio run -e pipico_bcu_connector_vp230 -t upload

Notes

  • Individual address defaults to 1.1.250; change KNX_INDIVIDUAL_ADDRESS in include/Config.h if needed.
  • No ETS product/database is required; the firmware ACKs the hardcoded group addresses directly.
  • The extract-only command uses the same payload as ventilation_extract_only in comfoair-esp32.
  • The VP230 variant depends on can2040, which is GPLv3 licensed.