Skip to main content

Buildings are graphs

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:
RelationshipDirectionWhat it means
feeds / fedByEquipment → EquipmentDistributes a medium (air, chilled water, hot water)
upstream / downstreamEquipment ↔ EquipmentTransitive feeds. Follows the full chain
parts / partOfEquipment → EquipmentPhysical composition: what’s inside
pointsEquipment → PointTelemetry: sensors, setpoints, commands
feeds (to Zone)Equipment → ZoneWhat spaces equipment conditions
locationEquipment → LocationWhere equipment physically sits

Equipment topology: feeds

feeds captures how equipment distributes a medium through a building. This is the backbone of every HVAC system:
                                            ┌─── TW01-LBR-RPC-01 ──feeds──▶ Library
Tower East HIU ──feeds──▶ TE01-XX-AHU-001 ──┤
  (hot water)              (air)            ├─── TW01-LBR-RPC-02 ──feeds──▶ Library
                                            └─── TW01-CE1-RPC-01 ──feeds──▶ CE1
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.

One-hop: feeds and fedBy

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
    }
  }
}
{
  "data": {
    "equipment": [{
      "name": "TE01-XX-AHU-001",
      "feeds": [
        { "name": "TW01-LBR-RPC-01", "type": "VAV" },
        { "name": "TW01-LBR-RPC-02", "type": "VAV" },
        { "name": "TW01-CE1-RPC-01", "type": "VAV" }
      ],
      "fedBy": [
        { "name": "Tower East HIU System", "type": "Heat_Exchanger" }
      ]
    }]
  }
}
feeds and fedBy return direct connections only (one hop). For the full chain (HIU → AHU → VAV → zone), use upstream and downstream.

Transitive: upstream and downstream

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
    }
  }
}
{
  "data": {
    "zone": [{
      "name": "Library",
      "upstream": [
        { "name": "TW01-LBR-RPC-01", "type": "VAV" },
        { "name": "TW01-LBR-RPC-02", "type": "VAV" },
        { "name": "TW01-XX-AHU-001", "type": "AHU" },
        { "name": "TW01-XX-AHU-002", "type": "AHU" },
        { "name": "Tower West HIU System", "type": "Heat_Exchanger" }
      ]
    }]
  }
}
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.

Filtering traversals

Control what the traversal returns:
# Only follow the hot water chain (skip air)
upstream(medium: "HOT_WATER") {
  name
  type
}

# Only go 2 hops deep
downstream(maxDepth: 2) {
  name
  type
}

# Only return zones in the downstream chain
downstream(is: "HVAC_Zone") {
  name
  type
}
ArgumentTypeDefaultDescription
maxDepthIntunlimitedMaximum hops to traverse
mediumStringallAIR, CHILLED_WATER, HOT_WATER, CONDENSER_WATER
isStringallFilter results to a Brick class (resolves subtypes)

Equipment composition: parts

An AHU isn’t a black box. It contains fans, coils, dampers, and filters. parts exposes this composition:
{
  equipment(id: "TE01-XX-AHU-001") {
    name
    type
    parts {
      name
      type
      points(is: "Sensor") {
        type
        timeseriesId
      }
    }
  }
}
{
  "data": {
    "equipment": [{
      "name": "TE01-XX-AHU-001",
      "type": "AHU",
        "parts": [
          {
            "name": "Supply Fan",
            "type": "Supply_Fan",
            "points": [
              { "type": "Speed_Sensor", "timeseriesId": "a1b2c3d4-..." },
              { "type": "Motor_Current_Sensor", "timeseriesId": "e5f6a7b8-..." }
            ]
          },
          {
            "name": "Cooling Coil",
            "type": "Cooling_Coil",
            "points": [
              { "type": "Chilled_Water_Valve_Position_Sensor", "timeseriesId": "c9d0e1f2-..." }
            ]
          },
          {
            "name": "Filter",
            "type": "Filter",
            "points": [
              { "type": "Differential_Pressure_Sensor", "timeseriesId": "f3a4b5c6-..." }
            ]
          }
        ]
      }]
  }
}
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.

Telemetry: points

Every piece of equipment has sensors, setpoints, and commands attached through points:
{
  equipment(id: "TE01-XX-AHU-001") {
    points {
      name
      type
      timeseriesId
    }
  }
}
A typical AHU has 10-20 points across all six Brick point types:
Point typeBrick classTypical value
Supply air temperatureSupply_Air_Temperature_Sensor14.2 °C
Return air temperatureReturn_Air_Temperature_Sensor22.8 °C
Mixed air temperatureMixed_Air_Temperature_Sensor18.1 °C
Supply air flowSupply_Air_Flow_Sensor4200 L/s
Filter pressure dropFilter_Differential_Pressure_Sensor180 Pa
Supply air temp setpointSupply_Air_Temperature_Setpoint14.0 °C
Supply fan commandSupply_Fan_CommandON
Cooling valve commandValve_Command65%
Supply fan runningOn_Off_StatusON
Equipment faultFault_Statusfalse
High temperature alarmHigh_Temperature_Alarminactive
Filter alarmFilter_Alarmactive
Brick defines six Point subtypes. Use is to query any of them:
# Sensors: measured values (temperature, humidity, pressure, flow, CO2)
points(is: "Sensor") { ... }

# Setpoints: desired target values
points(is: "Setpoint") { ... }

# Commands: control signals (damper position, valve position, on/off)
points(is: "Command") { ... }

# Status: read-only operating states (running, mode, fault)
points(is: "Status") { ... }

# Alarms: off-normal conditions (high temp, filter, smoke, comms loss)
points(is: "Alarm") { ... }

# Parameters: configuration (PID gains, deadbands, delays)
points(is: "Parameter") { ... }
See points reference for the full cross-cutting query surface.

Spatial: location

Equipment sits somewhere physical. location tells you where:
{
  equipment(is: "AHU") {
    name
    location { name type }
  }
}
{
  "data": {
    "equipment": [
      { "name": "TE01-XX-AHU-001", "location": { "name": "Basement Plant Room", "type": "Room" } },
      { "name": "TW01-XX-AHU-001", "location": { "name": "Roof Level", "type": "Floor" } }
    ]
  }
}
The spatial hierarchy runs Building → Wing → Floor → Room. Query it from the building level:
{
  building(siteId: "your-site-id", id: "B001") {
    locations {
      name
      type
      locations {
        name
        type
        equipment(is: "HVAC_Equipment") { name type }
      }
    }
  }
}

Zones: feeds to zones

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
    }
  }
}

Combining relationships

The real power is combining multiple relationships in a single query. Each example below is one request.

Root cause analysis

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.

Impact analysis

The Tower East HIU System is going down for maintenance. Which zones will lose conditioning?
{
  equipment(id: "tower-east-hiu") {
    # Every zone this HIU ultimately feeds
    downstream(is: "HVAC_Zone") {
      name
      points(is: "Zone_Air_Temperature_Sensor") {
        timeseriesId
      }
    }
  }
}

Full equipment diagnostic

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
    }
  }
}

Next steps

Class hierarchy

How is: "HVAC_Equipment" matches all subtypes automatically.

Upstream / downstream reference

Full reference for traversal arguments, return types, and filtering.