diff --git a/lib/measures/export_modelica_loads/measure.xml b/lib/measures/export_modelica_loads/measure.xml index 27ffee7..11a09a9 100644 --- a/lib/measures/export_modelica_loads/measure.xml +++ b/lib/measures/export_modelica_loads/measure.xml @@ -1,6 +1,6 @@ - 3.1 + 3.0 export_modelica_loads 7051db01-2e55-4223-b5b5-fee615b68dd0 e682f518-4785-4917-802e-600023816cc3 diff --git a/lib/urbanopt/reporting/default_reports/qaqc_flags.rb b/lib/urbanopt/reporting/default_reports/qaqc_flags.rb index 3fb20f9..6ffaa1c 100644 --- a/lib/urbanopt/reporting/default_reports/qaqc_flags.rb +++ b/lib/urbanopt/reporting/default_reports/qaqc_flags.rb @@ -16,9 +16,9 @@ class QAQC ## # _Hash_ - Hash of flags raised by QAQC measure for this feature during this reporting period # - attr_accessor :eui_reasonableness,:end_use_by_category,:mechanical_system_part_load_efficiency, - :simultaneous_heating_and_cooling , :internal_loads , :schedules, :envelope_r_value, - :domestic_hot_water , :mechanical_system_efficiency , :supply_and_zone_air_temperature, + attr_accessor :eui_reasonableness, :end_use_by_category, :mechanical_system_part_load_efficiency, + :simultaneous_heating_and_cooling, :internal_loads, :schedules, :envelope_r_value, + :domestic_hot_water, :mechanical_system_efficiency, :supply_and_zone_air_temperature, :total_qaqc_flags ## @@ -46,14 +46,11 @@ def initialize(hash = {}) @mechanical_system_efficiency = hash[:mechanical_system_efficiency] @total_qaqc_flags = hash[:total_qaqc_flags] - # initialize class variables @@validator and @@schema @@validator ||= Validator.new @@schema ||= @@validator.schema - end - ## # Assigns default values if values do not exist. ## @@ -72,9 +69,9 @@ def defaults hash[:mechanical_system_efficiency] = nil hash[:total_qaqc_flags] = nil - return hash end + ## # Convert to a Hash equivalent for JSON serialization ## @@ -99,7 +96,6 @@ def to_hash end return result - end ## @@ -126,7 +122,6 @@ def add_values(existing_value, new_value) #:nodoc: # +other+ - _QAQC_ - An object of Program class. ## def add_qaqc_flags(other) - @eui_reasonableness = add_values(@eui_reasonableness, other.eui_reasonableness) @end_use_by_category = add_values(@end_use_by_category, other.end_use_by_category) @mechanical_system_part_load_efficiency = add_values(@mechanical_system_part_load_efficiency, other.mechanical_system_part_load_efficiency) @@ -138,9 +133,7 @@ def add_qaqc_flags(other) @domestic_hot_water = add_values(@domestic_hot_water, other.domestic_hot_water) @mechanical_system_efficiency = add_values(@mechanical_system_efficiency, other.mechanical_system_efficiency) @total_qaqc_flags = add_values(@total_qaqc_flags, other.total_qaqc_flags) - end - end end end diff --git a/lib/urbanopt/reporting/default_reports/reporting_period.rb b/lib/urbanopt/reporting/default_reports/reporting_period.rb index fa988e1..0460a58 100644 --- a/lib/urbanopt/reporting/default_reports/reporting_period.rb +++ b/lib/urbanopt/reporting/default_reports/reporting_period.rb @@ -24,9 +24,9 @@ class ReportingPeriod :fuel_type, :total_cost_dollar, :usage_cost_dollar, :demand_cost_dollar, :comfort_result, :time_setpoint_not_met_during_occupied_cooling, :time_setpoint_not_met_during_occupied_heating, :time_setpoint_not_met_during_occupied_hours, :hours_out_of_comfort_bounds_PMV, :hours_out_of_comfort_bounds_PPD, :emissions, :future_annual_electricity_emissions_mt, :future_hourly_electricity_emissions_mt, :historical_annual_electricity_emissions_mt, :historical_hourly_electricity_emissions_mt, - :future_annual_electricity_emissions_intensity_kg_per_ft2, :future_hourly_electricity_emissions_intensity_kg_per_ft2, :historical_annual_electricity_emissions_intensity_kg_per_ft2, :historical_hourly_electricity_emissions_intensity_kg_per_ft2 , + :future_annual_electricity_emissions_intensity_kg_per_ft2, :future_hourly_electricity_emissions_intensity_kg_per_ft2, :historical_annual_electricity_emissions_intensity_kg_per_ft2, :historical_hourly_electricity_emissions_intensity_kg_per_ft2, :natural_gas_emissions_mt, :natural_gas_emissions_intensity_kg_per_ft2, :propane_emissions_mt, :propane_emissions_intensity_kg_per_ft2, - :fueloil_no2_emissions_mt, :fueloil_no2_emissions_intensity_kg_per_ft2 #:nodoc: + :fueloil_no2_emissions_mt, :fueloil_no2_emissions_intensity_kg_per_ft2 #:nodoc: # ReportingPeriod class initializes the reporting period attributes: # +:id+ , +:name+ , +:multiplier+ , +:start_date+ , +:end_date+ , +:month+ , +:day_of_month+ , +:year+ , +:total_site_energy_kwh+ , +:total_source_energy_kwh+ , +:site_EUI_kwh_per_m2+, +:site_EUI_kbtu_per_ft2+, +:source_EUI_kwh_per_m2+, +:source_EUI_kbtu_per_ft2+, @@ -123,11 +123,11 @@ def defaults hash[:comfort_result] = { time_setpoint_not_met_during_occupied_cooling: nil, time_setpoint_not_met_during_occupied_heating: nil, time_setpoint_not_met_during_occupied_hours: nil, hours_out_of_comfort_bounds_PMV: nil, hours_out_of_comfort_bounds_PPD: nil } hash[:emissions] = { future_annual_electricity_emissions_mt: nil, future_hourly_electricity_emissions_mt: nil, historical_annual_electricity_emissions_mt: nil, - historical_hourly_electricity_emissions_mt: nil, future_annual_electricity_emissions_intensity_kg_per_ft2: nil, - future_hourly_electricity_emissions_intensity_kg_per_ft2: nil, historical_annual_electricity_emissions_intensity_kg_per_ft2: nil, - historical_hourly_electricity_emissions_intensity_kg_per_ft2: nil, natural_gas_emissions_mt: nil, - natural_gas_emissions_intensity_kg_per_ft2: nil, propane_emissions_mt: nil, propane_emissions_intensity_kg_per_ft2: nil, - fueloil_no2_emissions_mt: nil, fueloil_no2_emissions_intensity_kg_per_ft2: nil } + historical_hourly_electricity_emissions_mt: nil, future_annual_electricity_emissions_intensity_kg_per_ft2: nil, + future_hourly_electricity_emissions_intensity_kg_per_ft2: nil, historical_annual_electricity_emissions_intensity_kg_per_ft2: nil, + historical_hourly_electricity_emissions_intensity_kg_per_ft2: nil, natural_gas_emissions_mt: nil, + natural_gas_emissions_intensity_kg_per_ft2: nil, propane_emissions_mt: nil, propane_emissions_intensity_kg_per_ft2: nil, + fueloil_no2_emissions_mt: nil, fueloil_no2_emissions_intensity_kg_per_ft2: nil } return hash end diff --git a/lib/urbanopt/reporting/default_reports/scenario_power_distribution_cost.rb b/lib/urbanopt/reporting/default_reports/scenario_power_distribution_cost.rb index 410e3b5..007802a 100644 --- a/lib/urbanopt/reporting/default_reports/scenario_power_distribution_cost.rb +++ b/lib/urbanopt/reporting/default_reports/scenario_power_distribution_cost.rb @@ -9,169 +9,165 @@ require 'json-schema' module URBANopt - module Reporting - module DefaultReports - ## - # scenario_power_distribution_cost include eletrical power distribution system violation and - # upgrade cost information. - ## - class ScenarioPowerDistributionCost - attr_accessor :results, :outputs, :violation_summary, :costs_per_equipment, :equipment - - ## - # ScenarioPowerDistributionCost class initializes all - # scenario_power_distribution_cost attributes: - # +:results+, +:outputs+, +:violation_summary+, +:costs_per_equipment+, +:equipment+ - ## - def initialize(hash = {}) - hash.delete_if { |k, v| v.nil? } - hash = defaults.merge(hash) - - @results = hash[:results] - @outputs = hash[:outputs] - @violation_summary = hash[:violation_summary] - @costs_per_equipment = hash[:costs_per_equipment] - @equipment = hash[:equipment] - - # initialize class variables @@validator and @@schema - @@validator ||= Validator.new - @@schema ||= @@validator.schema - end - - ## - # Assigns default values if attribute values do not exist.## - def defaults - hash = {} - hash[:results] = [] - hash[:outputs] = {} - hash[:violation_summary] = [] - hash[:costs_per_equipment] = [] - hash[:equipment] = [] - - return hash - end - - ## - # Converts to a Hash equivalent for JSON serialization. - ## - # - Exclude attributes with nil values. - # - Validate power_distribution_cost hash properties against schema. - ## - def to_hash - result = {} - result[:results] = @results if @results - result[:outputs] = @outputs if !@outputs.empty? - result[:violation_summary] = @violation_summary if @violation_summary - result[:costs_per_equipment] = @costs_per_equipment if @costs_per_equipment - result[:equipment] = @equipment if @equipment - - # validate power_distribution_cost properties against schema - if @@validator.validate(@@schema[:definitions][:ScenarioPowerDistributionCost][:properties], result).any? - raise "scenario_power_distribution_cost properties does not match schema: #{@@validator.validate(@@schema[:definitions][:ScenarioPowerDistributionCost][:properties], result)}" - end - - return result - end - - ## - # Add a result - ## - def add_result(hash = {}) - hash.delete_if { |k, v| v.nil? } - hash = defaults.merge(hash) - result = {} - result['num_violations'] = hash[:num_violations] - @results << result - end - - ## - ## Add outputs - ## - def add_outputs(hash = {}) - hash.delete_if { |k, v| v.nil? } - hash = defaults.merge(hash) - output = {} - output['log_file'] = hash[:log_file] - output['jobs'] = [] - hash[:jobs].each do |job| - output['jobs'] << job - end - @outputs = output - end - - ## - ## Add a violation summary - ## - def add_violation_summary(hash = {}) - hash.delete_if { |k, v| v.nil? } - hash = defaults.merge(hash) - violation_summary = {} - violation_summary['scenario'] = hash[:scenario] - violation_summary['stage'] = hash[:stage] - violation_summary['upgrade_type'] = hash[:upgrade_type] - violation_summary['simulation_time_s'] = hash[:simulation_time_s] - violation_summary['thermal_violations_present'] = hash[:thermal_violations_present] - violation_summary['voltage_violations_present'] = hash[:voltage_violations_present] - violation_summary['max_bus_voltage'] = hash[:max_bus_voltage] - violation_summary['min_bus_voltage'] = hash[:min_bus_voltage] - violation_summary['num_voltage_violation_buses'] = hash[:num_voltage_violation_buses] - violation_summary['num_overvoltage_violation_buses'] = hash[:num_overvoltage_violation_buses] - violation_summary['voltage_upper_limit'] = hash[:voltage_upper_limit] - violation_summary['num_undervoltage_violation_buses'] = hash[:num_undervoltage_violation_buses] - violation_summary['voltage_lower_limit'] = hash[:voltage_lower_limit] - violation_summary['max_line_loading'] = hash[:max_line_loading] - violation_summary['max_transformer_loading'] = hash[:max_transformer_loading] - violation_summary['num_line_violations'] = hash[:num_line_violations] - violation_summary['line_upper_limit'] = hash[:line_upper_limit] - violation_summary['num_transformer_violations'] = hash[:num_transformer_violations] - violation_summary['transformer_upper_limit'] = hash[:transformer_upper_limit] - - @violation_summary << violation_summary - end - - ## - # Add costs per equipment - ## - def add_costs_per_equipment - hash.delete_if { |k, v| v.nil? } - hash = defaults.merge(hash) - costs_per_equipment = {} - costs_per_equipment['name'] = hash[:name] - costs_per_equipment['type'] = hash[:type] - costs_per_equipment['count'] = hash[:count] - costs_per_equipment['total_cost_usd'] = hash[:costs_per_equipment] - - @costs_per_equipment << costs_per_equipment - end - - ## - # Add equipment - ## - def add_equipment - hash.delete_if { |k, v| v.nil? } - hash = defaults.merge(hash) - equipment = {} - equipment['equipment_type'] = hash[:equipment_type] - equipment['equipment_name'] = hash[:equipment_name] - equipment['status'] = hash[:status] - equipment['parameter1_name'] = hash[:parameter1_name] - equipment['parameter1_original'] = hash[:parameter1_original] - equipment['parameter1_upgraded'] = hash[:parameter1_upgraded] - equipment['parameter2_name'] = hash[:parameter2_name] - equipment['parameter2_original'] = hash[:parameter2_original] - equipment['parameter2_upgraded'] = hash[:parameter2_upgraded] - equipment['parameter3_name'] = hash[:parameter3_name] - equipment['parameter3_original'] = hash[:parameter3_original] - equipment['parameter3_upgraded'] = hash[:parameter3_upgraded] - equipment['name'] = hash[:name] - - @equipment << equipment - end - - - - end # ScenarioPowerDistributionCost - - end # DefaultReports - end # Reporting -end # URBANopt + module Reporting + module DefaultReports + ## + # scenario_power_distribution_cost include eletrical power distribution system violation and + # upgrade cost information. + ## + class ScenarioPowerDistributionCost + attr_accessor :results, :outputs, :violation_summary, :costs_per_equipment, :equipment + + ## + # ScenarioPowerDistributionCost class initializes all + # scenario_power_distribution_cost attributes: + # +:results+, +:outputs+, +:violation_summary+, +:costs_per_equipment+, +:equipment+ + ## + def initialize(hash = {}) + hash.delete_if { |k, v| v.nil? } + hash = defaults.merge(hash) + + @results = hash[:results] + @outputs = hash[:outputs] + @violation_summary = hash[:violation_summary] + @costs_per_equipment = hash[:costs_per_equipment] + @equipment = hash[:equipment] + + # initialize class variables @@validator and @@schema + @@validator ||= Validator.new + @@schema ||= @@validator.schema + end + + ## + # Assigns default values if attribute values do not exist.## + def defaults + hash = {} + hash[:results] = [] + hash[:outputs] = {} + hash[:violation_summary] = [] + hash[:costs_per_equipment] = [] + hash[:equipment] = [] + + return hash + end + + ## + # Converts to a Hash equivalent for JSON serialization. + ## + # - Exclude attributes with nil values. + # - Validate power_distribution_cost hash properties against schema. + ## + def to_hash + result = {} + result[:results] = @results if @results + result[:outputs] = @outputs if !@outputs.empty? + result[:violation_summary] = @violation_summary if @violation_summary + result[:costs_per_equipment] = @costs_per_equipment if @costs_per_equipment + result[:equipment] = @equipment if @equipment + + # validate power_distribution_cost properties against schema + if @@validator.validate(@@schema[:definitions][:ScenarioPowerDistributionCost][:properties], result).any? + raise "scenario_power_distribution_cost properties does not match schema: #{@@validator.validate(@@schema[:definitions][:ScenarioPowerDistributionCost][:properties], result)}" + end + + return result + end + + ## + # Add a result + ## + def add_result(hash = {}) + hash.delete_if { |k, v| v.nil? } + hash = defaults.merge(hash) + result = {} + result['num_violations'] = hash[:num_violations] + @results << result + end + + ## + ## Add outputs + ## + def add_outputs(hash = {}) + hash.delete_if { |k, v| v.nil? } + hash = defaults.merge(hash) + output = {} + output['log_file'] = hash[:log_file] + output['jobs'] = [] + hash[:jobs].each do |job| + output['jobs'] << job + end + @outputs = output + end + + ## + ## Add a violation summary + ## + def add_violation_summary(hash = {}) + hash.delete_if { |k, v| v.nil? } + hash = defaults.merge(hash) + violation_summary = {} + violation_summary['scenario'] = hash[:scenario] + violation_summary['stage'] = hash[:stage] + violation_summary['upgrade_type'] = hash[:upgrade_type] + violation_summary['simulation_time_s'] = hash[:simulation_time_s] + violation_summary['thermal_violations_present'] = hash[:thermal_violations_present] + violation_summary['voltage_violations_present'] = hash[:voltage_violations_present] + violation_summary['max_bus_voltage'] = hash[:max_bus_voltage] + violation_summary['min_bus_voltage'] = hash[:min_bus_voltage] + violation_summary['num_voltage_violation_buses'] = hash[:num_voltage_violation_buses] + violation_summary['num_overvoltage_violation_buses'] = hash[:num_overvoltage_violation_buses] + violation_summary['voltage_upper_limit'] = hash[:voltage_upper_limit] + violation_summary['num_undervoltage_violation_buses'] = hash[:num_undervoltage_violation_buses] + violation_summary['voltage_lower_limit'] = hash[:voltage_lower_limit] + violation_summary['max_line_loading'] = hash[:max_line_loading] + violation_summary['max_transformer_loading'] = hash[:max_transformer_loading] + violation_summary['num_line_violations'] = hash[:num_line_violations] + violation_summary['line_upper_limit'] = hash[:line_upper_limit] + violation_summary['num_transformer_violations'] = hash[:num_transformer_violations] + violation_summary['transformer_upper_limit'] = hash[:transformer_upper_limit] + + @violation_summary << violation_summary + end + + ## + # Add costs per equipment + ## + def add_costs_per_equipment + hash.delete_if { |k, v| v.nil? } + hash = defaults.merge(hash) + costs_per_equipment = {} + costs_per_equipment['name'] = hash[:name] + costs_per_equipment['type'] = hash[:type] + costs_per_equipment['count'] = hash[:count] + costs_per_equipment['total_cost_usd'] = hash[:costs_per_equipment] + + @costs_per_equipment << costs_per_equipment + end + + ## + # Add equipment + ## + def add_equipment + hash.delete_if { |k, v| v.nil? } + hash = defaults.merge(hash) + equipment = {} + equipment['equipment_type'] = hash[:equipment_type] + equipment['equipment_name'] = hash[:equipment_name] + equipment['status'] = hash[:status] + equipment['parameter1_name'] = hash[:parameter1_name] + equipment['parameter1_original'] = hash[:parameter1_original] + equipment['parameter1_upgraded'] = hash[:parameter1_upgraded] + equipment['parameter2_name'] = hash[:parameter2_name] + equipment['parameter2_original'] = hash[:parameter2_original] + equipment['parameter2_upgraded'] = hash[:parameter2_upgraded] + equipment['parameter3_name'] = hash[:parameter3_name] + equipment['parameter3_original'] = hash[:parameter3_original] + equipment['parameter3_upgraded'] = hash[:parameter3_upgraded] + equipment['name'] = hash[:name] + + @equipment << equipment + end + end + end + end +end diff --git a/spec/urbanopt/reporting/reporting_spec.rb b/spec/urbanopt/reporting/reporting_spec.rb index d0ef610..2056824 100644 --- a/spec/urbanopt/reporting/reporting_spec.rb +++ b/spec/urbanopt/reporting/reporting_spec.rb @@ -235,7 +235,7 @@ end it 'can report power distribution cost results' do - distribution_cost = URBANopt::Reporting::DefaultReports::ScenarioPowerDistributionCost.new({ "results": [ {"name": "baseline_scenario","num_violations": 0,"total_cost_usd": 546950.36419523}], "violation_summary": [ { "name": "baseline_scenario"}]}) + distribution_cost = URBANopt::Reporting::DefaultReports::ScenarioPowerDistributionCost.new({ "results": [{ "name": 'baseline_scenario', "num_violations": 0, "total_cost_usd": 546950.36419523 }], "violation_summary": [{ "name": 'baseline_scenario' }] }) expect(distribution_cost.results[0][:name]).to eq 'baseline_scenario' expect(distribution_cost.violation_summary[0][:name]).to eq 'baseline_scenario' end