This document recasts the Open-FDD expression rule cookbook into a Digital Buildings Ontology (DBO) style.
It is not a claim that DBO itself stores or executes fault rules. In DBO, the ontology primarily models entities, fields, translations, and relationships, while the fault logic still lives in your analytics engine (for example, Open-FDD, pandas, SQL, or another rules engine).
So the conversion here means:
- Replace Brick-class-centric rule inputs with DBO field names.
- Preserve the original fault logic as close as possible.
- Show how those fields would typically appear in a DBO building config.
- Keep the rule engine external to DBO.
The original cookbook is Brick-model-driven. A rule references inputs like:
Supply_Air_Temperature_SensorOutside_Air_Temperature_SensorValve_Command
Open-FDD resolves those from Brick classes and external timeseries references.
In DBO, the model is usually centered on:
- a DBO entity type such as
HVAC/AHU_*,HVAC/VAV_*,HVAC/CHWS_*, etc. - a translation block that maps canonical DBO field names to raw telemetry paths
- validation that the modeled entity really contains the required fields
So the equivalent pattern becomes:
supply_air_temperature_sensoroutside_air_temperature_sensorchilled_water_valve_percentage_commandsupply_fan_speed_percentage_commandsupply_air_static_pressure_sensor
In other words, Brick classes become DBO canonical field names.
DBO generally models:
- measured telemetry
- setpoints
- control states / commands
- entity typing
- relationships and connections
It generally does not try to model inferred alarms or faults as first-class ontology points unless there is a specific reason to do so. That makes DBO a good fit as the semantic layer feeding an FDD engine, rather than replacing the FDD engine.
You could keep your Open-FDD YAML format and simply use DBO field names as the resolved inputs.
name: high_supply_air_temp
platform: dbo
entity_types: [HVAC/AHU]
inputs:
supply_air_temperature_sensor:
dbo_field: supply_air_temperature_sensor
params:
max_temp: 90.0
expression: |
supply_air_temperature_sensor > max_tempYou could also allow an optional entity type constraint, for example:
entity_type_patterns:
- HVAC/AHU
- HVAC/AHU_*Because DBO uses highly specific canonical field names, avoid generic placeholders like Valve_Command whenever possible.
| Open-FDD / Brick-style input | DBO-style field to prefer |
|---|---|
Supply_Air_Temperature_Sensor |
supply_air_temperature_sensor |
Mixed_Air_Temperature_Sensor |
mixed_air_temperature_sensor |
Return_Air_Temperature_Sensor |
return_air_temperature_sensor |
Outside_Air_Temperature_Sensor |
outside_air_temperature_sensor |
Supply_Air_Temperature_Setpoint |
supply_air_temperature_setpoint |
Supply_Air_Static_Pressure_Sensor |
supply_air_static_pressure_sensor |
Supply_Air_Static_Pressure_Setpoint |
supply_air_static_pressure_setpoint |
Supply_Fan_Speed_Command |
supply_fan_speed_percentage_command |
Supply_Fan_Status |
supply_fan_run_status |
Damper_Position_Command |
outside_air_damper_percentage_command or the more specific damper field available on the entity |
Valve_Command (heating) |
heating_water_valve_percentage_command |
Valve_Command (cooling) |
chilled_water_valve_percentage_command |
Reheat_Valve_Command |
heating_water_valve_percentage_command |
Differential_Pressure_Sensor |
differential_pressure_sensor |
Differential_Pressure_Setpoint |
differential_pressure_setpoint |
Pump_Speed_Command |
pump_speed_percentage_command |
Water_Flow_Sensor |
water_flowrate_sensor |
Chilled_Water_Supply_Temperature_Sensor |
chilled_water_supply_temperature_sensor |
Chilled_Water_Supply_Temperature_Setpoint |
chilled_water_supply_temperature_setpoint |
Zone_Temperature_Sensor |
zone_air_temperature_sensor |
Chiller_Status |
run_status or the specific chiller run status field present on the entity |
Wind_Speed_Sensor |
wind_speed_sensor |
Wind_Gust_Speed_Sensor |
wind_gust_speed_sensor |
If your DBO entity uses a slightly different canonical field name than shown here, use the ontology explorer / existing entity type as source of truth.
AHU-1:
type: HVAC/AHU_SFSS_SFVSC_CHWSC_OADC_MIXM
translation:
supply_air_temperature_sensor:
present_value: points.sa_temp.present_value
supply_air_temperature_setpoint:
present_value: points.sa_temp_sp.present_value
outside_air_temperature_sensor:
present_value: points.oa_temp.present_value
return_air_temperature_sensor:
present_value: points.ra_temp.present_value
mixed_air_temperature_sensor:
present_value: points.ma_temp.present_value
supply_air_static_pressure_sensor:
present_value: points.sa_static.present_value
supply_air_static_pressure_setpoint:
present_value: points.sa_static_sp.present_value
supply_fan_speed_percentage_command:
present_value: points.sf_vfd_cmd.present_value
chilled_water_valve_percentage_command:
present_value: points.chw_valve_cmd.present_value
heating_water_valve_percentage_command:
present_value: points.hhw_valve_cmd.present_value
outside_air_damper_percentage_command:
present_value: points.oa_dmpr_cmd.present_valueOnce those translations exist, the rules below can run on top of the translated DBO field names.
name: duct_static_low_at_full_speed
platform: dbo
entity_type_patterns: [HVAC/AHU, HVAC/AHU_*]
inputs:
supply_air_static_pressure_sensor:
dbo_field: supply_air_static_pressure_sensor
supply_air_static_pressure_setpoint:
dbo_field: supply_air_static_pressure_setpoint
supply_fan_speed_percentage_command:
dbo_field: supply_fan_speed_percentage_command
params:
sp_margin: 0.12
drv_hi_frac: 0.93
drv_near_hi: 0.06
expression: |
(supply_air_static_pressure_sensor < supply_air_static_pressure_setpoint - sp_margin) &
(supply_fan_speed_percentage_command >= drv_hi_frac - drv_near_hi)name: mixed_air_temp_below_band
platform: dbo
entity_type_patterns: [HVAC/AHU, HVAC/AHU_*]
inputs:
mixed_air_temperature_sensor:
dbo_field: mixed_air_temperature_sensor
return_air_temperature_sensor:
dbo_field: return_air_temperature_sensor
outside_air_temperature_sensor:
dbo_field: outside_air_temperature_sensor
supply_fan_speed_percentage_command:
dbo_field: supply_fan_speed_percentage_command
params:
mat_tol: 1.15
rat_tol: 1.15
oat_tol: 1.15
expression: |
(mixed_air_temperature_sensor - mat_tol <
np.minimum(return_air_temperature_sensor - rat_tol,
outside_air_temperature_sensor - oat_tol)) &
(supply_fan_speed_percentage_command > 0.01)name: mixed_air_temp_above_band
platform: dbo
entity_type_patterns: [HVAC/AHU, HVAC/AHU_*]
inputs:
mixed_air_temperature_sensor:
dbo_field: mixed_air_temperature_sensor
return_air_temperature_sensor:
dbo_field: return_air_temperature_sensor
outside_air_temperature_sensor:
dbo_field: outside_air_temperature_sensor
supply_fan_speed_percentage_command:
dbo_field: supply_fan_speed_percentage_command
params:
mat_tol: 1.15
rat_tol: 1.15
oat_tol: 1.15
expression: |
(mixed_air_temperature_sensor - mat_tol >
np.maximum(return_air_temperature_sensor + rat_tol,
outside_air_temperature_sensor + oat_tol)) &
(supply_fan_speed_percentage_command > 0.01)name: supply_air_cold_when_heating
platform: dbo
entity_type_patterns: [HVAC/AHU, HVAC/AHU_*]
inputs:
mixed_air_temperature_sensor:
dbo_field: mixed_air_temperature_sensor
supply_air_temperature_sensor:
dbo_field: supply_air_temperature_sensor
heating_water_valve_percentage_command:
dbo_field: heating_water_valve_percentage_command
supply_fan_speed_percentage_command:
dbo_field: supply_fan_speed_percentage_command
params:
mat_tol: 1.15
sat_tol: 1.15
fan_delta_t: 0.55
expression: |
(supply_air_temperature_sensor + sat_tol <=
mixed_air_temperature_sensor - mat_tol + fan_delta_t) &
(heating_water_valve_percentage_command > 0.01) &
(supply_fan_speed_percentage_command > 0.01)name: sat_too_low_full_heating
platform: dbo
entity_type_patterns: [HVAC/AHU, HVAC/AHU_*]
inputs:
supply_air_temperature_sensor:
dbo_field: supply_air_temperature_sensor
supply_air_temperature_setpoint:
dbo_field: supply_air_temperature_setpoint
heating_water_valve_percentage_command:
dbo_field: heating_water_valve_percentage_command
supply_fan_speed_percentage_command:
dbo_field: supply_fan_speed_percentage_command
params:
supply_err_thresh: 1.0
expression: |
(supply_air_temperature_sensor < supply_air_temperature_setpoint - supply_err_thresh) &
(heating_water_valve_percentage_command > 0.9) &
(supply_fan_speed_percentage_command > 0)name: supply_air_mixed_air_mismatch_econ
platform: dbo
entity_type_patterns: [HVAC/AHU, HVAC/AHU_*]
inputs:
mixed_air_temperature_sensor:
dbo_field: mixed_air_temperature_sensor
supply_air_temperature_sensor:
dbo_field: supply_air_temperature_sensor
outside_air_damper_percentage_command:
dbo_field: outside_air_damper_percentage_command
chilled_water_valve_percentage_command:
dbo_field: chilled_water_valve_percentage_command
params:
fan_delta_t: 0.55
mat_tol: 1.15
sat_tol: 1.15
econ_min_open: 0.12
expression: |
(np.abs(supply_air_temperature_sensor - fan_delta_t - mixed_air_temperature_sensor) >
np.sqrt(sat_tol**2 + mat_tol**2)) &
(outside_air_damper_percentage_command > econ_min_open) &
(chilled_water_valve_percentage_command < 0.1)name: ambient_warm_free_cool
platform: dbo
entity_type_patterns: [HVAC/AHU, HVAC/AHU_*]
inputs:
outside_air_temperature_sensor:
dbo_field: outside_air_temperature_sensor
supply_air_temperature_setpoint:
dbo_field: supply_air_temperature_setpoint
outside_air_damper_percentage_command:
dbo_field: outside_air_damper_percentage_command
chilled_water_valve_percentage_command:
dbo_field: chilled_water_valve_percentage_command
params:
oat_tol: 1.15
fan_delta_t: 0.55
sat_tol: 1.15
econ_min_open: 0.12
expression: |
(outside_air_temperature_sensor - oat_tol >
supply_air_temperature_setpoint - fan_delta_t + sat_tol) &
(outside_air_damper_percentage_command > econ_min_open) &
(chilled_water_valve_percentage_command < 0.1)name: outdoor_mixed_air_mismatch_econ_mech
platform: dbo
entity_type_patterns: [HVAC/AHU, HVAC/AHU_*]
inputs:
outside_air_temperature_sensor:
dbo_field: outside_air_temperature_sensor
mixed_air_temperature_sensor:
dbo_field: mixed_air_temperature_sensor
chilled_water_valve_percentage_command:
dbo_field: chilled_water_valve_percentage_command
outside_air_damper_percentage_command:
dbo_field: outside_air_damper_percentage_command
params:
oat_tol: 1.15
mat_tol: 1.15
expression: |
(np.abs(mixed_air_temperature_sensor - outside_air_temperature_sensor) >
np.sqrt(mat_tol**2 + oat_tol**2)) &
(chilled_water_valve_percentage_command > 0.01) &
(outside_air_damper_percentage_command > 0.9)name: outdoor_mixed_air_mismatch_econ_only
platform: dbo
entity_type_patterns: [HVAC/AHU, HVAC/AHU_*]
inputs:
outside_air_temperature_sensor:
dbo_field: outside_air_temperature_sensor
mixed_air_temperature_sensor:
dbo_field: mixed_air_temperature_sensor
outside_air_damper_percentage_command:
dbo_field: outside_air_damper_percentage_command
params:
oat_tol: 1.15
mat_tol: 1.15
expression: |
(np.abs(mixed_air_temperature_sensor - outside_air_temperature_sensor) >
np.sqrt(mat_tol**2 + oat_tol**2)) &
(outside_air_damper_percentage_command > 0.9)name: supply_air_above_mixed_air_cooling
platform: dbo
entity_type_patterns: [HVAC/AHU, HVAC/AHU_*]
inputs:
supply_air_temperature_sensor:
dbo_field: supply_air_temperature_sensor
mixed_air_temperature_sensor:
dbo_field: mixed_air_temperature_sensor
chilled_water_valve_percentage_command:
dbo_field: chilled_water_valve_percentage_command
outside_air_damper_percentage_command:
dbo_field: outside_air_damper_percentage_command
params:
fan_delta_t: 0.55
mat_tol: 1.15
sat_tol: 1.15
econ_min_open: 0.12
expression: |
(supply_air_temperature_sensor >
mixed_air_temperature_sensor + np.sqrt(sat_tol**2 + mat_tol**2) + fan_delta_t) &
(((outside_air_damper_percentage_command > 0.9) & (chilled_water_valve_percentage_command > 0)) |
((outside_air_damper_percentage_command <= econ_min_open) & (chilled_water_valve_percentage_command > 0.9)))name: supply_air_above_setpoint_full_cool
platform: dbo
entity_type_patterns: [HVAC/AHU, HVAC/AHU_*]
inputs:
supply_air_temperature_sensor:
dbo_field: supply_air_temperature_sensor
supply_air_temperature_setpoint:
dbo_field: supply_air_temperature_setpoint
chilled_water_valve_percentage_command:
dbo_field: chilled_water_valve_percentage_command
outside_air_damper_percentage_command:
dbo_field: outside_air_damper_percentage_command
params:
sat_tol: 1.15
econ_min_open: 0.12
expression: |
(supply_air_temperature_sensor > supply_air_temperature_setpoint + sat_tol) &
(((outside_air_damper_percentage_command > 0.9) & (chilled_water_valve_percentage_command > 0.9)) |
((outside_air_damper_percentage_command <= econ_min_open) & (chilled_water_valve_percentage_command > 0.9)))name: cooling_coil_delta_t_when_inactive
platform: dbo
entity_type_patterns: [HVAC/AHU, HVAC/AHU_*]
inputs:
cooling_coil_entering_air_temperature_sensor:
dbo_field: cooling_coil_entering_air_temperature_sensor
cooling_coil_leaving_air_temperature_sensor:
dbo_field: cooling_coil_leaving_air_temperature_sensor
heating_water_valve_percentage_command:
dbo_field: heating_water_valve_percentage_command
chilled_water_valve_percentage_command:
dbo_field: chilled_water_valve_percentage_command
outside_air_damper_percentage_command:
dbo_field: outside_air_damper_percentage_command
params:
enter_tol: 1.15
leave_tol: 1.15
econ_min_open: 0.12
expression: |
((cooling_coil_entering_air_temperature_sensor - cooling_coil_leaving_air_temperature_sensor) >
np.sqrt(enter_tol**2 + leave_tol**2)) &
(((heating_water_valve_percentage_command > 0) &
(chilled_water_valve_percentage_command == 0) &
(outside_air_damper_percentage_command <= econ_min_open)) |
((heating_water_valve_percentage_command == 0) &
(chilled_water_valve_percentage_command == 0) &
(outside_air_damper_percentage_command > econ_min_open)))name: heating_coil_delta_t_when_inactive
platform: dbo
entity_type_patterns: [HVAC/AHU, HVAC/AHU_*]
inputs:
heating_coil_entering_air_temperature_sensor:
dbo_field: heating_coil_entering_air_temperature_sensor
heating_coil_leaving_air_temperature_sensor:
dbo_field: heating_coil_leaving_air_temperature_sensor
heating_water_valve_percentage_command:
dbo_field: heating_water_valve_percentage_command
chilled_water_valve_percentage_command:
dbo_field: chilled_water_valve_percentage_command
outside_air_damper_percentage_command:
dbo_field: outside_air_damper_percentage_command
params:
enter_tol: 1.15
leave_tol: 1.15
fan_delta_t: 0.55
econ_min_open: 0.12
expression: |
((heating_coil_leaving_air_temperature_sensor - heating_coil_entering_air_temperature_sensor) >
np.sqrt(enter_tol**2 + leave_tol**2) + fan_delta_t) &
(((heating_water_valve_percentage_command == 0) &
(chilled_water_valve_percentage_command == 0) &
(outside_air_damper_percentage_command > econ_min_open)) |
((heating_water_valve_percentage_command == 0) &
(chilled_water_valve_percentage_command > 0) &
(outside_air_damper_percentage_command > 0.9)) |
((heating_water_valve_percentage_command == 0) &
(chilled_water_valve_percentage_command > 0) &
(outside_air_damper_percentage_command <= econ_min_open)))name: dp_below_setpoint_pump_max
platform: dbo
entity_type_patterns: [HVAC/CHWS, HVAC/HWS, HVAC/*PUMP*]
inputs:
differential_pressure_sensor:
dbo_field: differential_pressure_sensor
differential_pressure_setpoint:
dbo_field: differential_pressure_setpoint
pump_speed_percentage_command:
dbo_field: pump_speed_percentage_command
params:
dp_margin: 2.2
pmp_hi_frac: 0.93
pmp_near_hi: 0.06
expression: |
(differential_pressure_sensor < differential_pressure_setpoint - dp_margin) &
(pump_speed_percentage_command >= pmp_hi_frac - pmp_near_hi)name: flow_high_pump_max
platform: dbo
entity_type_patterns: [HVAC/CHWS, HVAC/HWS, HVAC/*PUMP*]
inputs:
water_flowrate_sensor:
dbo_field: water_flowrate_sensor
pump_speed_percentage_command:
dbo_field: pump_speed_percentage_command
params:
flow_hi_limit: 1100.0
pmp_hi_frac: 0.93
pmp_near_hi: 0.06
expression: |
(water_flowrate_sensor > flow_hi_limit) &
(pump_speed_percentage_command >= pmp_hi_frac - pmp_near_hi)name: chw_supply_temp_deadband
platform: dbo
entity_type_patterns: [HVAC/CHWS, HVAC/CHILLER, HVAC/*]
inputs:
chilled_water_supply_temperature_sensor:
dbo_field: chilled_water_supply_temperature_sensor
chilled_water_supply_temperature_setpoint:
dbo_field: chilled_water_supply_temperature_setpoint
pump_speed_percentage_command:
dbo_field: pump_speed_percentage_command
params:
sp_band: 2.2
expression: |
(pump_speed_percentage_command > 0.01) &
((chilled_water_supply_temperature_sensor < chilled_water_supply_temperature_setpoint - sp_band) |
(chilled_water_supply_temperature_sensor > chilled_water_supply_temperature_setpoint + sp_band))name: chiller_excessive_runtime
platform: dbo
entity_type_patterns: [HVAC/CHILLER, HVAC/CH_*]
inputs:
run_status:
dbo_field: run_status
params:
rolling_samples: 276
max_runtime_samples: 264
expression: |
run_status.rolling(window=rolling_samples).sum() > max_runtime_samplesname: hp_discharge_cold_when_heating
platform: dbo
entity_type_patterns: [HVAC/HP, HVAC/HEAT_PUMP, HVAC/*HP*]
inputs:
supply_air_temperature_sensor:
dbo_field: supply_air_temperature_sensor
zone_air_temperature_sensor:
dbo_field: zone_air_temperature_sensor
supply_fan_run_status:
dbo_field: supply_fan_run_status
params:
min_discharge_temp: 85
zone_cold_threshold: 69.0
fan_on_threshold: 0.01
expression: |
(supply_fan_run_status > fan_on_threshold) &
(zone_air_temperature_sensor < zone_cold_threshold) &
(supply_air_temperature_sensor < min_discharge_temp)name: zone_reheat_warm_ambient
platform: dbo
entity_type_patterns: [HVAC/VAV, HVAC/VAV_*]
inputs:
outside_air_temperature_sensor:
dbo_field: outside_air_temperature_sensor
heating_water_valve_percentage_command:
dbo_field: heating_water_valve_percentage_command
params:
t_amb_cutoff: 78.0
reheat_open_min: 0.52
expression: |
(outside_air_temperature_sensor > t_amb_cutoff) &
(heating_water_valve_percentage_command > reheat_open_min)name: zone_damper_full_open
platform: dbo
entity_type_patterns: [HVAC/VAV, HVAC/VAV_*]
inputs:
supply_air_damper_percentage_command:
dbo_field: supply_air_damper_percentage_command
params:
full_open_pct: 97.5
roll_samples: 105
expression: |
(supply_air_damper_percentage_command > full_open_pct) &
(supply_air_damper_percentage_command.rolling(roll_samples).min() > full_open_pct)name: econ_active_warm_ambient
platform: dbo
entity_type_patterns: [HVAC/AHU, HVAC/AHU_*]
inputs:
outside_air_temperature_sensor:
dbo_field: outside_air_temperature_sensor
outside_air_damper_percentage_command:
dbo_field: outside_air_damper_percentage_command
params:
t_amb_econ_cutoff: 63.0
dpr_econ_min: 0.42
expression: |
(outside_air_temperature_sensor > t_amb_econ_cutoff) &
(outside_air_damper_percentage_command > dpr_econ_min)name: mech_cool_when_econ_available
platform: dbo
entity_type_patterns: [HVAC/AHU, HVAC/AHU_*]
inputs:
outside_air_temperature_sensor:
dbo_field: outside_air_temperature_sensor
outside_air_damper_percentage_command:
dbo_field: outside_air_damper_percentage_command
chilled_water_valve_percentage_command:
dbo_field: chilled_water_valve_percentage_command
params:
t_amb_econ_cutoff: 63.0
dpr_not_econ_max: 0.32
expression: |
(outside_air_temperature_sensor < t_amb_econ_cutoff) &
(outside_air_damper_percentage_command < dpr_not_econ_max) &
(chilled_water_valve_percentage_command > 0.01)name: low_oa_fraction_estimated
platform: dbo
entity_type_patterns: [HVAC/AHU, HVAC/AHU_*]
inputs:
mixed_air_temperature_sensor:
dbo_field: mixed_air_temperature_sensor
return_air_temperature_sensor:
dbo_field: return_air_temperature_sensor
outside_air_temperature_sensor:
dbo_field: outside_air_temperature_sensor
supply_fan_speed_percentage_command:
dbo_field: supply_fan_speed_percentage_command
params:
oa_min_pct: 21.0
t_rat_oat_min_gap: 2.2
expression: |
(supply_fan_speed_percentage_command > 0.01) &
(np.abs(return_air_temperature_sensor - outside_air_temperature_sensor) > t_rat_oat_min_gap) &
(((mixed_air_temperature_sensor - return_air_temperature_sensor) /
(outside_air_temperature_sensor - return_air_temperature_sensor) * 100) < oa_min_pct)name: preheat_excess_temp
platform: dbo
entity_type_patterns: [HVAC/AHU, HVAC/AHU_*]
inputs:
preheat_coil_leaving_air_temperature_sensor:
dbo_field: preheat_coil_leaving_air_temperature_sensor
supply_air_temperature_setpoint:
dbo_field: supply_air_temperature_setpoint
outside_air_temperature_sensor:
dbo_field: outside_air_temperature_sensor
heating_water_valve_percentage_command:
dbo_field: heating_water_valve_percentage_command
params:
excess_tol: 2.2
expression: |
(heating_water_valve_percentage_command > 0.01) &
(((outside_air_temperature_sensor > supply_air_temperature_setpoint) &
(preheat_coil_leaving_air_temperature_sensor - outside_air_temperature_sensor > excess_tol)) |
((outside_air_temperature_sensor < supply_air_temperature_setpoint) &
(preheat_coil_leaving_air_temperature_sensor - supply_air_temperature_setpoint > excess_tol)))name: weather_temp_spike
platform: dbo
entity_type_patterns: [WEATHER/*, FACILITIES/*, HVAC/*]
inputs:
outside_air_temperature_sensor:
dbo_field: outside_air_temperature_sensor
params:
spike_limit: 16.0
expression: |
outside_air_temperature_sensor.diff().abs() > spike_limitname: weather_gust_lt_wind
platform: dbo
entity_type_patterns: [WEATHER/*, FACILITIES/*, HVAC/*]
inputs:
wind_gust_speed_sensor:
dbo_field: wind_gust_speed_sensor
wind_speed_sensor:
dbo_field: wind_speed_sensor
expression: |
wind_gust_speed_sensor.notna() & wind_speed_sensor.notna() &
(wind_gust_speed_sensor < wind_speed_sensor)Keep Open-FDD exactly as-is conceptually, but allow a dbo_field key in inputs.
Example:
inputs:
supply_air_temperature_sensor:
dbo_field: supply_air_temperature_sensorThen the runtime would:
- identify the DBO entity instance
- read the entity's
translation - map
dbo_fieldto the raw timeseries path / column - build the DataFrame
- evaluate the expression
This is probably the easiest migration path.
- keep the current Open-FDD rule engine
- write a DBO adapter that reads the building config
- emit a normalized internal registry such as:
{
"AHU-1": {
"supply_air_temperature_sensor": "points.sa_temp.present_value",
"mixed_air_temperature_sensor": "points.ma_temp.present_value",
"outside_air_temperature_sensor": "points.oa_temp.present_value"
}
}Then the rest of Open-FDD can stay mostly unchanged.
This is likely the most practical real-world approach.
- Brick remains very strong for graph semantics and cross-equipment querying.
- DBO remains very strong for canonical telemetry naming and configuration validation.
- Open-FDD could support either:
brick:inputsdbo_field:inputs
That would let users choose the semantic source they already have.
If you want this to feel clean in Open-FDD, I would recommend these conventions:
- use lower snake case for DBO field references
- prefer specific command fields over generic placeholders
- keep expressions identical wherever possible
Prefer:
chilled_water_valve_percentage_commandover:
Valve_CommandAnd prefer:
outside_air_damper_percentage_commandover:
Damper_Position_CommandThat makes the rules much more portable and much more "DBO-like".
- This document converts the cookbook at the rule authoring layer, not by changing DBO itself.
- Some exact canonical DBO field names depend on the specific entity type you choose.
- A few generic cookbook inputs, especially
Valve_CommandandDamper_Position_Command, had to be specialized into likely DBO fields. - For some equipment, the correct DBO entity type may expose a slightly different canonical field name than the one shown here.
- Faults are still better treated as analytics outputs rather than ontology-native telemetry fields in DBO.
A clean way to think about this is:
- Brick version: rules reference semantic classes.
- DBO version: rules reference canonical DBO fields on validated entity types.
- Open-FDD stays the fault engine in both cases.
- Open-FDD Expression Rule Cookbook: https://bbartling.github.io/open-fdd/expression_rule_cookbook.html
- Digital Buildings project README: https://github.com/google/digitalbuildings
- DBO ontology overview: https://google.github.io/digitalbuildings/ontology/docs/ontology.html
- DBO HVAC model overview: https://google.github.io/digitalbuildings/ontology/docs/model_hvac.html
- DBO AHU examples: https://github.com/google/digitalbuildings/blob/master/ontology/docs/hvac_ahu.md
- DBO FAQ: https://github.com/google/digitalbuildings/blob/master/ontology/docs/faq.md