From 21bd1f40f78e073188daa26350a6b215cd18b2c9 Mon Sep 17 00:00:00 2001 From: Matthew Dahlhausen Date: Wed, 1 Apr 2026 13:40:17 -0600 Subject: [PATCH 01/11] Add refrigeration output variables --- .../comstock_sensitivity_reports/measure.rb | 26 +++++++++++++++++- .../comstock_sensitivity_reports/measure.xml | 10 +++---- .../resources/Variable List.xlsx | Bin 42549 -> 43109 bytes .../resources/comstock_column_definitions.csv | 4 +++ 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/measures/comstock_sensitivity_reports/measure.rb b/measures/comstock_sensitivity_reports/measure.rb index d8fee1fe1..193994ae5 100644 --- a/measures/comstock_sensitivity_reports/measure.rb +++ b/measures/comstock_sensitivity_reports/measure.rb @@ -112,6 +112,10 @@ def energyPlusOutputRequests(runner, user_arguments) # request service water heating use result << OpenStudio::IdfObject.load('Output:Variable,*,Water Use Connections Hot Water Volume,RunPeriod;').get + # request refrigeration defrost energy + result << OpenStudio::IdfObject.load('Output:Variable,*,Refrigeration Case Defrost Electricity Energy,RunPeriod;').get # J + result << OpenStudio::IdfObject.load('Output:Variable,*,Refrigeration Walk In Defrost Electricity Energy,RunPeriod;').get # J + # request coil and fan energy use for HVAC equipment result << OpenStudio::IdfObject.load('Output:Variable,*,Cooling Tower Make Up Water Volume,RunPeriod;').get # m3 result << OpenStudio::IdfObject.load('Output:Variable,*,Chiller COP,RunPeriod;').get @@ -193,7 +197,6 @@ def energyPlusOutputRequests(runner, user_arguments) end end - # result << OpenStudio::IdfObject.load("Output:Variable,*,Fan #{elec} Energy,RunPeriod;").get # J # result << OpenStudio::IdfObject.load("Output:Variable,*,Humidifier #{elec} Energy,RunPeriod;").get # J # result << OpenStudio::IdfObject.load("Output:Variable,*,Evaporative Cooler #{elec} Energy,RunPeriod;").get # J @@ -3800,6 +3803,27 @@ def system_type_for(pump) runner.registerValue('com_report_shw_hp_water_heater_unmet_heat_transfer_demand_j', heat_pump_water_heater_unmet_heat_transfer_demand_j) runner.registerValue('com_report_shw_non_hp_water_heater_unmet_heat_transfer_demand_j', water_heater_unmet_heat_transfer_demand_j) + # Refrigeration cases and walk-ins + refrigeration_case_count = 0.0 + refrigeration_case_total_defrost_electric_j = 0.0 + model.getRefrigerationCases.sort.each do |ref_case| + refrigeration_case_count += 1.0 + defrost_electric_j = sql_get_report_variable_data_double(runner, sql, ref_case, 'Refrigeration Case Defrost Electricity Energy') + refrigeration_case_total_defrost_electric_j += defrost_electric_j + end + runner.registerValue('com_report_refrigeration_case_count', refrigeration_case_count) + runner.registerValue('com_report_refrigeration_case_total_defrost_electric_j', refrigeration_case_total_defrost_electric_j, 'J') + + refrigeration_walk_in_count = 0.0 + refrigeration_walk_in_total_defrost_electric_j = 0.0 + model.getRefrigerationWalkIns.sort.each do |walk_in| + refrigeration_walk_in_count += 1.0 + defrost_electric_j = sql_get_report_variable_data_double(runner, sql, walk_in, 'Refrigeration Walk In Defrost Electricity Energy') + refrigeration_walk_in_total_defrost_electric_j += defrost_electric_j + end + runner.registerValue('com_report_refrigeration_walk_in_count', refrigeration_walk_in_count) + runner.registerValue('com_report_refrigeration_walk_in_total_defrost_electric_j', refrigeration_walk_in_total_defrost_electric_j, 'J') + # Error and Warning count from eplusout.err file (sql does not have data) err_path = File.join(File.dirname(sql.path.to_s), 'eplusout.err') File.foreach(err_path).each do |line| diff --git a/measures/comstock_sensitivity_reports/measure.xml b/measures/comstock_sensitivity_reports/measure.xml index cc2148c4b..61502007b 100644 --- a/measures/comstock_sensitivity_reports/measure.xml +++ b/measures/comstock_sensitivity_reports/measure.xml @@ -3,8 +3,8 @@ 3.1 com_stock_sensitivity_reports aeb81242-de7e-4613-af47-c1faf19d286a - 0955d5f5-3a15-4c10-9151-5ea649038f6b - 2025-09-17T17:07:23Z + 4ebe3785-5b87-4594-9aa5-1ddd95a41653 + 2026-03-31T22:01:31Z A0069B90 ComStockSensitivityReports ComStock_Sensitivity_Reports @@ -76,13 +76,13 @@ measure.rb rb script - 58DAA5CC + 09CA5730 Variable List.xlsx xlsx resource - 3B3560C3 + E2CB0BD3 8172d17_0000008.osm @@ -238,7 +238,7 @@ comstock_sensitivity_reports_test.rb rb test - BA366C89 + 887C00B2 ground_heat_exchanger.osm diff --git a/measures/comstock_sensitivity_reports/resources/Variable List.xlsx b/measures/comstock_sensitivity_reports/resources/Variable List.xlsx index 0da5074695be6ecb1346be5d93a1cf2cc2a8857d..c5011b7888753016a8693e0f7a39b1479d6aa5c7 100644 GIT binary patch delta 31766 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 KDy8s0nEwyozo{Sq delta 31210 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 TCH!E{SwP-WN+|Q(|JeLLxJqGi diff --git a/postprocessing/comstockpostproc/resources/comstock_column_definitions.csv b/postprocessing/comstockpostproc/resources/comstock_column_definitions.csv index b0211464a..17416b058 100644 --- a/postprocessing/comstockpostproc/resources/comstock_column_definitions.csv +++ b/postprocessing/comstockpostproc/resources/comstock_column_definitions.csv @@ -666,6 +666,10 @@ results.csv,com_stock_sensitivity_reports.com_report_shw_non_hp_water_heater_gas results.csv,com_stock_sensitivity_reports.com_report_shw_non_hp_water_heater_other_fuel_j,out.params.non_hp_water_heater_other_fuel,TRUE,FALSE,float,j,j,other fuel energy use by non-heat pump water heaters results.csv,com_stock_sensitivity_reports.com_report_shw_non_hp_water_heater_total_volume_gal,out.params.non_hp_water_heater_total_volume_gal,TRUE,FALSE,float,gal,gal,combined volume of water heaters results.csv,com_stock_sensitivity_reports.com_report_shw_non_hp_water_heater_unmet_heat_transfer_demand_j,out.params.non_hp_water_heater_unmet_heat_transfer_demand,TRUE,FALSE,float,j,j,water heater unmet heat transfer demand +results.csv,com_stock_sensitivity_reports.com_report_refrigeration_case_count,out.params.refrigeration_case_count,FALSE,FALSE,float,,,count of refrigerated cases +results.csv,com_stock_sensitivity_reports.com_report_refrigeration_case_total_defrost_electric_j,out.params.refrigeration_case_defrost_energy,TRUE,FALSE,float,j,j,electric energy use for refrigerated case defrost +results.csv,com_stock_sensitivity_reports.com_report_refrigeration_walk_in_count,out.params.refrigeration_walkin_count,FALSE,FALSE,float,,,count of refrigerated walk-ins +results.csv,com_stock_sensitivity_reports.com_report_refrigeration_walk_in_total_defrost_electric_j,out.params.refrigeration_walkin_defrost_energy,TRUE,FALSE,float,j,j,electric energy use for refrigerated walk-in defrost results.csv,com_stock_sensitivity_reports.com_report_unitary_sys_cycling_ratio_cooling,out.params.unitary_sys_cycling_ratio_cooling,TRUE,FALSE,float,,,weighted average unitary system cycling ratio for cooling operation results.csv,com_stock_sensitivity_reports.com_report_unitary_sys_cycling_ratio_heating,out.params.unitary_sys_cycling_ratio_heating,TRUE,FALSE,float,,,weighted average unitary system cycling ratio for heating operation results.csv,com_stock_sensitivity_reports.com_report_unitary_sys_cycling_excess_electricity_cooling_pcnt,out.params.unitary_sys_cycling_excess_electricity_cooling_pcnt,TRUE,FALSE,float,,,excess electricity used for cycling during cooling operation From 54e12f4ebc867c12690e7f706a7cd709789519db Mon Sep 17 00:00:00 2001 From: Matthew Dahlhausen Date: Thu, 2 Apr 2026 13:49:33 -0600 Subject: [PATCH 02/11] correction to air loop hvac logging --- measures/comstock_sensitivity_reports/measure.rb | 8 ++++---- measures/comstock_sensitivity_reports/measure.xml | 8 ++++---- .../tests/comstock_sensitivity_reports_test.rb | 3 +-- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/measures/comstock_sensitivity_reports/measure.rb b/measures/comstock_sensitivity_reports/measure.rb index 193994ae5..2ab5c89a5 100644 --- a/measures/comstock_sensitivity_reports/measure.rb +++ b/measures/comstock_sensitivity_reports/measure.rb @@ -648,7 +648,7 @@ def run(runner, user_arguments) end end - if ann_env_pd == false + if (ann_env_pd.nil?) || (!ann_env_pd == false) runner.registerError('Cannot find a weather runperiod. Make sure you ran an annual simulation, not just the design days.') return false end @@ -1153,7 +1153,7 @@ def run(runner, user_arguments) unless ts_ahu_ma_flow_rate_kg_s_list.nil? average_non_zero_loop_mass_flow_kg_s = ts_ahu_ma_flow_rate_kg_s_list.reject(&:zero?).sum.to_f / ts_ahu_ma_flow_rate_kg_s_list.reject(&:zero?).count else - average_non_zero_loop_mass_flow_kg_s = -999 + average_non_zero_loop_mass_flow_kg_s = 0.0 end # Add to weighted @@ -1162,8 +1162,8 @@ def run(runner, user_arguments) air_system_weighted_fan_power_minimum_flow_fraction += fan_minimum_flow_frac * air_loop_mass_flow_rate_kg_s air_system_weighted_fan_static_pressure += fan_static_pressure * air_loop_mass_flow_rate_kg_s air_system_weighted_fan_efficiency += fan_efficiency * air_loop_mass_flow_rate_kg_s - if fan_var_vol - air_system_total_vav_mass_flow_kg_s += average_non_zero_loop_mass_flow_kg_s # Track VAV airflow separately for SP reset measure + if fan_var_vol && average_non_zero_loop_mass_flow_kg_s > 0.0 + air_system_total_vav_mass_flow_kg_s += average_non_zero_loop_mass_flow_kg_s # Track VAV airflow separately for Static Pressure Reset measure air_system_total_des_flow_rate_m3_s += des_flow_rate_m3_s end end diff --git a/measures/comstock_sensitivity_reports/measure.xml b/measures/comstock_sensitivity_reports/measure.xml index 61502007b..6f6af682b 100644 --- a/measures/comstock_sensitivity_reports/measure.xml +++ b/measures/comstock_sensitivity_reports/measure.xml @@ -3,8 +3,8 @@ 3.1 com_stock_sensitivity_reports aeb81242-de7e-4613-af47-c1faf19d286a - 4ebe3785-5b87-4594-9aa5-1ddd95a41653 - 2026-03-31T22:01:31Z + 922cd479-6172-4435-bbea-73c3c67dc231 + 2026-04-02T19:49:08Z A0069B90 ComStockSensitivityReports ComStock_Sensitivity_Reports @@ -76,7 +76,7 @@ measure.rb rb script - 09CA5730 + 1D27A7F0 Variable List.xlsx @@ -238,7 +238,7 @@ comstock_sensitivity_reports_test.rb rb test - 887C00B2 + 486ECDB4 ground_heat_exchanger.osm diff --git a/measures/comstock_sensitivity_reports/tests/comstock_sensitivity_reports_test.rb b/measures/comstock_sensitivity_reports/tests/comstock_sensitivity_reports_test.rb index 335ea972a..acacfa6ba 100644 --- a/measures/comstock_sensitivity_reports/tests/comstock_sensitivity_reports_test.rb +++ b/measures/comstock_sensitivity_reports/tests/comstock_sensitivity_reports_test.rb @@ -305,7 +305,7 @@ def test_pump_spec output_txt = JSON.parse(File.read("#{run_dir(__method__)}/output.txt")) output_txt.each do |output_var| puts("### DEBUGGING: output_var = #{output_var['name']} | value = #{output_var['value']}") - + # check values with values from example model if output_var['name'] == 'com_report_pump_flow_weighted_avg_motor_efficiency' assert_in_delta(0.9086, output_var['value'].to_f, 0.01) @@ -328,7 +328,6 @@ def test_pump_spec if output_var['name'] == 'com_report_pump_count_swh_var_spd' assert_equal(1, output_var['value']) end - end end end From e1fec1197917044e918bdbe2d02d4bf0b63d1b77 Mon Sep 17 00:00:00 2001 From: Matthew Dahlhausen Date: Fri, 3 Apr 2026 11:36:32 -0600 Subject: [PATCH 03/11] Update Gemfile --- resources/Gemfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/Gemfile b/resources/Gemfile index e73c12495..e8c55626b 100644 --- a/resources/Gemfile +++ b/resources/Gemfile @@ -12,8 +12,8 @@ gem 'rubocop-rspec' gem 'bcl', '= 0.9.1' gem 'openstudio-extension', '= 0.9.1' gem 'openstudio-workflow', '= 2.5.0' -gem 'openstudio-standards', '= 0.8.6' -# gem 'openstudio-standards', git: 'https://github.com/NREL/openstudio-standards.git', ref: 'bf737839be4512577fd49b4ca5f4e091a718a3bf' +# gem 'openstudio-standards', '= 0.8.6' +gem 'openstudio-standards', git: 'https://github.com/NREL/openstudio-standards.git', ref: 'cd105f8e8f5d0980b5d0bb2468ec89c9aa517f04' # gem 'openstudio-standards', path: "C:/GitRepos/openstudio-standards" # Use this format when testing openstudio-standards changes locally gem 'openstudio-geb', git: 'https://github.com/LBNL-ETA/Openstudio-GEB-gem.git', ref: '87da5c2678327b73eef54d2364f46225154bb956' gem 'tbd', '= 3.4.4' From 345e8865986965820508553bca18b299422d8bfd Mon Sep 17 00:00:00 2001 From: Matthew Dahlhausen Date: Fri, 3 Apr 2026 11:59:07 -0600 Subject: [PATCH 04/11] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 38550be98..2d3fc7ce3 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,7 @@ lib/ *.pyc report.xml resources/Gemfile.lock +/test/local_run # Non-template postprocessing scripts postprocessing/compare_comstock_to_ami.py From 7801fc4bda9bbb6dd5503a18b71d31a421feeac5 Mon Sep 17 00:00:00 2001 From: Matthew Dahlhausen Date: Fri, 3 Apr 2026 13:05:05 -0600 Subject: [PATCH 05/11] fix negative lookup for weather file --- measures/comstock_sensitivity_reports/measure.rb | 2 +- measures/comstock_sensitivity_reports/measure.xml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/measures/comstock_sensitivity_reports/measure.rb b/measures/comstock_sensitivity_reports/measure.rb index 2ab5c89a5..6544fc874 100644 --- a/measures/comstock_sensitivity_reports/measure.rb +++ b/measures/comstock_sensitivity_reports/measure.rb @@ -648,7 +648,7 @@ def run(runner, user_arguments) end end - if (ann_env_pd.nil?) || (!ann_env_pd == false) + if (ann_env_pd.nil?) || (ann_env_pd == false) runner.registerError('Cannot find a weather runperiod. Make sure you ran an annual simulation, not just the design days.') return false end diff --git a/measures/comstock_sensitivity_reports/measure.xml b/measures/comstock_sensitivity_reports/measure.xml index 6f6af682b..9ffdb133e 100644 --- a/measures/comstock_sensitivity_reports/measure.xml +++ b/measures/comstock_sensitivity_reports/measure.xml @@ -3,8 +3,8 @@ 3.1 com_stock_sensitivity_reports aeb81242-de7e-4613-af47-c1faf19d286a - 922cd479-6172-4435-bbea-73c3c67dc231 - 2026-04-02T19:49:08Z + 0a1472cd-192c-4304-b60a-431c4ccf1d40 + 2026-04-03T19:04:30Z A0069B90 ComStockSensitivityReports ComStock_Sensitivity_Reports @@ -76,7 +76,7 @@ measure.rb rb script - 1D27A7F0 + 7195CBED Variable List.xlsx From f7be8344a75a5e945ff9702b228298878924c336 Mon Sep 17 00:00:00 2001 From: Matthew Dahlhausen Date: Tue, 7 Apr 2026 14:24:28 -0600 Subject: [PATCH 06/11] add refrigeration defrost end use to plots --- postprocessing/comstockpostproc/comstock.py | 25 ++++++++++++++++++- .../comstock_measure_comparison.py | 4 ++- .../comstock_to_cbecs_comparison.py | 20 +++++++++++++-- .../comstockpostproc/lazyframeplotter.py | 3 +++ .../comstockpostproc/naming_mixin.py | 8 ++++++ .../comstockpostproc/plotting_mixin.py | 25 ++++++++++++++----- .../comstockpostproc/units_mixin.py | 1 + 7 files changed, 76 insertions(+), 10 deletions(-) diff --git a/postprocessing/comstockpostproc/comstock.py b/postprocessing/comstockpostproc/comstock.py index e8f2053c0..bc6eb3eda 100644 --- a/postprocessing/comstockpostproc/comstock.py +++ b/postprocessing/comstockpostproc/comstock.py @@ -213,6 +213,7 @@ def __init__(self, s3_base_dir, comstock_run_name, comstock_run_version, comstoc self.add_buildstock_csv_columns() self.data = self.downselect_imported_columns(self.data) self.rename_columns_and_convert_units() + self.add_refrig_defrost_kwh_columns() self.set_column_data_types() self.fix_supermarket_building_type_name() self.remove_unused_as_simulated_geog_cols() @@ -1819,6 +1820,24 @@ def remove_unused_as_simulated_geog_cols(self): logger.debug(geog_cols_to_remove) self.data = self.data.drop(geog_cols_to_remove) + def add_refrig_defrost_kwh_columns(self): + """Derive kWh-based refrigeration defrost columns from the Joule-based sensitivity report params.""" + params_case = 'out.params.refrigeration_case_defrost_energy..j' + params_walkin = 'out.params.refrigeration_walkin_defrost_energy..j' + j_to_kwh = self.conv_fact('j', 'kwh') + existing_cols = self.data.collect_schema().names() + cols_to_add = [] + if params_case in existing_cols: + cols_to_add.append((pl.col(params_case) * j_to_kwh).alias(self.ANN_ELEC_REFRIG_CASE_DEFROST_KBTU)) + elif not self.skip_missing_columns: + logger.warning(f'Column {params_case} not found; cannot create {self.ANN_ELEC_REFRIG_CASE_DEFROST_KBTU}') + if params_walkin in existing_cols: + cols_to_add.append((pl.col(params_walkin) * j_to_kwh).alias(self.ANN_ELEC_REFRIG_WALKIN_DEFROST_KBTU)) + elif not self.skip_missing_columns: + logger.warning(f'Column {params_walkin} not found; cannot create {self.ANN_ELEC_REFRIG_WALKIN_DEFROST_KBTU}') + if cols_to_add: + self.data = self.data.with_columns(cols_to_add) + def add_missing_energy_columns(self): # Put in zeroes for end-use columns that aren't used in ComStock yet for engy_col in (self.COLS_TOT_ANN_ENGY + self.COLS_ENDUSE_ANN_ENGY + self.COLS_GEN_ANN_ENGY): @@ -2241,6 +2260,7 @@ def plotting_columns(self): # Universal pcs += [self.UPGRADE_APPL, self.UPGRADE_NAME, self.BLDG_ID, self.CZ_ASHRAE, self.DATASET, self.BLDG_WEIGHT] pcs += [self.col_name_to_weighted(c, new_units=UnitsMixin.UNIT.ENERGY.TBTU) for c in self.COLS_ENDUSE_ANN_ENGY] + pcs += [self.col_name_to_weighted(c, new_units=UnitsMixin.UNIT.ENERGY.TBTU) for c in self.COLS_GROCERY_REFRIG_DETAIL_ENDUSE] pcs += [self.col_name_to_weighted(c, UnitsMixin.UNIT.MASS.CO2E_MMT) for c in self.GHG_FUEL_COLS] cols = self.COLS_UTIL_BILLS + ['out.utility_bills.electricity_bill_max..usd', 'out.utility_bills.electricity_bill_min..usd'] @@ -2326,7 +2346,9 @@ def create_plotting_lazyframe(self): column_downselection='detailed') # Select only columns needed for plotting - wtd_agg_outs = wtd_agg_outs.select(self.plotting_columns()) + available_cols = set(wtd_agg_outs.collect_schema().names()) + plot_cols = [c for c in self.plotting_columns() if c in available_cols] + wtd_agg_outs = wtd_agg_outs.select(plot_cols) # Write data to parquet file, hive partition on upgrade to make later processing faster file_name = f'cached_ComStock_plotting_upgrade{upgrade_id}.parquet' @@ -3371,6 +3393,7 @@ def add_weighted_area_energy_savings_columns(self, input_lf): self.COLS_TOT_ANN_ENGY + self.COLS_GEN_ANN_ENGY + self.COLS_ENDUSE_ANN_ENGY + + self.COLS_GROCERY_REFRIG_DETAIL_ENDUSE + self.COLS_ENDUSE_GROUP_TOT_ANN_ENGY + self.COLS_ENDUSE_GROUP_ANN_ENGY + self.load_component_cols()): diff --git a/postprocessing/comstockpostproc/comstock_measure_comparison.py b/postprocessing/comstockpostproc/comstock_measure_comparison.py index a81803bb1..57a561a32 100644 --- a/postprocessing/comstockpostproc/comstock_measure_comparison.py +++ b/postprocessing/comstockpostproc/comstock_measure_comparison.py @@ -150,10 +150,12 @@ def make_plots(self, lazy_frame: pl.LazyFrame, column_for_grouping, timeseries_l plot_method=self.plot_floor_area_and_energy_totals_by_building_type, lazy_frame=lazy_frame.clone(), columns=(self.lazyframe_plotter.BASE_COLUMNS + self.lazyframe_plotter.WTD_COLUMNS_SUMMARIZE))(**BASIC_PARAMS) + _lf_schema = lazy_frame.collect_schema().names() + _grocery_detail_cols = [c for c in self.lazyframe_plotter.WTD_COLS_GROCERY_REFRIG_DETAIL if c in _lf_schema] LazyFramePlotter.plot_with_lazy( plot_method=self.plot_end_use_totals_by_building_type, lazy_frame=lazy_frame.clone(), - columns=(self.lazyframe_plotter.BASE_COLUMNS + self.lazyframe_plotter.WTD_COLUMNS_ANN_ENDUSE + [self.BLDG_TYPE, self.CEN_DIV]))(**BASIC_PARAMS) + columns=(self.lazyframe_plotter.BASE_COLUMNS + self.lazyframe_plotter.WTD_COLUMNS_ANN_ENDUSE + _grocery_detail_cols + [self.BLDG_TYPE, self.CEN_DIV]))(**BASIC_PARAMS) LazyFramePlotter.plot_with_lazy(plot_method=self.plot_eui_histograms_by_building_type, lazy_frame=lazy_frame.clone(), columns=(self.lazyframe_plotter.BASE_COLUMNS + self.lazyframe_plotter.EUI_ANN_TOTL_COLUMNS + [self.BLDG_TYPE]))(**BASIC_PARAMS) LazyFramePlotter.plot_with_lazy(plot_method=self.plot_eui_boxplots_by_building_type, diff --git a/postprocessing/comstockpostproc/comstock_to_cbecs_comparison.py b/postprocessing/comstockpostproc/comstock_to_cbecs_comparison.py index 088b6ee0f..7a93bb0cd 100644 --- a/postprocessing/comstockpostproc/comstock_to_cbecs_comparison.py +++ b/postprocessing/comstockpostproc/comstock_to_cbecs_comparison.py @@ -108,7 +108,18 @@ def __init__(self, comstock_list: List[ComStock], cbecs_list: List[CBECS], upgra # Combine into a single dataframe for convenience # self.data = pd.concat(dfs_to_concat, join='inner', ignore_index=True) - #There is no such a join='inner' in polars.concat, implement it manually + # Preserve optional grocery refrigeration detail columns in mixed CBECS/ComStock comparisons + # by adding zero-filled placeholders where they are missing before schema intersection. + optional_enduse_cols = list(self.lazyframe_plotter.WTD_COLS_GROCERY_REFRIG_DETAIL) + dfs_with_optional_cols = [] + for df in dfs_to_concat: + missing_optional_cols = [c for c in optional_enduse_cols if c not in df.collect_schema().names()] + if missing_optional_cols: + df = df.with_columns([pl.lit(0.0).alias(c) for c in missing_optional_cols]) + dfs_with_optional_cols.append(df) + dfs_to_concat = dfs_with_optional_cols + + # There is no such a join='inner' in polars.concat, implement it manually common_columns = set(dfs_to_concat[0].collect_schema().names()) for df in dfs_to_concat: common_columns = common_columns.intersection(set(df.collect_schema().names())) @@ -211,7 +222,12 @@ def make_plots(self, lazy_frame: pl.LazyFrame, column_for_grouping, color_map: d LazyFramePlotter.plot_with_lazy( plot_method=self.plot_end_use_totals_by_building_type, lazy_frame=lazy_frame.clone(), - columns=( [column_for_grouping] + self.lazyframe_plotter.WTD_COLUMNS_ANN_ENDUSE + [self.BLDG_TYPE, self.CEN_DIV]))(**BASIC_PARAMS) + columns=( + [column_for_grouping] + + self.lazyframe_plotter.WTD_COLUMNS_ANN_ENDUSE + + self.lazyframe_plotter.WTD_COLS_GROCERY_REFRIG_DETAIL + + [self.BLDG_TYPE, self.CEN_DIV] + ))(**BASIC_PARAMS) logger.info('Making EUI histogram by building type plots') LazyFramePlotter.plot_with_lazy( diff --git a/postprocessing/comstockpostproc/lazyframeplotter.py b/postprocessing/comstockpostproc/lazyframeplotter.py index 5b9d04b11..aaf305e0e 100644 --- a/postprocessing/comstockpostproc/lazyframeplotter.py +++ b/postprocessing/comstockpostproc/lazyframeplotter.py @@ -22,6 +22,9 @@ def __init__(self): self.WTD_COLUMNS_ANN_ENDUSE = [self.col_name_to_weighted( col_name=c, new_units=UnitsMixin.UNIT.ENERGY.TBTU) for c in self.COLS_ENDUSE_ANN_ENGY] + self.WTD_COLS_GROCERY_REFRIG_DETAIL = [self.col_name_to_weighted( + col_name=c, new_units=UnitsMixin.UNIT.ENERGY.TBTU) for c in self.COLS_GROCERY_REFRIG_DETAIL_ENDUSE] + self.WTD_COLUMNS_ANN_PV = [self.col_name_to_weighted( col_name=c, new_units=UnitsMixin.UNIT.ENERGY.TBTU) for c in self.COLS_GEN_ANN_ENGY] diff --git a/postprocessing/comstockpostproc/naming_mixin.py b/postprocessing/comstockpostproc/naming_mixin.py index e385c142a..c8b8ae55c 100644 --- a/postprocessing/comstockpostproc/naming_mixin.py +++ b/postprocessing/comstockpostproc/naming_mixin.py @@ -142,6 +142,8 @@ class NamingMixin(): ANN_ELEC_INTLTG_KBTU = 'out.electricity.interior_lighting.energy_consumption..kwh' ANN_ELEC_PUMPS_KBTU = 'out.electricity.pumps.energy_consumption..kwh' ANN_ELEC_REFRIG_KBTU = 'out.electricity.refrigeration.energy_consumption..kwh' + ANN_ELEC_REFRIG_CASE_DEFROST_KBTU = 'out.electricity.refrigeration_case_defrost.energy_consumption..kwh' + ANN_ELEC_REFRIG_WALKIN_DEFROST_KBTU = 'out.electricity.refrigeration_walkin_defrost.energy_consumption..kwh' ANN_ELEC_SWH_KBTU = 'out.electricity.water_systems.energy_consumption..kwh' ANN_ELEC_PV_KBTU = 'out.electricity.pv.energy_consumption..kwh' #new? @@ -751,6 +753,12 @@ class NamingMixin(): ANN_ELEC_REFRIG_KBTU ] + # Refrigeration sub-category detail columns for Grocery buildings (subset of refrigeration, not added to COLS_ENDUSE_ANN_ENGY) + COLS_GROCERY_REFRIG_DETAIL_ENDUSE = [ + ANN_ELEC_REFRIG_CASE_DEFROST_KBTU, + ANN_ELEC_REFRIG_WALKIN_DEFROST_KBTU + ] + # List of HVAC end use group columns COLS_HVAC_ENERGY = COLS_HVAC_ELEC_ENDUSE + COLS_HVAC_GAS_ENDUSE + COLS_HVAC_PROPANE_ENDUSE + COLS_HVAC_FUELOIL_ENDUSE + COLS_HVAC_DISTHTG_ENDUSE + COLS_HVAC_DISTCLG_ENDUSE diff --git a/postprocessing/comstockpostproc/plotting_mixin.py b/postprocessing/comstockpostproc/plotting_mixin.py index 4f2209d15..16cf81b02 100644 --- a/postprocessing/comstockpostproc/plotting_mixin.py +++ b/postprocessing/comstockpostproc/plotting_mixin.py @@ -1301,6 +1301,12 @@ def plot_end_use_totals_by_building_type(self, df, column_for_grouping, color_ma end_use_cols = self.COLS_ENDUSE_ANN_ENGY wtd_end_use_cols = [self.col_name_to_weighted(c, 'tbtu') for c in end_use_cols] + # Grocery-specific refrigeration defrost detail columns (subset of refrigeration) + grocery_detail_wtd_cols = [ + self.col_name_to_weighted(c, 'tbtu') for c in self.COLS_GROCERY_REFRIG_DETAIL_ENDUSE + if self.col_name_to_weighted(c, 'tbtu') in df.columns + ] + # Disaggregate to these levels (now supports None) group_bys = [ None, @@ -1317,13 +1323,20 @@ def plot_end_use_totals_by_building_type(self, df, column_for_grouping, color_ma hue_order = list(color_map.keys()) palette = [color_map[name] for name in hue_order] row_name = 'Fuel and End Use' - row_label_map = { - col: self.col_name_to_nice_name(col).replace(' Energy Consumption', '') - for col in wtd_end_use_cols - } - row_order = [row_label_map[col] for col in wtd_end_use_cols] for bldg_type, bldg_type_df in df.groupby(self.BLDG_TYPE, observed=True): + # Include refrigeration defrost detail columns for Grocery buildings + if bldg_type == 'Grocery' and grocery_detail_wtd_cols: + wtd_end_use_cols_this = wtd_end_use_cols + grocery_detail_wtd_cols + else: + wtd_end_use_cols_this = wtd_end_use_cols + + row_label_map = { + col: self.col_name_to_nice_name(col).replace(' Energy Consumption', '') + for col in wtd_end_use_cols_this + } + row_order = [row_label_map[col] for col in wtd_end_use_cols_this] + for group_by in group_bys: # --- Minimal additions to support None group_by --- if group_by is None: @@ -1351,7 +1364,7 @@ def plot_end_use_totals_by_building_type(self, df, column_for_grouping, color_ma column_for_grouping, x_col ], - value_vars=wtd_end_use_cols, + value_vars=wtd_end_use_cols_this, var_name=var_name, value_name=val_name ) diff --git a/postprocessing/comstockpostproc/units_mixin.py b/postprocessing/comstockpostproc/units_mixin.py index 721b3cc47..9833fccd6 100644 --- a/postprocessing/comstockpostproc/units_mixin.py +++ b/postprocessing/comstockpostproc/units_mixin.py @@ -52,6 +52,7 @@ class DIMLESS: 'btu_to_kbtu' : (1.0 / 1e3), 'million_btu_to_kbtu': (1e9 / 1e6), 'million_btu_to_kwh': (1000 / 3.412141633127942), + 'j_to_kwh' : 1.0 / 3_600_000, 'gj_to_kbtu' : 947.8171203133173, 'gj_to_kwh' : 277.77777777777777, 'w_per_m2_k_to_btu_per_ft2_f_hr': 0.17611, From a99bc016b635ead6964d093cb664ee0f61700bf3 Mon Sep 17 00:00:00 2001 From: Matthew Dahlhausen Date: Tue, 7 Apr 2026 14:49:53 -0600 Subject: [PATCH 07/11] split out med and low temp defrost --- .../comstock_sensitivity_reports/measure.rb | 43 +++++++++++++----- .../comstock_sensitivity_reports/measure.xml | 8 ++-- .../resources/Variable List.xlsx | Bin 43109 -> 43298 bytes 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/measures/comstock_sensitivity_reports/measure.rb b/measures/comstock_sensitivity_reports/measure.rb index 6544fc874..1e6510862 100644 --- a/measures/comstock_sensitivity_reports/measure.rb +++ b/measures/comstock_sensitivity_reports/measure.rb @@ -3804,25 +3804,44 @@ def system_type_for(pump) runner.registerValue('com_report_shw_non_hp_water_heater_unmet_heat_transfer_demand_j', water_heater_unmet_heat_transfer_demand_j) # Refrigeration cases and walk-ins - refrigeration_case_count = 0.0 - refrigeration_case_total_defrost_electric_j = 0.0 + # Medium temperature: caseOperatingTemperature > -3C; Low temperature: <= -3C + refrigeration_med_temp_case_count = 0.0 + refrigeration_med_temp_case_total_defrost_electric_j = 0.0 + refrigeration_low_temp_case_count = 0.0 + refrigeration_low_temp_case_total_defrost_electric_j = 0.0 model.getRefrigerationCases.sort.each do |ref_case| - refrigeration_case_count += 1.0 defrost_electric_j = sql_get_report_variable_data_double(runner, sql, ref_case, 'Refrigeration Case Defrost Electricity Energy') - refrigeration_case_total_defrost_electric_j += defrost_electric_j + if ref_case.caseOperatingTemperature > -3.0 + refrigeration_med_temp_case_count += 1.0 + refrigeration_med_temp_case_total_defrost_electric_j += defrost_electric_j + else + refrigeration_low_temp_case_count += 1.0 + refrigeration_low_temp_case_total_defrost_electric_j += defrost_electric_j + end end - runner.registerValue('com_report_refrigeration_case_count', refrigeration_case_count) - runner.registerValue('com_report_refrigeration_case_total_defrost_electric_j', refrigeration_case_total_defrost_electric_j, 'J') + runner.registerValue('com_report_refrigeration_med_temp_case_count', refrigeration_med_temp_case_count) + runner.registerValue('com_report_refrigeration_med_temp_case_total_defrost_electric_j', refrigeration_med_temp_case_total_defrost_electric_j, 'J') + runner.registerValue('com_report_refrigeration_low_temp_case_count', refrigeration_low_temp_case_count) + runner.registerValue('com_report_refrigeration_low_temp_case_total_defrost_electric_j', refrigeration_low_temp_case_total_defrost_electric_j, 'J') - refrigeration_walk_in_count = 0.0 - refrigeration_walk_in_total_defrost_electric_j = 0.0 + refrigeration_med_temp_walk_in_count = 0.0 + refrigeration_med_temp_walk_in_total_defrost_electric_j = 0.0 + refrigeration_low_temp_walk_in_count = 0.0 + refrigeration_low_temp_walk_in_total_defrost_electric_j = 0.0 model.getRefrigerationWalkIns.sort.each do |walk_in| - refrigeration_walk_in_count += 1.0 defrost_electric_j = sql_get_report_variable_data_double(runner, sql, walk_in, 'Refrigeration Walk In Defrost Electricity Energy') - refrigeration_walk_in_total_defrost_electric_j += defrost_electric_j + if walk_in.operatingTemperature > -3.0 + refrigeration_med_temp_walk_in_count += 1.0 + refrigeration_med_temp_walk_in_total_defrost_electric_j += defrost_electric_j + else + refrigeration_low_temp_walk_in_count += 1.0 + refrigeration_low_temp_walk_in_total_defrost_electric_j += defrost_electric_j + end end - runner.registerValue('com_report_refrigeration_walk_in_count', refrigeration_walk_in_count) - runner.registerValue('com_report_refrigeration_walk_in_total_defrost_electric_j', refrigeration_walk_in_total_defrost_electric_j, 'J') + runner.registerValue('com_report_refrigeration_med_temp_walk_in_count', refrigeration_med_temp_walk_in_count) + runner.registerValue('com_report_refrigeration_med_temp_walk_in_total_defrost_electric_j', refrigeration_med_temp_walk_in_total_defrost_electric_j, 'J') + runner.registerValue('com_report_refrigeration_low_temp_walk_in_count', refrigeration_low_temp_walk_in_count) + runner.registerValue('com_report_refrigeration_low_temp_walk_in_total_defrost_electric_j', refrigeration_low_temp_walk_in_total_defrost_electric_j, 'J') # Error and Warning count from eplusout.err file (sql does not have data) err_path = File.join(File.dirname(sql.path.to_s), 'eplusout.err') diff --git a/measures/comstock_sensitivity_reports/measure.xml b/measures/comstock_sensitivity_reports/measure.xml index 9ffdb133e..bf7915039 100644 --- a/measures/comstock_sensitivity_reports/measure.xml +++ b/measures/comstock_sensitivity_reports/measure.xml @@ -3,8 +3,8 @@ 3.1 com_stock_sensitivity_reports aeb81242-de7e-4613-af47-c1faf19d286a - 0a1472cd-192c-4304-b60a-431c4ccf1d40 - 2026-04-03T19:04:30Z + 77e7e9b0-bc0d-4c7d-941a-f1ef6e059cee + 2026-04-07T20:45:33Z A0069B90 ComStockSensitivityReports ComStock_Sensitivity_Reports @@ -76,13 +76,13 @@ measure.rb rb script - 7195CBED + 2272FBBC Variable List.xlsx xlsx resource - E2CB0BD3 + F43A7411 8172d17_0000008.osm diff --git a/measures/comstock_sensitivity_reports/resources/Variable List.xlsx b/measures/comstock_sensitivity_reports/resources/Variable List.xlsx index c5011b7888753016a8693e0f7a39b1479d6aa5c7..302a54f15f6080e422dc7f546da3c0db0ff91f88 100644 GIT binary patch delta 28210 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 JR{9^E{|B*+4x#`6 delta 27922 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 Date: Tue, 7 Apr 2026 14:58:05 -0600 Subject: [PATCH 08/11] update postproc with separate med and low temp --- .../comstockpostproc/naming_mixin.py | 22 +++++++++++++++++-- .../comstockpostproc/plotting_mixin.py | 12 ++++++---- .../resources/comstock_column_definitions.csv | 12 ++++++---- 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/postprocessing/comstockpostproc/naming_mixin.py b/postprocessing/comstockpostproc/naming_mixin.py index c8b8ae55c..6e211209f 100644 --- a/postprocessing/comstockpostproc/naming_mixin.py +++ b/postprocessing/comstockpostproc/naming_mixin.py @@ -144,6 +144,10 @@ class NamingMixin(): ANN_ELEC_REFRIG_KBTU = 'out.electricity.refrigeration.energy_consumption..kwh' ANN_ELEC_REFRIG_CASE_DEFROST_KBTU = 'out.electricity.refrigeration_case_defrost.energy_consumption..kwh' ANN_ELEC_REFRIG_WALKIN_DEFROST_KBTU = 'out.electricity.refrigeration_walkin_defrost.energy_consumption..kwh' + ANN_ELEC_REFRIG_MED_TEMP_CASE_DEFROST_KBTU = 'out.electricity.refrigeration_med_temp_case_defrost.energy_consumption..kwh' + ANN_ELEC_REFRIG_LOW_TEMP_CASE_DEFROST_KBTU = 'out.electricity.refrigeration_low_temp_case_defrost.energy_consumption..kwh' + ANN_ELEC_REFRIG_MED_TEMP_WALKIN_DEFROST_KBTU = 'out.electricity.refrigeration_med_temp_walkin_defrost.energy_consumption..kwh' + ANN_ELEC_REFRIG_LOW_TEMP_WALKIN_DEFROST_KBTU = 'out.electricity.refrigeration_low_temp_walkin_defrost.energy_consumption..kwh' ANN_ELEC_SWH_KBTU = 'out.electricity.water_systems.energy_consumption..kwh' ANN_ELEC_PV_KBTU = 'out.electricity.pv.energy_consumption..kwh' #new? @@ -755,8 +759,22 @@ class NamingMixin(): # Refrigeration sub-category detail columns for Grocery buildings (subset of refrigeration, not added to COLS_ENDUSE_ANN_ENGY) COLS_GROCERY_REFRIG_DETAIL_ENDUSE = [ - ANN_ELEC_REFRIG_CASE_DEFROST_KBTU, - ANN_ELEC_REFRIG_WALKIN_DEFROST_KBTU + ANN_ELEC_REFRIG_MED_TEMP_CASE_DEFROST_KBTU, + ANN_ELEC_REFRIG_LOW_TEMP_CASE_DEFROST_KBTU, + ANN_ELEC_REFRIG_MED_TEMP_WALKIN_DEFROST_KBTU, + ANN_ELEC_REFRIG_LOW_TEMP_WALKIN_DEFROST_KBTU + ] + + # Refrigeration medium temperature detail columns for Grocery buildings + COLS_GROCERY_REFRIG_MED_TEMP_DETAIL_ENDUSE = [ + ANN_ELEC_REFRIG_MED_TEMP_CASE_DEFROST_KBTU, + ANN_ELEC_REFRIG_MED_TEMP_WALKIN_DEFROST_KBTU + ] + + # Refrigeration low temperature detail columns for Grocery buildings + COLS_GROCERY_REFRIG_LOW_TEMP_DETAIL_ENDUSE = [ + ANN_ELEC_REFRIG_LOW_TEMP_CASE_DEFROST_KBTU, + ANN_ELEC_REFRIG_LOW_TEMP_WALKIN_DEFROST_KBTU ] # List of HVAC end use group columns diff --git a/postprocessing/comstockpostproc/plotting_mixin.py b/postprocessing/comstockpostproc/plotting_mixin.py index 16cf81b02..08098b438 100644 --- a/postprocessing/comstockpostproc/plotting_mixin.py +++ b/postprocessing/comstockpostproc/plotting_mixin.py @@ -1302,8 +1302,12 @@ def plot_end_use_totals_by_building_type(self, df, column_for_grouping, color_ma wtd_end_use_cols = [self.col_name_to_weighted(c, 'tbtu') for c in end_use_cols] # Grocery-specific refrigeration defrost detail columns (subset of refrigeration) - grocery_detail_wtd_cols = [ - self.col_name_to_weighted(c, 'tbtu') for c in self.COLS_GROCERY_REFRIG_DETAIL_ENDUSE + grocery_detail_wtd_cols_med_temp = [ + self.col_name_to_weighted(c, 'tbtu') for c in self.COLS_GROCERY_REFRIG_MED_TEMP_DETAIL_ENDUSE + if self.col_name_to_weighted(c, 'tbtu') in df.columns + ] + grocery_detail_wtd_cols_low_temp = [ + self.col_name_to_weighted(c, 'tbtu') for c in self.COLS_GROCERY_REFRIG_LOW_TEMP_DETAIL_ENDUSE if self.col_name_to_weighted(c, 'tbtu') in df.columns ] @@ -1326,8 +1330,8 @@ def plot_end_use_totals_by_building_type(self, df, column_for_grouping, color_ma for bldg_type, bldg_type_df in df.groupby(self.BLDG_TYPE, observed=True): # Include refrigeration defrost detail columns for Grocery buildings - if bldg_type == 'Grocery' and grocery_detail_wtd_cols: - wtd_end_use_cols_this = wtd_end_use_cols + grocery_detail_wtd_cols + if bldg_type == 'Grocery' and (grocery_detail_wtd_cols_med_temp or grocery_detail_wtd_cols_low_temp): + wtd_end_use_cols_this = wtd_end_use_cols + grocery_detail_wtd_cols_med_temp + grocery_detail_wtd_cols_low_temp else: wtd_end_use_cols_this = wtd_end_use_cols diff --git a/postprocessing/comstockpostproc/resources/comstock_column_definitions.csv b/postprocessing/comstockpostproc/resources/comstock_column_definitions.csv index 048a2fccf..b1e8dd0a2 100644 --- a/postprocessing/comstockpostproc/resources/comstock_column_definitions.csv +++ b/postprocessing/comstockpostproc/resources/comstock_column_definitions.csv @@ -662,10 +662,14 @@ results.csv,com_stock_sensitivity_reports.com_report_shw_non_hp_water_heater_gas results.csv,com_stock_sensitivity_reports.com_report_shw_non_hp_water_heater_other_fuel_j,out.params.non_hp_water_heater_other_fuel,TRUE,FALSE,float,j,j,other fuel energy use by non-heat pump water heaters results.csv,com_stock_sensitivity_reports.com_report_shw_non_hp_water_heater_total_volume_gal,out.params.non_hp_water_heater_total_volume_gal,TRUE,FALSE,float,gal,gal,combined volume of water heaters results.csv,com_stock_sensitivity_reports.com_report_shw_non_hp_water_heater_unmet_heat_transfer_demand_j,out.params.non_hp_water_heater_unmet_heat_transfer_demand,TRUE,FALSE,float,j,j,water heater unmet heat transfer demand -results.csv,com_stock_sensitivity_reports.com_report_refrigeration_case_count,out.params.refrigeration_case_count,FALSE,FALSE,float,,,count of refrigerated cases -results.csv,com_stock_sensitivity_reports.com_report_refrigeration_case_total_defrost_electric_j,out.params.refrigeration_case_defrost_energy,TRUE,FALSE,float,j,j,electric energy use for refrigerated case defrost -results.csv,com_stock_sensitivity_reports.com_report_refrigeration_walk_in_count,out.params.refrigeration_walkin_count,FALSE,FALSE,float,,,count of refrigerated walk-ins -results.csv,com_stock_sensitivity_reports.com_report_refrigeration_walk_in_total_defrost_electric_j,out.params.refrigeration_walkin_defrost_energy,TRUE,FALSE,float,j,j,electric energy use for refrigerated walk-in defrost +results.csv,com_stock_sensitivity_reports.com_report_refrigeration_med_temp_case_count,out.params.refrigeration_med_temp_case_count,FALSE,FALSE,float,,,count of medium temperature refrigerated cases (operating temp > -3C) +results.csv,com_stock_sensitivity_reports.com_report_refrigeration_med_temp_case_total_defrost_electric_j,out.params.refrigeration_med_temp_case_defrost_energy,TRUE,FALSE,float,j,j,electric energy use for medium temperature refrigerated case defrost +results.csv,com_stock_sensitivity_reports.com_report_refrigeration_low_temp_case_count,out.params.refrigeration_low_temp_case_count,FALSE,FALSE,float,,,count of low temperature refrigerated cases (operating temp <= -3C) +results.csv,com_stock_sensitivity_reports.com_report_refrigeration_low_temp_case_total_defrost_electric_j,out.params.refrigeration_low_temp_case_defrost_energy,TRUE,FALSE,float,j,j,electric energy use for low temperature refrigerated case defrost +results.csv,com_stock_sensitivity_reports.com_report_refrigeration_med_temp_walk_in_count,out.params.refrigeration_med_temp_walkin_count,FALSE,FALSE,float,,,count of medium temperature refrigerated walk-ins (operating temp > -3C) +results.csv,com_stock_sensitivity_reports.com_report_refrigeration_med_temp_walk_in_total_defrost_electric_j,out.params.refrigeration_med_temp_walkin_defrost_energy,TRUE,FALSE,float,j,j,electric energy use for medium temperature refrigerated walk-in defrost +results.csv,com_stock_sensitivity_reports.com_report_refrigeration_low_temp_walk_in_count,out.params.refrigeration_low_temp_walkin_count,FALSE,FALSE,float,,,count of low temperature refrigerated walk-ins (operating temp <= -3C) +results.csv,com_stock_sensitivity_reports.com_report_refrigeration_low_temp_walk_in_total_defrost_electric_j,out.params.refrigeration_low_temp_walkin_defrost_energy,TRUE,FALSE,float,j,j,electric energy use for low temperature refrigerated walk-in defrost results.csv,com_stock_sensitivity_reports.com_report_unitary_sys_cycling_ratio_cooling,out.params.unitary_sys_cycling_ratio_cooling,TRUE,FALSE,float,,,weighted average unitary system cycling ratio for cooling operation results.csv,com_stock_sensitivity_reports.com_report_unitary_sys_cycling_ratio_heating,out.params.unitary_sys_cycling_ratio_heating,TRUE,FALSE,float,,,weighted average unitary system cycling ratio for heating operation results.csv,com_stock_sensitivity_reports.com_report_unitary_sys_cycling_excess_electricity_cooling_pcnt,out.params.unitary_sys_cycling_excess_electricity_cooling_pcnt,TRUE,FALSE,float,,,excess electricity used for cycling during cooling operation From b0b63da1e11442d43bf6242ddd5bbf64ce3ef7cb Mon Sep 17 00:00:00 2001 From: Matthew Dahlhausen Date: Wed, 8 Apr 2026 14:29:36 -0600 Subject: [PATCH 09/11] all plotting by a specific building type --- .../comstock_to_cbecs_comparison.py | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/postprocessing/comstockpostproc/comstock_to_cbecs_comparison.py b/postprocessing/comstockpostproc/comstock_to_cbecs_comparison.py index 7a93bb0cd..34c9086a4 100644 --- a/postprocessing/comstockpostproc/comstock_to_cbecs_comparison.py +++ b/postprocessing/comstockpostproc/comstock_to_cbecs_comparison.py @@ -19,7 +19,7 @@ logger = logging.getLogger(__name__) class ComStockToCBECSComparison(NamingMixin, UnitsMixin, PlottingMixin): - def __init__(self, comstock_list: List[ComStock], cbecs_list: List[CBECS], upgrade_id=0, image_type='jpg', name=None, make_comparison_plots=True, make_hvac_plots = False): + def __init__(self, comstock_list: List[ComStock], cbecs_list: List[CBECS], upgrade_id=0, image_type='jpg', name=None, make_comparison_plots=True, make_hvac_plots = False, building_type: str | None = None): """ Creates the ComStock to CBECS comaprison plots. @@ -30,6 +30,11 @@ def __init__(self, comstock_list: List[ComStock], cbecs_list: List[CBECS], upgra image_type (str, optional): Image file type to use. Defaults to 'jpg'. name (str, optional): Name of output directory. If None, a name will be generated. Defaults to None. make_comparison_plots (bool, optional): Flag to create compairison plots. Defaults to True. + building_type (str | None, optional): ComStock building type to filter plots to. + Valid values: 'FullServiceRestaurant', 'QuickServiceRestaurant', 'RetailStripmall', + 'RetailStandalone', 'SmallOffice', 'MediumOffice', 'LargeOffice', 'PrimarySchool', + 'SecondarySchool', 'Outpatient', 'Hospital', 'SmallHotel', 'LargeHotel', 'Warehouse', + 'Grocery'. If None, all building types are plotted. """ # Initialize members self.comstock_list = comstock_list @@ -41,6 +46,9 @@ def __init__(self, comstock_list: List[ComStock], cbecs_list: List[CBECS], upgra self.column_for_grouping = self.DATASET self.lazyframe_plotter: LazyFramePlotter = LazyFramePlotter() + # Optional building type filter for faster plotting. + requested_building_type = self._validate_building_type(building_type) + # Concatenate the datasets and create a color map dfs_to_concat = [] comstock_dfs_to_concat = [] @@ -125,6 +133,8 @@ def __init__(self, comstock_list: List[ComStock], cbecs_list: List[CBECS], upgra common_columns = common_columns.intersection(set(df.collect_schema().names())) dfs_to_concat = [df.select(common_columns) for df in dfs_to_concat] self.data: pl.LazyFrame = pl.concat(dfs_to_concat, how="vertical_relaxed") + if requested_building_type is not None: + self.data = self._filter_to_building_type(self.data, requested_building_type) # Add Replicate Weights (CBECS only) for RSE calculations cbecs_src = cbecs_list[0] rep_cols = [self.BLDG_ID] + self.list_replicate_weight_cols(cbecs_src.data) @@ -154,9 +164,12 @@ def __init__(self, comstock_list: List[ComStock], cbecs_list: List[CBECS], upgra logger.info(f"Not including columns {all_columns - common_columns} in comstock only plots") comstock_dfs_to_concat = [df.select(common_columns) for df in comstock_dfs_to_concat] comstock_qoi_columns = [self.DATASET] + self.QOI_MAX_DAILY_TIMING_COLS + self.QOI_MAX_USE_COLS + self.QOI_MIN_USE_COLS + self.QOI_MAX_USE_COLS_NORMALIZED + self.QOI_MIN_USE_COLS_NORMALIZED - comstock_df: pl.LazyFrame = pl.concat(comstock_dfs_to_concat, how="vertical_relaxed").select(comstock_qoi_columns) + comstock_all_df: pl.LazyFrame = pl.concat(comstock_dfs_to_concat, how="vertical_relaxed") + if requested_building_type is not None: + comstock_all_df = self._filter_to_building_type(comstock_all_df, requested_building_type) + comstock_df: pl.LazyFrame = comstock_all_df.select(comstock_qoi_columns) comstock_enduse_columns = [self.DATASET] + self.lazyframe_plotter.WTD_COLUMNS_ANN_ENDUSE + self.lazyframe_plotter.WTD_COLUMNS_ANN_PV + self.lazyframe_plotter.WTD_COLUMNS_SUMMARIZE - comstock_enduse_df: pl.LazyFrame = pl.concat(comstock_dfs_to_concat, how="vertical_relaxed").select(comstock_enduse_columns) + comstock_enduse_df: pl.LazyFrame = comstock_all_df.select(comstock_enduse_columns) # Make directories self.output_dir = os.path.join(current_dir, '..', 'output', self.name) @@ -307,3 +320,21 @@ def export_to_csv_wide(self): logger.info(f'Exported comparison data to {file_path}') except Exception as e: logger.error(f"CSV export failed: {e}") + + def _validate_building_type(self, building_type: str | None) -> str | None: + if building_type is None: + return None + + allowed_types = list(self.ORDERED_CATEGORIES[self.BLDG_TYPE]) + requested = building_type.strip() + if requested not in allowed_types: + raise ValueError( + f"Invalid building_type '{building_type}'. Valid options are: {allowed_types}" + ) + return requested + + def _filter_to_building_type(self, lazy_frame: pl.LazyFrame, building_type: str) -> pl.LazyFrame: + schema = lazy_frame.collect_schema().names() + if self.BLDG_TYPE not in schema: + raise ValueError(f"Cannot filter by building type; missing required column: {self.BLDG_TYPE}") + return lazy_frame.filter(pl.col(self.BLDG_TYPE) == building_type) From d3fcb7af952c25d6361bc1872ae5de395affe297 Mon Sep 17 00:00:00 2001 From: Matthew Dahlhausen Date: Wed, 8 Apr 2026 15:59:15 -0600 Subject: [PATCH 10/11] update refrigeration defrost postproc var names --- postprocessing/comstockpostproc/comstock.py | 23 ++----------- .../comstockpostproc/lazyframeplotter.py | 2 +- .../comstockpostproc/naming_mixin.py | 32 +++++++++---------- .../comstockpostproc/plotting_mixin.py | 4 +-- .../resources/comstock_column_definitions.csv | 8 ++--- 5 files changed, 24 insertions(+), 45 deletions(-) diff --git a/postprocessing/comstockpostproc/comstock.py b/postprocessing/comstockpostproc/comstock.py index bc6eb3eda..ce0712d0d 100644 --- a/postprocessing/comstockpostproc/comstock.py +++ b/postprocessing/comstockpostproc/comstock.py @@ -213,7 +213,6 @@ def __init__(self, s3_base_dir, comstock_run_name, comstock_run_version, comstoc self.add_buildstock_csv_columns() self.data = self.downselect_imported_columns(self.data) self.rename_columns_and_convert_units() - self.add_refrig_defrost_kwh_columns() self.set_column_data_types() self.fix_supermarket_building_type_name() self.remove_unused_as_simulated_geog_cols() @@ -1820,24 +1819,6 @@ def remove_unused_as_simulated_geog_cols(self): logger.debug(geog_cols_to_remove) self.data = self.data.drop(geog_cols_to_remove) - def add_refrig_defrost_kwh_columns(self): - """Derive kWh-based refrigeration defrost columns from the Joule-based sensitivity report params.""" - params_case = 'out.params.refrigeration_case_defrost_energy..j' - params_walkin = 'out.params.refrigeration_walkin_defrost_energy..j' - j_to_kwh = self.conv_fact('j', 'kwh') - existing_cols = self.data.collect_schema().names() - cols_to_add = [] - if params_case in existing_cols: - cols_to_add.append((pl.col(params_case) * j_to_kwh).alias(self.ANN_ELEC_REFRIG_CASE_DEFROST_KBTU)) - elif not self.skip_missing_columns: - logger.warning(f'Column {params_case} not found; cannot create {self.ANN_ELEC_REFRIG_CASE_DEFROST_KBTU}') - if params_walkin in existing_cols: - cols_to_add.append((pl.col(params_walkin) * j_to_kwh).alias(self.ANN_ELEC_REFRIG_WALKIN_DEFROST_KBTU)) - elif not self.skip_missing_columns: - logger.warning(f'Column {params_walkin} not found; cannot create {self.ANN_ELEC_REFRIG_WALKIN_DEFROST_KBTU}') - if cols_to_add: - self.data = self.data.with_columns(cols_to_add) - def add_missing_energy_columns(self): # Put in zeroes for end-use columns that aren't used in ComStock yet for engy_col in (self.COLS_TOT_ANN_ENGY + self.COLS_ENDUSE_ANN_ENGY + self.COLS_GEN_ANN_ENGY): @@ -2260,7 +2241,7 @@ def plotting_columns(self): # Universal pcs += [self.UPGRADE_APPL, self.UPGRADE_NAME, self.BLDG_ID, self.CZ_ASHRAE, self.DATASET, self.BLDG_WEIGHT] pcs += [self.col_name_to_weighted(c, new_units=UnitsMixin.UNIT.ENERGY.TBTU) for c in self.COLS_ENDUSE_ANN_ENGY] - pcs += [self.col_name_to_weighted(c, new_units=UnitsMixin.UNIT.ENERGY.TBTU) for c in self.COLS_GROCERY_REFRIG_DETAIL_ENDUSE] + pcs += [self.col_name_to_weighted(c, new_units=UnitsMixin.UNIT.ENERGY.TBTU) for c in self.COLS_GROCERY_REFRIG_DEFROST_ENDUSE] pcs += [self.col_name_to_weighted(c, UnitsMixin.UNIT.MASS.CO2E_MMT) for c in self.GHG_FUEL_COLS] cols = self.COLS_UTIL_BILLS + ['out.utility_bills.electricity_bill_max..usd', 'out.utility_bills.electricity_bill_min..usd'] @@ -3393,7 +3374,7 @@ def add_weighted_area_energy_savings_columns(self, input_lf): self.COLS_TOT_ANN_ENGY + self.COLS_GEN_ANN_ENGY + self.COLS_ENDUSE_ANN_ENGY + - self.COLS_GROCERY_REFRIG_DETAIL_ENDUSE + + self.COLS_GROCERY_REFRIG_DEFROST_ENDUSE + self.COLS_ENDUSE_GROUP_TOT_ANN_ENGY + self.COLS_ENDUSE_GROUP_ANN_ENGY + self.load_component_cols()): diff --git a/postprocessing/comstockpostproc/lazyframeplotter.py b/postprocessing/comstockpostproc/lazyframeplotter.py index aaf305e0e..8f9e3cbd4 100644 --- a/postprocessing/comstockpostproc/lazyframeplotter.py +++ b/postprocessing/comstockpostproc/lazyframeplotter.py @@ -23,7 +23,7 @@ def __init__(self): col_name=c, new_units=UnitsMixin.UNIT.ENERGY.TBTU) for c in self.COLS_ENDUSE_ANN_ENGY] self.WTD_COLS_GROCERY_REFRIG_DETAIL = [self.col_name_to_weighted( - col_name=c, new_units=UnitsMixin.UNIT.ENERGY.TBTU) for c in self.COLS_GROCERY_REFRIG_DETAIL_ENDUSE] + col_name=c, new_units=UnitsMixin.UNIT.ENERGY.TBTU) for c in self.COLS_GROCERY_REFRIG_DEFROST_ENDUSE] self.WTD_COLUMNS_ANN_PV = [self.col_name_to_weighted( col_name=c, new_units=UnitsMixin.UNIT.ENERGY.TBTU) for c in self.COLS_GEN_ANN_ENGY] diff --git a/postprocessing/comstockpostproc/naming_mixin.py b/postprocessing/comstockpostproc/naming_mixin.py index 6e211209f..00321a01a 100644 --- a/postprocessing/comstockpostproc/naming_mixin.py +++ b/postprocessing/comstockpostproc/naming_mixin.py @@ -142,12 +142,10 @@ class NamingMixin(): ANN_ELEC_INTLTG_KBTU = 'out.electricity.interior_lighting.energy_consumption..kwh' ANN_ELEC_PUMPS_KBTU = 'out.electricity.pumps.energy_consumption..kwh' ANN_ELEC_REFRIG_KBTU = 'out.electricity.refrigeration.energy_consumption..kwh' - ANN_ELEC_REFRIG_CASE_DEFROST_KBTU = 'out.electricity.refrigeration_case_defrost.energy_consumption..kwh' - ANN_ELEC_REFRIG_WALKIN_DEFROST_KBTU = 'out.electricity.refrigeration_walkin_defrost.energy_consumption..kwh' - ANN_ELEC_REFRIG_MED_TEMP_CASE_DEFROST_KBTU = 'out.electricity.refrigeration_med_temp_case_defrost.energy_consumption..kwh' - ANN_ELEC_REFRIG_LOW_TEMP_CASE_DEFROST_KBTU = 'out.electricity.refrigeration_low_temp_case_defrost.energy_consumption..kwh' - ANN_ELEC_REFRIG_MED_TEMP_WALKIN_DEFROST_KBTU = 'out.electricity.refrigeration_med_temp_walkin_defrost.energy_consumption..kwh' - ANN_ELEC_REFRIG_LOW_TEMP_WALKIN_DEFROST_KBTU = 'out.electricity.refrigeration_low_temp_walkin_defrost.energy_consumption..kwh' + ANN_ELEC_REFRIG_MED_TEMP_CASE_DEFROST_KWH = 'out.params.refrigeration_med_temp_case_defrost_energy..kwh' + ANN_ELEC_REFRIG_LOW_TEMP_CASE_DEFROST_KWH = 'out.params.refrigeration_low_temp_case_defrost_energy..kwh' + ANN_ELEC_REFRIG_MED_TEMP_WALKIN_DEFROST_KWH = 'out.params.refrigeration_med_temp_walkin_defrost_energy..kwh' + ANN_ELEC_REFRIG_LOW_TEMP_WALKIN_DEFROST_KWH = 'out.params.refrigeration_low_temp_walkin_defrost_energy..kwh' ANN_ELEC_SWH_KBTU = 'out.electricity.water_systems.energy_consumption..kwh' ANN_ELEC_PV_KBTU = 'out.electricity.pv.energy_consumption..kwh' #new? @@ -758,23 +756,23 @@ class NamingMixin(): ] # Refrigeration sub-category detail columns for Grocery buildings (subset of refrigeration, not added to COLS_ENDUSE_ANN_ENGY) - COLS_GROCERY_REFRIG_DETAIL_ENDUSE = [ - ANN_ELEC_REFRIG_MED_TEMP_CASE_DEFROST_KBTU, - ANN_ELEC_REFRIG_LOW_TEMP_CASE_DEFROST_KBTU, - ANN_ELEC_REFRIG_MED_TEMP_WALKIN_DEFROST_KBTU, - ANN_ELEC_REFRIG_LOW_TEMP_WALKIN_DEFROST_KBTU + COLS_GROCERY_REFRIG_DEFROST_ENDUSE = [ + ANN_ELEC_REFRIG_MED_TEMP_CASE_DEFROST_KWH, + ANN_ELEC_REFRIG_LOW_TEMP_CASE_DEFROST_KWH, + ANN_ELEC_REFRIG_MED_TEMP_WALKIN_DEFROST_KWH, + ANN_ELEC_REFRIG_LOW_TEMP_WALKIN_DEFROST_KWH ] # Refrigeration medium temperature detail columns for Grocery buildings - COLS_GROCERY_REFRIG_MED_TEMP_DETAIL_ENDUSE = [ - ANN_ELEC_REFRIG_MED_TEMP_CASE_DEFROST_KBTU, - ANN_ELEC_REFRIG_MED_TEMP_WALKIN_DEFROST_KBTU + COLS_GROCERY_REFRIG_MED_TEMP_DEFROST_ENDUSE = [ + ANN_ELEC_REFRIG_MED_TEMP_CASE_DEFROST_KWH, + ANN_ELEC_REFRIG_MED_TEMP_WALKIN_DEFROST_KWH ] # Refrigeration low temperature detail columns for Grocery buildings - COLS_GROCERY_REFRIG_LOW_TEMP_DETAIL_ENDUSE = [ - ANN_ELEC_REFRIG_LOW_TEMP_CASE_DEFROST_KBTU, - ANN_ELEC_REFRIG_LOW_TEMP_WALKIN_DEFROST_KBTU + COLS_GROCERY_REFRIG_LOW_TEMP_DEFROST_ENDUSE = [ + ANN_ELEC_REFRIG_LOW_TEMP_CASE_DEFROST_KWH, + ANN_ELEC_REFRIG_LOW_TEMP_WALKIN_DEFROST_KWH ] # List of HVAC end use group columns diff --git a/postprocessing/comstockpostproc/plotting_mixin.py b/postprocessing/comstockpostproc/plotting_mixin.py index 08098b438..2f708722d 100644 --- a/postprocessing/comstockpostproc/plotting_mixin.py +++ b/postprocessing/comstockpostproc/plotting_mixin.py @@ -1303,11 +1303,11 @@ def plot_end_use_totals_by_building_type(self, df, column_for_grouping, color_ma # Grocery-specific refrigeration defrost detail columns (subset of refrigeration) grocery_detail_wtd_cols_med_temp = [ - self.col_name_to_weighted(c, 'tbtu') for c in self.COLS_GROCERY_REFRIG_MED_TEMP_DETAIL_ENDUSE + self.col_name_to_weighted(c, 'tbtu') for c in self.COLS_GROCERY_REFRIG_MED_TEMP_DEFROST_ENDUSE if self.col_name_to_weighted(c, 'tbtu') in df.columns ] grocery_detail_wtd_cols_low_temp = [ - self.col_name_to_weighted(c, 'tbtu') for c in self.COLS_GROCERY_REFRIG_LOW_TEMP_DETAIL_ENDUSE + self.col_name_to_weighted(c, 'tbtu') for c in self.COLS_GROCERY_REFRIG_LOW_TEMP_DEFROST_ENDUSE if self.col_name_to_weighted(c, 'tbtu') in df.columns ] diff --git a/postprocessing/comstockpostproc/resources/comstock_column_definitions.csv b/postprocessing/comstockpostproc/resources/comstock_column_definitions.csv index b1e8dd0a2..f69af3c42 100644 --- a/postprocessing/comstockpostproc/resources/comstock_column_definitions.csv +++ b/postprocessing/comstockpostproc/resources/comstock_column_definitions.csv @@ -663,13 +663,13 @@ results.csv,com_stock_sensitivity_reports.com_report_shw_non_hp_water_heater_oth results.csv,com_stock_sensitivity_reports.com_report_shw_non_hp_water_heater_total_volume_gal,out.params.non_hp_water_heater_total_volume_gal,TRUE,FALSE,float,gal,gal,combined volume of water heaters results.csv,com_stock_sensitivity_reports.com_report_shw_non_hp_water_heater_unmet_heat_transfer_demand_j,out.params.non_hp_water_heater_unmet_heat_transfer_demand,TRUE,FALSE,float,j,j,water heater unmet heat transfer demand results.csv,com_stock_sensitivity_reports.com_report_refrigeration_med_temp_case_count,out.params.refrigeration_med_temp_case_count,FALSE,FALSE,float,,,count of medium temperature refrigerated cases (operating temp > -3C) -results.csv,com_stock_sensitivity_reports.com_report_refrigeration_med_temp_case_total_defrost_electric_j,out.params.refrigeration_med_temp_case_defrost_energy,TRUE,FALSE,float,j,j,electric energy use for medium temperature refrigerated case defrost +results.csv,com_stock_sensitivity_reports.com_report_refrigeration_med_temp_case_total_defrost_electric_j,out.params.refrigeration_med_temp_case_defrost_energy,TRUE,FALSE,float,j,kwh,electric energy use for medium temperature refrigerated case defrost results.csv,com_stock_sensitivity_reports.com_report_refrigeration_low_temp_case_count,out.params.refrigeration_low_temp_case_count,FALSE,FALSE,float,,,count of low temperature refrigerated cases (operating temp <= -3C) -results.csv,com_stock_sensitivity_reports.com_report_refrigeration_low_temp_case_total_defrost_electric_j,out.params.refrigeration_low_temp_case_defrost_energy,TRUE,FALSE,float,j,j,electric energy use for low temperature refrigerated case defrost +results.csv,com_stock_sensitivity_reports.com_report_refrigeration_low_temp_case_total_defrost_electric_j,out.params.refrigeration_low_temp_case_defrost_energy,TRUE,FALSE,float,j,kwh,electric energy use for low temperature refrigerated case defrost results.csv,com_stock_sensitivity_reports.com_report_refrigeration_med_temp_walk_in_count,out.params.refrigeration_med_temp_walkin_count,FALSE,FALSE,float,,,count of medium temperature refrigerated walk-ins (operating temp > -3C) -results.csv,com_stock_sensitivity_reports.com_report_refrigeration_med_temp_walk_in_total_defrost_electric_j,out.params.refrigeration_med_temp_walkin_defrost_energy,TRUE,FALSE,float,j,j,electric energy use for medium temperature refrigerated walk-in defrost +results.csv,com_stock_sensitivity_reports.com_report_refrigeration_med_temp_walk_in_total_defrost_electric_j,out.params.refrigeration_med_temp_walkin_defrost_energy,TRUE,FALSE,float,j,kwh,electric energy use for medium temperature refrigerated walk-in defrost results.csv,com_stock_sensitivity_reports.com_report_refrigeration_low_temp_walk_in_count,out.params.refrigeration_low_temp_walkin_count,FALSE,FALSE,float,,,count of low temperature refrigerated walk-ins (operating temp <= -3C) -results.csv,com_stock_sensitivity_reports.com_report_refrigeration_low_temp_walk_in_total_defrost_electric_j,out.params.refrigeration_low_temp_walkin_defrost_energy,TRUE,FALSE,float,j,j,electric energy use for low temperature refrigerated walk-in defrost +results.csv,com_stock_sensitivity_reports.com_report_refrigeration_low_temp_walk_in_total_defrost_electric_j,out.params.refrigeration_low_temp_walkin_defrost_energy,TRUE,FALSE,float,j,kwh,electric energy use for low temperature refrigerated walk-in defrost results.csv,com_stock_sensitivity_reports.com_report_unitary_sys_cycling_ratio_cooling,out.params.unitary_sys_cycling_ratio_cooling,TRUE,FALSE,float,,,weighted average unitary system cycling ratio for cooling operation results.csv,com_stock_sensitivity_reports.com_report_unitary_sys_cycling_ratio_heating,out.params.unitary_sys_cycling_ratio_heating,TRUE,FALSE,float,,,weighted average unitary system cycling ratio for heating operation results.csv,com_stock_sensitivity_reports.com_report_unitary_sys_cycling_excess_electricity_cooling_pcnt,out.params.unitary_sys_cycling_excess_electricity_cooling_pcnt,TRUE,FALSE,float,,,excess electricity used for cycling during cooling operation From 3b4d7a4b65564fcbdb648d0db4c2a3f2fae72b49 Mon Sep 17 00:00:00 2001 From: Matthew Dahlhausen Date: Wed, 8 Apr 2026 18:45:44 -0600 Subject: [PATCH 11/11] Update Gemfile use 0.8.6 until next update; cd105f8e8f5d0980b5d0bb2468ec89c9aa517f04 contains changes to low temp walk-in defrost assumptions --- resources/Gemfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/Gemfile b/resources/Gemfile index e8c55626b..4c69ab934 100644 --- a/resources/Gemfile +++ b/resources/Gemfile @@ -12,8 +12,8 @@ gem 'rubocop-rspec' gem 'bcl', '= 0.9.1' gem 'openstudio-extension', '= 0.9.1' gem 'openstudio-workflow', '= 2.5.0' -# gem 'openstudio-standards', '= 0.8.6' -gem 'openstudio-standards', git: 'https://github.com/NREL/openstudio-standards.git', ref: 'cd105f8e8f5d0980b5d0bb2468ec89c9aa517f04' +gem 'openstudio-standards', '= 0.8.6' +# gem 'openstudio-standards', git: 'https://github.com/NREL/openstudio-standards.git', ref: 'cd105f8e8f5d0980b5d0bb2468ec89c9aa517f04' # gem 'openstudio-standards', path: "C:/GitRepos/openstudio-standards" # Use this format when testing openstudio-standards changes locally gem 'openstudio-geb', git: 'https://github.com/LBNL-ETA/Openstudio-GEB-gem.git', ref: '87da5c2678327b73eef54d2364f46225154bb956' gem 'tbd', '= 3.4.4'