Skip to content

Commit 4f183f7

Browse files
authored
Merge pull request #41 from BuildingPerformanceSimulation/detailed_hvac_viewer
Detailed HVAC viewer measure updates
2 parents 174231b + e0d9c3b commit 4f183f7

30 files changed

Lines changed: 11806 additions & 943 deletions

.vscode/settings.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"files.associations": {
3+
"*.html.erb": "html"
4+
}
5+
}

lib/measures/detailed_hvac_viewer/measure.rb

Lines changed: 102 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -201,32 +201,36 @@ def straight_component_data_hash(comp, reporting_frequency, variable_names)
201201
comp = comp.to_StraightComponent.get
202202
comp_data['object_name'] = comp.name.to_s
203203
comp_data['object_type'] = comp.iddObjectType.valueName.to_s
204+
comp_data['before_objects'] = []
205+
comp_data['after_objects'] = []
204206
if comp.inletModelObject.is_initialized
205207
if comp.inletModelObject.get.name.is_initialized
206208
inlet_object_name = comp.inletModelObject.get.name.get
207209
if comp.loop.get.name.get.to_s == inlet_object_name
208210
# don't log the air loop for the supply inlet node
209-
comp_data['before_objects'] = []
210211
else
212+
# use the component name as is
211213
comp_data['before_objects'] = [inlet_object_name]
212214
end
215+
elsif comp.inletModelObject.get.iddObjectType.valueName.to_s == 'OS_PortList'
216+
inlet_object_name = comp.inletModelObject.get.to_PortList.get.thermalZone.name.to_s
217+
comp_data['before_objects'] = [inlet_object_name]
213218
end
214-
else
215-
comp_data['before_objects'] = []
216219
end
217220
if comp.outletModelObject.is_initialized
218221
if comp.outletModelObject.get.name.is_initialized
219222
outlet_object_name = comp.outletModelObject.get.name.get
220223
if comp.loop.get.name.get.to_s == outlet_object_name
221224
# don't log the air loop for the supply outlet node
222-
comp_data['after_objects'] = []
223225
else
224226
comp_data['after_objects'] = [outlet_object_name]
225227
end
228+
elsif comp.outletModelObject.get.iddObjectType.valueName.to_s == 'OS_PortList'
229+
outlet_object_name = comp.outletModelObject.get.to_PortList.get.thermalZone.name.to_s
230+
comp_data['after_objects'] = [outlet_object_name]
226231
end
227-
else
228-
comp_data['after_objects'] = []
229232
end
233+
230234
if comp.to_Node.is_initialized && !variable_names.empty?
231235
sql = comp.model.sqlFile.get
232236
ann_env_pd = annual_run_period(sql)
@@ -246,6 +250,70 @@ def straight_component_data_hash(comp, reporting_frequency, variable_names)
246250
return comp_data
247251
end
248252

253+
def hvac_component_data_hash(comp, reporting_frequency, variable_names, loop_data)
254+
comp_data = {}
255+
comp = comp.to_HVACComponent.get
256+
comp_data['object_name'] = comp.name.to_s
257+
comp_data['object_type'] = comp.iddObjectType.valueName.to_s
258+
comp_data['before_objects'] = []
259+
comp_data['after_objects'] = []
260+
261+
# capture outdoor air system properties
262+
if comp.to_AirLoopHVACOutdoorAirSystem.is_initialized
263+
comp = comp.to_AirLoopHVACOutdoorAirSystem.get
264+
if comp.outboardOANode.is_initialized
265+
oa_node = comp.outboardOANode.get
266+
comp_data['before_objects'] << oa_node.name.get
267+
temp_comp = straight_component_data_hash(oa_node, reporting_frequency, variable_names)
268+
temp_comp['component_side'] = 'outdoor'
269+
loop_data['components'] << temp_comp
270+
end
271+
if comp.returnAirModelObject.is_initialized
272+
comp_data['before_objects'] << comp.returnAirModelObject.get.name.get
273+
end
274+
if comp.outboardReliefNode.is_initialized
275+
relief_node = comp.outboardReliefNode.get
276+
comp_data['after_objects'] << relief_node.name.get
277+
temp_comp = straight_component_data_hash(relief_node, reporting_frequency, variable_names)
278+
temp_comp['component_side'] = 'relief'
279+
loop_data['components'] << temp_comp
280+
end
281+
if comp.mixedAirModelObject.is_initialized
282+
comp_data['after_objects'] << comp.mixedAirModelObject.get.name.get
283+
end
284+
elsif comp.to_Splitter.is_initialized
285+
# if the object is a splitter, log the inlet node and all outlet nodes
286+
comp = comp.to_Splitter.get
287+
comp_data['before_objects'] = [comp.inletModelObject.get.name.get] if comp.inletModelObject.is_initialized
288+
comp.outletModelObjects.each { |obj| comp_data['after_objects'] << obj.name.get }
289+
elsif comp.to_Mixer.is_initialized
290+
# if the object is a mixer, log all inlet nodes and the outlet node
291+
comp = comp.to_Mixer.get
292+
comp.inletModelObjects.each { |obj| comp_data['before_objects'] << obj.name.get }
293+
comp_data['after_objects'] = [comp.outletModelObject.get.name.get] if comp.outletModelObject.is_initialized
294+
elsif comp.to_ThermalZone.is_initialized
295+
comp = comp.to_ThermalZone.get
296+
comp.inletPortList.modelObjects.each { |obj| comp_data['before_objects'] << obj.name.get }
297+
comp.returnPortList.modelObjects.each { |obj| comp_data['after_objects'] << obj.name.get }
298+
elsif comp.to_WaterToAirComponent.is_initialized
299+
comp = comp.to_WaterToAirComponent.get
300+
comp_data['before_objects'] << comp.airInletModelObject.get.name.get if comp.airInletModelObject.is_initialized
301+
comp_data['before_objects'] << comp.waterInletModelObject.get.name.get if comp.waterInletModelObject.is_initialized
302+
comp_data['after_objects'] << comp.airOutletModelObject.get.name.get if comp.airOutletModelObject.is_initialized
303+
comp_data['after_objects'] << comp.waterOutletModelObject.get.name.get if comp.waterOutletModelObject.is_initialized
304+
elsif comp.to_WaterToWaterComponent.is_initialized
305+
comp = comp.to_WaterToWaterComponent.get
306+
comp_data['before_objects'] << comp.demandInletModelObject.get.name.get if comp.demandInletModelObject.is_initialized
307+
comp_data['before_objects'] << comp.supplyInletModelObject.get.name.get if comp.supplyInletModelObject.is_initialized
308+
comp_data['before_objects'] << comp.tertiaryInletModelObject.get.name.get if comp.tertiaryInletModelObject.is_initialized
309+
comp_data['after_objects'] << comp.demandOutletModelObject.get.name.get if comp.demandOutletModelObject.is_initialized
310+
comp_data['after_objects'] << comp.supplyOutletModelObject.get.name.get if comp.supplyOutletModelObject.is_initialized
311+
comp_data['after_objects'] << comp.tertiaryOutletModelObject.get.name.get if comp.tertiaryOutletModelObject.is_initialized
312+
end
313+
314+
return comp_data
315+
end
316+
249317
def add_node_names_to_array(model_objects, node_names)
250318
model_objects.each do |model_object|
251319
unless model_object.to_Node.empty?
@@ -334,106 +402,49 @@ def run(runner, user_arguments)
334402
return false
335403
end
336404

405+
# log data from AirLoopHVACs and PlantLoops
337406
hvac_data = []
338-
# get data from air loops
339-
model.getAirLoopHVACs.each do |air_loop|
340-
air_loop_data = {}
341-
air_loop_data['loop_name'] = air_loop.name.to_s
342-
air_loop_data['loop_type'] = air_loop.iddObjectType.valueName.to_s
343-
air_loop_data['boundary_nodes'] = loop_boundary_nodes(air_loop)
344-
air_loop_data['components'] = []
345-
air_loop.supplyComponents.each do |comp|
407+
model.getLoops.each do |hvac_loop|
408+
loop_data = {}
409+
loop_data['loop_name'] = hvac_loop.name.to_s
410+
loop_data['loop_type'] = hvac_loop.iddObjectType.valueName.to_s
411+
loop_data['boundary_nodes'] = loop_boundary_nodes(hvac_loop)
412+
loop_data['components'] = []
413+
# loop through supply side components and add them to components array
414+
hvac_loop.supplyComponents.each do |comp|
346415
if comp.to_StraightComponent.is_initialized
347416
comp_data = straight_component_data_hash(comp, reporting_frequency, variable_names)
348417
else
349-
comp_data = {}
350-
end
351-
352-
# capture outdoor air system properties
353-
if comp.to_AirLoopHVACOutdoorAirSystem.is_initialized
354-
comp_data['object_name'] = comp.name.to_s
355-
comp_data['object_type'] = comp.iddObjectType.valueName.to_s
356-
comp = comp.to_AirLoopHVACOutdoorAirSystem.get
357-
comp_data['before_objects'] = []
358-
comp_data['after_objects'] = []
359-
if comp.outboardOANode.is_initialized
360-
oa_node = comp.outboardOANode.get
361-
comp_data['before_objects'] << oa_node.name.get
362-
temp_comp = straight_component_data_hash(oa_node, reporting_frequency, variable_names)
363-
temp_comp['component_side'] = 'supply'
364-
air_loop_data['components'] << temp_comp
365-
end
366-
if comp.returnAirModelObject.is_initialized
367-
comp_data['before_objects'] << comp.returnAirModelObject.get.name.get
368-
end
369-
if comp.outboardReliefNode.is_initialized
370-
relief_node = comp.outboardReliefNode.get
371-
comp_data['after_objects'] << relief_node.name.get
372-
temp_comp = straight_component_data_hash(relief_node, reporting_frequency, variable_names)
373-
temp_comp['component_side'] = 'supply'
374-
air_loop_data['components'] << temp_comp
375-
end
376-
if comp.mixedAirModelObject.is_initialized
377-
comp_data['after_objects'] << comp.mixedAirModelObject.get.name.get
378-
end
418+
comp_data = hvac_component_data_hash(comp, reporting_frequency, variable_names, loop_data)
379419
end
380-
381420
comp_data['component_side'] = 'supply'
382-
air_loop_data['components'] << comp_data
421+
loop_data['components'] << comp_data
383422
end
384-
385-
air_loop.demandComponents.each do |comp|
423+
# loop through demand side components and add them to components array
424+
hvac_loop.demandComponents.each do |comp|
386425
if comp.to_StraightComponent.is_initialized
387-
if include_demand_nodes
388-
comp_data = straight_component_data_hash(comp, reporting_frequency, variable_names)
389-
else
390-
comp_data = straight_component_data_hash(comp, reporting_frequency, [])
391-
end
426+
# variable_names = [] unless include_demand_nodes
427+
comp_data = straight_component_data_hash(comp, reporting_frequency, include_demand_nodes ? variable_names : [])
392428
else
393-
comp_data = {}
429+
comp_data = hvac_component_data_hash(comp, reporting_frequency, include_demand_nodes ? variable_names : [], loop_data)
394430
end
395-
396431
comp_data['component_side'] = 'demand'
397-
air_loop_data['components'] << comp_data
432+
loop_data['components'] << comp_data
398433
end
399434

400-
hvac_data << air_loop_data
401-
end
435+
# connect supply outlet and demand inlet
436+
supply_outlet = loop_data['components'].select { |comp| comp['object_name'] == loop_data['boundary_nodes']['supply_outlet'] }[0]
437+
demand_inlet = loop_data['components'].select { |comp| comp['object_name'] == loop_data['boundary_nodes']['demand_inlet'] }[0]
438+
supply_outlet['after_objects'] << loop_data['boundary_nodes']['demand_inlet']
439+
demand_inlet['before_objects'] << loop_data['boundary_nodes']['supply_outlet']
402440

403-
# get data from plant loops
404-
model.getPlantLoops.each do |plant_loop|
405-
plant_loop_data = {}
406-
plant_loop_data['loop_name'] = plant_loop.name.to_s
407-
plant_loop_data['loop_type'] = plant_loop.iddObjectType.valueName.to_s
408-
plant_loop_data['boundary_nodes'] = loop_boundary_nodes(plant_loop)
409-
plant_loop_data['components'] = []
410-
plant_loop.supplyComponents.each do |comp|
411-
if comp.to_StraightComponent.is_initialized
412-
comp_data = straight_component_data_hash(comp, reporting_frequency, variable_names)
413-
else
414-
comp_data = {}
415-
end
416-
417-
comp_data['component_side'] = 'supply'
418-
plant_loop_data['components'] << comp_data
419-
end
420-
421-
plant_loop.demandComponents.each do |comp|
422-
if comp.to_StraightComponent.is_initialized
423-
if include_demand_nodes
424-
comp_data = straight_component_data_hash(comp, reporting_frequency, variable_names)
425-
else
426-
comp_data = straight_component_data_hash(comp, reporting_frequency, [])
427-
end
428-
else
429-
comp_data = {}
430-
end
431-
432-
comp_data['component_side'] = 'demand'
433-
plant_loop_data['components'] << comp_data
434-
end
441+
# connect demand outlet and supply inlet
442+
demand_outlet = loop_data['components'].select { |comp| comp['object_name'] == loop_data['boundary_nodes']['demand_outlet'] }[0]
443+
supply_inlet = loop_data['components'].select { |comp| comp['object_name'] == loop_data['boundary_nodes']['supply_inlet'] }[0]
444+
demand_outlet['after_objects'] << loop_data['boundary_nodes']['supply_inlet']
445+
supply_inlet['before_objects'] << loop_data['boundary_nodes']['demand_outlet']
435446

436-
hvac_data << plant_loop_data
447+
hvac_data << loop_data
437448
end
438449

439450
# Convert the hash to a JSON string

0 commit comments

Comments
 (0)