BACManager's gateway reads BACnet objects — from BACnet/IP controllers, and from MS/TP devices through the RS-485 port — and publishes each present value to an MQTT broker as its own retained topic. With Home Assistant discovery on, Home Assistant creates the entities by itself, with units and device classes. A setpoint changed in Home Assistant goes back to the BACnet object at the priority you choose, not as a blind overwrite. No Node-RED flow, no Python, no second box.
Windows 10/11 · one-time license · 14-day trial
Each gateway row names a BACnet object (type and instance on a device you discovered on the BACnet tab) and sends it to MQTT. Read rows publish; write rows also take commands.
This is what a subscriber to ahu1/# received from that workspace:
ahu1/status online ahu1/outdoor_air_temperature/state 3.1 ahu1/supply_air_temperature/state 19 ahu1/return_air_temperature/state 21.7 ahu1/filter_pressure_drop/state 312 ahu1/supply_airflow/state 4165 ahu1/heating_valve/state 14 ahu1/outdoor_air_damper/state 35 ahu1/supply_fan_running/state 1 ahu1/filter_alarm/state 1 ahu1/supply_air_setpoint/state 21.5 ahu1/loop_auto/state 1
| BACnet object, row mode | MQTT | Home Assistant |
|---|---|---|
| AI, AO, AV — read | <base>/<topic>/state, a number | sensor with unit and device class |
| BI, BO, BV — read | …/state, 1 or 0 | binary_sensor |
| AV (or AO) — write | state + commands on …/set | number — a setpoint you can change |
| BV (or BO) — write | state + commands on …/set | switch |
| The gateway itself | <base>/status: online / offline (last will) | availability of every entity |
Values are published when they change and again every 60 seconds, retained, so anything that subscribes later gets the current state at once. Energy rows (device class energy) are announced as total_increasing for Home Assistant's Energy dashboard. A row you delete disappears from Home Assistant, and when Home Assistant restarts the gateway announces everything again.
A commandable BACnet object has a 16-level priority array. The value that counts is the one at the strongest priority that holds something.
Each write row has its own BACnet priority — 8, Manual Operator, unless you choose another. A setpoint set in Home Assistant goes into that slot and nowhere else.
If the controller's own logic writes at a stronger priority, it keeps control and Home Assistant shows the value that actually applies — the row is read back after every write.
Each command from MQTT appears in the gateway log with the object, the value and the priority it was written at; text that is not a number writes nothing.
Writing at priority 8 leaves the value there until something relinquishes it. See the priority array explained for how relinquish and the relinquish default work, and pick the priority with the site's controls engineer.
On the BACnet tab open BACnet/IP (or MS/TP on a COM port) and run Discover. Note the device instance and the objects you want from the object list.
On the Gateway tab add a + BACnet endpoint with the device instance, then a row per object: type, instance, Dest MQTT, a topic, the unit and the Home Assistant class.
Enter the broker (Home Assistant's Mosquitto add-on, port 1883), user and password, keep discovery on, and press Start gateway. The device appears in Home Assistant under MQTT.
Eleven rows for a typical AHU: outdoor, supply and return air temperature, filter pressure drop, supply airflow, heating valve, outdoor air damper, fan running and filter alarm — plus the supply air setpoint (AV 0) and the loop's auto/manual switch (BV 0) writable from Home Assistant at priority 8. Base topic ahu1, discovery on.
Change the device instance on the endpoint and the object instances to your controller's, enter the broker, and start. The workspace matches the simulated AHU in BACManager's test set, so it also runs as-is against that simulator.
Download the free trial, load the AHU workspace, point it at your broker — the entities appear by themselves. No credit card.
Windows 10/11 · $149 one-time
We use Google Analytics cookies to see how the site is used. You can accept or decline — declining keeps analytics off.