UDMI / Docs / Specs / Family Providers
UDMI abstracts various fieldbus protocols (such as BACnet, Modbus, IP, etc.) through its FamilyProvider interface. A FamilyProvider is responsible for translating local protocol-specific addressing and metadata into standardized, globally unique Uniform Resource Locators (URLs) and vice-versa.
These URLs provide a protocol-agnostic, structured path for identifying devices and data points:
<family>://<addr>/<ref>
This document details how a complete FamilyProvider URL is generated and resolved based on a device’s metadata specification and how validation constraints enforce these rules.
Every generated URL consists of three primary logical components:
| Component | Description | Mapping to Metadata | Example |
|---|---|---|---|
family |
The protocol/address family. | gateway.target.family |
bacnet or modbus |
addr |
The physical device address or host on that family. | gateway.target.addr |
1234 or modbus_rtu_1 |
ref |
The relative reference identifier of the data point. | pointset.points.<point_name>.ref |
AV:1 or 1/101?type=BOOLEAN |
The configuration manager uses a dynamic fallback strategy to resolve these components.
device)The local device address device can be defined in one of two places, but not both (defining both raises a validation error):
metadata.localnet.families.<family>.addrmetadata.gateway.target.addrThe effective device address is resolved as:
device_address = metadata.localnet.families.<family>.addr != null ? localnet.families.<family>.addr : gateway.target.addr
modbus, the effective device address (the <addr> component of the URL) must either start with an alphabetical character (e.g., modbus_rtu_1 or my-host), or be formatted as a valid 4-part IPv4 address (e.g., 192.168.1.1 — starting with a number and having 4 octets separated by dots). A purely numeric, non-IP value like "2" is invalid as a host.For standard configurations, the system constructs the complete URL by concatenating the components:
full_url = family + "://" + device_address + "/" + point_ref
url)During normalization, the registrar tool compiles the fully resolved URL for each data point and writes it to the generated metadata_norm.json file inside the pointset.points.<point_name>.url field. If there is doubt about how the configuration resolves (including fallback behaviors or relative-to-absolute expansions), the generated metadata_norm.json file can be checked to see the exact URLs that were generated.
{
"pointset": {
"points": {
"fan_run_status": {
"ref": "BI:1",
"url": "bacnet://1234/BI:1"
}
}
}
}
Because the validator constructs the URL programmatically as family + "://" + device_address + "/" + point_ref, the structure of the metadata determines whether point references can be relative or absolute.
In this pattern, a shared device/gateway target definition provides the default protocol family and target address for the device. The individual point definitions specify only their relative references.
This is the required pattern when a concrete gateway target family (e.g. "bacnet", "modbus") is specified.
{
"gateway": {
"target": {
"family": "bacnet",
"addr": "1234"
}
},
"pointset": {
"points": {
"fan_run_status": {
"ref": "BI:1"
},
"supply_air_temp": {
"ref": "AV:2"
}
}
}
}
Generated & Validated URLs:
fan_run_status: bacnet://1234/BI:1supply_air_temp: bacnet://1234/AV:2In this pattern, each individual point defines its full, absolute URL directly within its ref field.
Because the point references contain a protocol scheme (i.e., they contain ://), they bypass the default fallback combination logic. Instead of prepending the default gateway target family and target address, the system preserves the absolute reference as the fully qualified URL.
Each absolute reference is validated under the concrete protocol family provider matching its prefix (e.g., bacnet:// is strictly validated under the bacnet family provider, and modbus:// is validated under the modbus family provider). Therefore, omitting the gateway.target.family does not prevent or bypass validation for absolute URLs; they are always validated against the protocol scheme specified in their ref field.
Note: Strict protocol validation for absolute URLs can be completely disabled by setting
"vendor_ref": trueundergateway.targetin your metadata. When active, this flag tells the system to bypass all protocol-level validation checks.
{
"gateway": {
"gateway_id": "LTGW-123"
},
"pointset": {
"points": {
"fan_run_status": {
"ref": "bacnet://1234/BI:1"
},
"supply_air_temp": {
"ref": "bacnet://1234/AV:2"
}
}
}
}
Generated & Validated URLs:
fan_run_status: bacnet://1234/BI:1 (Validated under "bacnet" due to the bacnet:// prefix)supply_air_temp: bacnet://1234/AV:2 (Validated under "bacnet" due to the bacnet:// prefix)The URL syntax for different address families is defined by their respective FamilyProvider implementations. Please refer to protocol-specific documentation (such as bacnet.md and modbus.md) for detailed, exhaustive specifications of their reference formats and parameters.
bacnet)An address family representing BACnet devices and objects.
bacnet1234AV:100#present_valuebacnet://1234/AV:100#present_valuemodbus)An address family representing Modbus registers.
modbus23/40005?type=UINT32&worder=LWF&scale=0.01&network=modbus_rtu_1modbus://2/3/40005?type=UINT32&worder=LWF&scale=0.01&network=modbus_rtu_1The flexibility of absolute references enables advanced topologies where one logical UDMI “device” maps to multiple physical fieldbus targets or multiple protocols.
Because these topologies mix different target addresses or families, the gateway.target.family field must be left empty or omitted. Every point must specify its full, absolute URL explicitly in its ref field.
A multi-address device represents a single logical UDMI device whose points physically reside on different physical devices on the same local fieldbus network (e.g. multiple distinct BACnet devices).
In the example below, point_a resides on BACnet device 1234, while point_b physically resides on BACnet device 5678.
{
"gateway": {
"gateway_id": "LTGW-123",
"family": "bacnet"
},
"pointset": {
"points": {
"point_a": {
"ref": "1234/AV:1"
},
"point_b": {
"ref": "5678/AV:1"
}
}
}
}
Generated & Validated URLs:
point_a: bacnet://1234/AV:1point_b: bacnet://5678/AV:1A multi-family device represents a single logical UDMI device composed of points spanning different physical networks and entirely different protocol families (e.g., a combined Modbus and BACnet device).
In the example below, the device collects data from a BACnet device (1234) and a Modbus device connected to the serial network modbus_rtu_1.
{
"gateway": {
"gateway_id": "LTGW-123"
},
"pointset": {
"points": {
"room_temperature": {
"ref": "bacnet://1234/AI:1"
},
"fan_power": {
"ref": "modbus://2/3/40001/1?type=INT16&network=modbus_rtu_1"
}
}
}
}
Generated & Validated URLs:
room_temperature: bacnet://1234/AI:1 (Validated under "bacnet" due to the bacnet:// prefix)fan_power: modbus://2/3/40001/1?type=INT16&network=modbus_rtu_1 (Validated under "modbus" due to the modbus:// prefix)