I have a BACnet network that creates virtual devices behind a single static IP (192.168.2.100
). The devices are published behind that IP on the BAC0
47808
port. I use the YABE client and can see both the parent network device, and all of the devices behind it reported as being provided "via" the parent IP (192.168.2.100
). The other device IPs look like 0.8.28.77:0
, with the 77
incrementing for each device.
In case anyone is specifically familiar, this is a Daikin DCM601A71 central controller emitting BACnet IP on the local IP network. Also, to be clear, I can't change any of the underlying network, including the IPs, as it's being used by another application I can't update.
I want to control these devices programmatically. YABE is able to change the state, so it must be possible with their implementation in C#. My stack is written in python, however and I'm struggling to find the right invocation for how one would address this device when using bacpypes.
I've tried referencing just the 0.8.28.77:0
IP of the end devices to no avail. I've also tried the router (192.168.2.100
) IP with the final device's BACnet device ID with the BAC0 points functionality, but it also didn't work. Both of these just lead to timeouts which is the expected behavior for an address that's not able to be found on the network, implying this is just the wrong way to address the devices.
I've read online about BACnet internetworks, and it seems like I may need to also include a network number for the devices, but I don't know how to tell what the devices' network numbers are. I'm also not sure if appending the network number in front of the address works for BACnet IP the way it does for BACnet MS/TP.
My research has also mentioned BBMD multiple times. I have been assuming this isn't necessary because my device is on 192.168.2.0
, same as the router. If I'm mistaken and I still need to use BBMD to access the virtual devices behind the router please let me know.
This is not a BBMD issue, but a routing one.
Your virtual device is behind a BACnet Router (192.168.2.100), so your message, to get to the "end device" has to be sent to the BACnet Router, but also needs to include the final "Destination Address" or "DADR" (NN:ADR) in the NPCI part of the NPDU.
These DADR parameters can be established by looking at the SADR (Source Address) parameters of any message from the device in question. (Look at e.g. Wireshark) after e.g. a Who-Is. (This is what YABE does in order to establish the route to the device).
This is covered in section 6.5.3 "Network Layer Procedures for the Transmission of Remote Traffic"
PS: You will discover that your virtual devices "BACnet_Address" (NN:ADR) will include the Network Number (NN). This will be a configuration parameter in your system, and this NN will have to be unique (different to all other NNs) on a BACnet system. The ADR can be 1-6 bytes, in your case it is probably 6 bytes, attempting to be displayed as an IP:Port (0.8.28.77:0), but could be 4, 3 bytes inappropriately displayed.