Add HVAC System
SkillDev toolsGuided HVAC system selection and setup. Use when user asks to "add HVAC", "set up heating and cooling", or "what HVAC system should I use".
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Add HVAC System skill
What this skill tells your AI
The instructions your AI receives, as published by natlabrockies/openstudio-mcp in .claude/skills/add-hvac/SKILL.md and read by ahel’s review.
Guide the user through selecting and applying an HVAC system to their model.
Steps
-
Understand the current model:
get_building_info() list_thermal_zones() -
Ask the user about:
- Building type (office, residential, retail, warehouse, etc.)
- Heating fuel preference (natural gas, electric, district)
- Any specific system preference (baseline, DOAS, VRF, radiant)
-
Recommend a system using ASHRAE 90.1 Table G3.1.1 logic (see
ashrae-baseline-guideskill for selection criteria):- Residential → System 1 (PTAC) or 2 (PTHP)
- Small non-residential → System 3 (PSZ-AC) or 4 (PSZ-HP)
- Large non-residential → System 5/7 (VAV reheat) or 6/8 (VAV PFP)
- Heated-only → System 9 or 10
- High ventilation needs → DOAS
- Many small zones → VRF
- Comfort-critical → Radiant
-
Apply the selected system:
# For baseline systems (1-10): add_baseline_system(system_type=<N>, thermal_zone_names=[<zone_names>], heating_fuel="NaturalGas") # For modern templates: add_doas_system(thermal_zone_names=[...], zone_equipment_type="FanCoil") add_vrf_system(thermal_zone_names=[...]) add_radiant_system(thermal_zone_names=[...], radiant_type="Floor") -
Verify the installation:
list_air_loops() list_plant_loops() list_zone_hvac_equipment() -
Report what was created: system name, zones served, equipment types, plant loops.
Edit an Existing Air Loop's Supply Branch
Swap, add, or drop a coil or fan on a loop that already exists. No measure needed:
get_air_loop_details(air_loop_name="PSZ-AC 1") # exact component names + order
replace_air_loop_supply_component(air_loop_name="PSZ-AC 1",
component_name="PSZ-AC 1 DX Cooling Coil", new_component_type="CoilCoolingDXTwoSpeed")
add_air_loop_supply_component(air_loop_name="PSZ-AC 1", component_type="CoilHeatingWater",
component_name="Preheat Coil", insert_before="PSZ-AC 1 DX Cooling Coil", plant_loop_name="HW Loop")
remove_air_loop_supply_component(air_loop_name="PSZ-AC 1", component_name="Preheat Coil")
set_component_properties(component_name="PSZ-AC 1 DX Cooling Coil", properties={"rated_high_speed_cop": 4.0})
Water coils need plant_loop_name (a water-for-water swap inherits the old coil's loop).
Setpoint managers on a deleted node are moved to the surviving node and listed in the response.
These are for coils and fans; plant equipment uses add_supply_equipment, terminals use
replace_zone_terminal.
Setpoint managers (supply air temperature control) get their own pair:
add_setpoint_manager(spm_type="SetpointManagerOutdoorAirReset", name="SAT Reset",
air_loop_name="PSZ-AC 1", replace_existing=True) # swaps the builder's outlet SPM
set_setpoint_manager_properties(setpoint_name="SAT Reset",
properties={"setpoint_at_outdoor_low_temperature": 15.6, "setpoint_at_outdoor_high_temperature": 12.8})
remove_setpoint_manager(name="SAT Reset")
A node that already has a same-control-variable setpoint manager is refused unless
replace_existing=True; the SDK would otherwise delete the old one silently. Placement:
node="supply_outlet" (default) / "supply_inlet" / "mixed_air", or after_component=<coil>.
Custom HVAC Wiring
For custom HVAC configurations beyond the baseline templates:
search_wiring_patterns("DOAS") # get working Ruby wiring code
search_api("CoilCoolingFourPipeBeam") # verify SDK method names
Comparing Systems / Decision-Grade Results
The generic templates above (add_baseline_system, add_doas_system, add_vrf_system) are wiring templates — no standards efficiency tuning or availability-manager coordination. For comparative studies or decision-grade EUI/comfort numbers, use the standards-tuned path instead:
# Replace ONLY the HVAC on an already-configured model — loads, constructions,
# schedules, thermostats preserved. One call per candidate system:
create_typical_building(system_type="PVAV with gas boiler reheat",
template="90.1-2019", climate_zone="ASHRAE 169-2013-5A", hvac_only=True)
save_osm_model(...); run_simulation(...) # then next candidate
compare_runs(baseline_run_id=<run A>, retrofit_run_id=<run B>) # EUI + unmet-hours deltas
Notes
- Get all zone names from
list_thermal_zones()— names must match exactly - Systems 3-4 create one air loop per zone — pass the full zone list in one call, the tool fans out automatically
- Systems 5-8 create one shared air loop for all zones (multi-zone VAV)
- Systems 1-2, 9-10 create zone equipment only (no air loops)
- Plant loops: System 5 creates a HW loop; 7 creates CHW + HW + condenser; 8 creates CHW + condenser; 6 creates none (electric PFP reheat)
- DOAS zone equipment types: FanCoil (CHW+HW), Radiant (CHW+HW), ChilledBeams (CHW only), FourPipeBeam (CHW+HW)
Why These Defaults (comfort tuning, issue #97)
The generic templates apply these automatically so systems are viable out of the box — don't undo them without a reason:
- App G sizing factors (1.25 heating / 1.15 cooling) + night-cycle availability managers on air-loop systems
- VAV reheat terminals use DamperHeatingAction=Reverse (Normal caps heating at minimum airflow — 1807 unmet heating hours on the benchmark)
- System 4 heat pump: -12.2 C compressor lockout, cycling Fan:OnOff, 40 C max supplemental supply temperature (autosized 16.7 C could not heat a 21 C zone)
- DOAS loop availability defaults to the served zones' People schedule (24/7 buildings stay always-on); override via availability_schedule_name
- VRF uses the standard outdoor-unit family with waste-heat recovery (the FluidTemperatureControl family needs different terminal coils)
Signals
- GitHub stars
- 33
- Forks
- 8
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
add-hvac- Source
- github.com/natlabrockies/openstudio-mcp