openstudio-geb 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/Gemfile +10 -9
- data/lib/measures/AddElectricVehicleChargingLoad/measure.rb +247 -21
- data/lib/measures/AddElectricVehicleChargingLoad/tests/CZ06RV2.epw +8768 -0
- data/lib/measures/AddElectricVehicleChargingLoad/tests/add_electric_vehicle_charging_load_test.rb +40 -141
- data/lib/measures/AddElectricVehicleChargingLoad/tests/test.osm +55 -55
- data/lib/measures/add_chilled_water_storage_tank/measure.rb +2 -2
- data/lib/measures/add_exterior_blinds_and_control/measure.rb +6 -5
- data/lib/measures/add_interior_blinds_and_control/measure.rb +5 -5
- data/lib/measures/add_rooftop_pv_simple/measure.rb +13 -10
- data/lib/measures/average_ventilation_for_peak_hours/measure.rb +5 -5
- data/lib/measures/enable_occupancy_driven_lighting/measure.rb +2 -2
- data/lib/openstudio/geb/run.rb +5 -1
- data/lib/openstudio/geb/utilities.rb +3 -2
- data/lib/openstudio/geb/version.rb +1 -1
- data/openstudio-geb.gemspec +8 -5
- metadata +34 -33
data/lib/measures/AddElectricVehicleChargingLoad/tests/add_electric_vehicle_charging_load_test.rb
CHANGED
@@ -10,6 +10,7 @@ require 'openstudio/measure/ShowRunnerOutput'
|
|
10
10
|
require 'minitest/autorun'
|
11
11
|
require_relative '../measure.rb'
|
12
12
|
require 'fileutils'
|
13
|
+
require 'json'
|
13
14
|
|
14
15
|
class AddElectricVehicleChargingLoadTest < Minitest::Test
|
15
16
|
# def setup
|
@@ -28,137 +29,8 @@ class AddElectricVehicleChargingLoadTest < Minitest::Test
|
|
28
29
|
# create an instance of a runner
|
29
30
|
runner = OpenStudio::Measure::OSRunner.new(OpenStudio::WorkflowJSON.new)
|
30
31
|
|
31
|
-
# get arguments and test that they are what we are expecting
|
32
|
-
arguments = measure.arguments(model)
|
33
|
-
assert_equal(10, arguments.size)
|
34
|
-
assert_equal('bldg_use_type', arguments[0].name)
|
35
|
-
assert_equal('home', arguments[0].printValue)
|
36
|
-
|
37
|
-
|
38
|
-
# set argument values to bad values and run the measure
|
39
|
-
argument_map = OpenStudio::Measure.convertOSArgumentVectorToMap(arguments)
|
40
|
-
|
41
|
-
bldg_use_type = arguments[0].clone
|
42
|
-
assert(bldg_use_type.setValue('workplace'))
|
43
|
-
argument_map['bldg_use_type'] = bldg_use_type
|
44
|
-
|
45
|
-
num_ev_chargers = arguments[1].clone
|
46
|
-
assert(num_ev_chargers.setValue(3))
|
47
|
-
argument_map['num_ev_chargers'] = num_ev_chargers
|
48
|
-
|
49
|
-
num_evs = arguments[2].clone
|
50
|
-
assert(num_evs.setValue(10))
|
51
|
-
argument_map['num_evs'] = num_evs
|
52
|
-
|
53
|
-
# avg_arrival_time = arguments[4].clone
|
54
|
-
# assert(avg_arrival_time.setValue('9:00'))
|
55
|
-
# argument_map['avg_arrival_time'] = avg_arrival_time
|
56
|
-
#
|
57
|
-
avg_leave_time = arguments[5].clone
|
58
|
-
assert(avg_leave_time.setValue('23:30'))
|
59
|
-
argument_map['avg_leave_time'] = avg_leave_time
|
60
|
-
|
61
|
-
start_charge_time = arguments[6].clone
|
62
|
-
assert(start_charge_time.setValue('17:00'))
|
63
|
-
argument_map['start_charge_time'] = start_charge_time
|
64
|
-
|
65
|
-
avg_charge_hours = arguments[7].clone
|
66
|
-
assert(avg_charge_hours.setValue(4))
|
67
|
-
argument_map['avg_charge_hours'] = avg_charge_hours
|
68
|
-
|
69
|
-
# charge_on_sat = arguments[8].clone
|
70
|
-
# assert(charge_on_sat.setValue(false))
|
71
|
-
# argument_map['charge_on_sat'] = charge_on_sat
|
72
|
-
#
|
73
|
-
# charge_on_sun = arguments[9].clone
|
74
|
-
# assert(charge_on_sun.setValue(false))
|
75
|
-
# argument_map['charge_on_sun'] = charge_on_sun
|
76
|
-
|
77
|
-
|
78
|
-
measure.run(model, runner, argument_map)
|
79
|
-
result = runner.result
|
80
|
-
puts "errors: #{result.errors.inspect}"
|
81
|
-
puts "warnings: "
|
82
|
-
result.warnings.each{|warning| puts warning.logMessage}
|
83
|
-
show_output(result)
|
84
|
-
assert(result.value.valueName == 'Success')
|
85
|
-
assert(result.errors.empty?)
|
86
|
-
|
87
|
-
# save the model
|
88
|
-
# output_file_path = OpenStudio::Path.new('tests/test.osm')
|
89
|
-
output_file_path = File.join(File.dirname(__FILE__), 'test.osm')
|
90
|
-
model.save(output_file_path,true)
|
91
|
-
end
|
92
|
-
|
93
|
-
def test_number_of_arguments_and_argument_names
|
94
|
-
# create an instance of the measure
|
95
|
-
measure = AddElectricVehicleChargingLoad.new
|
96
|
-
|
97
|
-
# make an empty model
|
98
|
-
model = OpenStudio::Model::Model.new
|
99
|
-
|
100
|
-
# get arguments and test that they are what we are expecting
|
101
|
-
arguments = measure.arguments(model)
|
102
|
-
assert_equal(1, arguments.size)
|
103
|
-
assert_equal('space_name', arguments[0].name)
|
104
|
-
end
|
105
|
-
|
106
|
-
def test_bad_argument_values
|
107
|
-
# create an instance of the measure
|
108
|
-
measure = AddElectricVehicleChargingLoad.new
|
109
|
-
|
110
|
-
# create runner with empty OSW
|
111
|
-
osw = OpenStudio::WorkflowJSON.new
|
112
|
-
runner = OpenStudio::Measure::OSRunner.new(osw)
|
113
|
-
|
114
|
-
# make an empty model
|
115
|
-
model = OpenStudio::Model::Model.new
|
116
|
-
|
117
32
|
# get arguments
|
118
33
|
arguments = measure.arguments(model)
|
119
|
-
argument_map = OpenStudio::Measure.convertOSArgumentVectorToMap(arguments)
|
120
|
-
|
121
|
-
# create hash of argument values
|
122
|
-
args_hash = {}
|
123
|
-
args_hash['space_name'] = ''
|
124
|
-
|
125
|
-
# populate argument with specified hash value if specified
|
126
|
-
arguments.each do |arg|
|
127
|
-
temp_arg_var = arg.clone
|
128
|
-
if args_hash.key?(arg.name)
|
129
|
-
assert(temp_arg_var.setValue(args_hash[arg.name]))
|
130
|
-
end
|
131
|
-
argument_map[arg.name] = temp_arg_var
|
132
|
-
end
|
133
|
-
|
134
|
-
# run the measure
|
135
|
-
measure.run(model, runner, argument_map)
|
136
|
-
result = runner.result
|
137
|
-
|
138
|
-
# show the output
|
139
|
-
show_output(result)
|
140
|
-
|
141
|
-
# assert that it ran correctly
|
142
|
-
assert_equal('Fail', result.value.valueName)
|
143
|
-
end
|
144
|
-
|
145
|
-
def test_good_argument_values
|
146
|
-
# create an instance of the measure
|
147
|
-
measure = AddElectricVehicleChargingLoad.new
|
148
|
-
|
149
|
-
# create runner with empty OSW
|
150
|
-
osw = OpenStudio::WorkflowJSON.new
|
151
|
-
runner = OpenStudio::Measure::OSRunner.new(osw)
|
152
|
-
|
153
|
-
# load the test model
|
154
|
-
translator = OpenStudio::OSVersion::VersionTranslator.new
|
155
|
-
path = "#{File.dirname(__FILE__)}/example_model.osm"
|
156
|
-
model = translator.loadModel(path)
|
157
|
-
assert(!model.empty?)
|
158
|
-
model = model.get
|
159
|
-
|
160
|
-
# store the number of spaces in the seed model
|
161
|
-
num_spaces_seed = model.getSpaces.size
|
162
34
|
|
163
35
|
# get arguments
|
164
36
|
arguments = measure.arguments(model)
|
@@ -167,7 +39,26 @@ class AddElectricVehicleChargingLoadTest < Minitest::Test
|
|
167
39
|
# create hash of argument values.
|
168
40
|
# If the argument has a default that you want to use, you don't need it in the hash
|
169
41
|
args_hash = {}
|
170
|
-
|
42
|
+
# for workplace
|
43
|
+
# args_hash['bldg_use_type'] = 'workplace'
|
44
|
+
# args_hash['num_ev_chargers'] = 3
|
45
|
+
# args_hash['num_evs'] = 10
|
46
|
+
# args_hash['charger_level'] = 'Level 2'
|
47
|
+
# args_hash['avg_arrival_time'] = '9:00'
|
48
|
+
# args_hash['arrival_time_variation_in_mins'] = 60
|
49
|
+
# args_hash['avg_charge_hours'] = 2.5
|
50
|
+
# args_hash['charge_time_variation_in_mins'] = 60
|
51
|
+
|
52
|
+
# for commercial station
|
53
|
+
args_hash['bldg_use_type'] = 'commercial station'
|
54
|
+
args_hash['num_ev_chargers'] = 7
|
55
|
+
args_hash['num_evs'] = 28
|
56
|
+
args_hash['charger_level'] = 'DC charger'
|
57
|
+
args_hash['avg_arrival_time'] = '14:00'
|
58
|
+
args_hash['arrival_time_variation_in_mins'] = 300
|
59
|
+
args_hash['avg_charge_hours'] = 2
|
60
|
+
args_hash['charge_time_variation_in_mins'] = 30
|
61
|
+
|
171
62
|
# using defaults values from measure.rb for other arguments
|
172
63
|
|
173
64
|
# populate argument with specified hash value if specified
|
@@ -179,23 +70,31 @@ class AddElectricVehicleChargingLoadTest < Minitest::Test
|
|
179
70
|
argument_map[arg.name] = temp_arg_var
|
180
71
|
end
|
181
72
|
|
182
|
-
# run the measure
|
183
73
|
measure.run(model, runner, argument_map)
|
184
74
|
result = runner.result
|
185
|
-
|
186
|
-
|
75
|
+
puts "errors: #{result.errors.inspect}"
|
76
|
+
puts "warnings: "
|
77
|
+
result.warnings.each{|warning| puts warning.logMessage}
|
187
78
|
show_output(result)
|
188
|
-
|
189
|
-
|
190
|
-
assert_equal('Success', result.value.valueName)
|
191
|
-
assert(result.info.size == 1)
|
192
|
-
assert(result.warnings.empty?)
|
193
|
-
|
194
|
-
# check that there is now 1 space
|
195
|
-
assert_equal(1, model.getSpaces.size - num_spaces_seed)
|
79
|
+
assert(result.value.valueName == 'Success')
|
80
|
+
assert(result.errors.empty?)
|
196
81
|
|
197
82
|
# save the model to test output directory
|
198
83
|
output_file_path = "#{File.dirname(__FILE__)}//output/test_output.osm"
|
199
84
|
model.save(output_file_path, true)
|
85
|
+
|
86
|
+
# test run the modified model
|
87
|
+
osw = {}
|
88
|
+
osw["weather_file"] = File.join(File.dirname(__FILE__ ), "CZ06RV2.epw")
|
89
|
+
osw["seed_file"] = output_file_path
|
90
|
+
osw_path = "#{File.dirname(__FILE__)}//output/test_output.osw"
|
91
|
+
File.open(osw_path, 'w') do |f|
|
92
|
+
f << JSON.pretty_generate(osw)
|
93
|
+
end
|
94
|
+
cli_path = OpenStudio.getOpenStudioCLI
|
95
|
+
cmd = "\"#{cli_path}\" run -w \"#{osw_path}\""
|
96
|
+
puts cmd
|
97
|
+
system(cmd)
|
200
98
|
end
|
99
|
+
|
201
100
|
end
|
@@ -1,47 +1,47 @@
|
|
1
1
|
|
2
2
|
OS:Version,
|
3
|
-
{
|
4
|
-
3.
|
3
|
+
{710267aa-03b7-4f18-b675-4210bf362bb2}, !- Handle
|
4
|
+
3.7.0; !- Version Identifier
|
5
5
|
|
6
6
|
OS:Schedule:Ruleset,
|
7
|
-
{
|
7
|
+
{5e51be1d-47a4-45a6-831f-69e2b394fc9c}, !- Handle
|
8
8
|
EV Charging Power Draw, !- Name
|
9
|
-
{
|
10
|
-
{
|
9
|
+
{f4a971c0-7bb6-4f09-b54b-593ad91e646f}, !- Schedule Type Limits Name
|
10
|
+
{6bcacd24-481f-4f28-9dba-45fc1174e22a}; !- Default Day Schedule Name
|
11
11
|
|
12
12
|
OS:Schedule:Day,
|
13
|
-
{
|
13
|
+
{6bcacd24-481f-4f28-9dba-45fc1174e22a}, !- Handle
|
14
14
|
EV Charging Default, !- Name
|
15
|
-
{
|
15
|
+
{f4a971c0-7bb6-4f09-b54b-593ad91e646f}, !- Schedule Type Limits Name
|
16
16
|
, !- Interpolate to Timestep
|
17
17
|
8, !- Hour 1
|
18
|
-
|
18
|
+
8, !- Minute 1
|
19
19
|
0, !- Value Until Time 1
|
20
20
|
8, !- Hour 2
|
21
|
-
|
21
|
+
19, !- Minute 2
|
22
22
|
0.333333333333333, !- Value Until Time 2
|
23
23
|
8, !- Hour 3
|
24
|
-
|
24
|
+
20, !- Minute 3
|
25
25
|
0.666666666666667, !- Value Until Time 3
|
26
|
-
|
27
|
-
|
26
|
+
14, !- Hour 4
|
27
|
+
34, !- Minute 4
|
28
28
|
1, !- Value Until Time 4
|
29
|
-
|
30
|
-
|
29
|
+
14, !- Hour 5
|
30
|
+
39, !- Minute 5
|
31
31
|
0.666666666666667, !- Value Until Time 5
|
32
|
-
|
33
|
-
|
32
|
+
16, !- Hour 6
|
33
|
+
21, !- Minute 6
|
34
34
|
0.333333333333333, !- Value Until Time 6
|
35
35
|
24, !- Hour 7
|
36
36
|
0, !- Minute 7
|
37
|
-
|
37
|
+
-1.2335811384724e-16; !- Value Until Time 7
|
38
38
|
|
39
39
|
OS:Schedule:Rule,
|
40
|
-
{
|
40
|
+
{f33ae947-b72d-4290-aaef-fe86f9501ffc}, !- Handle
|
41
41
|
EV Charging Power Saturday, !- Name
|
42
|
-
{
|
42
|
+
{5e51be1d-47a4-45a6-831f-69e2b394fc9c}, !- Schedule Ruleset Name
|
43
43
|
1, !- Rule Order
|
44
|
-
{
|
44
|
+
{8ec2458e-65f1-4aeb-990f-bedc9b3fadfa}, !- Day Schedule Name
|
45
45
|
, !- Apply Sunday
|
46
46
|
, !- Apply Monday
|
47
47
|
, !- Apply Tuesday
|
@@ -51,83 +51,83 @@ OS:Schedule:Rule,
|
|
51
51
|
Yes; !- Apply Saturday
|
52
52
|
|
53
53
|
OS:Schedule:Day,
|
54
|
-
{
|
54
|
+
{8ec2458e-65f1-4aeb-990f-bedc9b3fadfa}, !- Handle
|
55
55
|
EV Charging Default 1, !- Name
|
56
|
-
{
|
56
|
+
{f4a971c0-7bb6-4f09-b54b-593ad91e646f}, !- Schedule Type Limits Name
|
57
57
|
, !- Interpolate to Timestep
|
58
58
|
8, !- Hour 1
|
59
|
-
|
59
|
+
8, !- Minute 1
|
60
60
|
0, !- Value Until Time 1
|
61
61
|
8, !- Hour 2
|
62
|
-
|
62
|
+
19, !- Minute 2
|
63
63
|
0.333333333333333, !- Value Until Time 2
|
64
64
|
8, !- Hour 3
|
65
|
-
|
65
|
+
20, !- Minute 3
|
66
66
|
0.666666666666667, !- Value Until Time 3
|
67
|
-
|
68
|
-
|
67
|
+
14, !- Hour 4
|
68
|
+
34, !- Minute 4
|
69
69
|
1, !- Value Until Time 4
|
70
|
-
|
71
|
-
|
70
|
+
14, !- Hour 5
|
71
|
+
39, !- Minute 5
|
72
72
|
0.666666666666667, !- Value Until Time 5
|
73
|
-
|
74
|
-
|
73
|
+
16, !- Hour 6
|
74
|
+
21, !- Minute 6
|
75
75
|
0.333333333333333, !- Value Until Time 6
|
76
76
|
24, !- Hour 7
|
77
77
|
0, !- Minute 7
|
78
|
-
|
78
|
+
-1.2335811384724e-16; !- Value Until Time 7
|
79
79
|
|
80
80
|
OS:Schedule:Rule,
|
81
|
-
{
|
81
|
+
{a4dc317b-a25b-488b-8b39-3a45a92069f4}, !- Handle
|
82
82
|
EV Charging Power Sunday, !- Name
|
83
|
-
{
|
83
|
+
{5e51be1d-47a4-45a6-831f-69e2b394fc9c}, !- Schedule Ruleset Name
|
84
84
|
0, !- Rule Order
|
85
|
-
{
|
85
|
+
{41604025-03c3-4af2-8370-f6ac84c8e3b7}, !- Day Schedule Name
|
86
86
|
Yes; !- Apply Sunday
|
87
87
|
|
88
88
|
OS:Schedule:Day,
|
89
|
-
{
|
89
|
+
{41604025-03c3-4af2-8370-f6ac84c8e3b7}, !- Handle
|
90
90
|
EV Charging Default 2, !- Name
|
91
|
-
{
|
91
|
+
{f4a971c0-7bb6-4f09-b54b-593ad91e646f}, !- Schedule Type Limits Name
|
92
92
|
, !- Interpolate to Timestep
|
93
93
|
8, !- Hour 1
|
94
|
-
|
94
|
+
8, !- Minute 1
|
95
95
|
0, !- Value Until Time 1
|
96
96
|
8, !- Hour 2
|
97
|
-
|
97
|
+
19, !- Minute 2
|
98
98
|
0.333333333333333, !- Value Until Time 2
|
99
99
|
8, !- Hour 3
|
100
|
-
|
100
|
+
20, !- Minute 3
|
101
101
|
0.666666666666667, !- Value Until Time 3
|
102
|
-
|
103
|
-
|
102
|
+
14, !- Hour 4
|
103
|
+
34, !- Minute 4
|
104
104
|
1, !- Value Until Time 4
|
105
|
-
|
106
|
-
|
105
|
+
14, !- Hour 5
|
106
|
+
39, !- Minute 5
|
107
107
|
0.666666666666667, !- Value Until Time 5
|
108
|
-
|
109
|
-
|
108
|
+
16, !- Hour 6
|
109
|
+
21, !- Minute 6
|
110
110
|
0.333333333333333, !- Value Until Time 6
|
111
111
|
24, !- Hour 7
|
112
112
|
0, !- Minute 7
|
113
|
-
|
113
|
+
-1.2335811384724e-16; !- Value Until Time 7
|
114
114
|
|
115
115
|
OS:Exterior:FuelEquipment:Definition,
|
116
|
-
{
|
117
|
-
|
118
|
-
|
116
|
+
{1c7425ee-61c5-4424-a7a2-680290c07aab}, !- Handle
|
117
|
+
28799.999999999996 w EV Charging Definition, !- Name
|
118
|
+
28800; !- Design Level {W}
|
119
119
|
|
120
120
|
OS:Exterior:FuelEquipment,
|
121
|
-
{
|
122
|
-
|
123
|
-
{
|
124
|
-
{
|
121
|
+
{31a42d85-55dc-43ec-b0a8-beace3568b41}, !- Handle
|
122
|
+
28799.999999999996 w EV Charger, !- Name
|
123
|
+
{1c7425ee-61c5-4424-a7a2-680290c07aab}, !- Exterior Fuel Equipment Definition Name
|
124
|
+
{5e51be1d-47a4-45a6-831f-69e2b394fc9c}, !- Schedule Name
|
125
125
|
Electricity, !- Fuel Use Type
|
126
126
|
, !- Multiplier
|
127
127
|
Electric Vehicles; !- End-Use Subcategory
|
128
128
|
|
129
129
|
OS:ScheduleTypeLimits,
|
130
|
-
{
|
130
|
+
{f4a971c0-7bb6-4f09-b54b-593ad91e646f}, !- Handle
|
131
131
|
Fractional, !- Name
|
132
132
|
0, !- Lower Limit Value
|
133
133
|
1, !- Upper Limit Value
|
@@ -477,9 +477,9 @@ class AddChilledWaterStorageTank < OpenStudio::Measure::ModelMeasure
|
|
477
477
|
# return false
|
478
478
|
# end
|
479
479
|
run_output_path = runner.getPathArgumentValue('run_output_path', user_arguments)
|
480
|
-
Dir.mkdir(run_output_path.to_s) unless File.
|
480
|
+
Dir.mkdir(run_output_path.to_s) unless File.exist?(run_output_path.to_s)
|
481
481
|
sizing_output_path = File.expand_path(File.join(run_output_path.to_s, 'sizing_run'))
|
482
|
-
Dir.mkdir(sizing_output_path.to_s) unless File.
|
482
|
+
Dir.mkdir(sizing_output_path.to_s) unless File.exist?(sizing_output_path.to_s)
|
483
483
|
|
484
484
|
# Change the simulation to only run the sizing days
|
485
485
|
sim_control = model.getSimulationControl
|
@@ -7,11 +7,11 @@
|
|
7
7
|
# http://nrel.github.io/OpenStudio-user-documentation/reference/measure_writing_guide/
|
8
8
|
|
9
9
|
# start the measure
|
10
|
-
require 'openstudio/extension/core/os_lib_helper_methods'
|
11
|
-
require 'openstudio/extension/core/os_lib_schedules'
|
10
|
+
# require 'openstudio/extension/core/os_lib_helper_methods'
|
11
|
+
# require 'openstudio/extension/core/os_lib_schedules'
|
12
|
+
require 'openstudio-standards'
|
12
13
|
class AddExteriorBlindsAndControl < OpenStudio::Measure::ModelMeasure
|
13
|
-
|
14
|
-
include OsLib_Schedules
|
14
|
+
|
15
15
|
# human readable name
|
16
16
|
def name
|
17
17
|
# Measure name should be the title case of the class name.
|
@@ -142,7 +142,8 @@ class AddExteriorBlindsAndControl < OpenStudio::Measure::ModelMeasure
|
|
142
142
|
'default_day' => ["default day"] + normal_day_data_pairs,
|
143
143
|
'rules' => [['Adjusted days', "#{start_month}/#{start_day}-#{end_month}/#{end_day}",
|
144
144
|
'Sun/Mon/Tue/Wed/Thu/Fri/Sat'] + adjusted_day_data_pairs] }
|
145
|
-
global_shading_schedule = OsLib_Schedules.createComplexSchedule(model, options)
|
145
|
+
# global_shading_schedule = OsLib_Schedules.createComplexSchedule(model, options)
|
146
|
+
global_shading_schedule = OpenstudioStandards::Schedules.create_complex_schedule(model, options)
|
146
147
|
runner.registerInfo("A new schedule 'Exterior blinds schedule' has been created for new shading control objects.")
|
147
148
|
end
|
148
149
|
unless space_shading_control
|
@@ -9,11 +9,10 @@
|
|
9
9
|
# http://nrel.github.io/OpenStudio-user-documentation/reference/measure_writing_guide/
|
10
10
|
|
11
11
|
# start the measure
|
12
|
-
require 'openstudio/extension/core/os_lib_helper_methods'
|
13
|
-
require 'openstudio/extension/core/os_lib_schedules'
|
12
|
+
# require 'openstudio/extension/core/os_lib_helper_methods'
|
13
|
+
# require 'openstudio/extension/core/os_lib_schedules'
|
14
|
+
require 'openstudio-standards'
|
14
15
|
class AddInteriorBlindsAndControl < OpenStudio::Measure::ModelMeasure
|
15
|
-
include OsLib_HelperMethods
|
16
|
-
include OsLib_Schedules
|
17
16
|
# human readable name
|
18
17
|
def name
|
19
18
|
# Measure name should be the title case of the class name.
|
@@ -144,7 +143,8 @@ class AddInteriorBlindsAndControl < OpenStudio::Measure::ModelMeasure
|
|
144
143
|
'default_day' => ["default day"] + normal_day_data_pairs,
|
145
144
|
'rules' => [['Adjusted days', "#{start_month}/#{start_day}-#{end_month}/#{end_day}",
|
146
145
|
'Sun/Mon/Tue/Wed/Thu/Fri/Sat'] + adjusted_day_data_pairs] }
|
147
|
-
global_shading_schedule = OsLib_Schedules.createComplexSchedule(model, options)
|
146
|
+
# global_shading_schedule = OsLib_Schedules.createComplexSchedule(model, options)
|
147
|
+
global_shading_schedule = OpenstudioStandards::Schedules.create_complex_schedule(model, options)
|
148
148
|
runner.registerInfo("A new schedule 'Interior blinds schedule' has been created for new shading control objects.")
|
149
149
|
end
|
150
150
|
unless space_shading_control
|
@@ -7,9 +7,10 @@
|
|
7
7
|
# http://nrel.github.io/OpenStudio-user-documentation/measures/measure_writing_guide/
|
8
8
|
|
9
9
|
# load OpenStudio measure libraries from openstudio-extension gem
|
10
|
-
require 'openstudio-extension'
|
11
|
-
require 'openstudio/extension/core/os_lib_helper_methods'
|
12
|
-
require 'openstudio/extension/core/os_lib_schedules'
|
10
|
+
# require 'openstudio-extension'
|
11
|
+
# require 'openstudio/extension/core/os_lib_helper_methods'
|
12
|
+
# require 'openstudio/extension/core/os_lib_schedules'
|
13
|
+
require 'openstudio-standards'
|
13
14
|
|
14
15
|
# start the measure
|
15
16
|
# this measure originally came from BCL (https://bcl.nrel.gov/results/?fq=bundle:measure&fq=measure_tags:Onsite%20Power%20Generation.Photovoltaic&show_rows=25)
|
@@ -69,8 +70,9 @@ class AddRooftopPV < OpenStudio::Measure::ModelMeasure
|
|
69
70
|
end
|
70
71
|
|
71
72
|
# assign the user inputs to variables
|
72
|
-
args = OsLib_HelperMethods.createRunVariables(runner, model, user_arguments, arguments(model))
|
73
|
-
|
73
|
+
# args = OsLib_HelperMethods.createRunVariables(runner, model, user_arguments, arguments(model))
|
74
|
+
args = runner. (arguments(model), user_arguments)
|
75
|
+
unless args then return false end
|
74
76
|
|
75
77
|
# check expected values of double arguments
|
76
78
|
# todo - not sure why this isn't working. Elsewhere it is used on E+ and reporting measures.
|
@@ -87,7 +89,7 @@ class AddRooftopPV < OpenStudio::Measure::ModelMeasure
|
|
87
89
|
|
88
90
|
# create the inverter
|
89
91
|
inverter = OpenStudio::Model::ElectricLoadCenterInverterSimple.new(model)
|
90
|
-
inverter.setInverterEfficiency(args[
|
92
|
+
inverter.setInverterEfficiency(args[:inverter_efficiency])
|
91
93
|
runner.registerInfo("Created inverter with efficiency of #{inverter.inverterEfficiency}")
|
92
94
|
|
93
95
|
# create the distribution system
|
@@ -95,14 +97,15 @@ class AddRooftopPV < OpenStudio::Measure::ModelMeasure
|
|
95
97
|
elcd.setInverter(inverter)
|
96
98
|
|
97
99
|
# create shared shading transmittance schedule
|
98
|
-
target_transmittance = 1.0 - args[
|
100
|
+
target_transmittance = 1.0 - args[:fraction_of_surface].to_f
|
99
101
|
inputs = {
|
100
102
|
'name' => 'PV Shading Transmittance Schedule',
|
101
103
|
'winterTimeValuePairs' => { 24.0 => target_transmittance },
|
102
104
|
'summerTimeValuePairs' => { 24.0 => target_transmittance },
|
103
105
|
'defaultTimeValuePairs' => { 24.0 => target_transmittance }
|
104
106
|
}
|
105
|
-
pv_shading_transmittance_schedule = OsLib_Schedules.createSimpleSchedule(model, inputs)
|
107
|
+
# pv_shading_transmittance_schedule = OsLib_Schedules.createSimpleSchedule(model, inputs)
|
108
|
+
pv_shading_transmittance_schedule = OpenstudioStandards::Schedules.create_simple_schedule(model, inputs)
|
106
109
|
runner.registerInfo("Created transmittance schedule for PV shading surfaces with constant value of #{target_transmittance}")
|
107
110
|
|
108
111
|
model.getSurfaces.each do |surface|
|
@@ -129,8 +132,8 @@ class AddRooftopPV < OpenStudio::Measure::ModelMeasure
|
|
129
132
|
panel = OpenStudio::Model::GeneratorPhotovoltaic.simple(model)
|
130
133
|
panel.setSurface(shading_surface)
|
131
134
|
performance = panel.photovoltaicPerformance.to_PhotovoltaicPerformanceSimple.get
|
132
|
-
performance.setFractionOfSurfaceAreaWithActiveSolarCells(args[
|
133
|
-
performance.setFixedEfficiency(args[
|
135
|
+
performance.setFractionOfSurfaceAreaWithActiveSolarCells(args[:fraction_of_surface])
|
136
|
+
performance.setFixedEfficiency(args[:cell_efficiency])
|
134
137
|
|
135
138
|
# connect panel to electric load center distribution
|
136
139
|
elcd.addGenerator(panel)
|
@@ -9,11 +9,10 @@
|
|
9
9
|
# http://nrel.github.io/OpenStudio-user-documentation/reference/measure_writing_guide/
|
10
10
|
|
11
11
|
# start the measure
|
12
|
-
require 'openstudio/extension/core/os_lib_helper_methods'
|
13
|
-
require 'openstudio/extension/core/os_lib_schedules'
|
12
|
+
# require 'openstudio/extension/core/os_lib_helper_methods'
|
13
|
+
# require 'openstudio/extension/core/os_lib_schedules'
|
14
|
+
require 'openstudio-standards'
|
14
15
|
class AverageVentilationForPeakHours < OpenStudio::Measure::ModelMeasure
|
15
|
-
include OsLib_HelperMethods
|
16
|
-
include OsLib_Schedules
|
17
16
|
# human readable name
|
18
17
|
def name
|
19
18
|
return "Average Ventilation for Peak Hours"
|
@@ -188,7 +187,8 @@ class AverageVentilationForPeakHours < OpenStudio::Measure::ModelMeasure
|
|
188
187
|
'default_day' => ["default day"] + normal_day_data_pairs,
|
189
188
|
'rules' => [['Adjusted days', "#{start_month1}/#{start_day1}-#{end_month1}/#{end_day1}",
|
190
189
|
'Sun/Mon/Tue/Wed/Thu/Fri/Sat'] + adjusted_day_data_pairs] }
|
191
|
-
new_oa_sch = OsLib_Schedules.createComplexSchedule(model, options)
|
190
|
+
# new_oa_sch = OsLib_Schedules.createComplexSchedule(model, options)
|
191
|
+
new_oa_sch = OpenstudioStandards::Schedules.create_complex_schedule(model, options)
|
192
192
|
outdoor_air_object.setOutdoorAirFlowRateFractionSchedule(new_oa_sch)
|
193
193
|
else
|
194
194
|
if schedules.key?(oa_sch.get.name.to_s)
|
@@ -66,9 +66,9 @@ class EnableOccupancyDrivenLighting < OpenStudio::Measure::ModelMeasure
|
|
66
66
|
end
|
67
67
|
runner.registerInfo("Pre-run output path: #{run_output_path}")
|
68
68
|
|
69
|
-
Dir.mkdir(run_output_path) unless File.
|
69
|
+
Dir.mkdir(run_output_path) unless File.exist?(run_output_path)
|
70
70
|
prerun_dir = File.join(run_output_path, 'pre-run')
|
71
|
-
Dir.mkdir(prerun_dir) unless File.
|
71
|
+
Dir.mkdir(prerun_dir) unless File.exist?(prerun_dir)
|
72
72
|
prerun_osw_path = File.join(prerun_dir, 'sizing.osm')
|
73
73
|
model.save(prerun_osw_path, true) # true is overwrite
|
74
74
|
|
data/lib/openstudio/geb/run.rb
CHANGED
@@ -74,6 +74,8 @@ module OpenStudio
|
|
74
74
|
def apply_measures(osw_result_folder)
|
75
75
|
# create osw_file
|
76
76
|
osw_path = File.join(osw_result_folder, "geb.osw")
|
77
|
+
# get the folder of measures
|
78
|
+
measures_path = File.expand_path("../../../measures/", __FILE__ )
|
77
79
|
|
78
80
|
steps = []
|
79
81
|
# measure_dict: hash of measures and their arguments => {measure_name: arguments}
|
@@ -82,7 +84,8 @@ module OpenStudio
|
|
82
84
|
report_measures = {}
|
83
85
|
@measure_dict.each_pair do |m_name, para_dict|
|
84
86
|
# get all EnergyPlus and Reporting measures out and remove original ones
|
85
|
-
|
87
|
+
# now measure_dir_name uses folder name rather than absolute path, adding "measure_paths" to the osw file
|
88
|
+
File.open("#{measures_path}/#{para_dict['measure_dir_name']}/measure.rb", 'r') do |file|
|
86
89
|
file.each_line do |line|
|
87
90
|
if line =~ /class.+EnergyPlusMeasure/
|
88
91
|
energyplus_measures[m_name] = @measure_dict[m_name]
|
@@ -119,6 +122,7 @@ module OpenStudio
|
|
119
122
|
end
|
120
123
|
|
121
124
|
osw = {}
|
125
|
+
osw["measure_paths"] = [measures_path]
|
122
126
|
osw["weather_file"] = @weather_file_path
|
123
127
|
osw["seed_file"] = @baseline_dir_str
|
124
128
|
osw["steps"] = steps
|
@@ -52,7 +52,8 @@ def list_all_geb_measures
|
|
52
52
|
measures.each do |measure|
|
53
53
|
measure_name = measure.split('/')[-2]
|
54
54
|
measure_list[measure_name] = {}
|
55
|
-
|
55
|
+
# now measure_dir_name uses folder name rather than absolute path, adding "measure_paths" to the osw file
|
56
|
+
measure_list[measure_name]['measure_dir_name'] = File.basename(File.dirname(measure)) # get just this folder name
|
56
57
|
end
|
57
58
|
|
58
59
|
=begin
|
@@ -114,7 +115,7 @@ end
|
|
114
115
|
def postprocess_out_osw(outdir)
|
115
116
|
|
116
117
|
out_osw = File.join(outdir, 'out.osw')
|
117
|
-
raise "Cannot find file #{out_osw}" if !File.
|
118
|
+
raise "Cannot find file #{out_osw}" if !File.exist?(out_osw)
|
118
119
|
|
119
120
|
result_osw = nil
|
120
121
|
File.open(out_osw, 'r') do |f|
|
data/openstudio-geb.gemspec
CHANGED
@@ -22,11 +22,14 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
23
|
spec.require_paths = ['lib']
|
24
24
|
|
25
|
-
spec.
|
25
|
+
spec.required_ruby_version = '~> 3.2.2'
|
26
|
+
|
27
|
+
spec.add_dependency 'openstudio-extension', '~> 0.8.0'
|
28
|
+
spec.add_dependency 'openstudio-standards', '0.6.1'
|
29
|
+
|
30
|
+
spec.add_development_dependency 'bundler', '~> 2.4.10'
|
26
31
|
spec.add_development_dependency 'rake', '~> 13.0'
|
27
|
-
spec.add_development_dependency 'rspec', '3.
|
28
|
-
spec.add_development_dependency 'rubocop', '
|
32
|
+
spec.add_development_dependency 'rspec', '~> 3.9'
|
33
|
+
spec.add_development_dependency 'rubocop', '1.50'
|
29
34
|
|
30
|
-
spec.add_dependency 'openstudio-extension', '~> 0.7.0'
|
31
|
-
spec.add_dependency 'openstudio-standards', '~> 0.5.0'
|
32
35
|
end
|