openstudio-common-measures 0.11.0 → 0.12.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test_with_openstudio.yml +94 -48
  3. data/CHANGELOG.md +29 -0
  4. data/Gemfile +5 -5
  5. data/Jenkinsfile +1 -1
  6. data/LICENSE.md +1 -1
  7. data/README.md +4 -0
  8. data/doc_templates/LICENSE.md +1 -1
  9. data/lib/measures/AddCostPerAreaToConstruction/LICENSE.md +1 -1
  10. data/lib/measures/AddCostPerAreaToConstruction/measure.xml +3 -3
  11. data/lib/measures/AddCostPerFloorAreaToBuilding/LICENSE.md +1 -1
  12. data/lib/measures/AddCostPerFloorAreaToBuilding/measure.xml +3 -3
  13. data/lib/measures/AddCostPerFloorAreaToElectricEquipment/LICENSE.md +1 -1
  14. data/lib/measures/AddCostPerFloorAreaToElectricEquipment/measure.xml +3 -3
  15. data/lib/measures/AddCostPerFloorAreaToLights/LICENSE.md +1 -1
  16. data/lib/measures/AddCostPerFloorAreaToLights/measure.xml +3 -3
  17. data/lib/measures/AddCostPerFloorAreaUnusedToLights/LICENSE.md +1 -1
  18. data/lib/measures/AddCostPerFloorAreaUnusedToLights/measure.xml +3 -3
  19. data/lib/measures/AddCostToSupplySideHVACComponentByAirLoop/LICENSE.md +1 -1
  20. data/lib/measures/AddCostToSupplySideHVACComponentByAirLoop/measure.xml +4 -4
  21. data/lib/measures/AddCostperAreatoUnusedConstruction/LICENSE.md +1 -1
  22. data/lib/measures/AddCostperAreatoUnusedConstruction/measure.xml +3 -3
  23. data/lib/measures/AddExteriorLights/LICENSE.md +1 -1
  24. data/lib/measures/AddExteriorLights/measure.xml +3 -3
  25. data/lib/measures/AddMeter/LICENSE.md +1 -1
  26. data/lib/measures/AddMeter/measure.xml +3 -3
  27. data/lib/measures/AddOutputDiagnostics/LICENSE.md +1 -1
  28. data/lib/measures/AddOutputDiagnostics/measure.xml +3 -3
  29. data/lib/measures/AddOutputVariable/LICENSE.md +1 -1
  30. data/lib/measures/AddOutputVariable/measure.xml +3 -3
  31. data/lib/measures/AddSimplePvToShadingSurfacesByType/LICENSE.md +1 -1
  32. data/lib/measures/AddSimplePvToShadingSurfacesByType/measure.xml +3 -3
  33. data/lib/measures/AddThermalComfortModelTypes/LICENSE.md +1 -1
  34. data/lib/measures/AddThermalComfortModelTypes/measure.xml +3 -3
  35. data/lib/measures/AdjustSystemEfficiencies/LICENSE.md +1 -1
  36. data/lib/measures/AdjustSystemEfficiencies/measure.xml +3 -3
  37. data/lib/measures/AdjustThermostatSetpointsByDegrees/LICENSE.md +1 -1
  38. data/lib/measures/AdjustThermostatSetpointsByDegrees/measure.xml +3 -3
  39. data/lib/measures/ChangeBuildingLocation/LICENSE.md +1 -1
  40. data/lib/measures/ChangeBuildingLocation/measure.xml +3 -3
  41. data/lib/measures/EnableIdealAirLoadsForAllZones/LICENSE.md +1 -1
  42. data/lib/measures/EnableIdealAirLoadsForAllZones/measure.xml +3 -3
  43. data/lib/measures/ExportScheduleCSV/LICENSE.md +1 -1
  44. data/lib/measures/ExportScheduleCSV/measure.xml +3 -3
  45. data/lib/measures/ImportEnvelopeAndInternalLoadsFromIdf/LICENSE.md +1 -1
  46. data/lib/measures/ImportEnvelopeAndInternalLoadsFromIdf/measure.xml +3 -3
  47. data/lib/measures/MeterFlodPlot/LICENSE.md +1 -1
  48. data/lib/measures/MeterFlodPlot/measure.xml +3 -3
  49. data/lib/measures/ModifyEnergyPlusCoilCoolingDXSingleSpeedObjects/LICENSE.md +1 -1
  50. data/lib/measures/ModifyEnergyPlusCoilCoolingDXSingleSpeedObjects/measure.xml +3 -3
  51. data/lib/measures/ModifyEnergyPlusFanVariableVolumeObjects/LICENSE.md +1 -1
  52. data/lib/measures/ModifyEnergyPlusFanVariableVolumeObjects/measure.xml +3 -3
  53. data/lib/measures/PredictedMeanVote/LICENSE.md +1 -1
  54. data/lib/measures/PredictedMeanVote/measure.xml +3 -3
  55. data/lib/measures/RemoveInternalLoadsDirectlyAssignedToSpaces/LICENSE.md +1 -1
  56. data/lib/measures/RemoveInternalLoadsDirectlyAssignedToSpaces/measure.xml +3 -3
  57. data/lib/measures/RemoveUnusedDefaultProfiles/LICENSE.md +1 -1
  58. data/lib/measures/RemoveUnusedDefaultProfiles/measure.xml +3 -3
  59. data/lib/measures/ReplaceExteriorWindowConstruction/LICENSE.md +1 -1
  60. data/lib/measures/ReplaceExteriorWindowConstruction/measure.xml +3 -3
  61. data/lib/measures/ReplaceModel/LICENSE.md +1 -1
  62. data/lib/measures/ReplaceModel/measure.xml +3 -3
  63. data/lib/measures/ReplaceThermostatSchedules/LICENSE.md +1 -1
  64. data/lib/measures/ReplaceThermostatSchedules/measure.xml +5 -5
  65. data/lib/measures/ReportModelChanges/LICENSE.md +1 -1
  66. data/lib/measures/ReportModelChanges/measure.xml +3 -3
  67. data/lib/measures/RunPeriod/LICENSE.md +1 -1
  68. data/lib/measures/RunPeriod/measure.xml +3 -3
  69. data/lib/measures/RunPeriodMultiple/LICENSE.md +1 -1
  70. data/lib/measures/RunPeriodMultiple/measure.xml +3 -3
  71. data/lib/measures/ServerDirectoryCleanup/LICENSE.md +1 -1
  72. data/lib/measures/ServerDirectoryCleanup/measure.xml +3 -3
  73. data/lib/measures/SetCOPforSingleSpeedDXCoolingUnits/LICENSE.md +1 -1
  74. data/lib/measures/SetCOPforSingleSpeedDXCoolingUnits/measure.xml +5 -5
  75. data/lib/measures/SetCOPforTwoSpeedDXCoolingUnits/LICENSE.md +1 -1
  76. data/lib/measures/SetCOPforTwoSpeedDXCoolingUnits/measure.xml +5 -5
  77. data/lib/measures/SetEnergyPlusInfiltrationFlowRatePerFloorArea/LICENSE.md +1 -1
  78. data/lib/measures/SetEnergyPlusInfiltrationFlowRatePerFloorArea/measure.xml +3 -3
  79. data/lib/measures/SetEnergyPlusLightObjectsLPD/LICENSE.md +1 -1
  80. data/lib/measures/SetEnergyPlusLightObjectsLPD/measure.xml +3 -3
  81. data/lib/measures/SetEnergyPlusMinimumOutdoorAirFlowRate/LICENSE.md +1 -1
  82. data/lib/measures/SetEnergyPlusMinimumOutdoorAirFlowRate/measure.xml +3 -3
  83. data/lib/measures/SetGasBurnerEfficiency/LICENSE.md +1 -1
  84. data/lib/measures/SetGasBurnerEfficiency/measure.xml +5 -5
  85. data/lib/measures/SetLifecycleCostParameters/LICENSE.md +1 -1
  86. data/lib/measures/SetLifecycleCostParameters/measure.xml +3 -3
  87. data/lib/measures/SetLightingLoadsByLPD/LICENSE.md +1 -1
  88. data/lib/measures/SetLightingLoadsByLPD/measure.xml +5 -5
  89. data/lib/measures/SetSpaceInfiltrationByExteriorSurfaceArea/LICENSE.md +1 -1
  90. data/lib/measures/SetSpaceInfiltrationByExteriorSurfaceArea/measure.xml +3 -3
  91. data/lib/measures/SetThermostatSchedules/LICENSE.md +1 -1
  92. data/lib/measures/SetThermostatSchedules/measure.xml +5 -5
  93. data/lib/measures/ShiftScheduleProfileTime/LICENSE.md +1 -1
  94. data/lib/measures/ShiftScheduleProfileTime/measure.xml +5 -5
  95. data/lib/measures/SwapLightsDefinition/LICENSE.md +1 -1
  96. data/lib/measures/SwapLightsDefinition/measure.xml +3 -3
  97. data/lib/measures/UnmetLoadHoursTroubleshooting/LICENSE.md +1 -1
  98. data/lib/measures/UnmetLoadHoursTroubleshooting/measure.xml +3 -3
  99. data/lib/measures/VentilationQAQC/LICENSE.md +1 -1
  100. data/lib/measures/VentilationQAQC/measure.xml +3 -3
  101. data/lib/measures/XcelEDAReportingandQAQC/LICENSE.md +1 -1
  102. data/lib/measures/XcelEDAReportingandQAQC/measure.xml +3 -3
  103. data/lib/measures/XcelEDATariffSelectionandModelSetup/LICENSE.md +1 -1
  104. data/lib/measures/XcelEDATariffSelectionandModelSetup/measure.xml +3 -3
  105. data/lib/measures/ZoneReport/LICENSE.md +1 -1
  106. data/lib/measures/ZoneReport/measure.rb +59 -34
  107. data/lib/measures/ZoneReport/measure.xml +9 -9
  108. data/lib/measures/ZoneReport/resources/report.html.in +11 -7
  109. data/lib/measures/add_ems_emissions_reporting/LICENSE.md +1 -1
  110. data/lib/measures/add_ems_emissions_reporting/measure.xml +3 -3
  111. data/lib/measures/add_ems_to_control_ev_charging/LICENSE.md +1 -1
  112. data/lib/measures/add_ems_to_control_ev_charging/measure.xml +3 -3
  113. data/lib/measures/add_ev_load/LICENSE.md +1 -1
  114. data/lib/measures/add_ev_load/measure.xml +3 -3
  115. data/lib/measures/add_rooftop_pv/LICENSE.md +1 -1
  116. data/lib/measures/add_rooftop_pv/measure.rb +21 -1
  117. data/lib/measures/add_rooftop_pv/measure.xml +4 -4
  118. data/lib/measures/add_zone_mixing_object/LICENSE.md +1 -1
  119. data/lib/measures/add_zone_mixing_object/measure.xml +3 -3
  120. data/lib/measures/add_zone_ventilation_design_flow_rate_object/LICENSE.md +1 -1
  121. data/lib/measures/add_zone_ventilation_design_flow_rate_object/measure.xml +3 -3
  122. data/lib/measures/air_wall_zone_mixing/LICENSE.md +1 -1
  123. data/lib/measures/air_wall_zone_mixing/measure.xml +3 -3
  124. data/lib/measures/create_csv_output/LICENSE.md +1 -1
  125. data/lib/measures/create_csv_output/measure.xml +3 -3
  126. data/lib/measures/envelope_and_internal_load_breakdown/LICENSE.md +1 -1
  127. data/lib/measures/envelope_and_internal_load_breakdown/measure.xml +4 -4
  128. data/lib/measures/envelope_and_internal_load_breakdown/resources/report.html.erb +2 -0
  129. data/lib/measures/example_report/LICENSE.md +1 -1
  130. data/lib/measures/example_report/measure.xml +4 -4
  131. data/lib/measures/example_report/resources/report.html.erb +2 -0
  132. data/lib/measures/gem_env_report/LICENSE.md +1 -1
  133. data/lib/measures/gem_env_report/measure.xml +3 -3
  134. data/lib/measures/generic_qaqc/LICENSE.md +1 -1
  135. data/lib/measures/generic_qaqc/measure.xml +4 -4
  136. data/lib/measures/generic_qaqc/resources/report.html.erb +2 -0
  137. data/lib/measures/get_site_from_building_component_library/LICENSE.md +1 -1
  138. data/lib/measures/get_site_from_building_component_library/measure.xml +3 -3
  139. data/lib/measures/hvac_psychrometric_chart/LICENSE.md +1 -1
  140. data/lib/measures/hvac_psychrometric_chart/measure.xml +4 -4
  141. data/lib/measures/hvac_psychrometric_chart/resources/report.html.erb +2 -0
  142. data/lib/measures/inject_idf_objects/LICENSE.md +1 -1
  143. data/lib/measures/inject_idf_objects/measure.xml +3 -3
  144. data/lib/measures/openstudio_results/LICENSE.md +1 -1
  145. data/lib/measures/openstudio_results/README.md +8 -0
  146. data/lib/measures/openstudio_results/measure.rb +11 -0
  147. data/lib/measures/openstudio_results/measure.xml +25 -6
  148. data/lib/measures/openstudio_results/resources/report.html.erb +17 -5
  149. data/lib/measures/output_table_summary_reports/LICENSE.md +13 -0
  150. data/lib/measures/output_table_summary_reports/README.md +32 -0
  151. data/lib/measures/output_table_summary_reports/README.md.erb +42 -0
  152. data/lib/measures/output_table_summary_reports/measure.rb +78 -0
  153. data/lib/measures/output_table_summary_reports/measure.xml +110 -0
  154. data/lib/measures/remove_orphan_objects_and_unused_resources/LICENSE.md +1 -1
  155. data/lib/measures/remove_orphan_objects_and_unused_resources/measure.xml +3 -3
  156. data/lib/measures/set_electric_equipment_loads_by_epd/LICENSE.md +1 -1
  157. data/lib/measures/set_electric_equipment_loads_by_epd/measure.xml +5 -5
  158. data/lib/measures/set_exterior_walls_and_floors_to_adiabatic/LICENSE.md +1 -1
  159. data/lib/measures/set_exterior_walls_and_floors_to_adiabatic/measure.xml +3 -3
  160. data/lib/measures/set_run_period/LICENSE.md +1 -1
  161. data/lib/measures/set_run_period/measure.xml +3 -3
  162. data/lib/measures/set_space_infiltration_per_exterior_area/LICENSE.md +1 -1
  163. data/lib/measures/set_space_infiltration_per_exterior_area/measure.xml +3 -3
  164. data/lib/measures/shadow_calculation/LICENSE.md +1 -1
  165. data/lib/measures/shadow_calculation/measure.xml +3 -3
  166. data/lib/measures/simulation_control/LICENSE.md +13 -0
  167. data/lib/measures/simulation_control/measure.rb +5 -0
  168. data/lib/measures/simulation_control/measure.xml +10 -4
  169. data/lib/measures/tariff_selection_block/LICENSE.md +1 -1
  170. data/lib/measures/tariff_selection_block/measure.xml +3 -3
  171. data/lib/measures/tariff_selection_flat/LICENSE.md +1 -1
  172. data/lib/measures/tariff_selection_flat/measure.xml +3 -3
  173. data/lib/measures/tariff_selection_generic/LICENSE.md +1 -1
  174. data/lib/measures/tariff_selection_generic/measure.xml +3 -3
  175. data/lib/measures/tariff_selection_time_and_date_dependant/LICENSE.md +1 -1
  176. data/lib/measures/tariff_selection_time_and_date_dependant/measure.xml +3 -3
  177. data/lib/measures/view_data/LICENSE.md +1 -1
  178. data/lib/measures/view_data/measure.xml +3 -3
  179. data/lib/measures/view_model/LICENSE.md +1 -1
  180. data/lib/measures/view_model/measure.xml +3 -3
  181. data/lib/openstudio/common_measures/version.rb +1 -1
  182. data/openstudio-common-measures.gemspec +6 -3
  183. metadata +59 -11
@@ -9,6 +9,9 @@ require 'erb'
9
9
 
10
10
  # start the measure
11
11
  class ZoneReport < OpenStudio::Measure::ReportingMeasure
12
+ attr_reader :component_loads
13
+ attr_reader :zone_collection
14
+
12
15
  # define the name that a user will see, this method may be deprecated as
13
16
  # the display name in PAT comes from the name field in measure.xml
14
17
  def name
@@ -213,6 +216,18 @@ class ZoneReport < OpenStudio::Measure::ReportingMeasure
213
216
  end
214
217
  model = model.get
215
218
 
219
+ # check if the Component Load Summary reports have been produced by EnergyPlus,
220
+ # which are needed for the Peak Heating Load and Peak Cooling Load tables
221
+ @component_loads = {}
222
+ if model.getOutputTableSummaryReports.summaryReports.any? { |r| r.include?('SizingPeriod') }
223
+ @component_loads[:report] = true
224
+ else
225
+ @component_loads[:report] = false
226
+ message = 'WARNING: The Component Load Summary reports were not produced by EnergyPlus, which are required by the Peak Heating Load and Peak Cooling Load tables.'
227
+ @component_loads[:message] = message
228
+ runner.registerWarning(message)
229
+ end
230
+
216
231
  @sqlFile = runner.lastEnergyPlusSqlFile
217
232
  if @sqlFile.empty?
218
233
  runner.registerError('Cannot find last sql file.')
@@ -306,8 +321,10 @@ class ZoneReport < OpenStudio::Measure::ReportingMeasure
306
321
 
307
322
  vals = {}
308
323
 
309
- vals[:va] = getDetailsData('LightingSummary', 'Entire Facility', 'Interior Lighting', "#{zoneMetrics[:name]}%", 'Lighting Power Density', 'W/m2', 'W/ft^2').round(2)
310
- vals[:vb] = getDetailsData('LightingSummary', 'Entire Facility', 'Interior Lighting', "#{zoneMetrics[:name]}%", 'Full Load Hours/Week', 'hr', 'hr').round(2)
324
+ #vals[:va] = getDetailsData('Input Verification and Results Summary', 'Entire Facility', 'Zone Summary', "#{zoneMetrics[:name].upcase}", 'Lighting[W/m2]', 'W/m2', 'W/ft^2').round(2)
325
+ #vals[:va] = getDetailsData('Initialization Summary', 'Entire Facility', 'Zone Internal Gains Nominal', "#{zoneMetrics[:name].upcase}", 'Interior Lighting', 'W/m2', 'W/ft^2').round(2)
326
+ # vals[:va] = getDetailsData('LightingSummary', 'Entire Facility', 'Interior Lighting', "#{zoneMetrics[:name]}%", 'Lighting Power Density', 'W/m2', 'W/ft^2').round(2)
327
+ # vals[:vb] = getDetailsData('LightingSummary', 'Entire Facility', 'Interior Lighting', "#{zoneMetrics[:name]}%", 'Full Load Hours/Week', 'hr', 'hr').round(2)
311
328
 
312
329
  vals[:vc] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Electricity', "InteriorLights:Electricity:Zone:#{zoneMetrics[:name]}", 'Electricity Annual Value', 'GJ', 'kWh').round(2)
313
330
 
@@ -318,47 +335,56 @@ class ZoneReport < OpenStudio::Measure::ReportingMeasure
318
335
  vals[:vf] = getDetailsData('InputVerificationandResultsSummary', 'Entire Facility', 'Zone Summary', zoneMetrics[:name], 'Conditioned (Y/N)', '', 's')
319
336
  if vals[:vf] == '' then vals[:vf] = 'No' end
320
337
 
321
- vals[:vg] = getDetailsData('HVACSizingSummary', 'Entire Facility', 'Zone Heating', zoneMetrics[:name], 'User Design Load', 'W', 'kBtu/hr').round(2)
322
- vals[:vh] = getDetailsData('HVACSizingSummary', 'Entire Facility', 'Zone Heating', zoneMetrics[:name], 'User Design Air Flow', 'm3/s', 'ft^3/s').round(2)
323
- vals[:vi] = getDetailsData('HVACSizingSummary', 'Entire Facility', 'Zone Cooling', zoneMetrics[:name], 'User Design Load', 'W', 'kBtu/hr').round(2)
324
- vals[:vj] = getDetailsData('HVACSizingSummary', 'Entire Facility', 'Zone Cooling', zoneMetrics[:name], 'User Design Air Flow', 'm3/s', 'ft^3/s').round(2)
338
+ vals[:vg] = getDetailsData('HVACSizingSummary', 'Entire Facility', 'Zone Sensible Heating', zoneMetrics[:name], 'User Design Load', 'W', 'kBtu/hr').round(2)
339
+ vals[:vh] = getDetailsData('HVACSizingSummary', 'Entire Facility', 'Zone Sensible Heating', zoneMetrics[:name], 'User Design Air Flow', 'm3/s', 'ft^3/s').round(2)
340
+ vals[:vi] = getDetailsData('HVACSizingSummary', 'Entire Facility', 'Zone Sensible Cooling', zoneMetrics[:name], 'User Design Load', 'W', 'kBtu/hr').round(2)
341
+ vals[:vj] = getDetailsData('HVACSizingSummary', 'Entire Facility', 'Zone Sensible Cooling', zoneMetrics[:name], 'User Design Air Flow', 'm3/s', 'ft^3/s').round(2)
325
342
 
326
343
  vals[:vk] = getDetailsData('OutdoorAirSummary', 'Entire Facility', 'Average Outdoor Air During Occupied Hours', zoneMetrics[:name], 'Mechanical Ventilation', 'ach', 'ach').round(2)
327
344
  vals[:vl] = getDetailsData('OutdoorAirSummary', 'Entire Facility', 'Average Outdoor Air During Occupied Hours', zoneMetrics[:name], 'Infiltration', 'ach', 'ach').round(2)
328
345
 
329
346
  vals[:vm] = getDetailsData('InputVerificationandResultsSummary', 'Entire Facility', 'Zone Summary', zoneMetrics[:name], 'People', 'm2 per person', 'ft^2/person').round(2)
330
347
 
331
- vals[:vn] = getDetailsData('HVACSizingSummary', 'Entire Facility', 'Zone Cooling', zoneMetrics[:name], 'Date/Time Of Peak', '', 's')
332
- vals[:vo] = getDetailsData('HVACSizingSummary', 'Entire Facility', 'Zone Heating', zoneMetrics[:name], 'Date/Time Of Peak', '', 's')
348
+ vals[:vn] = getDetailsData('HVACSizingSummary', 'Entire Facility', 'Zone Sensible Cooling', zoneMetrics[:name], 'Date/Time Of Peak {TIMESTAMP}', '', 's')
349
+ vals[:vo] = getDetailsData('HVACSizingSummary', 'Entire Facility', 'Zone Sensible Heating', zoneMetrics[:name], 'Date/Time Of Peak {TIMESTAMP}', '', 's')
333
350
 
334
351
  vals[:vp] = getDetailsData('SystemSummary', 'Entire Facility', 'Time Setpoint Not Met', zoneMetrics[:name], 'During Heating', 'hr', 'hr')
335
352
  vals[:vq] = getDetailsData('SystemSummary', 'Entire Facility', 'Time Setpoint Not Met', zoneMetrics[:name], 'During Cooling', 'hr', 'hr')
336
353
 
337
- vals[:vr] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Gas', "InteriorEquipment:Gas:Zone:#{zoneMetrics[:name]}", 'Electricity Annual Value', 'GJ', 'Therm').round(2)
354
+ vals[:vr] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Natural Gas', "InteriorEquipment:NaturalGas:Zone:#{zoneMetrics[:name]}", 'Natural Gas Annual Value', 'GJ', 'Therm').round(2)
338
355
  vals[:vs] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Electricity', "InteriorEquipment:Electricity:Zone:#{zoneMetrics[:name]}", 'Electricity Annual Value', 'GJ', 'kWh').round(2)
339
356
 
340
- vals[:vt] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Gas', "InteriorEquipment:Gas:Zone:#{zoneMetrics[:name]}", 'Gas Maximum Value', 'W', 'kBtu/hr').round(2)
341
- vals[:vu] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Gas', "InteriorEquipment:Gas:Zone:#{zoneMetrics[:name]}", 'Timestamp of Maximum', '', 's')
357
+ vals[:vt] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Natural Gas', "InteriorEquipment:NaturalGas:Zone:#{zoneMetrics[:name]}", 'Natural Gas Maximum Value', 'W', 'kBtu/hr').round(2)
358
+ vals[:vu] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Natural Gas', "InteriorEquipment:NaturalGas:Zone:#{zoneMetrics[:name]}", 'Timestamp of Maximum {TIMESTAMP}', '', 's')
342
359
 
343
360
  vals[:vv] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Electricity', "InteriorLights:Electricity:Zone:#{zoneMetrics[:name]}", 'Electricity Maximum Value', 'W', 'kW').round(2)
344
- vals[:vw] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Electricity', "InteriorLights:Electricity:Zone:#{zoneMetrics[:name]}", 'Timestamp of Maximum', '', 's')
361
+ vals[:vw] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Electricity', "InteriorLights:Electricity:Zone:#{zoneMetrics[:name]}", 'Timestamp of Maximum {TIMESTAMP}', '', 's')
362
+
363
+ # calculate lighting values based on EnergyMeters, which has data by zone
364
+ # instead of Lighting Summary, which has data by space
365
+
366
+ # W/ft2
367
+ vals[:va] = (vals[:vv] * 1000 / zoneMetrics[:area]).round(2)
368
+
369
+ # kWh / kW = full load hours
370
+ vals[:vb] = (vals[:vc] / vals[:vv]).round(2)
345
371
 
346
372
  # X unused
347
373
 
348
374
  vals[:vy] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Electricity', "InteriorEquipment:Electricity:Zone:#{zoneMetrics[:name]}", 'Electricity Maximum Value', 'W', 'kW').round(2)
349
- vals[:vz] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Electricity', "InteriorEquipment:Electricity:Zone:#{zoneMetrics[:name]}", 'Timestamp of Maximum', '', 's')
375
+ vals[:vz] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Electricity', "InteriorEquipment:Electricity:Zone:#{zoneMetrics[:name]}", 'Timestamp of Maximum {TIMESTAMP}', '', 's')
350
376
 
351
- vals[:vaa] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Other', "InteriorEquipment:DistrictHeating:Zone:#{zoneMetrics[:name]}", 'Annual Value', 'GJ', 'kBtu').round(2)
352
- vals[:vab] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Other', "InteriorEquipment:DistrictHeating:Zone:#{zoneMetrics[:name]}", 'Maximum Value', 'W', 'kBtu/hr').round(2)
353
- vals[:vac] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Other', "InteriorEquipment:DistrictHeating:Zone:#{zoneMetrics[:name]}", 'Timestamp of Maximum', '', 's')
377
+ # vals[:vaa] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Other', "InteriorEquipment:DistrictHeatingWater:Zone:#{zoneMetrics[:name]}", 'Annual Value', 'GJ', 'kBtu').round(2)
378
+ # vals[:vab] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Other', "InteriorEquipment:DistrictHeatingWater:Zone:#{zoneMetrics[:name]}", 'Maximum Value', 'W', 'kBtu/hr').round(2)
379
+ # vals[:vac] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Other', "InteriorEquipment:DistrictHeatingWater:Zone:#{zoneMetrics[:name]}", 'Timestamp of Maximum {TIMESTAMP}', '', 's')
354
380
 
355
- vals[:vad] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Other', "Heating:EnergyTransfer:Zone:#{zoneMetrics[:name]}", 'Annual Value', 'GJ', 'kBtu').round(2)
356
- vals[:vae] = (getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Other', "Heating:EnergyTransfer:Zone:#{zoneMetrics[:name]}", 'Maximum Value', 'W', 'kBtu/hr') / zoneMetrics[:area]).round(2)
357
- vals[:vaf] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Other', "Heating:EnergyTransfer:Zone:#{zoneMetrics[:name]}", 'Timestamp of Maximum', '', 's')
381
+ # vals[:vad] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Other', "Heating:EnergyTransfer:Zone:#{zoneMetrics[:name]}", 'Annual Value', 'GJ', 'kBtu').round(2)
382
+ # vals[:vae] = (getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Other', "Heating:EnergyTransfer:Zone:#{zoneMetrics[:name]}", 'Maximum Value', 'W', 'kBtu/hr') / zoneMetrics[:area]).round(2)
383
+ # vals[:vaf] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Other', "Heating:EnergyTransfer:Zone:#{zoneMetrics[:name]}", 'Timestamp of Maximum {TIMESTAMP}', '', 's')
358
384
 
359
- vals[:vag] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Other', "Cooling:EnergyTransfer:Zone:#{zoneMetrics[:name]}", 'Annual Value', 'GJ', 'kBtu').round(2)
360
- vals[:vah] = (getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Other', "Cooling:EnergyTransfer:Zone:#{zoneMetrics[:name]}", 'Maximum Value', 'W', 'kBtu/hr') / zoneMetrics[:area]).round(2)
361
- vals[:vai] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Other', "Cooling:EnergyTransfer:Zone:#{zoneMetrics[:name]}", 'Timestamp of Maximum', '', 's')
385
+ # vals[:vag] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Other', "Cooling:EnergyTransfer:Zone:#{zoneMetrics[:name]}", 'Annual Value', 'GJ', 'kBtu').round(2)
386
+ # vals[:vah] = (getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Other', "Cooling:EnergyTransfer:Zone:#{zoneMetrics[:name]}", 'Maximum Value', 'W', 'kBtu/hr') / zoneMetrics[:area]).round(2)
387
+ # vals[:vai] = getDetailsData('EnergyMeters', 'Entire Facility', 'Annual and Peak Values - Other', "Cooling:EnergyTransfer:Zone:#{zoneMetrics[:name]}", 'Timestamp of Maximum {TIMESTAMP}', '', 's')
362
388
 
363
389
  vals[:vaj] = zoneHeatComponentCalc('People', zoneMetrics)
364
390
  vals[:vak] = zoneHeatComponentCalc('Lights', zoneMetrics)
@@ -385,7 +411,7 @@ class ZoneReport < OpenStudio::Measure::ReportingMeasure
385
411
  vals[:vbf] = zoneHeatComponentCalc('Fenestration Conduction', zoneMetrics)
386
412
  vals[:vbg] = zoneHeatComponentCalc('Fenestration Solar', zoneMetrics)
387
413
 
388
- vals[:vbh] = getDetailsData('ZoneComponentLoadSummary', (zoneMetrics[:name]).to_s, 'Heating Peak Conditions', 'Time of Peak Load', 'Value', '', 's')
414
+ vals[:vbh] = getDetailsData('Zone Component Load Summary', (zoneMetrics[:name]).to_s, 'Heating Peak Conditions', 'Time of Peak Load', 'Value', '', 's')
389
415
 
390
416
  vals[:vbi] = zoneCoolComponentCalc('People', zoneMetrics)
391
417
  vals[:vbj] = zoneCoolComponentCalc('Lights', zoneMetrics)
@@ -412,7 +438,7 @@ class ZoneReport < OpenStudio::Measure::ReportingMeasure
412
438
  vals[:vce] = zoneCoolComponentCalc('Fenestration Conduction', zoneMetrics)
413
439
  vals[:vcf] = zoneCoolComponentCalc('Fenestration Solar', zoneMetrics)
414
440
 
415
- vals[:vcg] = getDetailsData('ZoneComponentLoadSummary', (zoneMetrics[:name]).to_s, 'Cooling Peak Conditions', 'Time of Peak Load', 'Value', '', 's')
441
+ vals[:vcg] = getDetailsData('Zone Component Load Summary', (zoneMetrics[:name]).to_s, 'Cooling Peak Conditions', 'Time of Peak Load', 'Value', '', 's')
416
442
 
417
443
  # vals = loadTestVals( vals )
418
444
 
@@ -480,11 +506,11 @@ class ZoneReport < OpenStudio::Measure::ReportingMeasure
480
506
  end
481
507
 
482
508
  def zoneHeatComponentCalc(component, zoneMetrics)
483
- (getDetailsData('ZoneComponentLoadSummary', (zoneMetrics[:name]).to_s, 'Estimated Heating Peak Load Components', component, 'Total', 'W', 'Btu/hr') / zoneMetrics[:area]).round(2)
509
+ (getDetailsData('Zone Component Load Summary', (zoneMetrics[:name]).to_s, 'Estimated Heating Peak Load Components', component, 'Total', 'W', 'Btu/hr') / zoneMetrics[:area]).round(2)
484
510
  end
485
511
 
486
512
  def zoneCoolComponentCalc(component, zoneMetrics)
487
- (getDetailsData('ZoneComponentLoadSummary', (zoneMetrics[:name]).to_s, 'Estimated Cooling Peak Load Components', component, 'Total', 'W', 'Btu/hr') / zoneMetrics[:area]).round(2)
513
+ (getDetailsData('Zone Component Load Summary', (zoneMetrics[:name]).to_s, 'Estimated Cooling Peak Load Components', component, 'Total', 'W', 'Btu/hr') / zoneMetrics[:area]).round(2)
488
514
  end
489
515
 
490
516
  def stacked_bars(zoneMetrics)
@@ -579,7 +605,7 @@ class ZoneReport < OpenStudio::Measure::ReportingMeasure
579
605
  graph['data'] = stacked_vals
580
606
 
581
607
  @graph_data << graph
582
- end
608
+ end
583
609
 
584
610
  def getPctLoad(val, total)
585
611
  if val != '' && total != 0
@@ -621,7 +647,7 @@ end
621
647
  # and final_units should be open studio style (m^2, m^3, ...)
622
648
  # If the data is not found or cannot be converted a warning is registered and "" or 0.0 is returned.
623
649
  def getDetailsData(report, forstring, table, row, column, units, final_units)
624
- if report == 'ZoneComponentLoadSummary'
650
+ if report == 'Zone Component Load Summary'
625
651
  forstring.upcase!
626
652
  end
627
653
 
@@ -637,12 +663,13 @@ end
637
663
 
638
664
  if query_results.empty?
639
665
 
640
- @runner.registerWarning("Could not get data for #{report} #{forstring} #{table} #{row} #{column}.")
666
+ # todo - is there any valid reason data might not be found? If not then make error isntead of warning
667
+ @runner.registerWarning("Could not get data for report:#{report} For:#{forstring} table:#{table} row:#{row} column:#{column}.")
641
668
  return final_units == 's' ? '' : 0.0
642
669
 
643
670
  else
644
671
  r = query_results.get
645
- if report == 'ZoneComponentLoadSummary'
672
+ if report == 'Zone Component Load Summary'
646
673
  @testData["#{@currentZoneName}_#{table}_#{row}"] = r
647
674
  end
648
675
 
@@ -652,7 +679,7 @@ end
652
679
  converted = OpenStudio.convert(r.to_f, eplus_to_openstudio(units), final_units)
653
680
  if converted.empty?
654
681
  @runner.registerError("Could not convert #{r} from #{units} to #{final_units}")
655
- return 0.0
682
+ return false
656
683
  else
657
684
  return converted.get.round(2)
658
685
  end
@@ -671,14 +698,12 @@ end
671
698
 
672
699
  if query_results.empty?
673
700
  @runner.registerError("Could not get data for requested Column #{colName}.")
674
- return []
701
+ return false
675
702
  else
676
703
  return query_results
677
704
  end
678
705
  end
679
706
 
680
- # Accessor to support unit tests
681
- attr_reader :zone_collection
682
707
  end
683
708
 
684
709
  # this allows the measure to be use by the application
@@ -3,8 +3,8 @@
3
3
  <schema_version>3.1</schema_version>
4
4
  <name>zone_report</name>
5
5
  <uid>81ac119f-4841-434c-9e11-824310fe1cb7</uid>
6
- <version_id>783f69cf-8d41-4389-b98b-d3f9b73f8891</version_id>
7
- <version_modified>2024-11-16T23:54:13Z</version_modified>
6
+ <version_id>a5a25c05-02b3-4b8d-bf91-59fac3fddaa4</version_id>
7
+ <version_modified>2025-08-01T14:35:26Z</version_modified>
8
8
  <xml_checksum>2C8A3EEF</xml_checksum>
9
9
  <class_name>ZoneReport</class_name>
10
10
  <display_name>Zone Report</display_name>
@@ -33,7 +33,7 @@
33
33
  <filename>LICENSE.md</filename>
34
34
  <filetype>md</filetype>
35
35
  <usage_type>license</usage_type>
36
- <checksum>8696A072</checksum>
36
+ <checksum>CBFF29F5</checksum>
37
37
  </file>
38
38
  <file>
39
39
  <filename>README.md</filename>
@@ -50,19 +50,19 @@
50
50
  <file>
51
51
  <version>
52
52
  <software_program>OpenStudio</software_program>
53
- <identifier>2.0.0</identifier>
54
- <min_compatible>2.0.0</min_compatible>
53
+ <identifier>3.9.0</identifier>
54
+ <min_compatible>3.9.0</min_compatible>
55
55
  </version>
56
56
  <filename>measure.rb</filename>
57
57
  <filetype>rb</filetype>
58
58
  <usage_type>script</usage_type>
59
- <checksum>C6695B06</checksum>
59
+ <checksum>DE6FAD49</checksum>
60
60
  </file>
61
61
  <file>
62
62
  <filename>report.html.in</filename>
63
63
  <filetype>in</filetype>
64
64
  <usage_type>resource</usage_type>
65
- <checksum>9863EEC5</checksum>
65
+ <checksum>4D3102CA</checksum>
66
66
  </file>
67
67
  <file>
68
68
  <filename>USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw</filename>
@@ -74,13 +74,13 @@
74
74
  <filename>ZoneReport_Test.rb</filename>
75
75
  <filetype>rb</filetype>
76
76
  <usage_type>test</usage_type>
77
- <checksum>5CDE28AB</checksum>
77
+ <checksum>28CD8E93</checksum>
78
78
  </file>
79
79
  <file>
80
80
  <filename>gas_electric_mark_load.osm</filename>
81
81
  <filetype>osm</filetype>
82
82
  <usage_type>test</usage_type>
83
- <checksum>1F5C6B63</checksum>
83
+ <checksum>1FAF2250</checksum>
84
84
  </file>
85
85
  </files>
86
86
  </measure>
@@ -216,7 +216,7 @@ var graph_data = <%= @graph_data %>;
216
216
  <ul class="nav nav-pills nav-stacked" role="navigation">
217
217
  <% counter = 0 %>
218
218
  <% zone_collection.each do |z| %>
219
-
219
+
220
220
  <li>
221
221
  <a href="#zone_<%= counter %>"><%= z[:name] %></a>
222
222
  </li>
@@ -224,18 +224,22 @@ var graph_data = <%= @graph_data %>;
224
224
  <% end %>
225
225
  </ul>
226
226
  </div>
227
- </div>
227
+ </div>
228
228
 
229
229
  <div class="col-md-9" style="padding-top:25px;" role="main">
230
-
230
+
231
231
  <h1>Zone Equipment Report</h1>
232
232
 
233
+ <% if component_loads[:report] == false %>
234
+ <i><%= component_loads[:message] %></i>
235
+ <% end %>
236
+
233
237
  <% counter = 0 %>
234
238
  <% zone_collection.each do |z| %>
235
239
  <h3 id="zone_<%= counter %>"><%= z[:name] %></h3>
236
-
240
+
237
241
  <h4>Zone Equipment Summary</h4>
238
-
242
+
239
243
  <table class="table table-striped table-bordered table-condensed zoneGrid">
240
244
  <% report_sort_order = {"Heating" => 0, "Backup Heating" => 1, "Cooling" => 2, "Fans" => 3} %>
241
245
  <% z[:equipment].sort_by{|k,v| report_sort_order[k]}.each do |reporting_type, equipments| %>
@@ -260,9 +264,9 @@ var graph_data = <%= @graph_data %>;
260
264
  <% end %>
261
265
  <% end %>
262
266
  </table>
263
-
267
+
264
268
  <h4>Zone Sizing and Load Summary</h4>
265
-
269
+
266
270
  <table class="table table-striped table-bordered table-condensed zoneGrid">
267
271
  <tr>
268
272
  <td>Zone Name</td><td><%=z[:name]%></td><td>Zone Size (ft2)</td><td><%=z[:area]%></td>
@@ -1,4 +1,4 @@
1
- OpenStudio(R), Copyright (c) 2008, 2024 Alliance for Sustainable Energy, LLC.
1
+ OpenStudio(R), Copyright (c) 2008, 2025 Alliance for Sustainable Energy, LLC.
2
2
 
3
3
  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
4
4
 
@@ -3,8 +3,8 @@
3
3
  <schema_version>3.1</schema_version>
4
4
  <name>add_ems_emissions_reporting</name>
5
5
  <uid>e8fe9153-5e70-4769-afa0-6da0045aa529</uid>
6
- <version_id>5d43cac2-efd0-4a24-92af-afdbcca53db7</version_id>
7
- <version_modified>2024-11-16T23:54:14Z</version_modified>
6
+ <version_id>186ed140-c7da-411f-bf36-87d862ecb885</version_id>
7
+ <version_modified>2025-08-01T14:35:28Z</version_modified>
8
8
  <xml_checksum>976EB6EB</xml_checksum>
9
9
  <class_name>AddEMSEmissionsReporting</class_name>
10
10
  <display_name>Add EMS to Report Emissions</display_name>
@@ -450,7 +450,7 @@
450
450
  <filename>LICENSE.md</filename>
451
451
  <filetype>md</filetype>
452
452
  <usage_type>license</usage_type>
453
- <checksum>8696A072</checksum>
453
+ <checksum>CBFF29F5</checksum>
454
454
  </file>
455
455
  <file>
456
456
  <filename>README.md</filename>
@@ -1,4 +1,4 @@
1
- OpenStudio(R), Copyright (c) 2008, 2024 Alliance for Sustainable Energy, LLC.
1
+ OpenStudio(R), Copyright (c) 2008, 2025 Alliance for Sustainable Energy, LLC.
2
2
 
3
3
  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
4
4
 
@@ -3,8 +3,8 @@
3
3
  <schema_version>3.1</schema_version>
4
4
  <name>add_ems_to_control_ev_charging</name>
5
5
  <uid>df97997f-d02a-4e35-af7a-5aed16cb5772</uid>
6
- <version_id>a6a93a92-7693-4cf3-81a1-59a618e75322</version_id>
7
- <version_modified>2024-11-16T23:54:15Z</version_modified>
6
+ <version_id>57045cd7-f87b-4f65-b493-2f420a8df85c</version_id>
7
+ <version_modified>2025-08-01T14:35:28Z</version_modified>
8
8
  <xml_checksum>976EB6EB</xml_checksum>
9
9
  <class_name>AddEMSToControlEVCharging</class_name>
10
10
  <display_name>Add EMS to Control EV Charging</display_name>
@@ -53,7 +53,7 @@
53
53
  <filename>LICENSE.md</filename>
54
54
  <filetype>md</filetype>
55
55
  <usage_type>license</usage_type>
56
- <checksum>8696A072</checksum>
56
+ <checksum>CBFF29F5</checksum>
57
57
  </file>
58
58
  <file>
59
59
  <filename>README.md</filename>
@@ -1,4 +1,4 @@
1
- OpenStudio(R), Copyright (c) 2008, 2024 Alliance for Sustainable Energy, LLC.
1
+ OpenStudio(R), Copyright (c) 2008, 2025 Alliance for Sustainable Energy, LLC.
2
2
 
3
3
  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
4
4
 
@@ -3,8 +3,8 @@
3
3
  <schema_version>3.1</schema_version>
4
4
  <name>add_ev_load</name>
5
5
  <uid>a23e0493-7357-48ca-b089-4d902efd6b50</uid>
6
- <version_id>12fb9a15-3439-41f4-981b-832f5c219cd0</version_id>
7
- <version_modified>2024-11-16T23:54:14Z</version_modified>
6
+ <version_id>2d6e7c7b-d342-478c-b85a-262b092eccd8</version_id>
7
+ <version_modified>2025-08-01T14:35:27Z</version_modified>
8
8
  <xml_checksum>9A202986</xml_checksum>
9
9
  <class_name>AddEVLoad</class_name>
10
10
  <display_name>Add_EV_Load</display_name>
@@ -139,7 +139,7 @@
139
139
  <filename>LICENSE.md</filename>
140
140
  <filetype>md</filetype>
141
141
  <usage_type>license</usage_type>
142
- <checksum>8696A072</checksum>
142
+ <checksum>CBFF29F5</checksum>
143
143
  </file>
144
144
  <file>
145
145
  <filename>README.md</filename>
@@ -1,4 +1,4 @@
1
- OpenStudio(R), Copyright (c) 2008, 2024 Alliance for Sustainable Energy, LLC.
1
+ OpenStudio(R), Copyright (c) 2008, 2025 Alliance for Sustainable Energy, LLC.
2
2
 
3
3
  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
4
4
 
@@ -84,12 +84,19 @@ class AddRooftopPV < OpenStudio::Measure::ModelMeasure
84
84
 
85
85
  # create the inverter
86
86
  inverter = OpenStudio::Model::ElectricLoadCenterInverterSimple.new(model)
87
- inverter.setInverterEfficiency(args['inverter_efficiency'])
87
+ inverter.setName("Rooftop PV Inverter")
88
+ inverter.setInverterEfficiency(args["inverter_efficiency"])
89
+ inverter.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
88
90
  runner.registerInfo("Created inverter with efficiency of #{inverter.inverterEfficiency}")
89
91
 
90
92
  # create the distribution system
91
93
  elcd = OpenStudio::Model::ElectricLoadCenterDistribution.new(model)
94
+ elcd.setName("Rooftop PV ELCD")
92
95
  elcd.setInverter(inverter)
96
+ # This is the default, but much better to do it explicitly since it's
97
+ # critical
98
+ elcd.setGeneratorOperationSchemeType("Baseload")
99
+ elcd.setElectricalBussType("DirectCurrentWithInverter")
93
100
 
94
101
  # create shared shading transmittance schedule
95
102
  target_transmittance = 1.0 - args['fraction_of_surface'].to_f
@@ -102,6 +109,10 @@ class AddRooftopPV < OpenStudio::Measure::ModelMeasure
102
109
  pv_shading_transmittance_schedule = OpenstudioStandards::Schedules.create_simple_schedule(model, inputs)
103
110
  runner.registerInfo("Created transmittance schedule for PV shading surfaces with constant value of #{target_transmittance}")
104
111
 
112
+ # Efficiency is rated at a solar irradiance intensity of 1000 W/m^2
113
+ # So if cell_efficiency is 0.18, that means 180 W/m^2
114
+ rated_solar_irradiance_w_per_m2 = 1000.0
115
+
105
116
  model.getSurfaces.each do |surface|
106
117
  next if !surface.space.is_initialized
107
118
  if (surface.surfaceType == 'RoofCeiling') && (surface.outsideBoundaryCondition == 'Outdoors')
@@ -125,9 +136,18 @@ class AddRooftopPV < OpenStudio::Measure::ModelMeasure
125
136
  # create the panel
126
137
  panel = OpenStudio::Model::GeneratorPhotovoltaic.simple(model)
127
138
  panel.setSurface(shading_surface)
139
+ panel.setName("Rooftop PV - #{surface.nameString}")
128
140
  performance = panel.photovoltaicPerformance.to_PhotovoltaicPerformanceSimple.get
129
141
  performance.setFractionOfSurfaceAreaWithActiveSolarCells(args['fraction_of_surface'])
130
142
  performance.setFixedEfficiency(args['cell_efficiency'])
143
+ performance.setName("Rooftop PV - #{surface.nameString} - Performance Simple")
144
+
145
+ rated_electric_power_output_w = args["cell_efficiency"] * rated_solar_irradiance_w_per_m2 * args["fraction_of_surface"] * shading_surface.grossArea
146
+
147
+ # Set it on the panel, so it's written to the ElectricLoadCenter:Generators
148
+ # object that the OS ForwardTranslator creates, and reported in the
149
+ # eplustbl.html (otherwise it shows rated power = 0.0W in L-1. Renewable Energy Source Summary)
150
+ panel.setRatedElectricPowerOutput(rated_electric_power_output_w)
131
151
 
132
152
  # connect panel to electric load center distribution
133
153
  elcd.addGenerator(panel)
@@ -3,8 +3,8 @@
3
3
  <schema_version>3.1</schema_version>
4
4
  <name>add_rooftop_pv</name>
5
5
  <uid>34550614-0c87-44db-9252-0ca0915b1e64</uid>
6
- <version_id>0d2f5512-be0c-4af5-a651-139c86a3adf0</version_id>
7
- <version_modified>2024-11-16T23:54:15Z</version_modified>
6
+ <version_id>782e0e4a-7795-4904-b3f7-3e7dffe12469</version_id>
7
+ <version_modified>2025-08-01T14:35:28Z</version_modified>
8
8
  <xml_checksum>178163B6</xml_checksum>
9
9
  <class_name>AddRooftopPV</class_name>
10
10
  <display_name>Add Rooftop PV</display_name>
@@ -91,7 +91,7 @@
91
91
  <filename>LICENSE.md</filename>
92
92
  <filetype>md</filetype>
93
93
  <usage_type>license</usage_type>
94
- <checksum>8696A072</checksum>
94
+ <checksum>CBFF29F5</checksum>
95
95
  </file>
96
96
  <file>
97
97
  <filename>README.md</filename>
@@ -114,7 +114,7 @@
114
114
  <filename>measure.rb</filename>
115
115
  <filetype>rb</filetype>
116
116
  <usage_type>script</usage_type>
117
- <checksum>9AA2D6EE</checksum>
117
+ <checksum>47313383</checksum>
118
118
  </file>
119
119
  <file>
120
120
  <filename>add_rooftop_pv_test.rb</filename>
@@ -1,4 +1,4 @@
1
- OpenStudio(R), Copyright (c) 2008, 2024 Alliance for Sustainable Energy, LLC.
1
+ OpenStudio(R), Copyright (c) 2008, 2025 Alliance for Sustainable Energy, LLC.
2
2
 
3
3
  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
4
4
 
@@ -3,8 +3,8 @@
3
3
  <schema_version>3.1</schema_version>
4
4
  <name>add_zone_mixing_object</name>
5
5
  <uid>6ed65817-1d97-43da-a4c2-1d738eafcde5</uid>
6
- <version_id>59de5d20-ca60-4d50-abf2-d0e87034d58f</version_id>
7
- <version_modified>2024-11-16T23:54:15Z</version_modified>
6
+ <version_id>7a54e78b-517d-4b0e-80bb-d56bc8e5b8b4</version_id>
7
+ <version_modified>2025-08-01T14:35:28Z</version_modified>
8
8
  <xml_checksum>61000E02</xml_checksum>
9
9
  <class_name>AddZoneMixingObject</class_name>
10
10
  <display_name>Add Zone Mixing Object</display_name>
@@ -73,7 +73,7 @@
73
73
  <filename>LICENSE.md</filename>
74
74
  <filetype>md</filetype>
75
75
  <usage_type>license</usage_type>
76
- <checksum>8696A072</checksum>
76
+ <checksum>CBFF29F5</checksum>
77
77
  </file>
78
78
  <file>
79
79
  <filename>README.md</filename>
@@ -1,4 +1,4 @@
1
- OpenStudio(R), Copyright (c) 2008, 2024 Alliance for Sustainable Energy, LLC.
1
+ OpenStudio(R), Copyright (c) 2008, 2025 Alliance for Sustainable Energy, LLC.
2
2
 
3
3
  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
4
4
 
@@ -3,8 +3,8 @@
3
3
  <schema_version>3.1</schema_version>
4
4
  <name>add_zone_ventilation_design_flow_rate_object</name>
5
5
  <uid>c31e2212-720d-413f-bdb9-f38e198dcfa3</uid>
6
- <version_id>f35f5097-94e0-4df8-9ac5-5e807af8339e</version_id>
7
- <version_modified>2024-11-16T23:54:10Z</version_modified>
6
+ <version_id>a8948f1e-81b8-4947-99ff-3b53b584c6d6</version_id>
7
+ <version_modified>2025-08-01T14:35:24Z</version_modified>
8
8
  <xml_checksum>3B6B95A6</xml_checksum>
9
9
  <class_name>AddZoneVentilationDesignFlowRateObject</class_name>
10
10
  <display_name>Add Zone Ventilation Design Flow Rate Object</display_name>
@@ -108,7 +108,7 @@
108
108
  <filename>LICENSE.md</filename>
109
109
  <filetype>md</filetype>
110
110
  <usage_type>license</usage_type>
111
- <checksum>8696A072</checksum>
111
+ <checksum>CBFF29F5</checksum>
112
112
  </file>
113
113
  <file>
114
114
  <filename>README.md</filename>
@@ -1,4 +1,4 @@
1
- OpenStudio(R), Copyright (c) 2008, 2024 Alliance for Sustainable Energy, LLC.
1
+ OpenStudio(R), Copyright (c) 2008, 2025 Alliance for Sustainable Energy, LLC.
2
2
 
3
3
  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
4
4
 
@@ -3,8 +3,8 @@
3
3
  <schema_version>3.1</schema_version>
4
4
  <name>air_wall_zone_mixing</name>
5
5
  <uid>fd04f73e-a530-4144-9e1e-c1878b1394bc</uid>
6
- <version_id>115db804-9cb0-4857-963f-f9dd6404a996</version_id>
7
- <version_modified>2024-11-16T23:54:13Z</version_modified>
6
+ <version_id>27c88398-8d73-47e2-80d4-47297cb98024</version_id>
7
+ <version_modified>2025-08-01T14:35:27Z</version_modified>
8
8
  <xml_checksum>772B7164</xml_checksum>
9
9
  <class_name>AirWallZoneMixing</class_name>
10
10
  <display_name>Air Wall Zone Mixing</display_name>
@@ -73,7 +73,7 @@ Zone mixing will only be added where there is an air wall and where the matched
73
73
  <filename>LICENSE.md</filename>
74
74
  <filetype>md</filetype>
75
75
  <usage_type>license</usage_type>
76
- <checksum>8696A072</checksum>
76
+ <checksum>CBFF29F5</checksum>
77
77
  </file>
78
78
  <file>
79
79
  <filename>README.md</filename>
@@ -1,4 +1,4 @@
1
- OpenStudio(R), Copyright (c) 2008, 2024 Alliance for Sustainable Energy, LLC.
1
+ OpenStudio(R), Copyright (c) 2008, 2025 Alliance for Sustainable Energy, LLC.
2
2
 
3
3
  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
4
4
 
@@ -3,8 +3,8 @@
3
3
  <schema_version>3.1</schema_version>
4
4
  <name>create_csv_output</name>
5
5
  <uid>99d3a7e5-4bd5-407f-b5eb-7c59660ca980</uid>
6
- <version_id>61088c82-955f-4e8d-af9f-bef34f7a3b98</version_id>
7
- <version_modified>2024-11-16T23:54:15Z</version_modified>
6
+ <version_id>746b6aa2-67d3-4f0d-8f32-dcdf17f54bca</version_id>
7
+ <version_modified>2025-08-01T14:35:28Z</version_modified>
8
8
  <xml_checksum>9BF1E6AC</xml_checksum>
9
9
  <class_name>CreateCSVOutput</class_name>
10
10
  <display_name>CreateCSVOutput</display_name>
@@ -65,7 +65,7 @@
65
65
  <filename>LICENSE.md</filename>
66
66
  <filetype>md</filetype>
67
67
  <usage_type>license</usage_type>
68
- <checksum>8696A072</checksum>
68
+ <checksum>CBFF29F5</checksum>
69
69
  </file>
70
70
  <file>
71
71
  <filename>README.md</filename>
@@ -1,4 +1,4 @@
1
- OpenStudio(R), Copyright (c) 2008, 2024 Alliance for Sustainable Energy, LLC.
1
+ OpenStudio(R), Copyright (c) 2008, 2025 Alliance for Sustainable Energy, LLC.
2
2
 
3
3
  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
4
4