Capability tables
Evaluate and get help / Capability tables
These tables list what the code implements: the object types it can construct, the services each surface executes, initiates or sends, and the data links each artifact is built with. They are generated from the code, not written by hand. A row records a capability, not tested behaviour and not interoperability with other vendors’ devices: read what a result proves before relying on one, and generate a PICS to describe a configured device. The sample PICS shows that output for one reference configuration, a database holding one object of each type below.
Constructible object types
Section titled “Constructible object types”Each row is a type that bacnet-objects can construct, one object of each from its catalogue (bacnet_objects::catalogue::representatives), and whether the full server’s CreateObject and DeleteObject reach it, as its PICS generator reports. The count is of constructible types. It is not a count of tested behaviour: a row says the type exists and a server can hold it, not that every property behaves as a test suite expects. The caption names the standard types the crate doesn’t build.
| Object type | Type number | CreateObject | DeleteObject |
|---|---|---|---|
| Analog Input | 0 | Yes | Yes |
| Analog Output | 1 | Yes | Yes |
| Analog Value | 2 | No | Yes |
| Binary Input | 3 | Yes | Yes |
| Binary Output | 4 | Yes | Yes |
| Binary Value | 5 | Yes | Yes |
| Calendar | 6 | No | Yes |
| Command | 7 | No | Yes |
| Device | 8 | No | No |
| Event Enrollment | 9 | No | Yes |
| File | 10 | No | Yes |
| Group | 11 | No | Yes |
| Loop | 12 | No | Yes |
| Multi State Input | 13 | Yes | Yes |
| Multi State Output | 14 | Yes | Yes |
| Notification Class | 15 | No | Yes |
| Program | 16 | No | Yes |
| Schedule | 17 | No | Yes |
| Averaging | 18 | No | Yes |
| Multi State Value | 19 | Yes | Yes |
| Trend Log | 20 | No | Yes |
| Life Safety Point | 21 | No | Yes |
| Life Safety Zone | 22 | No | Yes |
| Accumulator | 23 | No | Yes |
| Pulse Converter | 24 | No | Yes |
| Event Log | 25 | No | Yes |
| Global Group | 26 | No | Yes |
| Trend Log Multiple | 27 | No | Yes |
| Load Control | 28 | No | Yes |
| Structured View | 29 | No | Yes |
| Access Door | 30 | No | Yes |
| Timer | 31 | No | Yes |
| Access Credential | 32 | No | Yes |
| Access Point | 33 | No | Yes |
| Access Rights | 34 | No | Yes |
| Access User | 35 | No | Yes |
| Access Zone | 36 | No | Yes |
| Credential Data Input | 37 | No | Yes |
| Bitstring Value | 39 | No | Yes |
| Characterstring Value | 40 | No | Yes |
| Datepattern Value | 41 | No | Yes |
| Date Value | 42 | No | Yes |
| Datetimepattern Value | 43 | No | Yes |
| Datetime Value | 44 | No | Yes |
| Integer Value | 45 | No | Yes |
| Large Analog Value | 46 | No | Yes |
| Octetstring Value | 47 | No | Yes |
| Positive Integer Value | 48 | No | Yes |
| Timepattern Value | 49 | No | Yes |
| Time Value | 50 | No | Yes |
| Notification Forwarder | 51 | No | Yes |
| Alert Enrollment | 52 | No | Yes |
| Channel | 53 | No | Yes |
| Lighting Output | 54 | No | Yes |
| Binary Lighting Output | 55 | No | Yes |
| Network Port | 56 | No | No |
| Elevator Group | 57 | No | Yes |
| Escalator | 58 | No | Yes |
| Lift | 59 | No | Yes |
| Staging | 60 | No | Yes |
| Audit Log | 61 | No | Yes |
| Audit Reporter | 62 | No | Yes |
| Color | 63 | No | Yes |
| Color Temperature | 64 | No | Yes |
Services by surface
Section titled “Services by surface”Each surface is a different part of the stack, and a service in one column says nothing about another:
- Full server executes: what
bacnet-serverruns when a request arrives (bacnet_objects::device::EXECUTED_SERVICES, which a test ties to its dispatch). Its Device object advertises the same list. - Full server initiates: the requests the server can build and send itself, its PICS initiator column (
PicsGenerator::INITIATED_SERVICES, which a test ties to the server’s outbound requests). Some go out only when configured: COV and event notifications need a subscription or a recipient, audit notifications need audit reporting, and WriteProperty, ReadProperty and Who-Is need a Command action or a Channel member in another device. - Client sends: the services a
bacnet-clientmethod sends (bacnet_client::client::SENT_SERVICES, which a test ties to the methods).confirmed_requestandunconfirmed_requestsend any other service from octets the application encodes. An application that runs a client beside a server initiates both columns. - Endpoint responder executes: the bounded responder a shared endpoint runs instead of the full server (
bacnet_endpoint::RESPONDER_SERVICES). An opt-in row names theEndpointSessionmethod that turns it on. The column lists only what the responder executes; the endpoint also sends some services itself, such as I-Am and audit notifications. - Python client sends: the methods of the Python
BACnetClient, matched to services by name in the type stub. Some of them, such as the VT, text message and private transfer methods, send through the Rust client’s genericconfirmed_requestandunconfirmed_request, so Python shows Yes where the Rust client shows No. The PythonBACnetServerwraps the full server.
| Service | Full server executes | Full server initiates | Client sends | Endpoint responder executes | Python client sends |
|---|---|---|---|---|---|
| AcknowledgeAlarm | Yes | No | Yes | No | Yes |
| AddListElement | Yes | No | Yes | No | Yes |
| AtomicReadFile | Yes | No | Yes | No | Yes |
| AtomicWriteFile | Yes | No | Yes | No | Yes |
| AuditLogQuery | Yes | No | Yes | No | Yes |
| ConfirmedAuditNotification | Yes | Yes | Yes | No | Yes |
| ConfirmedCOVNotification | No | Yes | No | No | No |
| ConfirmedCOVNotificationMultiple | No | Yes | No | No | No |
| ConfirmedEventNotification | Yes | Yes | No | No | No |
| ConfirmedPrivateTransfer | No | No | No | No | Yes |
| ConfirmedTextMessage | Yes | No | No | No | Yes |
| CreateObject | Yes | No | Yes | No | Yes |
| DeleteObject | Yes | No | Yes | No | Yes |
| DeviceCommunicationControl | Yes | No | Yes | No | Yes |
| GetAlarmSummary | Yes | No | Yes | No | Yes |
| GetEnrollmentSummary | Yes | No | Yes | No | Yes |
| GetEventInformation | Yes | No | Yes | No | Yes |
| LifeSafetyOperation | Yes | No | No | No | Yes |
| ReadProperty | Yes | Yes | Yes | Always | Yes |
| ReadPropertyMultiple | Yes | No | Yes | No | Yes |
| ReadRange | Yes | No | Yes | No | Yes |
| ReinitializeDevice | Yes | No | Yes | Opt-in: with_reinitialize() | Yes |
| RemoveListElement | Yes | No | Yes | No | Yes |
| SubscribeCOV | Yes | No | Yes | No | Yes |
| SubscribeCOVProperty | Yes | No | Yes | No | No |
| SubscribeCOVPropertyMultiple | Yes | No | No | No | Yes |
| VT-Close | No | No | No | No | Yes |
| VT-Data | No | No | No | No | Yes |
| VT-Open | No | No | No | No | Yes |
| WriteProperty | Yes | Yes | Yes | Opt-in: with_device_writes() | Yes |
| WritePropertyMultiple | Yes | No | Yes | No | Yes |
| Service | Full server executes | Full server initiates | Client sends | Endpoint responder executes | Python client sends |
|---|---|---|---|---|---|
| I-Am | No | Yes | No | No | No |
| I-Have | No | Yes | No | No | No |
| TimeSynchronization | Yes | No | Yes | No | Yes |
| UTCTimeSynchronization | Yes | No | Yes | No | Yes |
| UnconfirmedAuditNotification | Yes | Yes | Yes | No | Yes |
| UnconfirmedCOVNotification | No | Yes | No | No | No |
| UnconfirmedCOVNotificationMultiple | No | Yes | No | No | No |
| UnconfirmedEventNotification | Yes | Yes | No | No | No |
| UnconfirmedPrivateTransfer | No | No | No | No | Yes |
| UnconfirmedTextMessage | Yes | No | No | No | Yes |
| Who-Am-I | No | No | No | No | Yes |
| WhoHas | Yes | No | Yes | No | Yes |
| WhoIs | Yes | Yes | Yes | No | Yes |
| WriteGroup | Yes | No | Yes | No | Yes |
Data links by artifact
Section titled “Data links by artifact”A Rust application picks the bacnet-transport features it builds. The Python wheel and the CLI executables are built with fixed features, which the generator resolves from their manifests and from the release build’s list of CLI features for each target. Transport boundaries gives each link’s platform limits and evidence.
| Data link | Rust: bacnet-transport feature | Python wheel | CLI release executable |
|---|---|---|---|
| BACnet/IP (Annex J) | Always built | Yes | Every release target |
| BACnet/IPv6 (Annex U) | ipv6 | Yes | Every release target |
| BACnet/SC (Annex AB) | sc-tls | Yes | Every release target |
| MS/TP (Clause 9) | serial | Yes | aarch64-unknown-linux-gnu, x86_64-unknown-linux-gnu |
| BACnet Ethernet (Clause 7) | ethernet | No | No |
Known gaps
Section titled “Known gaps”A missing object type, service or data-link behaviour is tracked as an issue with the conformance-gap label, where its evidence and discussion live. This page keeps no list of its own: see the open gaps.
How the tables are made
Section titled “How the tables are made”A generator in the integration tests builds the page’s data file, and the sample PICS, from the object catalogue and the PICS generator, the service lists named above, the Python type stub, and the Cargo manifests and release scripts. A workspace test regenerates both and fails when a committed copy differs, so a change that adds a service, an object type or a data link has to regenerate them: run cargo run -p bacnet-integration-tests --example support-tables.
Next steps
Section titled “Next steps”Release v0.15.0 ·Build and integrate. Pre-1.0 APIs; partial conformance.Support & limitations