Class: EnableEconomizerControl

Inherits:
OpenStudio::Measure::ModelMeasure
  • Object
show all
Defined in:
lib/measures/EnableEconomizerControl/measure.rb

Overview

start the measure

Instance Method Summary collapse

Instance Method Details

#arguments(model) ⇒ Object

define the arguments that the user will input



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/measures/EnableEconomizerControl/measure.rb', line 17

def arguments(model)
  args = OpenStudio::Measure::OSArgumentVector.new

  # make choice argument economizer control type
  choices = OpenStudio::StringVector.new
  choices << 'FixedDryBulb'
  choices << 'NoEconomizer'
  choices << 'NoChange'
  economizer_type = OpenStudio::Measure::OSArgument.makeChoiceArgument('economizer_type', choices, true)
  economizer_type.setDisplayName('Economizer Control Type')
  args << economizer_type

  # make an argument for econoMaxDryBulbTemp
  econoMaxDryBulbTemp = OpenStudio::Measure::OSArgument.makeDoubleArgument('econoMaxDryBulbTemp', true)
  econoMaxDryBulbTemp.setDisplayName('Economizer Maximum Limit Dry-Bulb Temperature (F).')
  econoMaxDryBulbTemp.setDefaultValue(69.0)
  args << econoMaxDryBulbTemp

  # make an argument for econoMinDryBulbTemp
  econoMinDryBulbTemp = OpenStudio::Measure::OSArgument.makeDoubleArgument('econoMinDryBulbTemp', true)
  econoMinDryBulbTemp.setDisplayName('Economizer Minimum Limit Dry-Bulb Temperature (F).')
  econoMinDryBulbTemp.setDefaultValue(-148.0)
  args << econoMinDryBulbTemp

  return args
end

#nameObject

define the name that a user will see, this method may be deprecated as the display name in PAT comes from the name field in measure.xml



12
13
14
# File 'lib/measures/EnableEconomizerControl/measure.rb', line 12

def name
  return 'Enable Economizer Control'
end

#neat_numbers(number, roundto = 2) ⇒ Object

short def to make numbers pretty (converts 4125001.25641 to 4,125,001.26 or 4,125,001). The definition be called through this measure



66
67
68
69
70
71
72
73
74
# File 'lib/measures/EnableEconomizerControl/measure.rb', line 66

def neat_numbers(number, roundto = 2) # round to 0 or 2)
  if roundto == 2
    number = format '%.2f', number
  else
    number = number.round
  end
  # regex to add commas
  number.to_s.reverse.gsub(/([0-9]{3}(?=([0-9])))/, '\\1,').reverse
end

#run(model, runner, user_arguments) ⇒ Object

define what happens when the measure is cop



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/measures/EnableEconomizerControl/measure.rb', line 45

def run(model, runner, user_arguments)
  super(model, runner, user_arguments)

  # use the built-in error checking
  if !runner.validateUserArguments(arguments(model), user_arguments)
    return false
  end

  # assign the user inputs to variables
  economizer_type = runner.getStringArgumentValue('economizer_type', user_arguments)
  econoMaxDryBulbTemp = runner.getDoubleArgumentValue('econoMaxDryBulbTemp', user_arguments)
  econoMinDryBulbTemp = runner.getDoubleArgumentValue('econoMinDryBulbTemp', user_arguments)

  # Note if economizer_type == NoChange
  # and register as N/A
  if economizer_type == 'NoChange'
    runner.registerAsNotApplicable('N/A - User requested No Change in economizer operation.')
    return true
  end

  # short def to make numbers pretty (converts 4125001.25641 to 4,125,001.26 or 4,125,001). The definition be called through this measure
  def neat_numbers(number, roundto = 2) # round to 0 or 2)
    if roundto == 2
      number = format '%.2f', number
    else
      number = number.round
    end
    # regex to add commas
    number.to_s.reverse.gsub(/([0-9]{3}(?=([0-9])))/, '\\1,').reverse
  end

  # info for initial condition
  air_loops_changed = []
  loops_with_outdoor_air = false

  # loop through air loops
  model.getAirLoopHVACs.each do |air_loop|
    # find AirLoopHVACOutdoorAirSystem on loop
    air_loop.supplyComponents.each do |supply_component|
      hVACComponent = supply_component.to_AirLoopHVACOutdoorAirSystem
      if hVACComponent.is_initialized
        hVACComponent = hVACComponent.get

        # set flag that at least one air loop has outdoor air objects
        loops_with_outdoor_air = true

        # get ControllerOutdoorAir
        controller_oa = hVACComponent.getControllerOutdoorAir

        # get ControllerMechanicalVentilation
        controller_mv = controller_oa.controllerMechanicalVentilation # not using this

        if controller_oa.getEconomizerControlType == economizer_type
          # report info about air loop
          runner.registerInfo("#{air_loop.name} already has the requested economizer type of #{economizer_type}.")
        else
          # store starting economizer type
          starting_econo_control_type = controller_oa.getEconomizerControlType

          # set economizer to the requested control type
          controller_oa.setEconomizerControlType(economizer_type)

          # report info about air loop
          runner.registerInfo("Changing Economizer Control Type on #{air_loop.name} from #{starting_econo_control_type} to #{controller_oa.getEconomizerControlType} and adjusting temperature and enthalpy limits per measure arguments.")

          air_loops_changed << air_loop

        end

        # set maximum limit drybulb temperature
        controller_oa.setEconomizerMaximumLimitDryBulbTemperature(OpenStudio.convert(econoMaxDryBulbTemp, 'F', 'C').get)

        # set minimum limit drybulb temperature
        controller_oa.setEconomizerMinimumLimitDryBulbTemperature(OpenStudio.convert(econoMinDryBulbTemp, 'F', 'C').get)

      end
    end
  end

  # Report N/A if none of the air loops had OA systems
  if loops_with_outdoor_air == false
    runner.registerAsNotApplicable('The affected loop(s) do not have any outdoor air objects.')
    return true
  end

  # Report N/A if none of the air loops were changed
  if air_loops_changed.empty?
    runner.registerAsNotApplicable('No air loops had economizers added or removed.')
    return true
  end

  # Report the final condition of model
  runner.registerFinalCondition("#{air_loops_changed.size} air loops now have economizers.")

  return true
end