BACnet/IP object server
OmniBus can present itself as a single BACnet/IP device that aggregates the decoded points of every port — plus the gateway's own health — under one Device object. A supervisor (a Niagara JACE, a BMS front-end, or any BACnet client) discovers the appliance with Who-Is, then reads, writes, and subscribes to its points like any other BACnet device. It's the BACnet sibling of the Modbus/TCP server, configured the same way: a shared, device-wide service that ports opt into.
Enable it on the BACnet page, then turn on BACnet output for each port whose points you want exposed.
The object server and a BACnet MS/TP↔IP bridge can't share the BVLC UDP port (47808) — they're mutually exclusive. Run one or the other. OmniBus refuses to start the server with a clear message if an enabled MS/TP bridge already owns the port, rather than failing with a raw address-in-use error.
How points map to objects
Each decoded point becomes an object, with the type chosen by its value type and direction — numerics become Analog objects, booleans become Binary, and the read-only-vs-writable split decides Input (read-only) vs. Value (commandable):
| Point | BACnet object | Access |
|---|---|---|
| numeric, read-only | Analog Input (AI) | read-only present-value |
| numeric, writable | Analog Value (AV) | commandable present-value (WriteProperty) |
| boolean, read-only | Binary Input (BI) | read-only present-value |
| boolean, writable | Binary Value (BV) | commandable present-value (WriteProperty) |
| string | — | not exposed |
Analog objects carry the point's engineering units (°C, %, kWh, …) when the adapter reports them, so a supervisor renders values with the right unit instead of a bare number. Each object's present-value tracks the latest decoded value.
Discovery and the object list
Unlike Modbus, BACnet is self-describing — you don't configure fixed addresses on the supervisor:
- On a Who-Is, the server answers with I-Am (unicast to the asker), so a supervisor's discovery finds the device. (Unsolicited broadcast I-Am on startup is a later refinement; a directed Who-Is or reading the device by instance always works.)
- It serves ReadProperty and ReadPropertyMultiple (batch reads), and exposes each object's property-list, so a BACnet explorer can enumerate the points and read their live values without a point list from you.
- Object instance numbers are assigned automatically and are stable across restarts (persisted) — each port (and the built-in system group) gets its own contiguous block, so a port's points stay grouped and a supervisor's discovered references don't churn when the box reboots or you rename a port.
Device-status objects
With Publish device status objects on (the default), the gateway's own health
is exposed as read-only AI/BI objects named System/<metric> — uptime, CPU
temperature, memory, disk, NTP sync, throttling, and port counts — so a
supervisor can monitor the appliance itself with no per-port configuration. This
is the same canonical metric set the MQTT and
Prometheus exporters publish.
Settings
On the BACnet page:
- Enable BACnet/IP object server — master on/off for the service.
- Publish device status objects — exposes the
System/<metric>health objects described above. On by default. - BVLC port — the BACnet/IP UDP port (default 47808). Can't be shared with an MS/TP↔IP bridge (see the note above).
- Device instance — the BACnet Device object instance; blank = derived automatically from the device id. Set it to fit your site's numbering plan.
- Object name — the Device object name; blank =
OmniBus-<id>. - Model name / Vendor name / Vendor ID — identity properties a
supervisor displays. Vendor ID defaults to
0until an ASHRAE-assigned ID is configured.
Writing back
Writing a Value object's present-value (AV / BV) with WriteProperty routes the command to the adapter, which actually drives the equipment — the adapter stays the source of truth and refreshes the present-value on its next poll. WriteProperty to anything that isn't a writable point's present-value returns a BACnet error. Many control paths default to dry-run; confirm a port's write path is live before expecting commands to take effect.
Change-of-value (COV)
The server accepts SubscribeCOV and pushes COV notifications when a subscribed object's value changes, so a supervisor can get event-driven updates instead of polling every point. (Modbus, by contrast, is poll-only.)
Limits
- One Device object hosts the whole point set.
- Can't coexist with an MS/TP↔IP bridge on the same BVLC UDP port — run one BACnet role per port.
- Unsolicited broadcast I-Am on startup isn't sent yet; discovery relies on the supervisor's Who-Is (which is answered).
- Strings aren't exposed as objects.
- APDUs are unsegmented (max ~1476 bytes) — use ReadPropertyMultiple to batch large reads efficiently.