Question-and-Answer Resource for the Building Energy Modeling Community
Get started with the Help page
Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

After I wrote all this I realized it would be more efficient and scalable to go backward though the mixer rather than forward through the splitter. Oh well.

def airLoopThermalZones(workspace, runner, air_loop, zone_names)
air_loop_name = air_loop.getString(0).get.to_s

# splitters
splitters = workspace.getObjectsByType("AirLoopHVAC:ZoneSplitter".to_IddObjectType)

# terminals
uncontrolleds = workspace.getObjectsByType("AirTerminal:SingleDuct:Uncontrolled".to_IddObjectType)
cv_reheats = workspace.getObjectsByType("AirTerminal:SingleDuct:ConstantVolume:Reheat".to_IddObjectType)
vav_reheats = workspace.getObjectsByType("AirTerminal:SingleDuct:VAV:Reheat".to_IddObjectType)
vav_noreheats = workspace.getObjectsByType("AirTerminal:SingleDuct:VAV:NoReheat".to_IddObjectType)
piu_series_reheats = workspace.getObjectsByType("AirTerminal:SingleDuct:SeriesPIU:Reheat".to_IddObjectType)
piu_parallel_reheats = workspace.getObjectsByType("AirTerminal:SingleDuct:ParallelPIU:Reheat".to_IddObjectType)

# adus
adus = workspace.getObjectsByType("ZoneHVAC:AirDistributionUnit".to_IddObjectType)

# equipment lists
equip_lists = workspace.getObjectsByType("ZoneHVAC:EquipmentList".to_IddObjectType)

# equipment connections
equip_connections = workspace.getObjectsByType("ZoneHVAC:EquipmentConnections".to_IddObjectType)
# required intermediate arrays
air_terminal_names = []
adu_names = []
equip_list_names = []

# get air loop inlet node list
inlet_nodelist_name = air_loop.getString(8).get.to_s
inlet_nodelist = workspace.getObjectByTypeAndName("NodeList".to_IddObjectType, inlet_nodelist_name).get

# get air loop demand inlet node name
node_name = inlet_nodelist.getString(1).get.to_s

# find cooresponding splitter
splitter = nil
splitters.each do |splitter_temp|
    if splitter_temp.getString(1).get.to_s == node_name
        splitter = splitter_temp
    end
end

# store all splitter outlet node names 
splitter_outlet_node_names = []
for i in 2..splitter.numFields.to_i-1
    splitter_outlet_node_names << splitter.getString(i).get.to_s
end

# find terminals that use stored splitter outlet nodes
splitter_outlet_node_names = checkTerminalNodeMatch(splitter_outlet_node_names, air_terminal_names, uncontrolleds, 2, runner)
splitter_outlet_node_names = checkTerminalNodeMatch(splitter_outlet_node_names, air_terminal_names, cv_reheats, 3, runner)
splitter_outlet_node_names = checkTerminalNodeMatch(splitter_outlet_node_names, air_terminal_names, vav_reheats, 3, runner)
splitter_outlet_node_names = checkTerminalNodeMatch(splitter_outlet_node_names, air_terminal_names, vav_noreheats, 3, runner)
splitter_outlet_node_names = checkTerminalNodeMatch(splitter_outlet_node_names, air_terminal_names, piu_series_reheats, 5, runner)
splitter_outlet_node_names = checkTerminalNodeMatch(splitter_outlet_node_names, air_terminal_names, piu_parallel_reheats, 6, runner) 

if splitter_outlet_node_names.size >= 1
    runner.registerError("There were #{splitter_outlet_node_names.size} that were not able to be matched to terminals for #{air_loop_name}.")
    return false
end

adus.each do |adu|
    adu_terminal_name = adu.getString(3).get.to_s
    air_terminal_names.each do |air_terminal_name|
        if air_terminal_name == adu_terminal_name
            adu_names << adu.getString(0).get.to_s
        end
    end
end

if adu_names.size == 0
    runner.registerError("No ADUs were able to be matched to air terminal names for #{air_loop_name}.")
    return false
end

equip_lists.each do |equip_list|
    i = 2
    length = equip_list.numFields.to_i
    while i < length
        equip_list_adu_name = equip_list.getString(i).get.to_s
        adu_names.each do |adu_name|
            if adu_name == equip_list_adu_name
                equip_list_names << equip_list.getString(0).get.to_s
            end
        end

        i = i + 4
    end
end

if equip_list_names.size == 0
    runner.registerError("No equipment lists were able to be matched to air distribution units for #{air_loop_name}.")
    return false
end

equip_connections.each do |equip_connection|
    equip_connection_equip_list_name= equip_connection.getString(1).get.to_s
    equip_list_names.each do |equip_list_name|
        runner.registerInfo("Checked #{equip_list_name} with #{equip_connection_equip_list_name}")
        if equip_list_name == equip_connection_equip_list_name
            zone_names << equip_connection.getString(0).get.to_s
        end
    end
end

if zone_names.size == 0
    runner.registerError("No zones were able to be matched to air loops for #{air_loop_name}.")
    return false
end

return zone_names

end

After I wrote all this I realized it would be more efficient and scalable to go backward though the mixer rather than forward through the splitter. Oh well.

def airLoopThermalZones(workspace, runner, air_loop, zone_names)
 air_loop_name = air_loop.getString(0).get.to_s

 # splitters
 splitters = workspace.getObjectsByType("AirLoopHVAC:ZoneSplitter".to_IddObjectType)

 # terminals
 uncontrolleds = workspace.getObjectsByType("AirTerminal:SingleDuct:Uncontrolled".to_IddObjectType)
 cv_reheats = workspace.getObjectsByType("AirTerminal:SingleDuct:ConstantVolume:Reheat".to_IddObjectType)
 vav_reheats = workspace.getObjectsByType("AirTerminal:SingleDuct:VAV:Reheat".to_IddObjectType)
 vav_noreheats = workspace.getObjectsByType("AirTerminal:SingleDuct:VAV:NoReheat".to_IddObjectType)
    vav_hc_noreheats = workspace.getObjectsByType("AirTerminal:SingleDuct:VAV:HeatAndCool:NoReheat".to_IddObjectType)
    piu_series_reheats = workspace.getObjectsByType("AirTerminal:SingleDuct:SeriesPIU:Reheat".to_IddObjectType)
 piu_parallel_reheats = workspace.getObjectsByType("AirTerminal:SingleDuct:ParallelPIU:Reheat".to_IddObjectType)

 # adus
 adus = workspace.getObjectsByType("ZoneHVAC:AirDistributionUnit".to_IddObjectType)

 # equipment lists
 equip_lists = workspace.getObjectsByType("ZoneHVAC:EquipmentList".to_IddObjectType)

 # equipment connections
 equip_connections = workspace.getObjectsByType("ZoneHVAC:EquipmentConnections".to_IddObjectType)
 # required intermediate arrays
air_terminal_names     adu_terminal_names = []
    other_terminal_names = []
    adu_names = []
 equip_list_names = []

 # get air loop inlet node list
 inlet_nodelist_name = air_loop.getString(8).get.to_s
 inlet_nodelist = workspace.getObjectByTypeAndName("NodeList".to_IddObjectType, inlet_nodelist_name).get

 # get air loop demand inlet node name
 node_name = inlet_nodelist.getString(1).get.to_s

 # find cooresponding splitter
 splitter = nil
 splitters.each do |splitter_temp|
     if splitter_temp.getString(1).get.to_s == node_name
         splitter = splitter_temp
    end
end

    end
    end

    # store all splitter outlet node names 
 splitter_outlet_node_names = []
 for i in 2..splitter.numFields.to_i-1
     splitter_outlet_node_names << splitter.getString(i).get.to_s
end

    end

    # find terminals that use stored splitter outlet nodes
 splitter_outlet_node_names = checkTerminalNodeMatch(splitter_outlet_node_names, air_terminal_names, other_terminal_names, uncontrolleds, 2, runner)
 splitter_outlet_node_names = checkTerminalNodeMatch(splitter_outlet_node_names, air_terminal_names, adu_terminal_names, cv_reheats, 3, runner)
 splitter_outlet_node_names = checkTerminalNodeMatch(splitter_outlet_node_names, air_terminal_names, adu_terminal_names, vav_reheats, 3, runner)
 splitter_outlet_node_names = checkTerminalNodeMatch(splitter_outlet_node_names, air_terminal_names, adu_terminal_names, vav_noreheats, 3, runner)
 splitter_outlet_node_names = checkTerminalNodeMatch(splitter_outlet_node_names, air_terminal_names, adu_terminal_names, vav_hc_noreheats, 3, runner)
    splitter_outlet_node_names = checkTerminalNodeMatch(splitter_outlet_node_names, adu_terminal_names, piu_series_reheats, 5, runner)
 splitter_outlet_node_names = checkTerminalNodeMatch(splitter_outlet_node_names, air_terminal_names, adu_terminal_names, piu_parallel_reheats, 6, runner) 

 if splitter_outlet_node_names.size >= 1
     runner.registerError("There were #{splitter_outlet_node_names.size} that were not able to be matched to terminals for #{air_loop_name}.")
     return false
end

    end

    adus.each do |adu|
     adu_terminal_name = adu.getString(3).get.to_s
    air_terminal_names.each     adu_terminal_names.each do |air_terminal_name|
         if air_terminal_name == adu_terminal_name
             adu_names << adu.getString(0).get.to_s
        end
    end
end

    end
        end
    end


    equip_lists.each do |equip_list|
    i = 2
    length = equip_list.numFields.to_i
    while i < length
        equip_list_adu_name = equip_list.getString(i).get.to_s
        if adu_names.size > 0
            adu_names.each do |adu_name|
                if adu_name == equip_list_adu_name
                    equip_list_names << equip_list.getString(0).get.to_s
                end
            end
        elsif other_terminal_names.size > 0
            other_terminal_names.each do |other_terminal_name|
                if other_terminal_name == equip_list_adu_name
                    equip_list_names << equip_list.getString(0).get.to_s
                end
            end
        else
            runner.registerError("No ADUs were equipment able to be matched to air terminal names for #{air_loop_name}.")
     return false
end

equip_lists.each do |equip_list|
    i = 2
    length = equip_list.numFields.to_i
    while i < length
        equip_list_adu_name = equip_list.getString(i).get.to_s
        adu_names.each do |adu_name|
            if adu_name == equip_list_adu_name
                equip_list_names << equip_list.getString(0).get.to_s
            end
        end

        end
        i = i + 4
    end
end

if equip_list_names.size == 0
    runner.registerError("No equipment lists were able to be matched to air distribution units for #{air_loop_name}.")
    return false
end

equip_connections.each do |equip_connection|
    equip_connection_equip_list_name= equip_connection.getString(1).get.to_s
    equip_list_names.each do |equip_list_name|
        runner.registerInfo("Checked #{equip_list_name} with #{equip_connection_equip_list_name}")
        if equip_list_name == equip_connection_equip_list_name
            zone_names << equip_connection.getString(0).get.to_s
        end
    end
end

if zone_names.size == 0
    runner.registerError("No zones were able to be matched to air loops for #{air_loop_name}.")
    return false
end

return zone_names
end

def checkTerminalNodeMatch(splitter_nodes, air_terminal_names, terminals, field, runner)

if splitter_nodes.size >= 1
    splitter_nodes.each do |splitter_node|
        # for uncontrolled terminals
        terminals.each do |terminal|
            if terminal.getString(field).to_s == splitter_node
                air_terminal_names << terminal.getString(0).get.to_s
                splitter_nodes -= [splitter_node]
                runner.registerInfo("Found Match! Terminals Matched: #{air_terminal_names.size}, Splitter Nodes Left: #{splitter_nodes.size}.")
                break
            end
        end
    end
end

return splitter_nodes

end

After I wrote all this I realized it would be more efficient and scalable to go backward though the mixer rather than forward through the splitter. Oh well.

def airLoopThermalZones(workspace, runner, air_loop, zone_names)
    air_loop_name = air_loop.getString(0).get.to_s

    # splitters
    splitters = workspace.getObjectsByType("AirLoopHVAC:ZoneSplitter".to_IddObjectType)

    # terminals
    uncontrolleds = workspace.getObjectsByType("AirTerminal:SingleDuct:Uncontrolled".to_IddObjectType)
    cv_reheats = workspace.getObjectsByType("AirTerminal:SingleDuct:ConstantVolume:Reheat".to_IddObjectType)
    vav_reheats = workspace.getObjectsByType("AirTerminal:SingleDuct:VAV:Reheat".to_IddObjectType)
    vav_noreheats = workspace.getObjectsByType("AirTerminal:SingleDuct:VAV:NoReheat".to_IddObjectType)
    vav_hc_noreheats = workspace.getObjectsByType("AirTerminal:SingleDuct:VAV:HeatAndCool:NoReheat".to_IddObjectType)
    piu_series_reheats = workspace.getObjectsByType("AirTerminal:SingleDuct:SeriesPIU:Reheat".to_IddObjectType)
    piu_parallel_reheats = workspace.getObjectsByType("AirTerminal:SingleDuct:ParallelPIU:Reheat".to_IddObjectType)

    # adus
    adus = workspace.getObjectsByType("ZoneHVAC:AirDistributionUnit".to_IddObjectType)

    # equipment lists
    equip_lists = workspace.getObjectsByType("ZoneHVAC:EquipmentList".to_IddObjectType)

    # equipment connections
    equip_connections = workspace.getObjectsByType("ZoneHVAC:EquipmentConnections".to_IddObjectType)
    # required intermediate arrays
    adu_terminal_names = []
    other_terminal_names = []
    adu_names = []
    equip_list_names = []

    # get air loop inlet node list
    inlet_nodelist_name = air_loop.getString(8).get.to_s
    inlet_nodelist = workspace.getObjectByTypeAndName("NodeList".to_IddObjectType, inlet_nodelist_name).get

    # get air loop demand inlet node name
    node_name = inlet_nodelist.getString(1).get.to_s

    # find cooresponding splitter
    splitter = nil
    splitters.each do |splitter_temp|
        if splitter_temp.getString(1).get.to_s == node_name
            splitter = splitter_temp
        end
    end

    # store all splitter outlet node names 
    splitter_outlet_node_names = []
    for i in 2..splitter.numFields.to_i-1
        splitter_outlet_node_names << splitter.getString(i).get.to_s
    end

    # find terminals that use stored splitter outlet nodes
    splitter_outlet_node_names = checkTerminalNodeMatch(splitter_outlet_node_names, other_terminal_names, uncontrolleds, 2, runner)
    splitter_outlet_node_names = checkTerminalNodeMatch(splitter_outlet_node_names, adu_terminal_names, cv_reheats, 3, runner)
    splitter_outlet_node_names = checkTerminalNodeMatch(splitter_outlet_node_names, adu_terminal_names, vav_reheats, 3, runner)
    splitter_outlet_node_names = checkTerminalNodeMatch(splitter_outlet_node_names, adu_terminal_names, vav_noreheats, 3, runner)
    splitter_outlet_node_names = checkTerminalNodeMatch(splitter_outlet_node_names, adu_terminal_names, vav_hc_noreheats, 3, runner)
    splitter_outlet_node_names = checkTerminalNodeMatch(splitter_outlet_node_names, adu_terminal_names, piu_series_reheats, 5, runner)
    splitter_outlet_node_names = checkTerminalNodeMatch(splitter_outlet_node_names, adu_terminal_names, piu_parallel_reheats, 6, runner) 

    if splitter_outlet_node_names.size >= 1
        runner.registerError("There were #{splitter_outlet_node_names.size} that were not able to be matched to terminals for #{air_loop_name}.")
        return false
    end

    adus.each do |adu|
        adu_terminal_name = adu.getString(3).get.to_s
        adu_terminal_names.each do |air_terminal_name|
            if air_terminal_name == adu_terminal_name
                adu_names << adu.getString(0).get.to_s
            end
        end
    end


    equip_lists.each do |equip_list|
    i = 2
    length = equip_list.numFields.to_i
    while i < length
        equip_list_adu_name = equip_list.getString(i).get.to_s
        if adu_names.size > 0
            adu_names.each do |adu_name|
                if adu_name == equip_list_adu_name
                    equip_list_names << equip_list.getString(0).get.to_s
                end
            end
        elsif other_terminal_names.size > 0
            other_terminal_names.each do |other_terminal_name|
                if other_terminal_name == equip_list_adu_name
                    equip_list_names << equip_list.getString(0).get.to_s
                end
            end
        else
            runner.registerError("No equipment able to be matched to air terminal names for #{air_loop_name}.")
            return false
        end
        i = i + 4
    end
end

if equip_list_names.size == 0
    runner.registerError("No equipment lists were able to be matched to air distribution units for #{air_loop_name}.")
    return false
end

 equip_connections.each do |equip_connection|
     equip_connection_equip_list_name= equip_connection.getString(1).get.to_s
     equip_list_names.each do |equip_list_name|
         runner.registerInfo("Checked #{equip_list_name} with #{equip_connection_equip_list_name}")
         if equip_list_name == equip_connection_equip_list_name
             zone_names << equip_connection.getString(0).get.to_s
        end
    end
end

    end
        end
    end

    if zone_names.size == 0
     runner.registerError("No zones were able to be matched to air loops for #{air_loop_name}.")
     return false
end

    end

    return zone_names
end


end

def checkTerminalNodeMatch(splitter_nodes, air_terminal_names, terminals, field, runner)
     #NESTED IFS END LIVES
    if splitter_nodes.size >= 1
     splitter_nodes.each do |splitter_node|
         # for uncontrolled terminals
         terminals.each do |terminal|
             if terminal.getString(field).to_s == splitter_node
                 air_terminal_names << terminal.getString(0).get.to_s
                 splitter_nodes -= [splitter_node]
                 runner.registerInfo("Found Match! Terminals Matched: #{air_terminal_names.size}, Splitter Nodes Left: #{splitter_nodes.size}.")
                 break
            end
        end
    end
end

    end
            end
        end
    end 
    return splitter_nodes
 end