lib/openstudio-standards/btap/measures.rb in openstudio-standards-0.3.0 vs lib/openstudio-standards/btap/measures.rb in openstudio-standards-0.3.1.rc1

- old
+ new

@@ -1,1515 +1,1515 @@ -# ********************************************************************* -# * Copyright (c) 2008-2015, Natural Resources Canada -# * All rights reserved. -# * -# * This library is free software; you can redistribute it and/or -# * modify it under the terms of the GNU Lesser General Public -# * License as published by the Free Software Foundation; either -# * version 2.1 of the License, or (at your option) any later version. -# * -# * This library is distributed in the hope that it will be useful, -# * but WITHOUT ANY WARRANTY; without even the implied warranty of -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# * Lesser General Public License for more details. -# * -# * You should have received a copy of the GNU Lesser General Public -# * License along with this library; if not, write to the Free Software -# * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -# **********************************************************************/ - - -# To change this template, choose Tools | Templates -# and open the template in the editor. -require "#{File.dirname(__FILE__)}/btap" - -class OSMArg - ARGUMENT_TYPES = [ - "BOOL", - "STRING", - "INTEGER", - "FLOAT", - "STRINGCHOICE", - "WSCHOICE" - ] - - - - attr_accessor :runner, - :variable_name, - :type, - :required, - :model_dependant, - :display_name, - :default_value, - :min_value, - :max_value, - :string_choice_array, - :os_object_type - - def self.bool( variable_name,display_name,required,default_value ) - raise "#{default_value} defaut value is not a bool." unless default_value.is_a?(Bool) - default_value.respond_to?(:to_s) - arg = OSMArg.new( "BOOL", variable_name, display_name, required) - arg.default_value = default_value - return arg - end - - def self.string( variable_name,display_name,required,default_value ) - raise "#{default_value} defaut value is not a string." unless default_value.respond_to?(:to_s) - arg = OSMArg.new( "STRING", variable_name, display_name, required) - arg.default_value = default_value - return arg - end - - def self.integer( variable_name,display_name,required,default_value,min_value,max_value ) - raise "#{default_value} defaut value is not a integer." unless default_value.respond_to?(:to_i) - arg = OSMArg.new( "INTEGER", variable_name, display_name, required) - arg.default_value = default_value - arg.min_value = min_value - arg.max_value = max_value - return arg - end - - def self.float( variable_name, display_name, required,default_value,min_value, max_value ) - raise "#{default_value} defaut value is not a float." unless default_value.respond_to?(:to_f) - arg = OSMArg.new( "INTEGER", variable_name, display_name, required) - arg.default_value = default_value - arg.min_value = min_value - arg.max_value = max_value - return arg - end - - def self.choice(variable_name,display_name,required,default_value,string_choice_array) - raise "#{default_value} defaut value is not an array." unless default_value.is_a?(Array) - arg = OSMArg.new( "STRINGCHOICE", variable_name, display_name, required) - arg.default_value = default_value - arg.string_choice_array = string_choice_array - return arg - end - - def self.wschoice( variable_name, display_name, required, default_value, os_object_type) - arg = OSMArg.new( "WSCHOICE", variable_name, display_name, required ) - arg.default_value = default_value - arg.os_object_type = os_object_type - return arg - end - - def initialize( type, variable_name, display_name, required ) - self.type = type - self.variable_name = variable_name - self.display_name = display_name - self.required = required - self.model_dependant = false - if self.type == "WSCHOICE" - self.model_dependant = true - else - self.model_dependant = false - end - return self - end -end - - - - - -module BTAP - module Measures - module OSMeasures - - - - - class BTAPModelUserScript < OpenStudio::Ruleset::ModelUserScript - #if and E+ measure replace OpenStudio::Ruleset::ModelUserScript with OpenStudio::Ruleset::WorkspaceUserScript - #Array containing information of all inputs required by measure. - attr_accessor :argument_array_of_arrays - attr_accessor :argument_array - attr_accessor :file - #Name of measure - #attr_accessor :name - - #if and E+ measure replace OpenStudio::Ruleset::ModelUserScript with OpenStudio::Ruleset::WorkspaceUserScript - def name - "BTAPModelUserScript" - OSMArgument.new - end - - #this method will output the ruby macro to perform the change. - def generate_ruby_macro(model,runner) - if @file == nil or @file == "" - @file = "Enter_Path_To_#{self.class.name}_measure.rb_File!" - end - BTAP::runner_register("MACRO", "\##{self.class.name} Measure Start", runner) - BTAP::runner_register("MACRO", "require \"#{@file}\"", runner) - BTAP::runner_register("MACRO", "argument_values = #{@arg_table}", runner) - BTAP::runner_register("MACRO", "#{self.class.name}.new.set_user_arguments_and_apply(model,argument_values,runner)",runner) - BTAP::runner_register("MACRO", "\##{self.class.name} Measure End", runner) - end - - def set_user_arguments_and_apply(model,argument_values,runner) - message = "Settting Arguments" - runner.nil? ? puts(message) : runner.registerInfo(message) - #create argument map - user_arguments = OpenStudio::Ruleset::OSArgumentMap.new - #get argument list - arguments = self.arguments(model) - #go through each argument - arguments.each do |argument| - found = false - #go through each passed argument_values - argument_values.each do |pair| - #when a match is found. - if argument.name == pair[0] - - clone_argument = argument.clone - unless clone_argument.setValue(pair[1]) - message = "Could not set #{argument.name} to #{pair[1]}" - runner.nil? ? puts(message) : runner.registerError(message) - else - message = "Set #{argument.name} to #{pair[1]}" - runner.nil? ? puts(message) : runner.registerInfo(message) - end - user_arguments[pair[0]] = clone_argument - #log message - message = " Argument set to #{user_arguments}" - runner.nil? ? puts(message) : runner.registerInfo(message) - end - found = true - end - puts ("Warning: value for argument #{argument.name} not set!.") if found == false - end - self.run(model, runner, user_arguments) - end - - def run(model, runner, user_arguments) - #IF and E+ measure replace model with workspace as the argument - #Boilerplate start - super(model, runner, user_arguments) - BTAP::runner_register("INFO", "Initial model being modified by #{self.class.name}",runner) - if not runner.validateUserArguments(self.arguments(model),user_arguments) - return false - end - - #Set argument to instance variables. - self.argument_getter(model, runner,user_arguments) - #will run the childs method measure_code - result = self.measure_code(model,runner) - generate_ruby_macro(model,runner) - return result - end # end method run - - def argument_setter(model,args) - #***boilerplate code starts. Do not edit... - - - #iterate through array of hashes and make arguments based on type and set - # max and min values where applicable. - @argument_array.each do |row| - #strip out first char that contains the @ symbol - row.variable_name[0] = '' - arg = nil - case row.type - when "BOOL" - arg = OpenStudio::Ruleset::OSArgument::makeBoolArgument(row.variable_name,row.required,row.model_dependant) - when "STRING" - arg = OpenStudio::Ruleset::OSArgument::makeStringArgument(row.variable_name,row.required,row.model_dependant) - when "INTEGER" - arg = OpenStudio::Ruleset::OSArgument::makeIntegerArgument(row.variable_name,row.required,row.model_dependant) - arg.setMaxValue( row.max_value.to_i ) unless row.min_value.nil? - arg.setMaxValue( row.max_value.to_i ) unless row.max_value.nil? - when "FLOAT" - arg = OpenStudio::Ruleset::OSArgument::makeDoubleArgument(row.variable_name,row.required,row.model_dependant) - arg.setMaxValue( row.max_value.to_f ) unless row.min_value.nil? - arg.setMaxValue( row.max_value.to_f ) unless row.max_value.nil? - when "STRINGCHOICE" - # #add string choices one by one. - chs = OpenStudio::StringVector.new - row.string_choice_array.each {|choice| chs << choice} - arg = OpenStudio::Ruleset::OSArgument::makeChoiceArgument(row.variable_name, chs,row.required,row.model_dependant) - when "PATH" - arg = OpenStudio::Ruleset::OSArgument::makePathArgument("alternativeModelPath",true,"osm") - when "WSCHOICE" - arg = OpenStudio::Ruleset::makeChoiceArgumentOfWorkspaceObjects( row.variable_name, row.os_object_type.to_IddObjectType , model, row.required) - end - # #common argument aspects. - unless arg.nil? - arg.setDisplayName(row.display_name) - arg.setDefaultValue(row.default_value) unless row.default_value.nil? - args << arg - end - end - return args - end - - def argument_getter(model, runner,user_arguments) - @arg_table = [] - unless @argument_array == nil - @argument_array.each do |row| - name = row.variable_name - - case row.type - when "BOOL" - value = runner.getBoolArgumentValue(name, user_arguments) - instance_variable_set("@#{name}",value) - @arg_table << [name,value] - when "STRING" - value = runner.getStringArgumentValue(name, user_arguments) - instance_variable_set("@#{name}",value) - @arg_table << [name,value] - when "INTEGER" - value = runner.getIntegerArgumentValue(name, user_arguments) - instance_variable_set("@#{name}",value) - @arg_table << [name,value] - if ( not row.min_value.nil? and instance_variable_get("@#{name}") < row.min_value ) or ( not row.max_value.nil? and instance_variable_get("@#{name}") > row.max_value ) - runner.registerError("#{row.display_name} must be greater than or equal to #{row.min_value} and less than or equal to #{row.max_value}. You entered #{instance_variable_get("@#{name}")}.") - return false - end - when "FLOAT" - value = runner.getDoubleArgumentValue(name, user_arguments) - instance_variable_set("@#{name}",value) - @arg_table << [name,value] - - if ( not row.min_value.nil? and instance_variable_get("@#{name}") < row.min_value ) or ( not row.max_value.nil? and instance_variable_get("@#{name}") > row.max_value ) - runner.registerError("#{row.display_name} must be greater than or equal to #{row.min_value} and less than or equal to #{row.max_value}. You entered #{instance_variable_get("@#{name}")}.") - return false - end - when "STRINGCHOICE" - @arg_table << [name,runner.getBoolArgumentValue(name, user_arguments)] - instance_variable_set("@#{name}", runner.getStringArgumentValue(name, user_arguments) ) - when "WSCHOICE" - @arg_table << [name,runner.getBoolArgumentValue(name, user_arguments)] - instance_variable_set("@#{name}", runner.getOptionalWorkspaceObjectChoiceValue(name, user_arguments,model) ) - - when "PATH" - @arg_table << [name,runner.getBoolArgumentValue(name, user_arguments)] - instance_variable_set("@#{name}", runner.getPathArgument(name, user_arguments) ) - end #end case - end #end do - end - return @arg_table - end - - end - #Measure Template simplified. - class TemplateModelMeasure < BTAPModelUserScript - - def name - "BTAPTempModelMeasure" - end - - def arguments(model) - - #bool - @argument_array << OSMArgument.bool(variable_name,display_name,required,default_value) - #string - @argument_array << OSMArgument.string(variable_name,display_name,required,default_value) - #integer - @argument_array << OSMArgument.integer(variable_name,display_name,required,default_value,min_value,max_value) - #float - @argument_array << OSMArgument.float(variable_name,display_name,required,default_value,min_value,max_value) - #Choice - @argument_array << OSMArgument.choice(variable_name,display_name,required,default_value,string_choice_array) - #Workspace choice (using zones as an example) - @argument_array << OSMArgument.wschoice(variable_name,display_name,required,default_value,string_choice_array) - args = super(model,@argument_array) - return args - end - - def run(model, runner, user_arguments) - #IF and E+ measure replace model with workspace as the argument - #Boilerplate start - parent_method_is_true = super(model, runner, user_arguments) - - - #Start measure changes based on model. - puts @boolean_argument_name - puts @string_argument_name - puts @integer_argument_name - puts @float_argument_name - puts @choice_argument_name - puts @ws_choice_argument_name - - - - - #Do your stuff here! - #Here are some logging methods for reference. - # runner.registerInitialCondition("Model initial condition (for example number of floors.") - # runner.registerInfo("Use this for information to user.") - # runner.registerWarning("Use this for warnings to user.") - # runner.registerError("Use this for fatal error message to user. Will not continue. Return a false.") ; return false - # runner.registerAsNotApplicable("Measure not applicable because XYZ. Return a true and will continue with other chained measures."); return true - # runner.registerFinalCondition("Model ended with # of floors for example") - # runner.registerFinalCondition("Indicate what was changed.") - - - #If everything went well.. - return true ? parent_method_is_true : false - end # end method run - - #For manually running script via an IDE or a command line. - #Using the template above as an example..... - # argument_values = [ - # - # ["boolean_argument_name", true ], - # ["string_argument_name", "some string" ], - # ["integer_argument_name", 1 ], - # ["float_argument_name", 0.001 ], - # ["choice_argument_name", "choice1" ], - # ["ws_choice_argument_name", "zone1" ], - # ["path_argument_name", OpenStudio::Path.new(File.dirname(__FILE__))] - # ] - # - def set_user_arguments_and_apply(model,argument_values,runner) - self.run(model, runner, super(model,argument_values,runner) ) - end - - end - - class ArchetypeScan < BTAPModelUserScript - - def name - "BTAPTempModelMeasure" - end - - def arguments(model) - #get all osm files in resource folder. - osmfiles = OpenStudio::StringVector.new - BTAP::FileIO::get_find_files_from_folder_by_extension(File.dirname(__FILE__), ".osm").each {|filename| osmfiles << File.basename(file_name, ",osm")} - - - #list of arguments as they will appear in the interface. They are available in the run command as @variable_name. - @argument_array_of_arrays = [ - [ "variable_name", "type", "required", "model_dependant", "display_name", "default_value", "min_value", "max_value", "string_choice_array", "os_object_type" ], - [ "archetype_name", "STRINGCHOICE", true, false, "archetype_name", osmfiles[0].to_s , nil, nil, osmfiles, nil ], - ] - args = super(model,@argument_array_of_arrays) - return args - end - - def run(model, runner, user_arguments) - #run the super - parent_method_is_true = super(model, runner, user_arguments) - - - ############### - - #Set Archetype name in runner. - runner.registerValue('archetype_name',@archetype_name) - - #Set path to OSM files. - alternative_model_path = OpenStudio::Path.new("#{File.dirname(__FILE__)}/#{@archetype_name}.osm") - #load model and test. - translator = OpenStudio::OSVersion::VersionTranslator.new - oModel = translator.loadModel(alternative_model_path) - if oModel.empty? - runner.registerError("Could not load alternative model from '" + alternative_model_path.to_s + "'.") - return false - end - new_model = oModel.get - - # pull original weather file object over - weather_file = new_model.getOptionalWeatherFile - if not weather_file.empty? - weather_file.get.remove - runner.registerInfo("Removed alternate model's weather file object.") - end - original_weather_file = model.getOptionalWeatherFile - if not original_weather_file.empty? - original_weather_file.get.clone(new_model) - end - - # pull original design days over - new_model.getDesignDays.sort.each { |designDay| designDay.remove } - model.getDesignDays.sort.each { |designDay| designDay.clone(new_model) } - - #swap underlying data in model with underlying data in newModel - model.swap(new_model) - runner.registerFinalCondition("Model replaced with alternative #{alternative_model_path}.") - return true ? parent_method_is_true : false - end # end method run - - #For manually running script via an IDE or a command line script. - #Using the template above as an example..... - # argument_values = [ - # ["archetype_name", "FullServiceRestaurant" ] - # ] - # - def set_user_arguments_and_apply(model,argument_values,runner) - self.run(model, runner, super(model,argument_values,runner) ) - end - end - end - - class CSV_Measures - def initialize( - csv_file, - script_root_folder_path - ) - @csv_file_path = csv_file - @csv_data = nil - @script_root_folder_path = script_root_folder_path - end - - - # A tiny bit of metacode to assign some instance variables named as above. This will set - # the above variable first to nil, then, if present in the csv row data received, the actual construction data values. - # So we should after this loop access @ext_wall_rsi for example. If the variable is not present in the row. It will default the value to zero. - # It should automatically make floats and strings accordingly. - def set_instance_variables(measure_values) - - measure_values.each do |variable| - instance_variable_set("@#{variable}", nil ) - instance_variable_set("@#{variable}", @csv_data[ variable ] ) unless ( (@csv_data.nil? == true ) or (@csv_data.has_key?(variable) == false) or (@csv_data[variable].to_s.strip.downcase == "na")) - end - end - - def are_all_instance_variables_nil?(measure_values) - value = true - measure_values.each do |variable| - value = false unless instance_variable_get("@#{variable}").nil? - end - return value - end - - end - class CSV_OS_Measures < CSV_Measures - #loading methods - def side_load_base_model_building( model ) - log_message = "" - measure_values =["base_model_rel_path"] - #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. - self.set_instance_variables(measure_values) - puts osm_model_full_path = "#{@script_root_folder_path}/#{@base_model_rel_path}" - newModel = BTAP::FileIO::load_osm(osm_model_full_path,"-") - model.swap(newModel) - log_message << "\nModel replaced with alternative model #{osm_model_full_path}.\n" - end - def load_base_model_building() - log_message = "" - measure_values =[ - "base_model_rel_path" - ] - #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. - self.set_instance_variables(measure_values) - osm_model_full_path = "#{@script_root_folder_path}/#{@base_model_rel_path}" - model = BTAP::FileIO::load_osm(osm_model_full_path,"-") - log_message << "\nModel rloaded #{osm_model_full_path}.\n" - return model - end - def set_weather_file(model) - measure_values =["weather_file_rel_path"] - #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. - self.set_instance_variables(measure_values) - BTAP::Site::set_weather_file(model,"#{@script_root_folder_path}/#{@weather_file_rel_path}") unless @weather_file_rel_path.nil? - return "Set weather file to #{@weather_file_rel_path}.\n" - end - def set_hourly_output(model) - #create array of output variables strings from E+ - output_variable_array = - [ - "Facility Total Electric Demand Power", - "Water Heater Gas Rate", - "Plant Supply Side Heating Demand Rate", - "Heating Coil Gas Rate", - "Cooling Coil Electric Power", - "Boiler Gas Rate", - "Heating Coil Air Heating Rate", - "Heating Coil Electric Power", - "Cooling Coil Total Cooling Rate", - "Water Heater Heating Rate", - # "Facility Total HVAC Electric Demand Power", - # "Facility Total Electric Demand Power", - "Zone Air Temperature", - "Water Heater Electric Power" - # "Baseboard Air Inlet Temperature", - # "Baseboard Air Outlet Temperature", - # "Baseboard Water Inlet Temperature", - # "Baseboard Water Outlet Temperature", - # "Boiler Inlet Temperature", - # "Boiler Outlet Temperature", - # "Plant Supply Side Inlet Temperature", - # "Plant Supply Side Outlet Temperature", - # "People Radiant Heating Rate", - # "People Sensible Heating Rate", - # "People Latent Gain Rate", - # "People Total Heating Rate", - # "Lights Total Heating Rate", - # "Electric Equipment Total Heating Rate", - # "Other Equipment Total Heating Rate", - # "District Heating Hot Water Rate", - # "District Heating Rate", - # "Air System Outdoor Air Flow Fraction", - # "Air System Outdoor Air Minimum Flow Fraction", - # "Air System Fan Electric Energy" - ] - BTAP::Reports::set_output_variables(model,"Hourly", output_variable_array) - return "added output variables ..." << output_variable_array.to_s << "\n" - end - - #Helper methods - def create_cold_lake_vintages(output_folder = nil) - # check if only a single vintage was requested or a full set. - baseline_models = Hash.new() - prototype_models = Hash.new() - - puts "Creating Baseline models" - CSV.foreach( @csv_file_path, :headers => true, :converters => :all ) do |row| - @csv_data = row - unless @csv_data["measure_id"] == "NA" - model = self.load_base_model_building() - self.set_weather_file(model) - self.set_hourly_output(model) - - model,log = self.apply_ecms(model,@csv_data) - BTAP::FileIO::save_osm( model, "#{output_folder}/#{BTAP::FileIO::get_name(model)}.osm") unless output_folder.nil? - File.open("#{output_folder}/#{BTAP::FileIO::get_name(model)}.log", 'w') { |file| file.write(log) } unless output_folder.nil? - baseline_models[BTAP::FileIO::get_name(model)] = model - end - end - - #create ECM models. - puts "Creating ECM models" - counter = 0 - baseline_models.each do |name,model| - #Scan folder and get the ecm csv files. - ecm_csv_files = Dir.glob( "#{@script_root_folder_path}/**/ecm_*.csv" ) - #iterate through each csv file. - ecm_csv_files.each do |ecm_csv_file| - puts "evaluating #{ecm_csv_file}" - - # iterate through each row - CSV.foreach( ecm_csv_file, :headers => true, :converters => :all ) do |row| - - # If row baseline matches current baseline name then - if name == "#{row["building_type"]}~#{row["vintage_name"]}~baseline" - #Skip row if measure_id is NA - counter = counter + 1 - if row["measure_id"].nil? or row["measure_id"].upcase.strip == "NA" or row["measure_id"].upcase.strip == "" - else - new_model = BTAP::FileIO::deep_copy(model) - new_model,log = self.apply_ecms(new_model,row) - BTAP::FileIO::save_osm( new_model, "#{output_folder}/#{BTAP::FileIO::get_name(new_model)}.osm") unless output_folder.nil? - File.open("#{output_folder}/#{BTAP::FileIO::get_name(new_model)}.log", 'w') { |file| file.write(log) } unless output_folder.nil? - end - end - end - end - end - puts "ECM generation completed." - end - def apply_ecms(model,row_data) - log = "" - @csv_data = row_data - self.methods.select{ |i| i[/^ecm_.*$/] }.each do |ecm_method_name| - log << "**********#{ecm_method_name}\n" - raise ("model is nil") if model.nil? - raise ("name is nil") if ecm_method_name.nil? - log << self.method(ecm_method_name).call(model) - end - return model,log - end - - #ecms - def ecm_capital_costs(model) - log = "" - measure_values = - [ - "measure_id", - "cost_per_floor_m2", - "cost_per_building" - ] - self.set_instance_variables( measure_values ) - - #cost per building and building area - building = model.building.get - raise ("you did not enter a cost for measure #{@measure_id}. All measures must have a cost of at least 0.0 . Please add a cost_per_building field.") if @cost_per_building.nil? - unless @cost_per_building.nil? - BTAP::Resources::Economics::object_cost(building,"#{@measure_id} Capital Cost per building",@cost_per_building.to_f,"CostPerEach") - log << "added cost of #{@measure_id} per building for #{@measure_id}" - puts log - end - return log - end - def ecm_id(model) - log = "" - measure_values = - [ - "building_type", - "vintage_name", - "measure_id" - ] - self.set_instance_variables( measure_values ) - BTAP::FileIO::set_name(model,"#{@building_type}~#{@vintage_name}~#{@measure_id}") - puts BTAP::FileIO::get_name(model) - return "Changed name to #{BTAP::FileIO::get_name(model)}" - - end - def ecm_envelope( model ) - log = "" - #List of variables required by this measure that are to be extracted from CSV row. - measure_values = - [ - "library_file", - "default_construction_set_name", - "ext_wall_rsi", - "ext_floor_rsi", - "ext_roof_rsi", - "ground_wall_rsi", - "ground_floor_rsi", - "ground_roof_rsi", - "fixed_window_rsi", - "fixed_wind_solar_trans", - "fixed_wind_vis_trans", - "operable_window_rsi", - "operable_wind_solar_trans", - "operable_wind_vis_trans", - "door_construction_rsi", - "glass_door_rsi", - "glass_door_solar_trans", - "glass_door_vis_trans", - "overhead_door_rsi", - "skylight_rsi", - "skylight_solar_trans", - "skylight_vis_trans", - "tubular_daylight_dome_rsi", - "tubular_daylight_dome_solar_trans", - "tubular_daylight_dome_vis_trans", - "tubular_daylight_diffuser_rsi", - "tubular_daylight_diffuser_solar_trans", - "tubular_daylight_diffuser_vis_trans", - "ext_wall_cost_m3", - "ext_floor_cost_m3", - "ext_roof_cost_m3", - "ground_wall_cost_m3", - "ground_floor_cost_m3", - "ground_roof_cost_m3", - "fixed_window_cost_m3", - "operable_window_cost_m3", - "door_construction_cost_m3", - "glass_door_cost_m3", - "overhead_door_cost_m3", - "skylight_cost_m3", - "tubular_daylight_dome_cost_m3", - "tubular_daylight_diffuser_cost_m3", - "total_building_construction_set_cost" - ] - - self.set_instance_variables(measure_values) - unless @default_construction_set_name.nil? or @library_file.nil? - - # #Remove all existing constructions from model. - BTAP::Resources::Envelope::remove_all_envelope_information( model ) - - # #Load Contruction osm library. - construction_lib = BTAP::FileIO::load_osm("#{@script_root_folder_path}/#{@library_file}") - - #Get construction set.. I/O expensive so doing it here. - vintage_construction_set = construction_lib.getDefaultConstructionSetByName(@default_construction_set_name) - if vintage_construction_set.empty? - raise("#{@default_construction_set} does not exist in #{@script_root_folder_path}/#{@library_file} library ") - else - vintage_construction_set = construction_lib.getDefaultConstructionSetByName(@default_construction_set_name).get - end - - - new_construction_set =vintage_construction_set.clone(model).to_DefaultConstructionSet.get - #Set conductances to needed values in construction set if possible. - BTAP::Resources::Envelope::ConstructionSets::customize_default_surface_construction_set_rsi!( - model: model, name: "#{@default_construction_set}-modified",default_surface_construction_set: new_construction_set, - ext_wall_rsi: @ext_wall_rsi, ext_floor_rsi: @ext_floor_rsi, ext_roof_rsi: @ext_roof_rsi, - ground_wall_rsi: @ground_wall_rsi, ground_floor_rsi: @ground_floor_rsi, ground_roof_rsi: @ground_roof_rsi, - fixed_window_rsi: @fixed_window_rsi, fixed_wind_solar_trans: @fixed_wind_solar_trans, fixed_wind_vis_trans: @fixed_wind_vis_trans, - operable_window_rsi: @operable_window_rsi, operable_wind_solar_trans: @operable_wind_solar_trans, operable_wind_vis_trans: @operable_wind_vis_trans, - door_construction_rsi: @door_construction_rsi, - glass_door_rsi: @glass_door_rsi, glass_door_solar_trans: @glass_door_solar_trans, glass_door_vis_trans: @glass_door_vis_trans, - overhead_door_rsi: @overhead_door_rsi, - skylight_rsi: @skylight_rsi, skylight_solar_trans: @skylight_solar_trans, skylight_vis_trans: @skylight_vis_trans, - tubular_daylight_dome_rsi: @tubular_daylight_dome_rsi, tubular_daylight_dome_solar_trans: @tubular_daylight_dome_solar_trans, tubular_daylight_dome_vis_trans: @tubular_daylight_dome_vis_trans, - tubular_daylight_diffuser_rsi: @tubular_daylight_diffuser_rsi, tubular_daylight_diffuser_solar_trans: @tubular_daylight_diffuser_solar_trans, tubular_daylight_diffuser_vis_trans: @tubular_daylight_diffuser_vis_trans - ) - - - #Set as default to model. - model.building.get.setDefaultConstructionSet( new_construction_set ) - - #Set cost information. - BTAP::Resources::Envelope::ConstructionSets::customize_default_surface_construction_set_costs(new_construction_set, - @ext_wall_cost_m2, - @ext_floor_cost_m2, - @ext_roof_cost_m2, - @ground_wall_cost_m2, - @ground_floor_cost_m2, - @ground_roof_cost_m2, - @fixed_window_cost_m2, - @operable_window_cost_m2, - @door_construction_cost_m2, - @glass_door_cost_m2, - @overhead_door_cost_m2, - @skylight_cost_m2, - @tubular_daylight_dome_cost_m2, - @tubular_daylight_diffuser_cost_m2, - @total_building_construction_set_cost - ) - - #Give adiabatic surfaces a construction. Does not matter what. This is a bug in OpenStudio that leave these surfaces unassigned by the default construction set. - all_adiabatic_surfaces = BTAP::Geometry::Surfaces::filter_by_boundary_condition(model.getSurfaces, "Adiabatic") - unless all_adiabatic_surfaces.empty? - BTAP::Geometry::Surfaces::set_surfaces_construction( all_adiabatic_surfaces, model.building.get.defaultConstructionSet.get.defaultInteriorSurfaceConstructions.get.wallConstruction.get) - end - #Create sample csv file. - CSV.open("#{@script_root_folder_path}/sample_envelope_ecm.csv", 'w') { |csv| csv << measure_values.unshift("measure_id") } - return BTAP::Resources::Envelope::ConstructionSets::get_construction_set_info( new_construction_set ) - end - return "Constructions were unchanged.\n" - end - def ecm_infiltration( model ) - measure_values = - [ - "infiltration_design_flow_rate", - "infiltration_flow_per_space", - "infiltration_flow_per_exterior_area", - "infiltration_air_changes_per_hour" - ] - - #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. - self.set_instance_variables(measure_values) - - log = BTAP::Resources::SpaceLoads::ScaleLoads::set_inflitration_magnitude( - model, - @infiltration_design_flow_rate, - @infiltration_flow_per_space, - @infiltration_flow_per_exterior_area, - @infiltration_air_changes_per_hour - ) - return log - end - def ecm_fans( model ) - measure_values = - [ - "fan_total_eff", - "fan_motor_eff", - "fan_volume_type" - ] - #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. - self.set_instance_variables(measure_values) - log = "" - unless model.getFanVariableVolumes.empty? - log = "fan_variable_volume_name,fan_total_eff,fan_motor_eff\n" - model.getFanVariableVolumes.sort.each do |fan| - fan.setFanEfficiency( @fan_total_eff ) unless @fan_total_eff.nil? - fan.setMotorEfficiency( @fan_motor_eff ) unless @fan_motor_eff.nil? - log << fan.name.get.to_s << ",#{fan.fanEfficiency},#{fan.motorEfficiency}\n" - end - end - - unless model.getFanConstantVolumes.empty? - log = "fan_constant_volume_name,fan_total_eff,fan_motor_eff\n" - model.getFanConstantVolumes.sort.each do |fan| - fan.setFanEfficiency( @fan_total_eff ) unless @fan_total_eff.nil? - fan.setMotorEfficiency( @fan_motor_eff ) unless @fan_motor_eff.nil? - log << fan.name.get.to_s << ",#{fan.fanEfficiency},#{fan.motorEfficiency}\n" - end - - end - - case @fan_volume_type - - when "VariableVolume" - model.getFanConstantVolumes.sort.each do |fan_const| - #check that this is indeed connected to an airloop. - log << "Found Const Vol Fan #{fan_const.name.get.to_s}" - unless fan_const.loop.empty? - fan_variable = OpenStudio::Model::FanVariableVolume.new(model,fan_const.availabilitySchedule) - #pass information from old fan as much as possible. - fan_variable.setFanEfficiency(fan_const.fanEfficiency) - fan_variable.setPressureRise( fan_const.pressureRise() ) - fan_variable.autosizeMaximumFlowRate - fan_variable.setFanPowerMinimumFlowRateInputMethod("FixedFlowRate") - fan_variable.setFanPowerMinimumFlowFraction(0.25) - fan_variable.setMotorInAirstreamFraction( fan_const.motorInAirstreamFraction() ) - fan_variable.setFanPowerCoefficient1(0.35071223) - fan_variable.setFanPowerCoefficient2(0.30850535) - fan_variable.setFanPowerCoefficient3(-0.54137364) - fan_variable.setFanPowerCoefficient4(0.87198823) - - #get the airloop. - air_loop = fan_const.loop.get - #add the FanVariableVolume - fan_variable.addToNode(air_loop.supplyOutletNode()) - #Remove FanConstantVolume - fan_const.remove() - log << "Replaced by Variable Vol Fan #{fan_variable.name.get.to_s}" - end - end - when "ConstantVolume" - model.getFanVariableVolumes.sort.each do |fan| - #check that this is indeed connected to an airloop. - log << "Found Const Vol Fan #{fan.name.get.to_s}" - unless fan.loop.empty? - new_fan = OpenStudio::Model::FanConstantVolume.new(model,fan.availabilitySchedule) - #pass information from constant speed fan as much as possible. - new_fan.setFanEfficiency(fan.fanEfficiency) - new_fan.setPressureRise( fan.pressureRise() ) - new_fan.setMotorEfficiency(fan.motorEfficiency) - new_fan.setMotorInAirstreamFraction( fan.motorInAirstreamFraction() ) - new_fan.autosizeMaximumFlowRate - #get the airloop. - air_loop = fan.loop.get - #add the FanVariableVolume - new_fan.addToNode(air_loop.supplyOutletNode()) - #Remove FanConstantVolume - fan.remove() - log << "Replaced by Constant Vol Fan #{new_fan.name.get.to_s}" - end - end - when nil - log << "No changes to Fan." - else - raise("fan_volume_type should be ConstantVolume or VariableVolume") - end - return log - end - def ecm_pumps( model ) - measure_values = - [ - "pump_motor_eff", - "pump_control_type", - "pump_speed_type" - ] - #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. - self.set_instance_variables(measure_values) - log = "" - unless model.getPumpVariableSpeeds.empty? - log = "pump_variable_speed_name,@pump_motor_eff\n" - model.getPumpVariableSpeeds.sort.each do |pump| - pump.setMotorEfficiency( @pump_motor_eff.to_f ) unless @pump_motor_eff.nil? - pump.setPumpControlType( @pump_control_type ) unless @pump_control_type.nil? - log << pump.name.get.to_s << ",#{pump.motorEfficiency}\n" - end - end - unless model.getPumpConstantSpeeds.empty? - log << "pump_variable_speed_name,@pump_motor_eff\n" - model.getPumpConstantSpeeds.sort.each do |pump| - pump.setMotorEfficiency( @pump_motor_eff.to_f ) unless @pump_motor_eff.nil? - pump.setPumpControlType( @pump_control_type ) unless @pump_control_type.nil? - log << pump.name.get.to_s << ",#{pump.motorEfficiency}\n" - end - end - - #set pump speed type based on existing pump. - case @pump_speed_type - when "VariableSpeed" - model.getPumpConstantSpeeds.sort.each do |pump_const| - log << "Found Const Vol Fan #{pump_const.name.get.to_s}" - #check that this is indeed connected to an plant loop. - unless pump_const.plantLoop.empty? - pump_variable = OpenStudio::Model::PumpVariableSpeed.new(model) - #pass information from constant speed fan as much as possible. - pump_variable.setRatedFlowRate(pump_const.ratedFlowRate) - pump_variable.setRatedPumpHead(pump_const.ratedPumpHead) - pump_variable.setRatedPowerConsumption(pump_const.ratedPowerConsumption.to_f) - pump_variable.setMotorEfficiency(pump_const.motorEfficiency.to_f) - pump_variable.setPumpControlType(pump_const.pumpControlType) - pump_variable.setFractionofMotorInefficienciestoFluidStream(pump_const.fractionofMotorInefficienciestoFluidStream.to_f) - pump_variable.autosizeRatedFlowRate if pump_const.isRatedFlowRateAutosized - pump_variable.autosizeRatedPowerConsumption if pump_const.isRatedPowerConsumptionAutosized - - #get the hot water loop. - hw_loop = pump_const.plantLoop.get - #Remove PumpConstantSpeed - pump_const.remove() - #add - pump_variable.addToNode(hw_loop.supplyInletNode) - log << "Replaced by Variable Vol Pump #{pump_variable.name.get.to_s}" - end - end #end loop PumpConstantSpeeds - when "ConstantSpeed" - model.getPumpVariableSpeeds.sort.each do |pump| - log << "Found Variable Speed Pump #{pump.name.get.to_s}" - #check that this is indeed connected to an plant loop. - unless pump.plantLoop.empty? - new_pump = OpenStudio::Model::PumpVariableSpeed.new(model) - #pass information from constant speed fan as much as possible. - - new_pump.setRatedFlowRate(pump.ratedFlowRate.get) - new_pump.setRatedPumpHead(pump.ratedPumpHead()) - new_pump.setRatedPowerConsumption(pump.ratedPowerConsumption.to_f) - new_pump.setMotorEfficiency(pump.motorEfficiency().to_f) - new_pump.setFractionofMotorInefficienciestoFluidStream(pump.fractionofMotorInefficienciestoFluidStream().to_f) - new_pump.setPumpControlType( pump.pumpControlType ) - new_pump.autosizeRatedFlowRate if pump.isRatedFlowRateAutosized - new_pump.autosizeRatedPowerConsumption if pump.isRatedPowerConsumptionAutosized - #get the hot water loop. - hw_loop = pump.plantLoop.get - #Remove PumpVariableSpeed - pump.remove() - #add the pump to loop. - new_pump.addToNode(hw_loop.supplyInletNode) - - log << "Replaced by constant speed Pump #{new_pump.name.get.to_s}" - end - end #end loop Pump variable Speeds - when nil - log << "No changes" - else - raise( "pump_speed_type field is not ConstantSpeed or VariableSpeed" ) - end - - #Create sample csv file. - CSV.open("#{@script_root_folder_path}/sample_pump_eff_ecm.csv", 'w') { |csv| csv << measure_values.unshift("measure_id") } - return log - end - def ecm_cooling_cop( model ) - log = "" - measure_values =[ - "cop" - ] - - #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. - self.set_instance_variables(measure_values) - - unless model.getCoilCoolingDXSingleSpeeds.empty? - log = "coil_cooling_dx_single_speed_name,cop\n" - model.getCoilCoolingDXSingleSpeeds.sort.each do |cooling_coil| - cooling_coil.setRatedCOP( OpenStudio::OptionalDouble.new( @cop ) ) unless @cop.nil? - cop = "NA" - # Prior to 3.5.0, it was an optional double, now it's a double - cop_ = OpenStudio::OptionalDouble.new(cooling_coil.ratedCOP) - cop = cop_.get unless cop_.empty? - log << cooling_coil.name.get.to_s << ",#{cop}\n" - - end - end - - unless model.getCoilCoolingDXTwoSpeeds.empty? - log << "coil_cooling_dx_two_speed_name,cop\n" - model.getCoilCoolingDXTwoSpeeds.sort.each do |cooling_coil| - cooling_coil.setRatedHighSpeedCOP( @cop ) unless @cop.nil? - cooling_coil.setRatedLowSpeedCOP( @cop ) unless @cop.nil? - cop_high = "NA" - cop_ = OpenStudio::OptionalDouble.new(cooling_coil.ratedHighSpeedCOP) - cop_high = cop_.get unless cop_.empty? - cop_low = "NA" - cop_ = OpenStudio::OptionalDouble.new(cooling_coil.ratedLowSpeedCOP) - cop_low = cop_.get unless cop_.empty? - log << cooling_coil.name.get.to_s << ",#{cop_high},#{cop_low}\n" - end - end - return log - end - def ecm_economizers( model ) - - measure_values =[ - "economizer_control_type", - "economizer_control_action_type", - "economizer_maximum_limit_dry_bulb_temperature", - "economizer_maximum_limit_enthalpy", - "economizer_maximum_limit_dewpoint_temperature", - "economizer_minimum_limit_dry_bulb_temperature" ] - - #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. - self.set_instance_variables(measure_values) - log = "" - unless @economizer_control_type.nil? - log << BTAP::Resources::HVAC::enable_economizer( - model, - @economizer_control_type, - @economizer_control_action_type, - @economizer_maximum_limit_dry_bulb_temperature, - @economizer_maximum_limit_enthalpy, - @economizer_maximum_limit_dewpoint_temperature, - @economizer_minimum_limit_dry_bulb_temperature - ) - - end - return log - end - def ecm_sizing( model) - measure_values =[ - "heating_sizing_factor", - "cooling_sizing_factor", - "zone_heating_sizing_factor", - "zone_cooling_sizing_factor" - ] - - table = "*Sizing Factor Measure*" - #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. - self.set_instance_variables(measure_values) - table = "handle,heating_sizing_factor,cooling_sizing_factor\n" - #Sizing Parameters - - model.getSizingParameters.setHeatingSizingFactor(@heating_sizing_factor) unless @heating_sizing_factor.nil? - model.getSizingParameters.setCoolingSizingFactor(@cooling_sizing_factor) unless @cooling_sizing_factor.nil? - - - #SizingZone - table << "handle,zone_heating_sizing_factor,zone_cooling_sizing_factor\n" - model.getSizingZones.sort.each do |item| - item.setZoneHeatingSizingFactor(@zone_heating_sizing_factor) unless @zone_heating_sizing_factor.nil? - item.setZoneCoolingSizingFactor(@zone_cooling_sizing_factor) unless @zone_cooling_sizing_factor.nil? - table << "#{item.handle},#{item.zoneHeatingSizingFactor.get},#{item.zoneCoolingSizingFactor.get}\n" - end - #Create sample csv file. - CSV.open("#{@script_root_folder_path}/sample_sizing_param_ecm.csv", 'w') { |csv| csv << measure_values.unshift("measure_id") } - return table - end - def ecm_dhw( model ) - log = "shw_setpoint_sched,shw_heater_fuel_type,shw_thermal_eff\n" - measure_values =[ - "shw_setpoint_sched_name", - "shw_heater_fuel_type", - "shw_thermal_eff" - ] - log = "*SHW Measures*\n" - #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. - self.set_instance_variables(measure_values) - - #Create Schedule - #schedule = BTAP::Resources::Schedules::create_annual_ruleset_schedule_detailed_json(model, @shw_setpoint_sched) unless @shw_setpoint_sched_name.nil? or @shw_setpoint_sched.nil? - - #iterate through water heaters. - model.getWaterHeaterMixeds.sort.each do |item| - unless @shw_setpoint_sched_name.nil? or @shw_setpoint_sched.nil? - item.setSetpointTemperatureSchedule(schedule) - end - item.setHeaterFuelType(@shw_heater_fuel_type) unless @shw_heater_fuel_type.nil? - item.setHeaterThermalEfficiency(@shw_thermal_eff) unless @shw_thermal_eff.nil? - log << item.name.get.to_s << ",#{item.setpointTemperatureSchedule},#{item.heaterFuelType},#{item.heaterThermalEfficiency}\n" - end - return log - end - def ecm_hotwater_boilers( model ) - measure_values = [ - "hw_boiler_design_water_outlet_temperature", - "hw_boiler_fuel_type", - "hw_boiler_thermal_eff", - "hw_boiler_curve", - "hw_boiler_flow_mode",# - "hw_boiler_eff_curve_temp_eval_var",# - "hw_boiler_reset_highsupplytemp" , - "hw_boiler_reset_outsidehighsupplytemp" , - "hw_boiler_reset_lowsupplytemp" , - "hw_boiler_reset_outsidelowsupplytemp" , - ] - - #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. - self.set_instance_variables(measure_values) - table = "name,boiler_design_water_outlet_temperature,boiler_fuel_type,boiler_thermal_eff\n" - - model.getPlantLoops.sort.each do |iplantloop| - iplantloop.components.each do |icomponent| - if icomponent.to_BoilerHotWater.is_initialized - boiler = icomponent.to_BoilerHotWater.get - - #set design outlet temp - if model.version < OpenStudio::VersionString.new('3.0.0') - boiler.setDesignWaterOutletTemperature(@hw_boiler_design_water_outlet_temperature) unless @hw_boiler_design_water_outlet_temperature.nil? - end - #set fuel type - boiler.setFuelType(@hw_boiler_fuel_type) unless @hw_boiler_fuel_type.nil? - #set thermal eff - boiler.setNominalThermalEfficiency(@hw_boiler_thermal_eff) unless @hw_boiler_thermal_eff.nil? - #set boiler flow mode - unless @hw_boiler_flow_mode.nil? - ["ConstantFlow","LeavingSetpointModulated","NotModulated"].include?(@hw_boiler_flow_mode) ? boiler.setBoilerFlowMode(@hw_boiler_flow_mode) : raise("Boiler flow mode #{@hw_boiler_flow_mode} invalid.") - end - #set setDesignWaterOutletTemperature - if model.version < OpenStudio::VersionString.new('3.0.0') - boiler.setDesignWaterOutletTemperature(@hotwaterboiler_reset_highsupplytemp) unless @hotwaterboiler_reset_highsupplytemp.nil? - end - #set EfficiencyCurveTemperatureEvaluationVariable - unless @hw_boiler_eff_curve_temp_eval_var.nil? - ["LeavingBoiler","EnteringBoiler"].include?(@hw_boiler_eff_curve_temp_eval_var) ? boiler.setEfficiencyCurveTemperatureEvaluationVariable(@hw_boiler_eff_curve_temp_eval_var) : raise("EfficiencyCurveTemperatureEvaluationVariable #{@hw_boiler_eff_curve_temp_eval_var} invalid.") - end - - - #Set boiler curve - curve = boiler.normalizedBoilerEfficiencyCurve - if not @hw_boiler_curve.nil? and curve.is_initialized and curve.get.to_CurveBiquadratic.is_initialized - case @hw_boiler_curve.downcase - when "atmospheric" - biqcurve = curve.get.to_CurveBiquadratic.get - biqcurve.setCoefficient1Constant(1.057059) - biqcurve.setCoefficient1Constant(1.057059) - biqcurve.setCoefficient2x(-0.0774177) - biqcurve.setCoefficient3xPOW2(0.07875142) - biqcurve.setCoefficient4y(0.0003943856) - biqcurve.setCoefficient5yPOW2(-0.000004074629) - biqcurve.setCoefficient6xTIMESY(-0.002202606) - biqcurve.setMinimumValueofx(0.3) - biqcurve.setMaximumValueofx(1.0) - biqcurve.setMinimumValueofy(40.0) - biqcurve.setMaximumValueofy(90.0) - biqcurve.setMinimumCurveOutput(0.0) - biqcurve.setMaximumCurveOutput(1.1) - biqcurve.setInputUnitTypeforX("Dimensionless") - biqcurve.setInputUnitTypeforY("Temperature") - biqcurve.setOutputUnitType("Dimensionless") - when "condensing" - biqcurve = curve.get.to_CurveBiquadratic.get - biqcurve.setCoefficient1Constant(0.4873) - biqcurve.setCoefficient2x(1.1322) - biqcurve.setCoefficient3xPOW2(-0.6425) - biqcurve.setCoefficient4y(0.0) - biqcurve.setCoefficient5yPOW2(0.0) - biqcurve.setCoefficient6xTIMESY(0.0) - biqcurve.setMinimumValueofx(0.1) - biqcurve.setMaximumValueofx(1.0) - biqcurve.setMinimumValueofy(0.0) - biqcurve.setMaximumValueofy(0.0) - biqcurve.setMinimumCurveOutput(0.0) - biqcurve.setMaximumCurveOutput(1.0) - biqcurve.setInputUnitTypeforX("Dimensionless") - biqcurve.setInputUnitTypeforY("Temperature") - biqcurve.setOutputUnitType("Dimensionless") - else - raise("#{@hotwaterboiler_curve} is not a valid boiler curve name (condensing_boiler_curve,atmospheric_boiler_curve") - end - end - - #boiler reset setpoint manager - unless @hotwaterboiler_reset_lowsupplytemp.nil? and @hotwaterboiler_reset_outsidelowsupplytemp.nil? and @hotwaterboiler_reset_highsupplytemp.nil? and @hotwaterboiler_reset_outsidehighsupplytemp.nil? - #check if setpoint manager is present at supply outlet - #Find any setpoint manager if it exists and outlet node and remove it. - iplantloop.supplyOutletNode.setpointManagers.each {|sm| sm.disconnect} - - #Add new setpoint manager - oar_stpt_manager = OpenStudio::Model::SetpointManagerOutdoorAirReset.new(model) - oar_stpt_manager.addToNode(iplantloop.supplyOutletNode) - oar_stpt_manager.setSetpointatOutdoorHighTemperature(@hw_boiler_reset_lowsupplytemp) unless @hw_boiler_reset_lowsupplytemp.nil? - oar_stpt_manager.setOutdoorHighTemperature(@hotwaterboiler_reset_outsidelowsupplytemp) unless @hw_boiler_reset_outsidelowsupplytemp.nil? - oar_stpt_manager.setSetpointatOutdoorLowTemperature(@hw_boiler_reset_highsupplytemp) unless @hw_boiler_reset_highsupplytemp.nil? - oar_stpt_manager.setOutdoorLowTemperature(@hw_boiler_reset_outsidehighsupplytemp) unless @hw_boiler_reset_outsidehighsupplytemp.nil? - end - table << boiler.name.get.to_s << "," - boiler.designWaterOutletTemperature.empty? ? dowt = "NA" : dowt = boiler.designWaterOutletTemperature.get - table << "#{dowt},#{boiler.fuelType},#{boiler.nominalThermalEfficiency}\n" - end - end - end #end boilers loop - return table - end - def ecm_dcv( model ) - log = "" - measure_values =[ - "dcv_enabled" - ] - #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. - self.set_instance_variables(measure_values) - unless @dcv_enabled.nil? - log = BTAP::Resources::HVAC::enable_demand_control_ventilation(model,@dcv_enabled.to_bool) - end - return log - end - def ecm_heating_cooling_setpoints(model) - - log = "" - measure_values =[ - "library_file", - "heating_schedule_name", - "cooling_schedule_name" - ] - #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. - self.set_instance_variables(measure_values) - - library_file = @library_file - heating_schedule_name = @heating_schedule_name - cooling_schedule_name = @cooling_schedule_name - - unless @heating_schedule_name.nil? and @cooling_schedule_name.nil? - #Load Contruction osm library. - lib = BTAP::FileIO::load_osm("#{@script_root_folder_path}/#{library_file}") - - unless heating_schedule_name.nil? - #Get heating schedule from library and clone it. - heating_schedule = lib.getScheduleRulesetByName(heating_schedule_name) - if heating_schedule.empty? - raise("#{heating_schedule_name} does not exist in #{library_file} library ") - else - heating_schedule = lib.getScheduleRulesetByName(heating_schedule_name).get.clone(model).to_ScheduleRuleset.get - end - end - - unless cooling_schedule_name.nil? - #Get cooling schedule from library and clone it. - cooling_schedule = lib.getScheduleRulesetByName(cooling_schedule_name) - if cooling_schedule.empty? - raise("#{cooling_schedule_name} does not exist in #{library_file} library ") - else - cooling_schedule = lib.getScheduleRulesetByName(cooling_schedule_name).get.clone(model).to_ScheduleRuleset.get - end - end - model.getThermostatSetpointDualSetpoints.sort.each do |dual_setpoint| - unless heating_schedule_name.nil? - raise ("Could not set heating Schedule") unless dual_setpoint.setHeatingSetpointTemperatureSchedule(heating_schedule) - end - unless cooling_schedule_name.nil? - raise ("Could not set cooling Schedule") unless dual_setpoint.setCoolingSetpointTemperatureSchedule(cooling_schedule) - end - end - end - return log - end - def ecm_erv( model ) - log = "" - measure_values =[ - "erv_enabled", - "erv_autosizeNominalSupplyAirFlowRate", - "erv_NominalSupplyAirFlowRate", - "erv_HeatExchangerType", - "erv_SensibleEffectivenessat100CoolingAirFlow", - "erv_SensibleEffectivenessat75CoolingAirFlow", - "erv_LatentEffectiveness100Cooling", - "erv_LatentEffectiveness75Cooling", - "erv_SensibleEffectiveness100Heating", - "erv_SensibleEffectiveness75Heating", - "erv_LatentEffectiveness100Heating", - "erv_LatentEffectiveness75Heating", - "erv_SupplyAirOutletTemperatureControl", - "erv_setFrostControlType", - "erv_ThresholdTemperature", - "erv_InitialDefrostTimeFraction", - "erv_nominal_electric_power", - "erv_economizer_lockout" - ] - - #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. - self.set_instance_variables(measure_values) - - - unless @erv_enabled.nil? or @erv_enabled.to_bool == false - BTAP::Resources::HVAC::enable_erv( - model, - @erv_autosizeNominalSupplyAirFlowRate, - @erv_NominalSupplyAirFlowRate, - @erv_HeatExchangerType, - @erv_SensibleEffectivenessat100CoolingAirFlow, - @erv_SensibleEffectivenessat75CoolingAirFlow, - @erv_LatentEffectiveness100Cooling, - @erv_LatentEffectiveness75Cooling, - @erv_SensibleEffectiveness100Heating, - @erv_SensibleEffectiveness75Heating, - @erv_LatentEffectiveness100Heating, - @erv_LatentEffectiveness75Heating, - @erv_SupplyAirOutletTemperatureControl.to_bool, - @erv_setFrostControlType, - @erv_ThresholdTemperature, - @erv_InitialDefrostTimeFraction, - @erv_nominal_electric_power, - @erv_economizer_lockout.to_bool - ).each { |erv| log << erv.to_s } - - - #Add setpoint manager to all OA object in airloops. - model.getHeatExchangerAirToAirSensibleAndLatents.sort.each do |erv| - - #needed to get the supply outlet node from the erv to place the setpoint manager. - node = erv.primaryAirOutletModelObject.get.to_Node.get if erv.primaryAirOutletModelObject.is_initialized - new_set_point_manager = OpenStudio::Model::SetpointManagerWarmest.new(model) - raise ("Could not add setpoint manager") unless new_set_point_manager.addToNode(node) - log << "added warmest control to node #{node}" - new_set_point_manager.setMaximumSetpointTemperature(16.0) - new_set_point_manager.setMinimumSetpointTemperature(5.0) - new_set_point_manager.setStrategy("MaximumTemperature") - new_set_point_manager.setControlVariable("Temperature") - end - log << "ERV have been modified.\n" - else - log << "ERV not changed." - end - return log - end - def ecm_exhaust_fans( model ) - log = "" - #Exhaust ECM - measure_values =[ - "exhaust_fans_occ_control_enabled" - ] - #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. - self.set_instance_variables(measure_values) - unless @exhaust_fans_occ_control_enabled.nil? or @exhaust_fans_occ_control_enabled.to_bool == false - fans = BTAP::Resources::Schedules::set_exhaust_fans_availability_to_building_default_occ_schedule(model) - fans.each { |fan| log << fan.to_s} - else - log << "No changes to exhaust fans." - end - return log - end - def ecm_lighting( model ) - log = "" - #Lighting ECM - measure_values =[ - "lighting_scaling_factor", - "lighting_fraction_radiant", - "lighting_fraction_visible", - "lighting_return_air_fraction" - ] - #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. - self.set_instance_variables(measure_values) - BTAP::Resources::SpaceLoads::ScaleLoads::scale_lighting_loads( - model, - @lighting_scaling_factor ) unless @lighting_scaling_factor.nil? - #Set lighting variables - model.getLightsDefinitions.sort.each do |lightsdef| - lightsdef.setFractionRadiant(@lighting_fraction_radiant.to_f) - lightsdef.setFractionVisible(@lighting_fraction_visible.to_f) - lightsdef.setReturnAirFraction(@lighting_return_air_fraction.to_f) - end - return log - end - def ecm_plugs( model ) - log = "" - #Plug loads ECM - measure_values = [ - "elec_equipment_scaling_factor", - "elec_equipment_fraction_radiant", - "elec_equipment_fraction_latent", - "elec_equipment_fraction_lost" - ] - #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. - self.set_instance_variables(measure_values) - - BTAP::Resources::SpaceLoads::ScaleLoads::scale_electrical_loads( - model, - @elec_equipment_scaling_factor) unless @elec_equipment_scaling_factor.nil? - - #Set plug loads variables - model.getElectricEquipmentDefinitions.sort.each do |elec_equip_def| - elec_equip_def.setFractionRadiant(@elec_equipment_fraction_radiant.to_f) - elec_equip_def.setFractionLatent(@elec_equipment_fraction_latent.to_f) - elec_equip_def.setFractionLost(@elec_equipment_fraction_lost.to_f) - end - - CSV.open("#{@script_root_folder_path}/sample_scale_plug_loads_ecm.csv", 'w') { |csv| csv << measure_values.unshift("measure_id") } - return log - end - def ecm_cold_deck_reset_control( model ) - log = "" - measure_values = [ - "cold_deck_reset_enabled", - "cold_deck_reset_max_supply_air_temp", - "cold_deck_reset_min_supply_air_temp", - ] - #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. - self.set_instance_variables(measure_values) - - if @cold_deck_reset_enabled.to_bool == true - - model.getAirLoopHVACs.sort.each do |iairloop| - cooling_present = false - set_point_manager = nil - iairloop.components.each do |icomponent| - if icomponent.to_CoilCoolingDXSingleSpeed.is_initialized or - icomponent.to_CoilCoolingDXTwoSpeed.is_initialized or - icomponent.to_CoilCoolingWater.is_initialized or - icomponent.to_CoilCoolingCooledBeam.is_initialized or - icomponent.to_CoilCoolingDXMultiSpeed.is_initialized or - icomponent.to_CoilCoolingDXVariableRefrigerantFlow.is_initialized or - icomponent.to_CoilCoolingLowTempRadiantConstFlow.is_initialized or - icomponent.to_CoilCoolingLowTempRadiantVarFlow.is_initialized - cooling_present = true - log << "found cooling." - end - end - #check if setpoint manager is present at supply outlet. - model.getSetpointManagerSingleZoneReheats.sort.each do |manager| - if iairloop.supplyOutletNode == manager.setpointNode.get - set_point_manager = manager - end - end - - if set_point_manager.nil? and cooling_present == true - set_point_manager = OpenStudio::Model::SetpointManagerSingleZoneReheat.new(model) - set_point_manager.addToNode(iairloop.supplyOutletNode) - end - - - - if cooling_present == true and not set_point_manager.nil? - set_point_manager.setMaximumSupplyAirTemperature(@cold_deck_reset_max_supply_air_temp) - set_point_manager.setMinimumSupplyAirTemperature(@cold_deck_reset_min_supply_air_temp) - log << "to_SetpointManagerSingleZoneReheat set to 20.0 and 13.0" - end - end - end - return log - end - def ecm_sat_reset( model ) - log = "" - measure_values = [ - "sat_reset_enabled", - "sat_reset_outdoor_high_temperature", - "sat_reset_outdoor_low_temperature", - "sat_reset_setpoint_at_outdoor_high_temperature", - "sat_reset_setpoint_at_outdoor_low_temperature" - ] - - - #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. - self.set_instance_variables(measure_values) - if @sat_reset_enabled.to_bool == true - model.getAirLoopHVACs.sort.each do |iairloop| - - #check if setpoint manager is present at supply outlet - model.getSetpointManagerSingleZoneReheats.sort.each do |manager| - if iairloop.supplyOutletNode == manager.setpointNode.get - manager.disconnect - end - end - - new_set_point_manager = OpenStudio::Model::SetpointManagerOutdoorAirReset.new(model) - new_set_point_manager.addToNode(iairloop.supplyOutletNode) - new_set_point_manager.setOutdoorHighTemperature(@sat_reset_outdoor_high_temperature) - new_set_point_manager.setOutdoorLowTemperature(@sat_reset_outdoor_low_temperature) - new_set_point_manager.setSetpointatOutdoorHighTemperature(@sat_reset_setpoint_at_outdoor_high_temperature) - new_set_point_manager.setSetpointatOutdoorLowTemperature(@sat_reset_setpoint_at_outdoor_low_temperature) - new_set_point_manager.setControlVariable("Temperature") - log << "Replaced SingleZoneReheat with OA reset control." - end - end - return log - end - def ecm_temp_setback( model ) - log = "" - measure_values = [ - "occ_stbck_enabled", - "occ_stbck_tolerance", - "occ_stbck_heat_setback", - "occ_stbck_heat_setpoint", - "occ_stbck_cool_setback", - "occ_stbck_cool_setpoint" - ] - #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. - self.set_instance_variables(measure_values) - # get occupancy schedule if possible. - unless @occ_stbck_enabled.nil? or @occ_stbck_enabled == false - if model.building.get.defaultScheduleSet.is_initialized and - model.building.get.defaultScheduleSet.get.numberofPeopleSchedule.is_initialized and - model.building.get.defaultScheduleSet.get.numberofPeopleSchedule.get.to_ScheduleRuleset.is_initialized - occupancy_schedule = model.building.get.defaultScheduleSet.get.numberofPeopleSchedule.get - heating_schedule,cooling_schedule = BTAP::Resources::Schedules::create_setback_schedule_based_on_another_schedule( - model, - occupancy_schedule, - @occ_stbck_tolerance.to_f, - @occ_stbck_heat_setpoint.to_f, - @occ_stbck_heat_setback.to_f, - @occ_stbck_cool_setpoint.to_f, - @occ_stbck_cool_setback.to_f) - model.getThermostatSetpointDualSetpoints.sort.each do |dual_setpoint| - raise ("Could not set setback heating Schedule") unless dual_setpoint.setHeatingSetpointTemperatureSchedule(heating_schedule) - raise ("Could not set setback cooling Schedule") unless dual_setpoint.setCoolingSetpointTemperatureSchedule(cooling_schedule) - log << "modified....#{dual_setpoint}" - end - end - else - log << "no change to setbacks." - end - return log - end - end - end -end - - +# # ********************************************************************* +# # * Copyright (c) 2008-2015, Natural Resources Canada +# # * All rights reserved. +# # * +# # * This library is free software; you can redistribute it and/or +# # * modify it under the terms of the GNU Lesser General Public +# # * License as published by the Free Software Foundation; either +# # * version 2.1 of the License, or (at your option) any later version. +# # * +# # * This library is distributed in the hope that it will be useful, +# # * but WITHOUT ANY WARRANTY; without even the implied warranty of +# # * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# # * Lesser General Public License for more details. +# # * +# # * You should have received a copy of the GNU Lesser General Public +# # * License along with this library; if not, write to the Free Software +# # * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# # **********************************************************************/ +# +# +# # To change this template, choose Tools | Templates +# # and open the template in the editor. +# require "#{File.dirname(__FILE__)}/btap" +# +# class OSMArg +# ARGUMENT_TYPES = [ +# "BOOL", +# "STRING", +# "INTEGER", +# "FLOAT", +# "STRINGCHOICE", +# "WSCHOICE" +# ] +# +# +# +# attr_accessor :runner, +# :variable_name, +# :type, +# :required, +# :model_dependant, +# :display_name, +# :default_value, +# :min_value, +# :max_value, +# :string_choice_array, +# :os_object_type +# +# def self.bool( variable_name,display_name,required,default_value ) +# raise "#{default_value} defaut value is not a bool." unless default_value.is_a?(Bool) +# default_value.respond_to?(:to_s) +# arg = OSMArg.new( "BOOL", variable_name, display_name, required) +# arg.default_value = default_value +# return arg +# end +# +# def self.string( variable_name,display_name,required,default_value ) +# raise "#{default_value} defaut value is not a string." unless default_value.respond_to?(:to_s) +# arg = OSMArg.new( "STRING", variable_name, display_name, required) +# arg.default_value = default_value +# return arg +# end +# +# def self.integer( variable_name,display_name,required,default_value,min_value,max_value ) +# raise "#{default_value} defaut value is not a integer." unless default_value.respond_to?(:to_i) +# arg = OSMArg.new( "INTEGER", variable_name, display_name, required) +# arg.default_value = default_value +# arg.min_value = min_value +# arg.max_value = max_value +# return arg +# end +# +# def self.float( variable_name, display_name, required,default_value,min_value, max_value ) +# raise "#{default_value} defaut value is not a float." unless default_value.respond_to?(:to_f) +# arg = OSMArg.new( "INTEGER", variable_name, display_name, required) +# arg.default_value = default_value +# arg.min_value = min_value +# arg.max_value = max_value +# return arg +# end +# +# def self.choice(variable_name,display_name,required,default_value,string_choice_array) +# raise "#{default_value} defaut value is not an array." unless default_value.is_a?(Array) +# arg = OSMArg.new( "STRINGCHOICE", variable_name, display_name, required) +# arg.default_value = default_value +# arg.string_choice_array = string_choice_array +# return arg +# end +# +# def self.wschoice( variable_name, display_name, required, default_value, os_object_type) +# arg = OSMArg.new( "WSCHOICE", variable_name, display_name, required ) +# arg.default_value = default_value +# arg.os_object_type = os_object_type +# return arg +# end +# +# def initialize( type, variable_name, display_name, required ) +# self.type = type +# self.variable_name = variable_name +# self.display_name = display_name +# self.required = required +# self.model_dependant = false +# if self.type == "WSCHOICE" +# self.model_dependant = true +# else +# self.model_dependant = false +# end +# return self +# end +# end +# +# +# +# +# +# module BTAP +# module Measures +# module OSMeasures +# +# +# +# +# class BTAPModelUserScript < OpenStudio::Ruleset::ModelUserScript +# #if and E+ measure replace OpenStudio::Ruleset::ModelUserScript with OpenStudio::Ruleset::WorkspaceUserScript +# #Array containing information of all inputs required by measure. +# attr_accessor :argument_array_of_arrays +# attr_accessor :argument_array +# attr_accessor :file +# #Name of measure +# #attr_accessor :name +# +# #if and E+ measure replace OpenStudio::Ruleset::ModelUserScript with OpenStudio::Ruleset::WorkspaceUserScript +# def name +# "BTAPModelUserScript" +# OSMArgument.new +# end +# +# #this method will output the ruby macro to perform the change. +# def generate_ruby_macro(model,runner) +# if @file == nil or @file == "" +# @file = "Enter_Path_To_#{self.class.name}_measure.rb_File!" +# end +# BTAP::runner_register("MACRO", "\##{self.class.name} Measure Start", runner) +# BTAP::runner_register("MACRO", "require \"#{@file}\"", runner) +# BTAP::runner_register("MACRO", "argument_values = #{@arg_table}", runner) +# BTAP::runner_register("MACRO", "#{self.class.name}.new.set_user_arguments_and_apply(model,argument_values,runner)",runner) +# BTAP::runner_register("MACRO", "\##{self.class.name} Measure End", runner) +# end +# +# def set_user_arguments_and_apply(model,argument_values,runner) +# message = "Settting Arguments" +# runner.nil? ? puts(message) : runner.registerInfo(message) +# #create argument map +# user_arguments = OpenStudio::Ruleset::OSArgumentMap.new +# #get argument list +# arguments = self.arguments(model) +# #go through each argument +# arguments.each do |argument| +# found = false +# #go through each passed argument_values +# argument_values.each do |pair| +# #when a match is found. +# if argument.name == pair[0] +# +# clone_argument = argument.clone +# unless clone_argument.setValue(pair[1]) +# message = "Could not set #{argument.name} to #{pair[1]}" +# runner.nil? ? puts(message) : runner.registerError(message) +# else +# message = "Set #{argument.name} to #{pair[1]}" +# runner.nil? ? puts(message) : runner.registerInfo(message) +# end +# user_arguments[pair[0]] = clone_argument +# #log message +# message = " Argument set to #{user_arguments}" +# runner.nil? ? puts(message) : runner.registerInfo(message) +# end +# found = true +# end +# puts ("Warning: value for argument #{argument.name} not set!.") if found == false +# end +# self.run(model, runner, user_arguments) +# end +# +# def run(model, runner, user_arguments) +# #IF and E+ measure replace model with workspace as the argument +# #Boilerplate start +# super(model, runner, user_arguments) +# BTAP::runner_register("INFO", "Initial model being modified by #{self.class.name}",runner) +# if not runner.validateUserArguments(self.arguments(model),user_arguments) +# return false +# end +# +# #Set argument to instance variables. +# self.argument_getter(model, runner,user_arguments) +# #will run the childs method measure_code +# result = self.measure_code(model,runner) +# generate_ruby_macro(model,runner) +# return result +# end # end method run +# +# def argument_setter(model,args) +# #***boilerplate code starts. Do not edit... +# +# +# #iterate through array of hashes and make arguments based on type and set +# # max and min values where applicable. +# @argument_array.each do |row| +# #strip out first char that contains the @ symbol +# row.variable_name[0] = '' +# arg = nil +# case row.type +# when "BOOL" +# arg = OpenStudio::Ruleset::OSArgument::makeBoolArgument(row.variable_name,row.required,row.model_dependant) +# when "STRING" +# arg = OpenStudio::Ruleset::OSArgument::makeStringArgument(row.variable_name,row.required,row.model_dependant) +# when "INTEGER" +# arg = OpenStudio::Ruleset::OSArgument::makeIntegerArgument(row.variable_name,row.required,row.model_dependant) +# arg.setMaxValue( row.max_value.to_i ) unless row.min_value.nil? +# arg.setMaxValue( row.max_value.to_i ) unless row.max_value.nil? +# when "FLOAT" +# arg = OpenStudio::Ruleset::OSArgument::makeDoubleArgument(row.variable_name,row.required,row.model_dependant) +# arg.setMaxValue( row.max_value.to_f ) unless row.min_value.nil? +# arg.setMaxValue( row.max_value.to_f ) unless row.max_value.nil? +# when "STRINGCHOICE" +# # #add string choices one by one. +# chs = OpenStudio::StringVector.new +# row.string_choice_array.each {|choice| chs << choice} +# arg = OpenStudio::Ruleset::OSArgument::makeChoiceArgument(row.variable_name, chs,row.required,row.model_dependant) +# when "PATH" +# arg = OpenStudio::Ruleset::OSArgument::makePathArgument("alternativeModelPath",true,"osm") +# when "WSCHOICE" +# arg = OpenStudio::Ruleset::makeChoiceArgumentOfWorkspaceObjects( row.variable_name, row.os_object_type.to_IddObjectType , model, row.required) +# end +# # #common argument aspects. +# unless arg.nil? +# arg.setDisplayName(row.display_name) +# arg.setDefaultValue(row.default_value) unless row.default_value.nil? +# args << arg +# end +# end +# return args +# end +# +# def argument_getter(model, runner,user_arguments) +# @arg_table = [] +# unless @argument_array == nil +# @argument_array.each do |row| +# name = row.variable_name +# +# case row.type +# when "BOOL" +# value = runner.getBoolArgumentValue(name, user_arguments) +# instance_variable_set("@#{name}",value) +# @arg_table << [name,value] +# when "STRING" +# value = runner.getStringArgumentValue(name, user_arguments) +# instance_variable_set("@#{name}",value) +# @arg_table << [name,value] +# when "INTEGER" +# value = runner.getIntegerArgumentValue(name, user_arguments) +# instance_variable_set("@#{name}",value) +# @arg_table << [name,value] +# if ( not row.min_value.nil? and instance_variable_get("@#{name}") < row.min_value ) or ( not row.max_value.nil? and instance_variable_get("@#{name}") > row.max_value ) +# runner.registerError("#{row.display_name} must be greater than or equal to #{row.min_value} and less than or equal to #{row.max_value}. You entered #{instance_variable_get("@#{name}")}.") +# return false +# end +# when "FLOAT" +# value = runner.getDoubleArgumentValue(name, user_arguments) +# instance_variable_set("@#{name}",value) +# @arg_table << [name,value] +# +# if ( not row.min_value.nil? and instance_variable_get("@#{name}") < row.min_value ) or ( not row.max_value.nil? and instance_variable_get("@#{name}") > row.max_value ) +# runner.registerError("#{row.display_name} must be greater than or equal to #{row.min_value} and less than or equal to #{row.max_value}. You entered #{instance_variable_get("@#{name}")}.") +# return false +# end +# when "STRINGCHOICE" +# @arg_table << [name,runner.getBoolArgumentValue(name, user_arguments)] +# instance_variable_set("@#{name}", runner.getStringArgumentValue(name, user_arguments) ) +# when "WSCHOICE" +# @arg_table << [name,runner.getBoolArgumentValue(name, user_arguments)] +# instance_variable_set("@#{name}", runner.getOptionalWorkspaceObjectChoiceValue(name, user_arguments,model) ) +# +# when "PATH" +# @arg_table << [name,runner.getBoolArgumentValue(name, user_arguments)] +# instance_variable_set("@#{name}", runner.getPathArgument(name, user_arguments) ) +# end #end case +# end #end do +# end +# return @arg_table +# end +# +# end +# #Measure Template simplified. +# class TemplateModelMeasure < BTAPModelUserScript +# +# def name +# "BTAPTempModelMeasure" +# end +# +# def arguments(model) +# +# #bool +# @argument_array << OSMArgument.bool(variable_name,display_name,required,default_value) +# #string +# @argument_array << OSMArgument.string(variable_name,display_name,required,default_value) +# #integer +# @argument_array << OSMArgument.integer(variable_name,display_name,required,default_value,min_value,max_value) +# #float +# @argument_array << OSMArgument.float(variable_name,display_name,required,default_value,min_value,max_value) +# #Choice +# @argument_array << OSMArgument.choice(variable_name,display_name,required,default_value,string_choice_array) +# #Workspace choice (using zones as an example) +# @argument_array << OSMArgument.wschoice(variable_name,display_name,required,default_value,string_choice_array) +# args = super(model,@argument_array) +# return args +# end +# +# def run(model, runner, user_arguments) +# #IF and E+ measure replace model with workspace as the argument +# #Boilerplate start +# parent_method_is_true = super(model, runner, user_arguments) +# +# +# #Start measure changes based on model. +# puts @boolean_argument_name +# puts @string_argument_name +# puts @integer_argument_name +# puts @float_argument_name +# puts @choice_argument_name +# puts @ws_choice_argument_name +# +# +# +# +# #Do your stuff here! +# #Here are some logging methods for reference. +# # runner.registerInitialCondition("Model initial condition (for example number of floors.") +# # runner.registerInfo("Use this for information to user.") +# # runner.registerWarning("Use this for warnings to user.") +# # runner.registerError("Use this for fatal error message to user. Will not continue. Return a false.") ; return false +# # runner.registerAsNotApplicable("Measure not applicable because XYZ. Return a true and will continue with other chained measures."); return true +# # runner.registerFinalCondition("Model ended with # of floors for example") +# # runner.registerFinalCondition("Indicate what was changed.") +# +# +# #If everything went well.. +# return true ? parent_method_is_true : false +# end # end method run +# +# #For manually running script via an IDE or a command line. +# #Using the template above as an example..... +# # argument_values = [ +# # +# # ["boolean_argument_name", true ], +# # ["string_argument_name", "some string" ], +# # ["integer_argument_name", 1 ], +# # ["float_argument_name", 0.001 ], +# # ["choice_argument_name", "choice1" ], +# # ["ws_choice_argument_name", "zone1" ], +# # ["path_argument_name", OpenStudio::Path.new(File.dirname(__FILE__))] +# # ] +# # +# def set_user_arguments_and_apply(model,argument_values,runner) +# self.run(model, runner, super(model,argument_values,runner) ) +# end +# +# end +# +# class ArchetypeScan < BTAPModelUserScript +# +# def name +# "BTAPTempModelMeasure" +# end +# +# def arguments(model) +# #get all osm files in resource folder. +# osmfiles = OpenStudio::StringVector.new +# BTAP::FileIO::get_find_files_from_folder_by_extension(File.dirname(__FILE__), ".osm").each {|filename| osmfiles << File.basename(file_name, ",osm")} +# +# +# #list of arguments as they will appear in the interface. They are available in the run command as @variable_name. +# @argument_array_of_arrays = [ +# [ "variable_name", "type", "required", "model_dependant", "display_name", "default_value", "min_value", "max_value", "string_choice_array", "os_object_type" ], +# [ "archetype_name", "STRINGCHOICE", true, false, "archetype_name", osmfiles[0].to_s , nil, nil, osmfiles, nil ], +# ] +# args = super(model,@argument_array_of_arrays) +# return args +# end +# +# def run(model, runner, user_arguments) +# #run the super +# parent_method_is_true = super(model, runner, user_arguments) +# +# +# ############### +# +# #Set Archetype name in runner. +# runner.registerValue('archetype_name',@archetype_name) +# +# #Set path to OSM files. +# alternative_model_path = OpenStudio::Path.new("#{File.dirname(__FILE__)}/#{@archetype_name}.osm") +# #load model and test. +# translator = OpenStudio::OSVersion::VersionTranslator.new +# oModel = translator.loadModel(alternative_model_path) +# if oModel.empty? +# runner.registerError("Could not load alternative model from '" + alternative_model_path.to_s + "'.") +# return false +# end +# new_model = oModel.get +# +# # pull original weather file object over +# weather_file = new_model.getOptionalWeatherFile +# if not weather_file.empty? +# weather_file.get.remove +# runner.registerInfo("Removed alternate model's weather file object.") +# end +# original_weather_file = model.getOptionalWeatherFile +# if not original_weather_file.empty? +# original_weather_file.get.clone(new_model) +# end +# +# # pull original design days over +# new_model.getDesignDays.sort.each { |designDay| designDay.remove } +# model.getDesignDays.sort.each { |designDay| designDay.clone(new_model) } +# +# #swap underlying data in model with underlying data in newModel +# model.swap(new_model) +# runner.registerFinalCondition("Model replaced with alternative #{alternative_model_path}.") +# return true ? parent_method_is_true : false +# end # end method run +# +# #For manually running script via an IDE or a command line script. +# #Using the template above as an example..... +# # argument_values = [ +# # ["archetype_name", "FullServiceRestaurant" ] +# # ] +# # +# def set_user_arguments_and_apply(model,argument_values,runner) +# self.run(model, runner, super(model,argument_values,runner) ) +# end +# end +# end +# +# class CSV_Measures +# def initialize( +# csv_file, +# script_root_folder_path +# ) +# @csv_file_path = csv_file +# @csv_data = nil +# @script_root_folder_path = script_root_folder_path +# end +# +# +# # A tiny bit of metacode to assign some instance variables named as above. This will set +# # the above variable first to nil, then, if present in the csv row data received, the actual construction data values. +# # So we should after this loop access @ext_wall_rsi for example. If the variable is not present in the row. It will default the value to zero. +# # It should automatically make floats and strings accordingly. +# def set_instance_variables(measure_values) +# +# measure_values.each do |variable| +# instance_variable_set("@#{variable}", nil ) +# instance_variable_set("@#{variable}", @csv_data[ variable ] ) unless ( (@csv_data.nil? == true ) or (@csv_data.has_key?(variable) == false) or (@csv_data[variable].to_s.strip.downcase == "na")) +# end +# end +# +# def are_all_instance_variables_nil?(measure_values) +# value = true +# measure_values.each do |variable| +# value = false unless instance_variable_get("@#{variable}").nil? +# end +# return value +# end +# +# end +# class CSV_OS_Measures < CSV_Measures +# #loading methods +# def side_load_base_model_building( model ) +# log_message = "" +# measure_values =["base_model_rel_path"] +# #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. +# self.set_instance_variables(measure_values) +# puts osm_model_full_path = "#{@script_root_folder_path}/#{@base_model_rel_path}" +# newModel = BTAP::FileIO::load_osm(osm_model_full_path,"-") +# model.swap(newModel) +# log_message << "\nModel replaced with alternative model #{osm_model_full_path}.\n" +# end +# def load_base_model_building() +# log_message = "" +# measure_values =[ +# "base_model_rel_path" +# ] +# #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. +# self.set_instance_variables(measure_values) +# osm_model_full_path = "#{@script_root_folder_path}/#{@base_model_rel_path}" +# model = BTAP::FileIO::load_osm(osm_model_full_path,"-") +# log_message << "\nModel rloaded #{osm_model_full_path}.\n" +# return model +# end +# def set_weather_file(model) +# measure_values =["weather_file_rel_path"] +# #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. +# self.set_instance_variables(measure_values) +# BTAP::Site::set_weather_file(model,"#{@script_root_folder_path}/#{@weather_file_rel_path}") unless @weather_file_rel_path.nil? +# return "Set weather file to #{@weather_file_rel_path}.\n" +# end +# def set_hourly_output(model) +# #create array of output variables strings from E+ +# output_variable_array = +# [ +# "Facility Total Electric Demand Power", +# "Water Heater Gas Rate", +# "Plant Supply Side Heating Demand Rate", +# "Heating Coil Gas Rate", +# "Cooling Coil Electric Power", +# "Boiler Gas Rate", +# "Heating Coil Air Heating Rate", +# "Heating Coil Electric Power", +# "Cooling Coil Total Cooling Rate", +# "Water Heater Heating Rate", +# # "Facility Total HVAC Electric Demand Power", +# # "Facility Total Electric Demand Power", +# "Zone Air Temperature", +# "Water Heater Electric Power" +# # "Baseboard Air Inlet Temperature", +# # "Baseboard Air Outlet Temperature", +# # "Baseboard Water Inlet Temperature", +# # "Baseboard Water Outlet Temperature", +# # "Boiler Inlet Temperature", +# # "Boiler Outlet Temperature", +# # "Plant Supply Side Inlet Temperature", +# # "Plant Supply Side Outlet Temperature", +# # "People Radiant Heating Rate", +# # "People Sensible Heating Rate", +# # "People Latent Gain Rate", +# # "People Total Heating Rate", +# # "Lights Total Heating Rate", +# # "Electric Equipment Total Heating Rate", +# # "Other Equipment Total Heating Rate", +# # "District Heating Hot Water Rate", +# # "District Heating Rate", +# # "Air System Outdoor Air Flow Fraction", +# # "Air System Outdoor Air Minimum Flow Fraction", +# # "Air System Fan Electric Energy" +# ] +# BTAP::Reports::set_output_variables(model,"Hourly", output_variable_array) +# return "added output variables ..." << output_variable_array.to_s << "\n" +# end +# +# #Helper methods +# def create_cold_lake_vintages(output_folder = nil) +# # check if only a single vintage was requested or a full set. +# baseline_models = Hash.new() +# prototype_models = Hash.new() +# +# puts "Creating Baseline models" +# CSV.foreach( @csv_file_path, :headers => true, :converters => :all ) do |row| +# @csv_data = row +# unless @csv_data["measure_id"] == "NA" +# model = self.load_base_model_building() +# self.set_weather_file(model) +# self.set_hourly_output(model) +# +# model,log = self.apply_ecms(model,@csv_data) +# BTAP::FileIO::save_osm( model, "#{output_folder}/#{BTAP::FileIO::get_name(model)}.osm") unless output_folder.nil? +# File.open("#{output_folder}/#{BTAP::FileIO::get_name(model)}.log", 'w') { |file| file.write(log) } unless output_folder.nil? +# baseline_models[BTAP::FileIO::get_name(model)] = model +# end +# end +# +# #create ECM models. +# puts "Creating ECM models" +# counter = 0 +# baseline_models.each do |name,model| +# #Scan folder and get the ecm csv files. +# ecm_csv_files = Dir.glob( "#{@script_root_folder_path}/**/ecm_*.csv" ) +# #iterate through each csv file. +# ecm_csv_files.each do |ecm_csv_file| +# puts "evaluating #{ecm_csv_file}" +# +# # iterate through each row +# CSV.foreach( ecm_csv_file, :headers => true, :converters => :all ) do |row| +# +# # If row baseline matches current baseline name then +# if name == "#{row["building_type"]}~#{row["vintage_name"]}~baseline" +# #Skip row if measure_id is NA +# counter = counter + 1 +# if row["measure_id"].nil? or row["measure_id"].upcase.strip == "NA" or row["measure_id"].upcase.strip == "" +# else +# new_model = BTAP::FileIO::deep_copy(model) +# new_model,log = self.apply_ecms(new_model,row) +# BTAP::FileIO::save_osm( new_model, "#{output_folder}/#{BTAP::FileIO::get_name(new_model)}.osm") unless output_folder.nil? +# File.open("#{output_folder}/#{BTAP::FileIO::get_name(new_model)}.log", 'w') { |file| file.write(log) } unless output_folder.nil? +# end +# end +# end +# end +# end +# puts "ECM generation completed." +# end +# def apply_ecms(model,row_data) +# log = "" +# @csv_data = row_data +# self.methods.select{ |i| i[/^ecm_.*$/] }.each do |ecm_method_name| +# log << "**********#{ecm_method_name}\n" +# raise ("model is nil") if model.nil? +# raise ("name is nil") if ecm_method_name.nil? +# log << self.method(ecm_method_name).call(model) +# end +# return model,log +# end +# +# #ecms +# def ecm_capital_costs(model) +# log = "" +# measure_values = +# [ +# "measure_id", +# "cost_per_floor_m2", +# "cost_per_building" +# ] +# self.set_instance_variables( measure_values ) +# +# #cost per building and building area +# building = model.building.get +# raise ("you did not enter a cost for measure #{@measure_id}. All measures must have a cost of at least 0.0 . Please add a cost_per_building field.") if @cost_per_building.nil? +# unless @cost_per_building.nil? +# BTAP::Resources::Economics::object_cost(building,"#{@measure_id} Capital Cost per building",@cost_per_building.to_f,"CostPerEach") +# log << "added cost of #{@measure_id} per building for #{@measure_id}" +# puts log +# end +# return log +# end +# def ecm_id(model) +# log = "" +# measure_values = +# [ +# "building_type", +# "vintage_name", +# "measure_id" +# ] +# self.set_instance_variables( measure_values ) +# BTAP::FileIO::set_name(model,"#{@building_type}~#{@vintage_name}~#{@measure_id}") +# puts BTAP::FileIO::get_name(model) +# return "Changed name to #{BTAP::FileIO::get_name(model)}" +# +# end +# def ecm_envelope( model ) +# log = "" +# #List of variables required by this measure that are to be extracted from CSV row. +# measure_values = +# [ +# "library_file", +# "default_construction_set_name", +# "ext_wall_rsi", +# "ext_floor_rsi", +# "ext_roof_rsi", +# "ground_wall_rsi", +# "ground_floor_rsi", +# "ground_roof_rsi", +# "fixed_window_rsi", +# "fixed_wind_solar_trans", +# "fixed_wind_vis_trans", +# "operable_window_rsi", +# "operable_wind_solar_trans", +# "operable_wind_vis_trans", +# "door_construction_rsi", +# "glass_door_rsi", +# "glass_door_solar_trans", +# "glass_door_vis_trans", +# "overhead_door_rsi", +# "skylight_rsi", +# "skylight_solar_trans", +# "skylight_vis_trans", +# "tubular_daylight_dome_rsi", +# "tubular_daylight_dome_solar_trans", +# "tubular_daylight_dome_vis_trans", +# "tubular_daylight_diffuser_rsi", +# "tubular_daylight_diffuser_solar_trans", +# "tubular_daylight_diffuser_vis_trans", +# "ext_wall_cost_m3", +# "ext_floor_cost_m3", +# "ext_roof_cost_m3", +# "ground_wall_cost_m3", +# "ground_floor_cost_m3", +# "ground_roof_cost_m3", +# "fixed_window_cost_m3", +# "operable_window_cost_m3", +# "door_construction_cost_m3", +# "glass_door_cost_m3", +# "overhead_door_cost_m3", +# "skylight_cost_m3", +# "tubular_daylight_dome_cost_m3", +# "tubular_daylight_diffuser_cost_m3", +# "total_building_construction_set_cost" +# ] +# +# self.set_instance_variables(measure_values) +# unless @default_construction_set_name.nil? or @library_file.nil? +# +# # #Remove all existing constructions from model. +# BTAP::Resources::Envelope::remove_all_envelope_information( model ) +# +# # #Load Contruction osm library. +# construction_lib = BTAP::FileIO::load_osm("#{@script_root_folder_path}/#{@library_file}") +# +# #Get construction set.. I/O expensive so doing it here. +# vintage_construction_set = construction_lib.getDefaultConstructionSetByName(@default_construction_set_name) +# if vintage_construction_set.empty? +# raise("#{@default_construction_set} does not exist in #{@script_root_folder_path}/#{@library_file} library ") +# else +# vintage_construction_set = construction_lib.getDefaultConstructionSetByName(@default_construction_set_name).get +# end +# +# +# new_construction_set =vintage_construction_set.clone(model).to_DefaultConstructionSet.get +# #Set conductances to needed values in construction set if possible. +# BTAP::Resources::Envelope::ConstructionSets::customize_default_surface_construction_set_rsi!( +# model: model, name: "#{@default_construction_set}-modified",default_surface_construction_set: new_construction_set, +# ext_wall_rsi: @ext_wall_rsi, ext_floor_rsi: @ext_floor_rsi, ext_roof_rsi: @ext_roof_rsi, +# ground_wall_rsi: @ground_wall_rsi, ground_floor_rsi: @ground_floor_rsi, ground_roof_rsi: @ground_roof_rsi, +# fixed_window_rsi: @fixed_window_rsi, fixed_wind_solar_trans: @fixed_wind_solar_trans, fixed_wind_vis_trans: @fixed_wind_vis_trans, +# operable_window_rsi: @operable_window_rsi, operable_wind_solar_trans: @operable_wind_solar_trans, operable_wind_vis_trans: @operable_wind_vis_trans, +# door_construction_rsi: @door_construction_rsi, +# glass_door_rsi: @glass_door_rsi, glass_door_solar_trans: @glass_door_solar_trans, glass_door_vis_trans: @glass_door_vis_trans, +# overhead_door_rsi: @overhead_door_rsi, +# skylight_rsi: @skylight_rsi, skylight_solar_trans: @skylight_solar_trans, skylight_vis_trans: @skylight_vis_trans, +# tubular_daylight_dome_rsi: @tubular_daylight_dome_rsi, tubular_daylight_dome_solar_trans: @tubular_daylight_dome_solar_trans, tubular_daylight_dome_vis_trans: @tubular_daylight_dome_vis_trans, +# tubular_daylight_diffuser_rsi: @tubular_daylight_diffuser_rsi, tubular_daylight_diffuser_solar_trans: @tubular_daylight_diffuser_solar_trans, tubular_daylight_diffuser_vis_trans: @tubular_daylight_diffuser_vis_trans +# ) +# +# +# #Set as default to model. +# model.building.get.setDefaultConstructionSet( new_construction_set ) +# +# #Set cost information. +# BTAP::Resources::Envelope::ConstructionSets::customize_default_surface_construction_set_costs(new_construction_set, +# @ext_wall_cost_m2, +# @ext_floor_cost_m2, +# @ext_roof_cost_m2, +# @ground_wall_cost_m2, +# @ground_floor_cost_m2, +# @ground_roof_cost_m2, +# @fixed_window_cost_m2, +# @operable_window_cost_m2, +# @door_construction_cost_m2, +# @glass_door_cost_m2, +# @overhead_door_cost_m2, +# @skylight_cost_m2, +# @tubular_daylight_dome_cost_m2, +# @tubular_daylight_diffuser_cost_m2, +# @total_building_construction_set_cost +# ) +# +# #Give adiabatic surfaces a construction. Does not matter what. This is a bug in OpenStudio that leave these surfaces unassigned by the default construction set. +# all_adiabatic_surfaces = BTAP::Geometry::Surfaces::filter_by_boundary_condition(model.getSurfaces, "Adiabatic") +# unless all_adiabatic_surfaces.empty? +# BTAP::Geometry::Surfaces::set_surfaces_construction( all_adiabatic_surfaces, model.building.get.defaultConstructionSet.get.defaultInteriorSurfaceConstructions.get.wallConstruction.get) +# end +# #Create sample csv file. +# CSV.open("#{@script_root_folder_path}/sample_envelope_ecm.csv", 'w') { |csv| csv << measure_values.unshift("measure_id") } +# return BTAP::Resources::Envelope::ConstructionSets::get_construction_set_info( new_construction_set ) +# end +# return "Constructions were unchanged.\n" +# end +# def ecm_infiltration( model ) +# measure_values = +# [ +# "infiltration_design_flow_rate", +# "infiltration_flow_per_space", +# "infiltration_flow_per_exterior_area", +# "infiltration_air_changes_per_hour" +# ] +# +# #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. +# self.set_instance_variables(measure_values) +# +# log = BTAP::Resources::SpaceLoads::ScaleLoads::set_inflitration_magnitude( +# model, +# @infiltration_design_flow_rate, +# @infiltration_flow_per_space, +# @infiltration_flow_per_exterior_area, +# @infiltration_air_changes_per_hour +# ) +# return log +# end +# def ecm_fans( model ) +# measure_values = +# [ +# "fan_total_eff", +# "fan_motor_eff", +# "fan_volume_type" +# ] +# #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. +# self.set_instance_variables(measure_values) +# log = "" +# unless model.getFanVariableVolumes.empty? +# log = "fan_variable_volume_name,fan_total_eff,fan_motor_eff\n" +# model.getFanVariableVolumes.sort.each do |fan| +# fan.setFanEfficiency( @fan_total_eff ) unless @fan_total_eff.nil? +# fan.setMotorEfficiency( @fan_motor_eff ) unless @fan_motor_eff.nil? +# log << fan.name.get.to_s << ",#{fan.fanEfficiency},#{fan.motorEfficiency}\n" +# end +# end +# +# unless model.getFanConstantVolumes.empty? +# log = "fan_constant_volume_name,fan_total_eff,fan_motor_eff\n" +# model.getFanConstantVolumes.sort.each do |fan| +# fan.setFanEfficiency( @fan_total_eff ) unless @fan_total_eff.nil? +# fan.setMotorEfficiency( @fan_motor_eff ) unless @fan_motor_eff.nil? +# log << fan.name.get.to_s << ",#{fan.fanEfficiency},#{fan.motorEfficiency}\n" +# end +# +# end +# +# case @fan_volume_type +# +# when "VariableVolume" +# model.getFanConstantVolumes.sort.each do |fan_const| +# #check that this is indeed connected to an airloop. +# log << "Found Const Vol Fan #{fan_const.name.get.to_s}" +# unless fan_const.loop.empty? +# fan_variable = OpenStudio::Model::FanVariableVolume.new(model,fan_const.availabilitySchedule) +# #pass information from old fan as much as possible. +# fan_variable.setFanEfficiency(fan_const.fanEfficiency) +# fan_variable.setPressureRise( fan_const.pressureRise() ) +# fan_variable.autosizeMaximumFlowRate +# fan_variable.setFanPowerMinimumFlowRateInputMethod("FixedFlowRate") +# fan_variable.setFanPowerMinimumFlowFraction(0.25) +# fan_variable.setMotorInAirstreamFraction( fan_const.motorInAirstreamFraction() ) +# fan_variable.setFanPowerCoefficient1(0.35071223) +# fan_variable.setFanPowerCoefficient2(0.30850535) +# fan_variable.setFanPowerCoefficient3(-0.54137364) +# fan_variable.setFanPowerCoefficient4(0.87198823) +# +# #get the airloop. +# air_loop = fan_const.loop.get +# #add the FanVariableVolume +# fan_variable.addToNode(air_loop.supplyOutletNode()) +# #Remove FanConstantVolume +# fan_const.remove() +# log << "Replaced by Variable Vol Fan #{fan_variable.name.get.to_s}" +# end +# end +# when "ConstantVolume" +# model.getFanVariableVolumes.sort.each do |fan| +# #check that this is indeed connected to an airloop. +# log << "Found Const Vol Fan #{fan.name.get.to_s}" +# unless fan.loop.empty? +# new_fan = OpenStudio::Model::FanConstantVolume.new(model,fan.availabilitySchedule) +# #pass information from constant speed fan as much as possible. +# new_fan.setFanEfficiency(fan.fanEfficiency) +# new_fan.setPressureRise( fan.pressureRise() ) +# new_fan.setMotorEfficiency(fan.motorEfficiency) +# new_fan.setMotorInAirstreamFraction( fan.motorInAirstreamFraction() ) +# new_fan.autosizeMaximumFlowRate +# #get the airloop. +# air_loop = fan.loop.get +# #add the FanVariableVolume +# new_fan.addToNode(air_loop.supplyOutletNode()) +# #Remove FanConstantVolume +# fan.remove() +# log << "Replaced by Constant Vol Fan #{new_fan.name.get.to_s}" +# end +# end +# when nil +# log << "No changes to Fan." +# else +# raise("fan_volume_type should be ConstantVolume or VariableVolume") +# end +# return log +# end +# def ecm_pumps( model ) +# measure_values = +# [ +# "pump_motor_eff", +# "pump_control_type", +# "pump_speed_type" +# ] +# #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. +# self.set_instance_variables(measure_values) +# log = "" +# unless model.getPumpVariableSpeeds.empty? +# log = "pump_variable_speed_name,@pump_motor_eff\n" +# model.getPumpVariableSpeeds.sort.each do |pump| +# pump.setMotorEfficiency( @pump_motor_eff.to_f ) unless @pump_motor_eff.nil? +# pump.setPumpControlType( @pump_control_type ) unless @pump_control_type.nil? +# log << pump.name.get.to_s << ",#{pump.motorEfficiency}\n" +# end +# end +# unless model.getPumpConstantSpeeds.empty? +# log << "pump_variable_speed_name,@pump_motor_eff\n" +# model.getPumpConstantSpeeds.sort.each do |pump| +# pump.setMotorEfficiency( @pump_motor_eff.to_f ) unless @pump_motor_eff.nil? +# pump.setPumpControlType( @pump_control_type ) unless @pump_control_type.nil? +# log << pump.name.get.to_s << ",#{pump.motorEfficiency}\n" +# end +# end +# +# #set pump speed type based on existing pump. +# case @pump_speed_type +# when "VariableSpeed" +# model.getPumpConstantSpeeds.sort.each do |pump_const| +# log << "Found Const Vol Fan #{pump_const.name.get.to_s}" +# #check that this is indeed connected to an plant loop. +# unless pump_const.plantLoop.empty? +# pump_variable = OpenStudio::Model::PumpVariableSpeed.new(model) +# #pass information from constant speed fan as much as possible. +# pump_variable.setRatedFlowRate(pump_const.ratedFlowRate) +# pump_variable.setRatedPumpHead(pump_const.ratedPumpHead) +# pump_variable.setRatedPowerConsumption(pump_const.ratedPowerConsumption.to_f) +# pump_variable.setMotorEfficiency(pump_const.motorEfficiency.to_f) +# pump_variable.setPumpControlType(pump_const.pumpControlType) +# pump_variable.setFractionofMotorInefficienciestoFluidStream(pump_const.fractionofMotorInefficienciestoFluidStream.to_f) +# pump_variable.autosizeRatedFlowRate if pump_const.isRatedFlowRateAutosized +# pump_variable.autosizeRatedPowerConsumption if pump_const.isRatedPowerConsumptionAutosized +# +# #get the hot water loop. +# hw_loop = pump_const.plantLoop.get +# #Remove PumpConstantSpeed +# pump_const.remove() +# #add +# pump_variable.addToNode(hw_loop.supplyInletNode) +# log << "Replaced by Variable Vol Pump #{pump_variable.name.get.to_s}" +# end +# end #end loop PumpConstantSpeeds +# when "ConstantSpeed" +# model.getPumpVariableSpeeds.sort.each do |pump| +# log << "Found Variable Speed Pump #{pump.name.get.to_s}" +# #check that this is indeed connected to an plant loop. +# unless pump.plantLoop.empty? +# new_pump = OpenStudio::Model::PumpVariableSpeed.new(model) +# #pass information from constant speed fan as much as possible. +# +# new_pump.setRatedFlowRate(pump.ratedFlowRate.get) +# new_pump.setRatedPumpHead(pump.ratedPumpHead()) +# new_pump.setRatedPowerConsumption(pump.ratedPowerConsumption.to_f) +# new_pump.setMotorEfficiency(pump.motorEfficiency().to_f) +# new_pump.setFractionofMotorInefficienciestoFluidStream(pump.fractionofMotorInefficienciestoFluidStream().to_f) +# new_pump.setPumpControlType( pump.pumpControlType ) +# new_pump.autosizeRatedFlowRate if pump.isRatedFlowRateAutosized +# new_pump.autosizeRatedPowerConsumption if pump.isRatedPowerConsumptionAutosized +# #get the hot water loop. +# hw_loop = pump.plantLoop.get +# #Remove PumpVariableSpeed +# pump.remove() +# #add the pump to loop. +# new_pump.addToNode(hw_loop.supplyInletNode) +# +# log << "Replaced by constant speed Pump #{new_pump.name.get.to_s}" +# end +# end #end loop Pump variable Speeds +# when nil +# log << "No changes" +# else +# raise( "pump_speed_type field is not ConstantSpeed or VariableSpeed" ) +# end +# +# #Create sample csv file. +# CSV.open("#{@script_root_folder_path}/sample_pump_eff_ecm.csv", 'w') { |csv| csv << measure_values.unshift("measure_id") } +# return log +# end +# def ecm_cooling_cop( model ) +# log = "" +# measure_values =[ +# "cop" +# ] +# +# #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. +# self.set_instance_variables(measure_values) +# +# unless model.getCoilCoolingDXSingleSpeeds.empty? +# log = "coil_cooling_dx_single_speed_name,cop\n" +# model.getCoilCoolingDXSingleSpeeds.sort.each do |cooling_coil| +# cooling_coil.setRatedCOP( OpenStudio::OptionalDouble.new( @cop ) ) unless @cop.nil? +# cop = "NA" +# # Prior to 3.5.0, it was an optional double, now it's a double +# cop_ = OpenStudio::OptionalDouble.new(cooling_coil.ratedCOP) +# cop = cop_.get unless cop_.empty? +# log << cooling_coil.name.get.to_s << ",#{cop}\n" +# +# end +# end +# +# unless model.getCoilCoolingDXTwoSpeeds.empty? +# log << "coil_cooling_dx_two_speed_name,cop\n" +# model.getCoilCoolingDXTwoSpeeds.sort.each do |cooling_coil| +# cooling_coil.setRatedHighSpeedCOP( @cop ) unless @cop.nil? +# cooling_coil.setRatedLowSpeedCOP( @cop ) unless @cop.nil? +# cop_high = "NA" +# cop_ = OpenStudio::OptionalDouble.new(cooling_coil.ratedHighSpeedCOP) +# cop_high = cop_.get unless cop_.empty? +# cop_low = "NA" +# cop_ = OpenStudio::OptionalDouble.new(cooling_coil.ratedLowSpeedCOP) +# cop_low = cop_.get unless cop_.empty? +# log << cooling_coil.name.get.to_s << ",#{cop_high},#{cop_low}\n" +# end +# end +# return log +# end +# def ecm_economizers( model ) +# +# measure_values =[ +# "economizer_control_type", +# "economizer_control_action_type", +# "economizer_maximum_limit_dry_bulb_temperature", +# "economizer_maximum_limit_enthalpy", +# "economizer_maximum_limit_dewpoint_temperature", +# "economizer_minimum_limit_dry_bulb_temperature" ] +# +# #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. +# self.set_instance_variables(measure_values) +# log = "" +# unless @economizer_control_type.nil? +# log << BTAP::Resources::HVAC::enable_economizer( +# model, +# @economizer_control_type, +# @economizer_control_action_type, +# @economizer_maximum_limit_dry_bulb_temperature, +# @economizer_maximum_limit_enthalpy, +# @economizer_maximum_limit_dewpoint_temperature, +# @economizer_minimum_limit_dry_bulb_temperature +# ) +# +# end +# return log +# end +# def ecm_sizing( model) +# measure_values =[ +# "heating_sizing_factor", +# "cooling_sizing_factor", +# "zone_heating_sizing_factor", +# "zone_cooling_sizing_factor" +# ] +# +# table = "*Sizing Factor Measure*" +# #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. +# self.set_instance_variables(measure_values) +# table = "handle,heating_sizing_factor,cooling_sizing_factor\n" +# #Sizing Parameters +# +# model.getSizingParameters.setHeatingSizingFactor(@heating_sizing_factor) unless @heating_sizing_factor.nil? +# model.getSizingParameters.setCoolingSizingFactor(@cooling_sizing_factor) unless @cooling_sizing_factor.nil? +# +# +# #SizingZone +# table << "handle,zone_heating_sizing_factor,zone_cooling_sizing_factor\n" +# model.getSizingZones.sort.each do |item| +# item.setZoneHeatingSizingFactor(@zone_heating_sizing_factor) unless @zone_heating_sizing_factor.nil? +# item.setZoneCoolingSizingFactor(@zone_cooling_sizing_factor) unless @zone_cooling_sizing_factor.nil? +# table << "#{item.handle},#{item.zoneHeatingSizingFactor.get},#{item.zoneCoolingSizingFactor.get}\n" +# end +# #Create sample csv file. +# CSV.open("#{@script_root_folder_path}/sample_sizing_param_ecm.csv", 'w') { |csv| csv << measure_values.unshift("measure_id") } +# return table +# end +# def ecm_dhw( model ) +# log = "shw_setpoint_sched,shw_heater_fuel_type,shw_thermal_eff\n" +# measure_values =[ +# "shw_setpoint_sched_name", +# "shw_heater_fuel_type", +# "shw_thermal_eff" +# ] +# log = "*SHW Measures*\n" +# #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. +# self.set_instance_variables(measure_values) +# +# #Create Schedule +# #schedule = BTAP::Resources::Schedules::create_annual_ruleset_schedule_detailed_json(model, @shw_setpoint_sched) unless @shw_setpoint_sched_name.nil? or @shw_setpoint_sched.nil? +# +# #iterate through water heaters. +# model.getWaterHeaterMixeds.sort.each do |item| +# unless @shw_setpoint_sched_name.nil? or @shw_setpoint_sched.nil? +# item.setSetpointTemperatureSchedule(schedule) +# end +# item.setHeaterFuelType(@shw_heater_fuel_type) unless @shw_heater_fuel_type.nil? +# item.setHeaterThermalEfficiency(@shw_thermal_eff) unless @shw_thermal_eff.nil? +# log << item.name.get.to_s << ",#{item.setpointTemperatureSchedule},#{item.heaterFuelType},#{item.heaterThermalEfficiency}\n" +# end +# return log +# end +# def ecm_hotwater_boilers( model ) +# measure_values = [ +# "hw_boiler_design_water_outlet_temperature", +# "hw_boiler_fuel_type", +# "hw_boiler_thermal_eff", +# "hw_boiler_curve", +# "hw_boiler_flow_mode",# +# "hw_boiler_eff_curve_temp_eval_var",# +# "hw_boiler_reset_highsupplytemp" , +# "hw_boiler_reset_outsidehighsupplytemp" , +# "hw_boiler_reset_lowsupplytemp" , +# "hw_boiler_reset_outsidelowsupplytemp" , +# ] +# +# #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. +# self.set_instance_variables(measure_values) +# table = "name,boiler_design_water_outlet_temperature,boiler_fuel_type,boiler_thermal_eff\n" +# +# model.getPlantLoops.sort.each do |iplantloop| +# iplantloop.components.each do |icomponent| +# if icomponent.to_BoilerHotWater.is_initialized +# boiler = icomponent.to_BoilerHotWater.get +# +# #set design outlet temp +# if model.version < OpenStudio::VersionString.new('3.0.0') +# boiler.setDesignWaterOutletTemperature(@hw_boiler_design_water_outlet_temperature) unless @hw_boiler_design_water_outlet_temperature.nil? +# end +# #set fuel type +# boiler.setFuelType(@hw_boiler_fuel_type) unless @hw_boiler_fuel_type.nil? +# #set thermal eff +# boiler.setNominalThermalEfficiency(@hw_boiler_thermal_eff) unless @hw_boiler_thermal_eff.nil? +# #set boiler flow mode +# unless @hw_boiler_flow_mode.nil? +# ["ConstantFlow","LeavingSetpointModulated","NotModulated"].include?(@hw_boiler_flow_mode) ? boiler.setBoilerFlowMode(@hw_boiler_flow_mode) : raise("Boiler flow mode #{@hw_boiler_flow_mode} invalid.") +# end +# #set setDesignWaterOutletTemperature +# if model.version < OpenStudio::VersionString.new('3.0.0') +# boiler.setDesignWaterOutletTemperature(@hotwaterboiler_reset_highsupplytemp) unless @hotwaterboiler_reset_highsupplytemp.nil? +# end +# #set EfficiencyCurveTemperatureEvaluationVariable +# unless @hw_boiler_eff_curve_temp_eval_var.nil? +# ["LeavingBoiler","EnteringBoiler"].include?(@hw_boiler_eff_curve_temp_eval_var) ? boiler.setEfficiencyCurveTemperatureEvaluationVariable(@hw_boiler_eff_curve_temp_eval_var) : raise("EfficiencyCurveTemperatureEvaluationVariable #{@hw_boiler_eff_curve_temp_eval_var} invalid.") +# end +# +# +# #Set boiler curve +# curve = boiler.normalizedBoilerEfficiencyCurve +# if not @hw_boiler_curve.nil? and curve.is_initialized and curve.get.to_CurveBiquadratic.is_initialized +# case @hw_boiler_curve.downcase +# when "atmospheric" +# biqcurve = curve.get.to_CurveBiquadratic.get +# biqcurve.setCoefficient1Constant(1.057059) +# biqcurve.setCoefficient1Constant(1.057059) +# biqcurve.setCoefficient2x(-0.0774177) +# biqcurve.setCoefficient3xPOW2(0.07875142) +# biqcurve.setCoefficient4y(0.0003943856) +# biqcurve.setCoefficient5yPOW2(-0.000004074629) +# biqcurve.setCoefficient6xTIMESY(-0.002202606) +# biqcurve.setMinimumValueofx(0.3) +# biqcurve.setMaximumValueofx(1.0) +# biqcurve.setMinimumValueofy(40.0) +# biqcurve.setMaximumValueofy(90.0) +# biqcurve.setMinimumCurveOutput(0.0) +# biqcurve.setMaximumCurveOutput(1.1) +# biqcurve.setInputUnitTypeforX("Dimensionless") +# biqcurve.setInputUnitTypeforY("Temperature") +# biqcurve.setOutputUnitType("Dimensionless") +# when "condensing" +# biqcurve = curve.get.to_CurveBiquadratic.get +# biqcurve.setCoefficient1Constant(0.4873) +# biqcurve.setCoefficient2x(1.1322) +# biqcurve.setCoefficient3xPOW2(-0.6425) +# biqcurve.setCoefficient4y(0.0) +# biqcurve.setCoefficient5yPOW2(0.0) +# biqcurve.setCoefficient6xTIMESY(0.0) +# biqcurve.setMinimumValueofx(0.1) +# biqcurve.setMaximumValueofx(1.0) +# biqcurve.setMinimumValueofy(0.0) +# biqcurve.setMaximumValueofy(0.0) +# biqcurve.setMinimumCurveOutput(0.0) +# biqcurve.setMaximumCurveOutput(1.0) +# biqcurve.setInputUnitTypeforX("Dimensionless") +# biqcurve.setInputUnitTypeforY("Temperature") +# biqcurve.setOutputUnitType("Dimensionless") +# else +# raise("#{@hotwaterboiler_curve} is not a valid boiler curve name (condensing_boiler_curve,atmospheric_boiler_curve") +# end +# end +# +# #boiler reset setpoint manager +# unless @hotwaterboiler_reset_lowsupplytemp.nil? and @hotwaterboiler_reset_outsidelowsupplytemp.nil? and @hotwaterboiler_reset_highsupplytemp.nil? and @hotwaterboiler_reset_outsidehighsupplytemp.nil? +# #check if setpoint manager is present at supply outlet +# #Find any setpoint manager if it exists and outlet node and remove it. +# iplantloop.supplyOutletNode.setpointManagers.each {|sm| sm.disconnect} +# +# #Add new setpoint manager +# oar_stpt_manager = OpenStudio::Model::SetpointManagerOutdoorAirReset.new(model) +# oar_stpt_manager.addToNode(iplantloop.supplyOutletNode) +# oar_stpt_manager.setSetpointatOutdoorHighTemperature(@hw_boiler_reset_lowsupplytemp) unless @hw_boiler_reset_lowsupplytemp.nil? +# oar_stpt_manager.setOutdoorHighTemperature(@hotwaterboiler_reset_outsidelowsupplytemp) unless @hw_boiler_reset_outsidelowsupplytemp.nil? +# oar_stpt_manager.setSetpointatOutdoorLowTemperature(@hw_boiler_reset_highsupplytemp) unless @hw_boiler_reset_highsupplytemp.nil? +# oar_stpt_manager.setOutdoorLowTemperature(@hw_boiler_reset_outsidehighsupplytemp) unless @hw_boiler_reset_outsidehighsupplytemp.nil? +# end +# table << boiler.name.get.to_s << "," +# boiler.designWaterOutletTemperature.empty? ? dowt = "NA" : dowt = boiler.designWaterOutletTemperature.get +# table << "#{dowt},#{boiler.fuelType},#{boiler.nominalThermalEfficiency}\n" +# end +# end +# end #end boilers loop +# return table +# end +# def ecm_dcv( model ) +# log = "" +# measure_values =[ +# "dcv_enabled" +# ] +# #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. +# self.set_instance_variables(measure_values) +# unless @dcv_enabled.nil? +# log = BTAP::Resources::HVAC::enable_demand_control_ventilation(model,@dcv_enabled.to_bool) +# end +# return log +# end +# def ecm_heating_cooling_setpoints(model) +# +# log = "" +# measure_values =[ +# "library_file", +# "heating_schedule_name", +# "cooling_schedule_name" +# ] +# #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. +# self.set_instance_variables(measure_values) +# +# library_file = @library_file +# heating_schedule_name = @heating_schedule_name +# cooling_schedule_name = @cooling_schedule_name +# +# unless @heating_schedule_name.nil? and @cooling_schedule_name.nil? +# #Load Contruction osm library. +# lib = BTAP::FileIO::load_osm("#{@script_root_folder_path}/#{library_file}") +# +# unless heating_schedule_name.nil? +# #Get heating schedule from library and clone it. +# heating_schedule = lib.getScheduleRulesetByName(heating_schedule_name) +# if heating_schedule.empty? +# raise("#{heating_schedule_name} does not exist in #{library_file} library ") +# else +# heating_schedule = lib.getScheduleRulesetByName(heating_schedule_name).get.clone(model).to_ScheduleRuleset.get +# end +# end +# +# unless cooling_schedule_name.nil? +# #Get cooling schedule from library and clone it. +# cooling_schedule = lib.getScheduleRulesetByName(cooling_schedule_name) +# if cooling_schedule.empty? +# raise("#{cooling_schedule_name} does not exist in #{library_file} library ") +# else +# cooling_schedule = lib.getScheduleRulesetByName(cooling_schedule_name).get.clone(model).to_ScheduleRuleset.get +# end +# end +# model.getThermostatSetpointDualSetpoints.sort.each do |dual_setpoint| +# unless heating_schedule_name.nil? +# raise ("Could not set heating Schedule") unless dual_setpoint.setHeatingSetpointTemperatureSchedule(heating_schedule) +# end +# unless cooling_schedule_name.nil? +# raise ("Could not set cooling Schedule") unless dual_setpoint.setCoolingSetpointTemperatureSchedule(cooling_schedule) +# end +# end +# end +# return log +# end +# def ecm_erv( model ) +# log = "" +# measure_values =[ +# "erv_enabled", +# "erv_autosizeNominalSupplyAirFlowRate", +# "erv_NominalSupplyAirFlowRate", +# "erv_HeatExchangerType", +# "erv_SensibleEffectivenessat100CoolingAirFlow", +# "erv_SensibleEffectivenessat75CoolingAirFlow", +# "erv_LatentEffectiveness100Cooling", +# "erv_LatentEffectiveness75Cooling", +# "erv_SensibleEffectiveness100Heating", +# "erv_SensibleEffectiveness75Heating", +# "erv_LatentEffectiveness100Heating", +# "erv_LatentEffectiveness75Heating", +# "erv_SupplyAirOutletTemperatureControl", +# "erv_setFrostControlType", +# "erv_ThresholdTemperature", +# "erv_InitialDefrostTimeFraction", +# "erv_nominal_electric_power", +# "erv_economizer_lockout" +# ] +# +# #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. +# self.set_instance_variables(measure_values) +# +# +# unless @erv_enabled.nil? or @erv_enabled.to_bool == false +# BTAP::Resources::HVAC::enable_erv( +# model, +# @erv_autosizeNominalSupplyAirFlowRate, +# @erv_NominalSupplyAirFlowRate, +# @erv_HeatExchangerType, +# @erv_SensibleEffectivenessat100CoolingAirFlow, +# @erv_SensibleEffectivenessat75CoolingAirFlow, +# @erv_LatentEffectiveness100Cooling, +# @erv_LatentEffectiveness75Cooling, +# @erv_SensibleEffectiveness100Heating, +# @erv_SensibleEffectiveness75Heating, +# @erv_LatentEffectiveness100Heating, +# @erv_LatentEffectiveness75Heating, +# @erv_SupplyAirOutletTemperatureControl.to_bool, +# @erv_setFrostControlType, +# @erv_ThresholdTemperature, +# @erv_InitialDefrostTimeFraction, +# @erv_nominal_electric_power, +# @erv_economizer_lockout.to_bool +# ).each { |erv| log << erv.to_s } +# +# +# #Add setpoint manager to all OA object in airloops. +# model.getHeatExchangerAirToAirSensibleAndLatents.sort.each do |erv| +# +# #needed to get the supply outlet node from the erv to place the setpoint manager. +# node = erv.primaryAirOutletModelObject.get.to_Node.get if erv.primaryAirOutletModelObject.is_initialized +# new_set_point_manager = OpenStudio::Model::SetpointManagerWarmest.new(model) +# raise ("Could not add setpoint manager") unless new_set_point_manager.addToNode(node) +# log << "added warmest control to node #{node}" +# new_set_point_manager.setMaximumSetpointTemperature(16.0) +# new_set_point_manager.setMinimumSetpointTemperature(5.0) +# new_set_point_manager.setStrategy("MaximumTemperature") +# new_set_point_manager.setControlVariable("Temperature") +# end +# log << "ERV have been modified.\n" +# else +# log << "ERV not changed." +# end +# return log +# end +# def ecm_exhaust_fans( model ) +# log = "" +# #Exhaust ECM +# measure_values =[ +# "exhaust_fans_occ_control_enabled" +# ] +# #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. +# self.set_instance_variables(measure_values) +# unless @exhaust_fans_occ_control_enabled.nil? or @exhaust_fans_occ_control_enabled.to_bool == false +# fans = BTAP::Resources::Schedules::set_exhaust_fans_availability_to_building_default_occ_schedule(model) +# fans.each { |fan| log << fan.to_s} +# else +# log << "No changes to exhaust fans." +# end +# return log +# end +# def ecm_lighting( model ) +# log = "" +# #Lighting ECM +# measure_values =[ +# "lighting_scaling_factor", +# "lighting_fraction_radiant", +# "lighting_fraction_visible", +# "lighting_return_air_fraction" +# ] +# #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. +# self.set_instance_variables(measure_values) +# BTAP::Resources::SpaceLoads::ScaleLoads::scale_lighting_loads( +# model, +# @lighting_scaling_factor ) unless @lighting_scaling_factor.nil? +# #Set lighting variables +# model.getLightsDefinitions.sort.each do |lightsdef| +# lightsdef.setFractionRadiant(@lighting_fraction_radiant.to_f) +# lightsdef.setFractionVisible(@lighting_fraction_visible.to_f) +# lightsdef.setReturnAirFraction(@lighting_return_air_fraction.to_f) +# end +# return log +# end +# def ecm_plugs( model ) +# log = "" +# #Plug loads ECM +# measure_values = [ +# "elec_equipment_scaling_factor", +# "elec_equipment_fraction_radiant", +# "elec_equipment_fraction_latent", +# "elec_equipment_fraction_lost" +# ] +# #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. +# self.set_instance_variables(measure_values) +# +# BTAP::Resources::SpaceLoads::ScaleLoads::scale_electrical_loads( +# model, +# @elec_equipment_scaling_factor) unless @elec_equipment_scaling_factor.nil? +# +# #Set plug loads variables +# model.getElectricEquipmentDefinitions.sort.each do |elec_equip_def| +# elec_equip_def.setFractionRadiant(@elec_equipment_fraction_radiant.to_f) +# elec_equip_def.setFractionLatent(@elec_equipment_fraction_latent.to_f) +# elec_equip_def.setFractionLost(@elec_equipment_fraction_lost.to_f) +# end +# +# CSV.open("#{@script_root_folder_path}/sample_scale_plug_loads_ecm.csv", 'w') { |csv| csv << measure_values.unshift("measure_id") } +# return log +# end +# def ecm_cold_deck_reset_control( model ) +# log = "" +# measure_values = [ +# "cold_deck_reset_enabled", +# "cold_deck_reset_max_supply_air_temp", +# "cold_deck_reset_min_supply_air_temp", +# ] +# #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. +# self.set_instance_variables(measure_values) +# +# if @cold_deck_reset_enabled.to_bool == true +# +# model.getAirLoopHVACs.sort.each do |iairloop| +# cooling_present = false +# set_point_manager = nil +# iairloop.components.each do |icomponent| +# if icomponent.to_CoilCoolingDXSingleSpeed.is_initialized or +# icomponent.to_CoilCoolingDXTwoSpeed.is_initialized or +# icomponent.to_CoilCoolingWater.is_initialized or +# icomponent.to_CoilCoolingCooledBeam.is_initialized or +# icomponent.to_CoilCoolingDXMultiSpeed.is_initialized or +# icomponent.to_CoilCoolingDXVariableRefrigerantFlow.is_initialized or +# icomponent.to_CoilCoolingLowTempRadiantConstFlow.is_initialized or +# icomponent.to_CoilCoolingLowTempRadiantVarFlow.is_initialized +# cooling_present = true +# log << "found cooling." +# end +# end +# #check if setpoint manager is present at supply outlet. +# model.getSetpointManagerSingleZoneReheats.sort.each do |manager| +# if iairloop.supplyOutletNode == manager.setpointNode.get +# set_point_manager = manager +# end +# end +# +# if set_point_manager.nil? and cooling_present == true +# set_point_manager = OpenStudio::Model::SetpointManagerSingleZoneReheat.new(model) +# set_point_manager.addToNode(iairloop.supplyOutletNode) +# end +# +# +# +# if cooling_present == true and not set_point_manager.nil? +# set_point_manager.setMaximumSupplyAirTemperature(@cold_deck_reset_max_supply_air_temp) +# set_point_manager.setMinimumSupplyAirTemperature(@cold_deck_reset_min_supply_air_temp) +# log << "to_SetpointManagerSingleZoneReheat set to 20.0 and 13.0" +# end +# end +# end +# return log +# end +# def ecm_sat_reset( model ) +# log = "" +# measure_values = [ +# "sat_reset_enabled", +# "sat_reset_outdoor_high_temperature", +# "sat_reset_outdoor_low_temperature", +# "sat_reset_setpoint_at_outdoor_high_temperature", +# "sat_reset_setpoint_at_outdoor_low_temperature" +# ] +# +# +# #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. +# self.set_instance_variables(measure_values) +# if @sat_reset_enabled.to_bool == true +# model.getAirLoopHVACs.sort.each do |iairloop| +# +# #check if setpoint manager is present at supply outlet +# model.getSetpointManagerSingleZoneReheats.sort.each do |manager| +# if iairloop.supplyOutletNode == manager.setpointNode.get +# manager.disconnect +# end +# end +# +# new_set_point_manager = OpenStudio::Model::SetpointManagerOutdoorAirReset.new(model) +# new_set_point_manager.addToNode(iairloop.supplyOutletNode) +# new_set_point_manager.setOutdoorHighTemperature(@sat_reset_outdoor_high_temperature) +# new_set_point_manager.setOutdoorLowTemperature(@sat_reset_outdoor_low_temperature) +# new_set_point_manager.setSetpointatOutdoorHighTemperature(@sat_reset_setpoint_at_outdoor_high_temperature) +# new_set_point_manager.setSetpointatOutdoorLowTemperature(@sat_reset_setpoint_at_outdoor_low_temperature) +# new_set_point_manager.setControlVariable("Temperature") +# log << "Replaced SingleZoneReheat with OA reset control." +# end +# end +# return log +# end +# def ecm_temp_setback( model ) +# log = "" +# measure_values = [ +# "occ_stbck_enabled", +# "occ_stbck_tolerance", +# "occ_stbck_heat_setback", +# "occ_stbck_heat_setpoint", +# "occ_stbck_cool_setback", +# "occ_stbck_cool_setpoint" +# ] +# #Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil. +# self.set_instance_variables(measure_values) +# # get occupancy schedule if possible. +# unless @occ_stbck_enabled.nil? or @occ_stbck_enabled == false +# if model.building.get.defaultScheduleSet.is_initialized and +# model.building.get.defaultScheduleSet.get.numberofPeopleSchedule.is_initialized and +# model.building.get.defaultScheduleSet.get.numberofPeopleSchedule.get.to_ScheduleRuleset.is_initialized +# occupancy_schedule = model.building.get.defaultScheduleSet.get.numberofPeopleSchedule.get +# heating_schedule,cooling_schedule = BTAP::Resources::Schedules::create_setback_schedule_based_on_another_schedule( +# model, +# occupancy_schedule, +# @occ_stbck_tolerance.to_f, +# @occ_stbck_heat_setpoint.to_f, +# @occ_stbck_heat_setback.to_f, +# @occ_stbck_cool_setpoint.to_f, +# @occ_stbck_cool_setback.to_f) +# model.getThermostatSetpointDualSetpoints.sort.each do |dual_setpoint| +# raise ("Could not set setback heating Schedule") unless dual_setpoint.setHeatingSetpointTemperatureSchedule(heating_schedule) +# raise ("Could not set setback cooling Schedule") unless dual_setpoint.setCoolingSetpointTemperatureSchedule(cooling_schedule) +# log << "modified....#{dual_setpoint}" +# end +# end +# else +# log << "no change to setbacks." +# end +# return log +# end +# end +# end +# end +# +#