Skip to main content

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 in bacnet_static_peers so they are found with a directed Who-Is.
  • The BACnet product in your license.

Setup steps​

  1. 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.
  2. Run who_is (or use Discover in the BACnet Explorer) to find controllers.
  3. Map zone points in the Explorer's Zone Mapping tab. Each point is a device_id,object_type,object_instance triple, for example bacnet_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 as bacnet_<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​

CommandArgumentsNotes
system_modeaddress, mode, prioritymode 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_modeaddress, mode, prioritySame rules, using the zone's fan_modes attribute.
setpointaddress, setpoint, mode, occupancyRejected when outside the zone's min / max.
get_system_mode, get_fan_mode, get_setpoint, get_temperatureaddressRead 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​

CommandArgumentAccepted values
read_valueindexArray index. Blank or -1 reads the whole property. 0 returns the array length.
write_valuetagApplication 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_valueindexArray index. Blank or -1 writes the whole property.
write_valuepriority1–16, as above.
get_objectsinclude_names, include_description, include_present_valuetrue / false, 1 / 0, yes / no and on / off are all accepted. Blank uses the default: names on, description and present value off.
time_syncutcSame 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.

CommandArgumentsBlank means
acknowledge_alarmevent_stateNo default. Supply the event state reported by get_alarm_summary or get_event_information.
reinitialize_devicestate0
device_comm_controlduration, enable_disable0, 0
read_rangestart, count0, 100
who_is_rangelow_limit, high_limitIf 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.