class OpenStudio::RecommendationEngine::RecommendationEngine
Public Class Methods
new(model, path_to_measures)
click to toggle source
# File lib/openstudio/recommendation_engine/recommendation_engine.rb, line 23 def initialize(model, path_to_measures) @model = model @path_to_measures = path_to_measures end
Public Instance Methods
apply_measures(model, measures_hash)
click to toggle source
measures_hash looks like { “measure”: { “uid”: “123-fake-daylight-uid”, “name”: “AddEconomizer”, “spaces”: [ “427_office_1_North Perimeter Space”, “427_office_1_South Perimeter Space”, “427_office_1_West Perimeter Space”, “427_office_1_East Perimeter Space” ] “arguments”: { “cost_per_thing”:50, “input_2”:true, } }, “measure”: { “uid”: “123-fake-daylight-uid”, “name”: “AddDaylightControls”, “spaces”: [ “427_office_1_North Perimeter Space”, “427_office_1_South Perimeter Space”, “427_office_1_West Perimeter Space”, “427_office_1_East Perimeter Space” ] } }
# File lib/openstudio/recommendation_engine/recommendation_engine.rb, line 88 def apply_measures(model, measures_hash) messages = {} #loop through each measure in the measures_hash measures_hash.each do |m| puts JSON.pretty_generate(m) measure_name = m['measure']['name'] puts measure_name messages[measure_name] = [] puts File.expand_path(measure_name) require "#{@path_to_measures}/#{measure_name}/measure" #make os argument vector and assign values from measures_json measure = Object.const_get(measure_name).new arguments = measure.arguments(model) runner = OpenStudio::Ruleset::OSRunner.new argument_map = OpenStudio::Ruleset::OSArgumentMap.new arguments.each do |arg| argument_map[arg.name] = arg.clone end if m['measure']['arguments'] m['measure']['arguments'].each do |arg_name, arg_val| v = argument_map[arg_name] raise "Could not find argument map in measure" if not v value_set = v.setValue(arg_val) raise "Could not set argument #{arg_name} of value #{arg_val} on model" unless value_set argument_map[arg_name] = v.clone end end #run the measure measure.run(model, runner, argument_map) #log the messages from when running the measure result = runner.result messages[measure_name] << result.initialCondition.get.logMessage if result.initialCondition.is_initialized messages[measure_name] << result.finalCondition.get.logMessage if result.finalCondition.is_initialized result.warnings.each { |w| messages[measure_name] << w.logMessage} result.errors.each { |w| messages[measure_name] << w.logMessage} result.info.each { |w| messages[measure_name] << w.logMessage} end #next measure return model,messages end
check_measures()
click to toggle source
# File lib/openstudio/recommendation_engine/recommendation_engine.rb, line 28 def check_measures measure_checks = Dir.glob("#{@path_to_measures}/**/recommendation.rb") applicable_measures = [] debug_outputs = [] measure_checks.each do |measure| require "#{File.expand_path(measure)}" measure_class_name = File.basename(File.expand_path("../..",measure)) puts "checking #{measure_class_name}" measure = Object.const_get(measure_class_name).new if @model results_hash, debug_hash = measure.check_applicability(@model) if results_hash applicable_measures << results_hash else puts "measure #{measure_class_name} not applicable" end debug_outputs << debug_hash else raise "No model passed into the recommendation engine" end end return [applicable_measures,debug_outputs] end