Tools
Free tools for reading a building's network
Two small programs, given away because they cost nothing to give. One sweeps a network for BACnet devices and dumps a device's points. One watches an MQTT broker and prints its topic tree. Both are read-only, both are one Python file, and neither needs anything installed.
- Read-only
- Python 3
- Standard library only
- One file
- No licence
Why these exist
The first hour on an unfamiliar site is always the same hour. What is on this network. What is it called. Is that value real. The tools that answer those questions well are either a vendor's, or licensed to a laptop that is not yours, or excellent and free and installed on a machine you are not allowed to install anything on.
So these two are deliberately small. A single Python file each, standard library only, nothing to install, nothing to register, and no ability to change anything in the building. Copy the file onto whatever laptop you have, run it, read the output, delete it.
They are not replacements for the tools you already use. They are narrower than all of them on purpose: a sweep and a dump, a tap and a tree. Where a general-purpose explorer is better, use the explorer — each page says so.
Both free
The two tools
bacnet-sweep
Broadcasts a BACnet/IP Who-Is, tables the devices that answer, and dumps a named device's object list — object name, present value and units — to a table or to CSV. It can encode two BACnet services and no others: Who-Is and ReadProperty.
- BACnet/IP
- Who-Is
- CSV out
mqtt-tap
Subscribes to a broker and prints what is actually on it: the topic tree with a count, a rate, a payload-type guess and the last value per topic, plus the retained topics that stopped updating. It sends five packet types and none of them is PUBLISH.
- MQTT
- Topic tree
- Retained
What “read-only” means here
It means something mechanical in both cases, not a promise about intent.
bacnet-sweep can encode two BACnet services and no others, Who-Is and
ReadProperty, and a gate function raises before any packet leaves if anything else
is ever passed to the request builder. mqtt-tap has no PUBLISH encoder
in it at all; every outbound byte goes through one function that refuses any packet
type outside CONNECT, SUBSCRIBE, PUBACK, PINGREQ and DISCONNECT, and
mqtt-tap.py --self-check makes that refusal happen in front of you.
Both files are one file, so anyone who wants to check rather than believe it can.
Read-only is not the same as no effect. A Who-Is makes every device on a subnet answer at once, and reading a large controller's object list is hundreds of requests to a device that also has a building to run. A new MQTT client that takes an identifier already in use gets the existing client disconnected, which is a way to cause an incident without publishing a byte. Both tools are built to avoid the second and to pace the first, and both pages say where it still matters.
Neither has been near real hardware
This is the honest headline and it belongs above the fold rather than in a
footnote. bacnet-sweep has never spoken to a real BACnet device;
mqtt-tap has never connected to a real broker product. Each was
proved against a fixture written from the protocol specification and run on
loopback — 194 assertions for one, 130 for the other — and every
terminal transcript on these pages is real output from that fixture, not from a
site. A real controller or a real broker will differ. Each page has a section
saying exactly what was and was not covered, and it is worth reading before you
rely on either of them for anything that matters.
Also free, and not a program
The Niagara 5 module
scan is the same idea pointed at a different problem: send a listing of a
station's modules folder and a per-module readiness table comes back.
That one we run rather than give away, because it needs a Java 25 JDK and a
rule set rather than a laptop.
Next step
Found something you now have to fix?
Send the CSV, or the topic list, and what the site is. You will get a written scope and a fixed price against it — or, if the honest answer is that this is a setting rather than a project, that instead.