A building isn’t a list of sensors. It’s a network of equipment distributing air, water, and electricity through chains: heat exchangers feeding AHUs feeding VAVs feeding zones. Each piece of equipment contains sub-components (fans, coils, dampers), attaches to sensors and setpoints, sits on a floor, and feeds a zone.This graph is what you query. Every relationship has a direction and a meaning:
Relationship
Direction
What it means
feeds / fedBy
Equipment → Equipment
Distributes a medium (air, chilled water, hot water)
The HIU (Heat Interface Unit) receives hot water from the district energy network and feeds it to the AHU’s heating coil. The AHU conditions air and feeds it to VAV boxes. Each VAV feeds a zone. The medium changes at each stage: hot water becomes conditioned air.
Query direct connections: what this equipment feeds, or what feeds it:
{ equipment(id: "TE01-XX-AHU-001") { name # What does this AHU feed? (VAV boxes) feeds { name type } # What feeds this AHU? (Heat Interface Unit) fedBy { name type } }}
upstream and downstream follow feeds chains to any depth. This is the most powerful query in the API.Upstream: “What feeds this?” Start from an endpoint and trace back to the source:
{ zone(name: "Library") { name upstream { name type } }}
One query, full chain: Library ← TW01-LBR-RPC-01 ← TW01-XX-AHU-001 ← Tower West HIU System. Without traversal, this takes four sequential API calls with stop-condition logic.Downstream: “What does this feed?” Start from a source and find everything it reaches:
{ equipment(id: "tower-east-hiu") { name downstream { name type } }}
Returns every AHU, VAV, and zone the HIU ultimately feeds.
# Only follow the hot water chain (skip air)upstream(medium: "HOT_WATER") { name type}# Only go 2 hops deepdownstream(maxDepth: 2) { name type}# Only return zones in the downstream chaindownstream(is: "HVAC_Zone") { name type}
Argument
Type
Default
Description
maxDepth
Int
unlimited
Maximum hops to traverse
medium
String
all
AIR, CHILLED_WATER, HOT_WATER, CONDENSER_WATER
is
String
all
Filter results to a Brick class (resolves subtypes)
Use partOf to go the other direction, from a component back to its parent:
equipment(id: "supply-fan-01") { name partOf { name type } # → TE01-XX-AHU-001}
parts is equipment composition (fan inside AHU). feeds is medium distribution (AHU supplies air to VAV). A supply fan is a part of the AHU, but the AHU feeds the VAV.
Zones are the spaces that equipment conditions. In Brick, a VAV box feeds one or more HVAC zones, using the same feeds relationship used between equipment. From a zone, use fedBy to find the equipment that conditions it.
# From equipment: what zones does this VAV feed?{ equipment(id: "TW01-LBR-RPC-01") { name feeds { name type } }}# From zone: what equipment feeds this zone?{ zone(name: "Library") { name fedBy { name type } }}
A zone is too warm. Is the problem the VAV, the AHU, or the HIU?
{ zone(name: "Library") { # Zone temperature: is it actually hot? points(is: "Zone_Air_Temperature_Sensor") { timeseriesId } # Trace the full supply chain, reading temperatures at every level upstream { name type points(is: "Temperature_Sensor") { type timeseriesId } } }}
Read the response top-down: if Library is 26°C but the AHU supply air is 14°C, the problem is the VAV (damper stuck, reheat on). If the AHU supply air is also 22°C, the problem is upstream, so check the HIU.
Get everything about an AHU: its parts, their sensors, what it feeds, what feeds it, and where it is:
{ equipment(id: "TE01-XX-AHU-001") { name type location { name } # What's inside this AHU parts { name type points(is: "Sensor") { type timeseriesId } } # What feeds this AHU fedBy { name type } # What zones it feeds (through VAVs) downstream(is: "HVAC_Zone") { name } }}