honeybee-openstudio 1.8.1 → 1.8.2

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.
Files changed (70) hide show
  1. checksums.yaml +5 -5
  2. data/.coveralls.yml +1 -1
  3. data/.gitignore +32 -32
  4. data/.releaserc.json +7 -7
  5. data/.travis.yml +42 -41
  6. data/Gemfile +18 -18
  7. data/LICENSE.md +23 -23
  8. data/README.md +95 -95
  9. data/Rakefile +20 -20
  10. data/doc_templates/LICENSE.md +23 -23
  11. data/doc_templates/copyright_erb.txt +31 -31
  12. data/doc_templates/copyright_js.txt +4 -4
  13. data/doc_templates/copyright_ruby.txt +29 -29
  14. data/honeybee-openstudio.gemspec +35 -35
  15. data/lib/files/Honeybee.rb +112 -112
  16. data/lib/files/honeybee_workflow.osw +47 -47
  17. data/lib/files/urbanopt_Gemfile +32 -32
  18. data/lib/from_honeybee.rb +86 -86
  19. data/lib/from_honeybee/_openapi/model.json +8126 -8126
  20. data/lib/from_honeybee/_openapi/simulation-parameter.json +842 -842
  21. data/lib/from_honeybee/construction/air.rb +64 -64
  22. data/lib/from_honeybee/construction/opaque.rb +76 -76
  23. data/lib/from_honeybee/construction/shade.rb +107 -107
  24. data/lib/from_honeybee/construction/window.rb +80 -80
  25. data/lib/from_honeybee/construction_set.rb +278 -278
  26. data/lib/from_honeybee/extension.rb +109 -109
  27. data/lib/from_honeybee/geometry/aperture.rb +167 -167
  28. data/lib/from_honeybee/geometry/door.rb +160 -160
  29. data/lib/from_honeybee/geometry/face.rb +163 -163
  30. data/lib/from_honeybee/geometry/room.rb +392 -392
  31. data/lib/from_honeybee/geometry/shade.rb +89 -89
  32. data/lib/from_honeybee/hvac/ideal_air.rb +150 -150
  33. data/lib/from_honeybee/load/electric_equipment.rb +95 -95
  34. data/lib/from_honeybee/load/gas_equipment.rb +97 -97
  35. data/lib/from_honeybee/load/infiltration.rb +94 -94
  36. data/lib/from_honeybee/load/lighting.rb +98 -98
  37. data/lib/from_honeybee/load/people.rb +99 -99
  38. data/lib/from_honeybee/load/setpoint_humidistat.rb +74 -74
  39. data/lib/from_honeybee/load/setpoint_thermostat.rb +71 -71
  40. data/lib/from_honeybee/load/ventilation.rb +95 -95
  41. data/lib/from_honeybee/material/opaque.rb +94 -94
  42. data/lib/from_honeybee/material/opaque_no_mass.rb +94 -94
  43. data/lib/from_honeybee/material/window_blind.rb +238 -238
  44. data/lib/from_honeybee/material/window_gas.rb +76 -76
  45. data/lib/from_honeybee/material/window_gas_custom.rb +118 -118
  46. data/lib/from_honeybee/material/window_gas_mixture.rb +79 -79
  47. data/lib/from_honeybee/material/window_glazing.rb +166 -166
  48. data/lib/from_honeybee/material/window_shade.rb +160 -160
  49. data/lib/from_honeybee/material/window_simpleglazsys.rb +73 -73
  50. data/lib/from_honeybee/model.rb +434 -434
  51. data/lib/from_honeybee/model_object.rb +110 -110
  52. data/lib/from_honeybee/program_type.rb +124 -124
  53. data/lib/from_honeybee/schedule/fixed_interval.rb +115 -115
  54. data/lib/from_honeybee/schedule/ruleset.rb +164 -164
  55. data/lib/from_honeybee/schedule/type_limit.rb +88 -88
  56. data/lib/from_honeybee/simulation/designday.rb +105 -105
  57. data/lib/from_honeybee/simulation/extension.rb +46 -46
  58. data/lib/from_honeybee/simulation/parameter.rb +277 -277
  59. data/lib/from_honeybee/version.rb +34 -34
  60. data/lib/measures/from_honeybee_model/LICENSE.md +26 -26
  61. data/lib/measures/from_honeybee_model/README.md +32 -32
  62. data/lib/measures/from_honeybee_model/measure.rb +91 -91
  63. data/lib/measures/from_honeybee_model/measure.xml +103 -103
  64. data/lib/measures/from_honeybee_model/tests/from_honeybee_model_test.rb +126 -126
  65. data/lib/measures/from_honeybee_simulation_parameter/LICENSE.md +26 -26
  66. data/lib/measures/from_honeybee_simulation_parameter/README.md +32 -32
  67. data/lib/measures/from_honeybee_simulation_parameter/measure.rb +95 -95
  68. data/lib/measures/from_honeybee_simulation_parameter/measure.xml +91 -91
  69. data/lib/measures/from_honeybee_simulation_parameter/tests/from_honeybee_simulation_parameter_test.rb +109 -109
  70. metadata +2 -2
@@ -1,115 +1,115 @@
1
- # *******************************************************************************
2
- # Honeybee OpenStudio Gem, Copyright (c) 2020, Alliance for Sustainable
3
- # Energy, LLC, Ladybug Tools LLC and other contributors. All rights reserved.
4
- #
5
- # Redistribution and use in source and binary forms, with or without
6
- # modification, are permitted provided that the following conditions are met:
7
- #
8
- # (1) Redistributions of source code must retain the above copyright notice,
9
- # this list of conditions and the following disclaimer.
10
- #
11
- # (2) Redistributions in binary form must reproduce the above copyright notice,
12
- # this list of conditions and the following disclaimer in the documentation
13
- # and/or other materials provided with the distribution.
14
- #
15
- # (3) Neither the name of the copyright holder nor the names of any contributors
16
- # may be used to endorse or promote products derived from this software without
17
- # specific prior written permission from the respective party.
18
- #
19
- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS
20
- # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21
- # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
- # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE
23
- # UNITED STATES GOVERNMENT, OR THE UNITED STATES DEPARTMENT OF ENERGY, NOR ANY OF
24
- # THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25
- # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
26
- # OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
- # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28
- # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
- # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
- # *******************************************************************************
31
-
32
- require 'from_honeybee/extension'
33
- require 'from_honeybee/model_object'
34
-
35
- module FromHoneybee
36
- class ScheduleFixedIntervalAbridged < ModelObject
37
- attr_reader :errors, :warnings
38
-
39
- def initialize(hash = {})
40
- super(hash)
41
-
42
- raise "Incorrect model type '#{@type}'" unless @type == 'ScheduleFixedIntervalAbridged'
43
- end
44
-
45
- def defaults
46
- @@schema[:components][:schemas][:ScheduleFixedIntervalAbridged][:properties]
47
- end
48
-
49
- def find_existing_openstudio_object(openstudio_model)
50
- model_schedule = openstudio_model.getScheduleFixedIntervalByName(@hash[:identifier])
51
- return model_schedule.get unless model_schedule.empty?
52
- nil
53
- end
54
-
55
- def to_openstudio(openstudio_model)
56
- # create the new schedule
57
- os_fi_schedule = OpenStudio::Model::ScheduleFixedInterval.new(openstudio_model)
58
- os_fi_schedule.setName(@hash[:identifier])
59
-
60
- # assign start date
61
- if @hash[:start_date]
62
- os_fi_schedule.setStartMonth(@hash[:start_date][0])
63
- os_fi_schedule.setStartDay(@hash[:start_date][1])
64
- else
65
- os_fi_schedule.setStartMonth(defaults[:start_date][:default][0])
66
- os_fi_schedule.setStartDay(defaults[:start_date][:default][1])
67
- end
68
-
69
- # assign the interpolate value
70
- unless @hash[:interpolate].nil?
71
- os_fi_schedule.setInterpolatetoTimestep(@hash[:interpolate])
72
- else
73
- os_fi_schedule.setInterpolatetoTimestep(defaults[:interpolate][:default])
74
- end
75
-
76
- # assign the schedule type limit
77
- if @hash[:schedule_type_limit]
78
- schedule_type_limit = openstudio_model.getScheduleTypeLimitsByName(@hash[:schedule_type_limit])
79
- unless schedule_type_limit.empty?
80
- schedule_type_limit_object = schedule_type_limit.get
81
- os_fi_schedule.setScheduleTypeLimits(schedule_type_limit_object)
82
- end
83
- end
84
-
85
- # assign the timestep
86
- if @hash[:timestep]
87
- timestep = @hash[:timestep]
88
- interval_length = 60 / timestep
89
- os_fi_schedule.setIntervalLength(interval_length)
90
- else
91
- timestep = defaults[:timestep][:default]
92
- interval_length = 60 / timestep
93
- os_fi_schedule.setIntervalLength(interval_length)
94
- end
95
- openstudio_interval_length = OpenStudio::Time.new(0, 0, interval_length)
96
-
97
- # assign the values as a timeseries
98
- year_description = openstudio_model.getYearDescription
99
-
100
- # set is leap year = true in case start date has 3 integers
101
- if @hash[:start_date][2]
102
- year_description.setIsLeapYear(true)
103
- end
104
-
105
- start_date = year_description.makeDate(@hash[:start_date][0], @hash[:start_date][1])
106
-
107
- values = @hash[:values]
108
- timeseries = OpenStudio::TimeSeries.new(start_date, openstudio_interval_length, OpenStudio.createVector(values), '')
109
- os_fi_schedule.setTimeSeries(timeseries)
110
-
111
- os_fi_schedule
112
- end
113
-
114
- end #ScheduleFixedIntervalAbridged
115
- end #FromHoneybee
1
+ # *******************************************************************************
2
+ # Honeybee OpenStudio Gem, Copyright (c) 2020, Alliance for Sustainable
3
+ # Energy, LLC, Ladybug Tools LLC and other contributors. All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # (1) Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # (2) Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # (3) Neither the name of the copyright holder nor the names of any contributors
16
+ # may be used to endorse or promote products derived from this software without
17
+ # specific prior written permission from the respective party.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS
20
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE
23
+ # UNITED STATES GOVERNMENT, OR THE UNITED STATES DEPARTMENT OF ENERGY, NOR ANY OF
24
+ # THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
26
+ # OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28
+ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
+ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+ # *******************************************************************************
31
+
32
+ require 'from_honeybee/extension'
33
+ require 'from_honeybee/model_object'
34
+
35
+ module FromHoneybee
36
+ class ScheduleFixedIntervalAbridged < ModelObject
37
+ attr_reader :errors, :warnings
38
+
39
+ def initialize(hash = {})
40
+ super(hash)
41
+
42
+ raise "Incorrect model type '#{@type}'" unless @type == 'ScheduleFixedIntervalAbridged'
43
+ end
44
+
45
+ def defaults
46
+ @@schema[:components][:schemas][:ScheduleFixedIntervalAbridged][:properties]
47
+ end
48
+
49
+ def find_existing_openstudio_object(openstudio_model)
50
+ model_schedule = openstudio_model.getScheduleFixedIntervalByName(@hash[:identifier])
51
+ return model_schedule.get unless model_schedule.empty?
52
+ nil
53
+ end
54
+
55
+ def to_openstudio(openstudio_model)
56
+ # create the new schedule
57
+ os_fi_schedule = OpenStudio::Model::ScheduleFixedInterval.new(openstudio_model)
58
+ os_fi_schedule.setName(@hash[:identifier])
59
+
60
+ # assign start date
61
+ if @hash[:start_date]
62
+ os_fi_schedule.setStartMonth(@hash[:start_date][0])
63
+ os_fi_schedule.setStartDay(@hash[:start_date][1])
64
+ else
65
+ os_fi_schedule.setStartMonth(defaults[:start_date][:default][0])
66
+ os_fi_schedule.setStartDay(defaults[:start_date][:default][1])
67
+ end
68
+
69
+ # assign the interpolate value
70
+ unless @hash[:interpolate].nil?
71
+ os_fi_schedule.setInterpolatetoTimestep(@hash[:interpolate])
72
+ else
73
+ os_fi_schedule.setInterpolatetoTimestep(defaults[:interpolate][:default])
74
+ end
75
+
76
+ # assign the schedule type limit
77
+ if @hash[:schedule_type_limit]
78
+ schedule_type_limit = openstudio_model.getScheduleTypeLimitsByName(@hash[:schedule_type_limit])
79
+ unless schedule_type_limit.empty?
80
+ schedule_type_limit_object = schedule_type_limit.get
81
+ os_fi_schedule.setScheduleTypeLimits(schedule_type_limit_object)
82
+ end
83
+ end
84
+
85
+ # assign the timestep
86
+ if @hash[:timestep]
87
+ timestep = @hash[:timestep]
88
+ interval_length = 60 / timestep
89
+ os_fi_schedule.setIntervalLength(interval_length)
90
+ else
91
+ timestep = defaults[:timestep][:default]
92
+ interval_length = 60 / timestep
93
+ os_fi_schedule.setIntervalLength(interval_length)
94
+ end
95
+ openstudio_interval_length = OpenStudio::Time.new(0, 0, interval_length)
96
+
97
+ # assign the values as a timeseries
98
+ year_description = openstudio_model.getYearDescription
99
+
100
+ # set is leap year = true in case start date has 3 integers
101
+ if @hash[:start_date][2]
102
+ year_description.setIsLeapYear(true)
103
+ end
104
+
105
+ start_date = year_description.makeDate(@hash[:start_date][0], @hash[:start_date][1])
106
+
107
+ values = @hash[:values]
108
+ timeseries = OpenStudio::TimeSeries.new(start_date, openstudio_interval_length, OpenStudio.createVector(values), '')
109
+ os_fi_schedule.setTimeSeries(timeseries)
110
+
111
+ os_fi_schedule
112
+ end
113
+
114
+ end #ScheduleFixedIntervalAbridged
115
+ end #FromHoneybee
@@ -1,164 +1,164 @@
1
- # *******************************************************************************
2
- # Honeybee OpenStudio Gem, Copyright (c) 2020, Alliance for Sustainable
3
- # Energy, LLC, Ladybug Tools LLC and other contributors. All rights reserved.
4
- #
5
- # Redistribution and use in source and binary forms, with or without
6
- # modification, are permitted provided that the following conditions are met:
7
- #
8
- # (1) Redistributions of source code must retain the above copyright notice,
9
- # this list of conditions and the following disclaimer.
10
- #
11
- # (2) Redistributions in binary form must reproduce the above copyright notice,
12
- # this list of conditions and the following disclaimer in the documentation
13
- # and/or other materials provided with the distribution.
14
- #
15
- # (3) Neither the name of the copyright holder nor the names of any contributors
16
- # may be used to endorse or promote products derived from this software without
17
- # specific prior written permission from the respective party.
18
- #
19
- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS
20
- # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21
- # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
- # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE
23
- # UNITED STATES GOVERNMENT, OR THE UNITED STATES DEPARTMENT OF ENERGY, NOR ANY OF
24
- # THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25
- # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
26
- # OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
- # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28
- # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
- # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
- # *******************************************************************************
31
-
32
- require 'from_honeybee/model_object'
33
-
34
- require 'openstudio'
35
-
36
- module FromHoneybee
37
- class ScheduleRulesetAbridged < ModelObject
38
- attr_reader :errors, :warnings
39
-
40
- def initialize(hash = {})
41
- super(hash)
42
-
43
- raise "Incorrect model type '#{@type}'" unless @type == 'ScheduleRulesetAbridged'
44
- end
45
-
46
- def defaults
47
- @@schema[:components][:schemas][:ScheduleRulesetAbridged][:properties]
48
- end
49
-
50
- def find_existing_openstudio_object(openstudio_model)
51
- object = openstudio_model.getScheduleRulesetByName(@hash[:identifier])
52
- return object.get if object.is_initialized
53
- nil
54
- end
55
-
56
- def to_openstudio(openstudio_model)
57
- # create openstudio schedule ruleset object
58
- os_sch_ruleset = OpenStudio::Model::ScheduleRuleset.new(openstudio_model)
59
- os_sch_ruleset.setName(@hash[:identifier])
60
-
61
- # loop through day schedules and create openstudio schedule day object
62
- @hash[:day_schedules].each do |day_schedule|
63
- day_schedule_new = OpenStudio::Model::ScheduleDay.new(openstudio_model)
64
- day_schedule_new.setName(day_schedule[:identifier])
65
- values_day_new = day_schedule[:values]
66
- times_day_new = day_schedule[:times]
67
- times_day_new.delete_at(0) # Remove [0, 0] from array at index 0.
68
- times_day_new.push([24, 0]) # Add [24, 0] at index 0
69
- values_day_new.each_index do |i|
70
- time_until = OpenStudio::Time.new(0, times_day_new[i][0], times_day_new[i][1], 0)
71
- day_schedule_new.addValue(time_until, values_day_new[i])
72
- end
73
- end
74
-
75
- # assign holiday schedule
76
- if @hash[:holiday_schedule]
77
- holiday_schedule = openstudio_model.getScheduleDayByName(@hash[:holiday_schedule])
78
- unless holiday_schedule.empty?
79
- holiday_schedule_object = holiday_schedule.get
80
- begin
81
- os_sch_ruleset.setHolidaySchedule(holiday_schedule_object)
82
- rescue NoMethodError
83
- end
84
- end
85
- end
86
-
87
- # assign summer design day schedule
88
- if @hash[:summer_designday_schedule]
89
- summer_design_day = openstudio_model.getScheduleDayByName(@hash[:summer_designday_schedule])
90
- unless summer_design_day.empty?
91
- summer_design_day_object = summer_design_day.get
92
- os_sch_ruleset.setSummerDesignDaySchedule(summer_design_day_object)
93
- end
94
- end
95
-
96
- # assign winter design day schedule
97
- if @hash[:winter_designday_schedule]
98
- winter_design_day = openstudio_model.getScheduleDayByName(@hash[:winter_designday_schedule])
99
- unless winter_design_day.empty?
100
- winter_design_day_object = winter_design_day.get
101
- os_sch_ruleset.setWinterDesignDaySchedule(winter_design_day_object)
102
- end
103
- end
104
-
105
- # assign default day schedule
106
- default_day_schedule = openstudio_model.getScheduleDayByName(@hash[:default_day_schedule])
107
- unless default_day_schedule.empty?
108
- default_day_schedule_object = default_day_schedule.get
109
- values = default_day_schedule_object.values
110
- times = default_day_schedule_object.times
111
- values.each_index do |i|
112
- os_sch_ruleset.defaultDaySchedule.addValue(times[i], values[i])
113
- end
114
- end
115
-
116
- # assign schedule type limit
117
- if @hash[:schedule_type_limit]
118
- schedule_type_limit = openstudio_model.getScheduleTypeLimitsByName(@hash[:schedule_type_limit])
119
- unless schedule_type_limit.empty?
120
- schedule_type_limit_object = schedule_type_limit.get
121
- os_sch_ruleset.setScheduleTypeLimits(schedule_type_limit_object)
122
- end
123
- end
124
-
125
- # assign schedule rules
126
- if @hash[:schedule_rules]
127
- @hash[:schedule_rules].each do |rule|
128
- openstudio_schedule_rule = OpenStudio::Model::ScheduleRule.new(os_sch_ruleset)
129
- openstudio_schedule_rule.setApplySunday(rule[:apply_sunday])
130
- openstudio_schedule_rule.setApplyMonday(rule[:apply_monday])
131
- openstudio_schedule_rule.setApplyTuesday(rule[:apply_tuesday])
132
- openstudio_schedule_rule.setApplyWednesday(rule[:apply_wednesday])
133
- openstudio_schedule_rule.setApplyThursday(rule[:apply_thursday])
134
- openstudio_schedule_rule.setApplyFriday(rule[:apply_friday])
135
- openstudio_schedule_rule.setApplySaturday(rule[:apply_saturday])
136
- year_description = openstudio_model.getYearDescription
137
- start_date = year_description.makeDate(rule[:start_date][0], rule[:start_date][1])
138
- end_date = year_description.makeDate(rule[:end_date][0], rule[:end_date][1])
139
- openstudio_schedule_rule.setStartDate(start_date)
140
- openstudio_schedule_rule.setEndDate(end_date)
141
-
142
- schedule_rule_day = openstudio_model.getScheduleDayByName(rule[:schedule_day])
143
- unless schedule_rule_day.empty?
144
- schedule_rule_day_object = schedule_rule_day.get
145
-
146
- values_day = schedule_rule_day_object.values
147
- times_day = schedule_rule_day_object.times
148
-
149
- values_day.each_index do |i|
150
- openstudio_schedule_rule.daySchedule.addValue(times_day[i], values_day[i])
151
- end
152
- end
153
-
154
- #set schedule rule index
155
- index = @hash[:schedule_rules].find_index(rule)
156
- os_sch_ruleset.setScheduleRuleIndex(openstudio_schedule_rule, index)
157
- end
158
- end
159
-
160
- os_sch_ruleset
161
- end
162
-
163
- end #ScheduleRulesetAbridged
164
- end #FromHoneybee
1
+ # *******************************************************************************
2
+ # Honeybee OpenStudio Gem, Copyright (c) 2020, Alliance for Sustainable
3
+ # Energy, LLC, Ladybug Tools LLC and other contributors. All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # (1) Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # (2) Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # (3) Neither the name of the copyright holder nor the names of any contributors
16
+ # may be used to endorse or promote products derived from this software without
17
+ # specific prior written permission from the respective party.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS
20
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE
23
+ # UNITED STATES GOVERNMENT, OR THE UNITED STATES DEPARTMENT OF ENERGY, NOR ANY OF
24
+ # THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
26
+ # OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28
+ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
+ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+ # *******************************************************************************
31
+
32
+ require 'from_honeybee/model_object'
33
+
34
+ require 'openstudio'
35
+
36
+ module FromHoneybee
37
+ class ScheduleRulesetAbridged < ModelObject
38
+ attr_reader :errors, :warnings
39
+
40
+ def initialize(hash = {})
41
+ super(hash)
42
+
43
+ raise "Incorrect model type '#{@type}'" unless @type == 'ScheduleRulesetAbridged'
44
+ end
45
+
46
+ def defaults
47
+ @@schema[:components][:schemas][:ScheduleRulesetAbridged][:properties]
48
+ end
49
+
50
+ def find_existing_openstudio_object(openstudio_model)
51
+ object = openstudio_model.getScheduleRulesetByName(@hash[:identifier])
52
+ return object.get if object.is_initialized
53
+ nil
54
+ end
55
+
56
+ def to_openstudio(openstudio_model)
57
+ # create openstudio schedule ruleset object
58
+ os_sch_ruleset = OpenStudio::Model::ScheduleRuleset.new(openstudio_model)
59
+ os_sch_ruleset.setName(@hash[:identifier])
60
+
61
+ # loop through day schedules and create openstudio schedule day object
62
+ @hash[:day_schedules].each do |day_schedule|
63
+ day_schedule_new = OpenStudio::Model::ScheduleDay.new(openstudio_model)
64
+ day_schedule_new.setName(day_schedule[:identifier])
65
+ values_day_new = day_schedule[:values]
66
+ times_day_new = day_schedule[:times]
67
+ times_day_new.delete_at(0) # Remove [0, 0] from array at index 0.
68
+ times_day_new.push([24, 0]) # Add [24, 0] at index 0
69
+ values_day_new.each_index do |i|
70
+ time_until = OpenStudio::Time.new(0, times_day_new[i][0], times_day_new[i][1], 0)
71
+ day_schedule_new.addValue(time_until, values_day_new[i])
72
+ end
73
+ end
74
+
75
+ # assign holiday schedule
76
+ if @hash[:holiday_schedule]
77
+ holiday_schedule = openstudio_model.getScheduleDayByName(@hash[:holiday_schedule])
78
+ unless holiday_schedule.empty?
79
+ holiday_schedule_object = holiday_schedule.get
80
+ begin
81
+ os_sch_ruleset.setHolidaySchedule(holiday_schedule_object)
82
+ rescue NoMethodError
83
+ end
84
+ end
85
+ end
86
+
87
+ # assign summer design day schedule
88
+ if @hash[:summer_designday_schedule]
89
+ summer_design_day = openstudio_model.getScheduleDayByName(@hash[:summer_designday_schedule])
90
+ unless summer_design_day.empty?
91
+ summer_design_day_object = summer_design_day.get
92
+ os_sch_ruleset.setSummerDesignDaySchedule(summer_design_day_object)
93
+ end
94
+ end
95
+
96
+ # assign winter design day schedule
97
+ if @hash[:winter_designday_schedule]
98
+ winter_design_day = openstudio_model.getScheduleDayByName(@hash[:winter_designday_schedule])
99
+ unless winter_design_day.empty?
100
+ winter_design_day_object = winter_design_day.get
101
+ os_sch_ruleset.setWinterDesignDaySchedule(winter_design_day_object)
102
+ end
103
+ end
104
+
105
+ # assign default day schedule
106
+ default_day_schedule = openstudio_model.getScheduleDayByName(@hash[:default_day_schedule])
107
+ unless default_day_schedule.empty?
108
+ default_day_schedule_object = default_day_schedule.get
109
+ values = default_day_schedule_object.values
110
+ times = default_day_schedule_object.times
111
+ values.each_index do |i|
112
+ os_sch_ruleset.defaultDaySchedule.addValue(times[i], values[i])
113
+ end
114
+ end
115
+
116
+ # assign schedule type limit
117
+ if @hash[:schedule_type_limit]
118
+ schedule_type_limit = openstudio_model.getScheduleTypeLimitsByName(@hash[:schedule_type_limit])
119
+ unless schedule_type_limit.empty?
120
+ schedule_type_limit_object = schedule_type_limit.get
121
+ os_sch_ruleset.setScheduleTypeLimits(schedule_type_limit_object)
122
+ end
123
+ end
124
+
125
+ # assign schedule rules
126
+ if @hash[:schedule_rules]
127
+ @hash[:schedule_rules].each do |rule|
128
+ openstudio_schedule_rule = OpenStudio::Model::ScheduleRule.new(os_sch_ruleset)
129
+ openstudio_schedule_rule.setApplySunday(rule[:apply_sunday])
130
+ openstudio_schedule_rule.setApplyMonday(rule[:apply_monday])
131
+ openstudio_schedule_rule.setApplyTuesday(rule[:apply_tuesday])
132
+ openstudio_schedule_rule.setApplyWednesday(rule[:apply_wednesday])
133
+ openstudio_schedule_rule.setApplyThursday(rule[:apply_thursday])
134
+ openstudio_schedule_rule.setApplyFriday(rule[:apply_friday])
135
+ openstudio_schedule_rule.setApplySaturday(rule[:apply_saturday])
136
+ year_description = openstudio_model.getYearDescription
137
+ start_date = year_description.makeDate(rule[:start_date][0], rule[:start_date][1])
138
+ end_date = year_description.makeDate(rule[:end_date][0], rule[:end_date][1])
139
+ openstudio_schedule_rule.setStartDate(start_date)
140
+ openstudio_schedule_rule.setEndDate(end_date)
141
+
142
+ schedule_rule_day = openstudio_model.getScheduleDayByName(rule[:schedule_day])
143
+ unless schedule_rule_day.empty?
144
+ schedule_rule_day_object = schedule_rule_day.get
145
+
146
+ values_day = schedule_rule_day_object.values
147
+ times_day = schedule_rule_day_object.times
148
+
149
+ values_day.each_index do |i|
150
+ openstudio_schedule_rule.daySchedule.addValue(times_day[i], values_day[i])
151
+ end
152
+ end
153
+
154
+ #set schedule rule index
155
+ index = @hash[:schedule_rules].find_index(rule)
156
+ os_sch_ruleset.setScheduleRuleIndex(openstudio_schedule_rule, index)
157
+ end
158
+ end
159
+
160
+ os_sch_ruleset
161
+ end
162
+
163
+ end #ScheduleRulesetAbridged
164
+ end #FromHoneybee