BACnet / IP
The BACnet / IP driver talks to BACnet controllers over UDP (port 47808 by default). GEM devices on the same interface and port share one BACnet/IP client (see Sharing the BACnet port), so you can add more than one BACnet / IP or Daikin DZK device. It finds controllers with Who-Is, reads and writes object properties, subscribes to change-of-value (COV), and queries alarms and priority arrays. HVAC zones are mapped to BACnet points through bacnet_*_read / bacnet_*_write zone attributes.
This page is the command reference. For discovery, browsing objects, zone mapping and diagnostics, see the BACnet Explorer.
Prerequisites
- A BACnet/IP network the GEM host can reach, usually the same VLAN.
- For controllers on another subnet: a BBMD address (
bbmd_address), or the controllers' IPs inbacnet_static_peersso they are found with a directed Who-Is. - The BACnet product in your license.
Setup steps
- Add a device in System → Devices with the BACnet / IP driver. Leave the IP blank to pick the network interface automatically, or set it to the local interface to bind to.
- Run
who_is(or use Discover in the BACnet Explorer) to find controllers. - Map zone points in the Explorer's Zone Mapping tab. Each point is a
device_id,object_type,object_instancetriple, for examplebacnet_system_mode_write = 1001,19,1. An analog that reports counts or a raw signal instead of engineering units can be given a Range scaling on the same tab, stored asbacnet_<point>_scaling— see Zone Mapping.
Command arguments
Values from saved commands, macros and the admin UI reach the driver as text. The driver converts each argument to the type BACnet needs before sending anything.
Zone commands
| Command | Arguments | Notes |
|---|---|---|
system_mode | address, mode, priority | mode is a mode number (1 auto, 2 cool, 3 heat, 4 emergency heat, 5 off) or a name from the zone's system_modes attribute. |
fan_mode | address, mode, priority | Same rules, using the zone's fan_modes attribute. |
setpoint | address, setpoint, mode, occupancy | Rejected when outside the zone's min / max. |
get_system_mode, get_fan_mode, get_setpoint, get_temperature | address | Read the mapped point and update the zone. |
Mode maps. system_modes and fan_modes can be written either way round, name to number ({"cool": 2}) or number to name ({"2": "cool"}). A mode name is looked up in the map. A mode number is always written as that number, so the 1–5 options on system_mode work whichever way round the map is written. A name that is not in the map is rejected with invalid mode.
Priority. priority is the BACnet write priority, 1 (highest) to 16. If it is blank or outside that range, the device's priority attribute is used (16 unless set).
Property commands
| Command | Argument | Accepted values |
|---|---|---|
read_value | index | Array index. Blank or -1 reads the whole property. 0 returns the array length. |
write_value | tag | Application tag number, for example 4 REAL or 9 ENUMERATED. Blank or -1 picks the tag from the value. Any other text is rejected and nothing is sent. |
write_value | index | Array index. Blank or -1 writes the whole property. |
write_value | priority | 1–16, as above. |
get_objects | include_names, include_description, include_present_value | true / false, 1 / 0, yes / no and on / off are all accepted. Blank uses the default: names on, description and present value off. |
time_sync | utc | Same true/false spellings. Blank sends local time. |
Device services
These arguments are sent as numbers. A value that is not a number is rejected with an error and nothing is sent to the device.
| Command | Arguments | Blank means |
|---|---|---|
acknowledge_alarm | event_state | No default. Supply the event state reported by get_alarm_summary or get_event_information. |
reinitialize_device | state | 0 |
device_comm_control | duration, enable_disable | 0, 0 |
read_range | start, count | 0, 100 |
who_is_range | low_limit, high_limit | If both are blank, every device is asked to answer. If only one is blank, that end of the range stays open: 0 for the low limit, 4194303 for the high limit. |
Testing status
The argument conversions above are covered by unit tests against a mocked BACnet stack. acknowledge_alarm, reinitialize_device, device_comm_control and read_range have not been re-verified against a physical controller since these conversions were added.