Protocol simulator

BACnet Simulator

Run a virtual HVAC unit over BACnet/IP. Write a setpoint, read it back and follow the supply-air temperature response.

Start in three steps

Change an HVAC setpoint over BACnet/IP, read it back and follow the supply-air temperature response.

Before you start: Install SPX with the BACnet package and SPX UI. Have a BACnet/IP client ready. This guide uses the library’s Flexit Nordic HVAC model.

1. Create a virtual HVAC unit

Open Instances → New instance. Select Building.HvacFlexitNordic.Bacnet, or your imported registry name. Use an unused name, such as demo_bacnet_hvac. Keep device ID 2 and UDP port 47808. Choose Create, then Start instance. Confirm RUNNING.

Model not listed?

Download the linked YAML. In Models → Load model from file, import it under a registry name of your choice. Select that name in New instance. The dotted name in our screenshots is a registry label, not the YAML filename.

SPX New Instance dialog selecting Building.HvacFlexitNordic.Bacnet and the name demo_bacnet_hvac.
Use the library HVAC model to test a setpoint write and its temperature response. Open full size

2. Connect and change the setpoint

Open Communication → bacnet. Point your client at the reachable SPX host on UDP 47808. Publish that UDP port when using Docker. Use a direct connection if broadcast discovery does not cross your network boundary.

Read supply temperature at analogInput:4 / presentValue. In Attributes, select supply_air_temp_c and active_air_temp_setpoint_c with a shared °C axis and 1000 ms chart rate.

Write Real 22.5 to analogValue:1994 / presentValue and active to binaryValue:445 / presentValue. Read both properties back. The communication reference explains object types and acknowledgements.

SPX BACnet adapter enabled on UDP port 47808, beside the HVAC temperature and setpoint history.
0.0.0.0 is the listen address. Connect your client to the reachable SPX host. Open full size

3. Follow the heating response

Success: the setpoint reads 22.5°C, the heater reads active, and the supply temperature rises. After it settles, restore the setpoint to 19°C and the heater to inactive. The supply air cools toward the model’s unheated baseline.

Pause after the heating and cooling response, then select its time range for inspection.

Paused HVAC history: the 19 to 22.5 to 19 degree setpoint pulse, a gradual supply-temperature rise to about 22.3 degrees and cooling toward 16.7 degrees.
Shared °C axis; time in seconds. The heater-on rise and heater-off cooldown show the model’s thermal lag. Supply temperature is not the setpoint. Open full size

When finished, choose Stop instance.

Protocol communication

Use these settings and messages with the library’s Flexit Nordic HVAC model.

Client / transport
BACnet/IP → SPX_HOST:47808 over UDP; device instance 2
Property
presentValue; identify values by object type and object instance
Docker / discovery
Publish UDP 47808; use direct unicast when broadcasts cannot cross the network

Replace host placeholders with reachable addresses and use your published ports.

Swipe the table to see requests and replies.

Addresses, requests and expected replies
Address / messageOperation / payloadExpected reply
analogInput:1 / presentValueReadProperty — outside air temperatureReal in °C; nominal value 5.0
analogInput:4 / presentValueReadProperty — supply air temperature; read-onlyReal in °C; changes with heating/cooling
analogValue:1994 / presentValueReadProperty / WriteProperty — home setpointInitially 19.0°C; write Real 22.5, then read 22.5
binaryValue:445 / presentValueReadProperty / WriteProperty — heater enableBinaryPV / Enumerated: inactive (0) or active (1)

Values describe this model’s nominal setup unless noted. Live measurements change as the simulation runs.

Example request and reply

Write setpoint 22.5 and heater active, read both back, then poll analogInput:4. Restore setpoint 19.0 and heater inactive after the response.

ReadProperty analogValue:1994 presentValue → Real 19.0
WriteProperty analogValue:1994 presentValue = Real 22.5 → SimpleACK
ReadProperty analogValue:1994 presentValue → Real 22.5
WriteProperty binaryValue:445 presentValue = active → SimpleACK
ReadProperty analogInput:4 presentValue → rising temperature
Restore: analogValue:1994 = 19.0; binaryValue:445 = inactive
No reply or an unexpected value?
  • Device instance 2 is not the UDP port or object instance. Both object type and number matter: analogInput:4 differs from analogOutput:4.
  • Send a BACnet Real for the setpoint and BinaryPV/Enumerated for the heater, not text. ReadProperty returns an ACK containing the value; WriteProperty returns a SimpleACK. Read again to verify the change.
  • A UDP mapping does not guarantee Who-Is/I-Am broadcast discovery. Check the client interface/subnet, UDP mapping and reachable unicast destination.

What you can test next

  • Browse the model’s other BACnet objects and properties.
  • Compare heating response at different setpoints.
  • Verify your client’s readback and reconnection behavior.
Using an AI agent?

Give your agent this page and the linked YAML. Resolve the registered model name and reachable UDP endpoint. Read and write the exact object identifiers above using a BACnet client; verify presentValue after each write. Record supply-temperature samples, then restore setpoint 19 and heater inactive. The plotted attributes are supply_air_temp_c and active_air_temp_setpoint_c. UDP broadcast discovery may require network configuration; a published port alone does not guarantee discovery.

See the BACnet adapter guide for object bindings and network settings.