| import gymnasium as gym |
| import sinergym |
| import pandas as pd |
| import numpy as np |
| import os |
| import json |
| import sys |
| from unihvac.find_files import ( |
| detect_paths, |
| find_manifest, |
| find_building_and_weather_from_manifest, |
| ) |
| from unihvac.tables import ( |
| print_monthly_tables_extra, |
| print_monthly_tables_split, |
| ) |
| from unihvac.rollout import run_rollout_to_df |
| from unihvac.data_generator import save_dt_training_data |
|
|
|
|
|
|
|
|
| |
| |
| pd.set_option("display.max_columns", None) |
| pd.set_option("display.width", 240) |
| pd.set_option("display.max_colwidth", 32) |
| pd.set_option("display.float_format", lambda x: f"{x:,.2f}") |
| |
|
|
| |
| |
| |
| TARGET_LOCATION = "Fairbanks" |
| TARGET_THERMAL = "default" |
| TARGET_OCCUPANCY = "standard" |
|
|
|
|
| HEATING_SP = 21.0 |
| COOLING_SP = 24.0 |
|
|
| |
| |
| |
| paths = detect_paths(outputs_dirname="baseline_results") |
| |
| manifest_path = find_manifest(paths, building="OfficeSmall", prefer_patched=True) |
| output_root = str(paths.outputs_root) |
| os.makedirs(output_root, exist_ok=True) |
|
|
| OUTPUT_DIR = "rollout_run" |
|
|
| TIME_STEP_HOURS = 900.0 / 3600.0 |
|
|
| |
| |
| |
| hot_actuators = { |
| "Htg_Core": ("Zone Temperature Control", "Heating Setpoint", "CORE_ZN"), |
| "Clg_Core": ("Zone Temperature Control", "Cooling Setpoint", "CORE_ZN"), |
| "Htg_P1": ("Zone Temperature Control", "Heating Setpoint", "PERIMETER_ZN_1"), |
| "Clg_P1": ("Zone Temperature Control", "Cooling Setpoint", "PERIMETER_ZN_1"), |
| "Htg_P2": ("Zone Temperature Control", "Heating Setpoint", "PERIMETER_ZN_2"), |
| "Clg_P2": ("Zone Temperature Control", "Cooling Setpoint", "PERIMETER_ZN_2"), |
| "Htg_P3": ("Zone Temperature Control", "Heating Setpoint", "PERIMETER_ZN_3"), |
| "Clg_P3": ("Zone Temperature Control", "Cooling Setpoint", "PERIMETER_ZN_3"), |
| "Htg_P4": ("Zone Temperature Control", "Heating Setpoint", "PERIMETER_ZN_4"), |
| "Clg_P4": ("Zone Temperature Control", "Cooling Setpoint", "PERIMETER_ZN_4"), |
| } |
|
|
| hot_variables = { |
| "outdoor_temp": ("Site Outdoor Air DryBulb Temperature", "Environment"), |
| "core_temp": ("Zone Air Temperature", "Core_ZN"), |
| "perim1_temp": ("Zone Air Temperature", "Perimeter_ZN_1"), |
| "perim2_temp": ("Zone Air Temperature", "Perimeter_ZN_2"), |
| "perim3_temp": ("Zone Air Temperature", "Perimeter_ZN_3"), |
| "perim4_temp": ("Zone Air Temperature", "Perimeter_ZN_4"), |
| "elec_power": ("Facility Total HVAC Electricity Demand Rate", "Whole Building"), |
| "core_occ_count": ("Zone People Occupant Count", "CORE_ZN"), |
| "perim1_occ_count": ("Zone People Occupant Count", "PERIMETER_ZN_1"), |
| "perim2_occ_count": ("Zone People Occupant Count", "PERIMETER_ZN_2"), |
| "perim3_occ_count": ("Zone People Occupant Count", "PERIMETER_ZN_3"), |
| "perim4_occ_count": ("Zone People Occupant Count", "PERIMETER_ZN_4"), |
| "outdoor_dewpoint": ("Site Outdoor Air Dewpoint Temperature", "Environment"), |
| "outdoor_wetbulb": ("Site Outdoor Air Wetbulb Temperature", "Environment"), |
| "core_rh": ("Zone Air Relative Humidity", "CORE_ZN"), |
| "perim1_rh": ("Zone Air Relative Humidity", "PERIMETER_ZN_1"), |
| "perim2_rh": ("Zone Air Relative Humidity", "PERIMETER_ZN_2"), |
| "perim3_rh": ("Zone Air Relative Humidity", "PERIMETER_ZN_3"), |
| "perim4_rh": ("Zone Air Relative Humidity", "PERIMETER_ZN_4"), |
| } |
|
|
| class BaselineReward: |
|
|
| def __init__(self, *args, **kwargs): |
| pass |
| def __call__(self, obs_dict): |
| return 0.0, {} |
| |
| |
| |
| def get_constant_rbc(): |
| h_sp, c_sp = HEATING_SP, COOLING_SP |
| action = np.array([h_sp, c_sp] * 5, dtype=np.float32) |
| return action, h_sp, c_sp |
|
|
|
|
|
|
| def run_baseline_for_location(location, building_path, weather_path): |
| print("\n" + "=" * 80) |
| print(f"Running baseline for location: {location}") |
| print(f" Building: {building_path}") |
| print(f" Weather: {weather_path}") |
| print("=" * 80) |
|
|
| out_dir = os.path.join(output_root, location) |
| os.makedirs(out_dir, exist_ok=True) |
| def policy_fn(obs, info, step): |
| action, _, _ = get_constant_rbc() |
| return action |
| df = run_rollout_to_df( |
| building_path=str(building_path), |
| weather_path=str(weather_path), |
| variables=hot_variables, |
| actuators=hot_actuators, |
| policy_fn=policy_fn, |
| location=location, |
| timestep_hours=TIME_STEP_HOURS, |
| heating_sp=HEATING_SP, |
| cooling_sp=COOLING_SP, |
| reward=BaselineReward, |
| max_steps=None, |
| verbose=True, |
| ) |
| |
| print("setpoint_htg min/max:", df["setpoint_htg"].min(), df["setpoint_htg"].max()) |
| print("setpoint_clg min/max:", df["setpoint_clg"].min(), df["setpoint_clg"].max()) |
| print("comfort_violation min/mean/max:", df["comfort_violation_degCh"].min(), |
| df["comfort_violation_degCh"].mean(), df["comfort_violation_degCh"].max()) |
|
|
|
|
| df["setpoint_htg"] = HEATING_SP |
| df["setpoint_clg"] = COOLING_SP |
|
|
| |
| print_monthly_tables_extra(df, location) |
| print_monthly_tables_split(df, location, time_step_hours=TIME_STEP_HOURS) |
|
|
| |
| df.to_csv(os.path.join(out_dir, "baseline_timeseries.csv"), index=False) |
| save_dt_training_data(df, out_dir, location=location) |
|
|
| if "month" in df.columns: |
| monthly_energy = df.groupby("month") |
| return df, monthly_energy |
|
|
| return df, None |
|
|
|
|
|
|
| if __name__ == "__main__": |
| bpath, wpath = find_building_and_weather_from_manifest( |
| manifest_path, |
| location=TARGET_LOCATION, |
| occupancy=TARGET_OCCUPANCY, |
| thermal=TARGET_THERMAL, |
| require_patched=True, |
| ) |
| run_baseline_for_location(TARGET_LOCATION, str(bpath), str(wpath)) |
|
|