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