honeybee-openstudio 1.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +32 -0
  4. data/.releaserc.json +7 -0
  5. data/.travis.yml +41 -0
  6. data/Gemfile +18 -0
  7. data/LICENSE.md +23 -0
  8. data/README.md +95 -0
  9. data/Rakefile +21 -0
  10. data/doc_templates/LICENSE.md +23 -0
  11. data/doc_templates/copyright_erb.txt +32 -0
  12. data/doc_templates/copyright_js.txt +5 -0
  13. data/doc_templates/copyright_ruby.txt +30 -0
  14. data/honeybee-openstudio.gemspec +35 -0
  15. data/lib/files/Honeybee.rb +113 -0
  16. data/lib/files/honeybee_workflow.osw +48 -0
  17. data/lib/files/urbanopt_Gemfile +32 -0
  18. data/lib/from_honeybee.rb +86 -0
  19. data/lib/from_honeybee/_openapi/model.json +8127 -0
  20. data/lib/from_honeybee/_openapi/simulation-parameter.json +843 -0
  21. data/lib/from_honeybee/construction/air.rb +65 -0
  22. data/lib/from_honeybee/construction/opaque.rb +77 -0
  23. data/lib/from_honeybee/construction/shade.rb +108 -0
  24. data/lib/from_honeybee/construction/window.rb +80 -0
  25. data/lib/from_honeybee/construction_set.rb +278 -0
  26. data/lib/from_honeybee/extension.rb +109 -0
  27. data/lib/from_honeybee/geometry/aperture.rb +167 -0
  28. data/lib/from_honeybee/geometry/door.rb +160 -0
  29. data/lib/from_honeybee/geometry/face.rb +163 -0
  30. data/lib/from_honeybee/geometry/room.rb +392 -0
  31. data/lib/from_honeybee/geometry/shade.rb +89 -0
  32. data/lib/from_honeybee/hvac/ideal_air.rb +150 -0
  33. data/lib/from_honeybee/load/electric_equipment.rb +96 -0
  34. data/lib/from_honeybee/load/gas_equipment.rb +97 -0
  35. data/lib/from_honeybee/load/infiltration.rb +95 -0
  36. data/lib/from_honeybee/load/lighting.rb +98 -0
  37. data/lib/from_honeybee/load/people.rb +100 -0
  38. data/lib/from_honeybee/load/setpoint_humidistat.rb +75 -0
  39. data/lib/from_honeybee/load/setpoint_thermostat.rb +71 -0
  40. data/lib/from_honeybee/load/ventilation.rb +96 -0
  41. data/lib/from_honeybee/material/opaque.rb +94 -0
  42. data/lib/from_honeybee/material/opaque_no_mass.rb +94 -0
  43. data/lib/from_honeybee/material/window_blind.rb +238 -0
  44. data/lib/from_honeybee/material/window_gas.rb +76 -0
  45. data/lib/from_honeybee/material/window_gas_custom.rb +118 -0
  46. data/lib/from_honeybee/material/window_gas_mixture.rb +79 -0
  47. data/lib/from_honeybee/material/window_glazing.rb +166 -0
  48. data/lib/from_honeybee/material/window_shade.rb +160 -0
  49. data/lib/from_honeybee/material/window_simpleglazsys.rb +73 -0
  50. data/lib/from_honeybee/model.rb +434 -0
  51. data/lib/from_honeybee/model_object.rb +110 -0
  52. data/lib/from_honeybee/program_type.rb +124 -0
  53. data/lib/from_honeybee/schedule/fixed_interval.rb +115 -0
  54. data/lib/from_honeybee/schedule/ruleset.rb +164 -0
  55. data/lib/from_honeybee/schedule/type_limit.rb +88 -0
  56. data/lib/from_honeybee/simulation/designday.rb +105 -0
  57. data/lib/from_honeybee/simulation/extension.rb +46 -0
  58. data/lib/from_honeybee/simulation/parameter.rb +277 -0
  59. data/lib/from_honeybee/version.rb +34 -0
  60. data/lib/measures/.gitkeep +0 -0
  61. data/lib/measures/from_honeybee_model/LICENSE.md +27 -0
  62. data/lib/measures/from_honeybee_model/README.md +32 -0
  63. data/lib/measures/from_honeybee_model/measure.rb +91 -0
  64. data/lib/measures/from_honeybee_model/measure.xml +103 -0
  65. data/lib/measures/from_honeybee_model/tests/from_honeybee_model_test.rb +126 -0
  66. data/lib/measures/from_honeybee_simulation_parameter/LICENSE.md +27 -0
  67. data/lib/measures/from_honeybee_simulation_parameter/README.md +32 -0
  68. data/lib/measures/from_honeybee_simulation_parameter/measure.rb +95 -0
  69. data/lib/measures/from_honeybee_simulation_parameter/measure.xml +91 -0
  70. data/lib/measures/from_honeybee_simulation_parameter/tests/from_honeybee_simulation_parameter_test.rb +109 -0
  71. metadata +243 -0
@@ -0,0 +1,110 @@
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 'openstudio'
33
+
34
+ module FromHoneybee
35
+ class ModelObject
36
+ # Base class from which all other ojbects in this module inherit.
37
+ # Attributes and methods of this class should be overwritten in each inheriting object.
38
+
39
+ attr_reader :errors, :warnings
40
+
41
+ def method_missing(sym, *args)
42
+ name = sym.to_s
43
+ aname = name.sub('=', '')
44
+ asym = aname.to_sym
45
+ is_getter = args.empty? && @hash.key?(asym)
46
+ is_setter = (name != aname) && (args.size == 1) && @hash.key?(asym)
47
+
48
+ if is_getter
49
+ return @hash[asym]
50
+ elsif is_setter
51
+ return @hash[asym] = args[0]
52
+ end
53
+
54
+ # do the regular thing
55
+ super
56
+ end
57
+
58
+ # Read ModelObject JSON from disk
59
+ def self.read_from_disk(file)
60
+ hash = nil
61
+ File.open(File.join(file), 'r') do |f|
62
+ hash = JSON.parse(f.read, symbolize_names: true)
63
+ end
64
+ new(hash)
65
+ end
66
+
67
+ # Load ModelObject from symbolized hash
68
+ def initialize(hash)
69
+ # initialize class variable @@extension only once
70
+ @@extension ||= Extension.new
71
+ @@schema ||= @@extension.schema
72
+
73
+ @hash = hash
74
+ @type = @hash[:type]
75
+ raise 'Unknown type' if @type.nil?
76
+ raise "Incorrect model type '#{@type}'" unless @type == @hash[:type]
77
+ @openstudio_object = nil
78
+ end
79
+
80
+ # hash containing the object defaults taken from the open API schema
81
+ def defaults
82
+ raise 'defaults not implemented for ModelObject, override in your class'
83
+ end
84
+
85
+ # check if the ModelObject is valid
86
+ def valid?
87
+ return validation_errors.empty?
88
+ end
89
+
90
+ # return detailed model validation errors
91
+ def validation_errors
92
+ if Gem.loaded_specs.has_key?("json-schema")
93
+ require 'json-schema'
94
+ # if this raises a 'Invalid fragment resolution for :fragment option' it is because @type
95
+ # does not correspond to a definition in the schema
96
+ JSON::Validator.fully_validate(@@schema, @hash, :fragment => "#/definitions/#{@type}")
97
+ end
98
+ end
99
+
100
+ # find an equivalent existing object in the openstudio model, return nil if not found
101
+ def find_existing_openstudio_object(openstudio_model)
102
+ raise 'find_existing_openstudio_object is not yet implemented for this ModelObject.'
103
+ end
104
+
105
+ # create a new object in the openstudio model and return it
106
+ def to_openstudio(openstudio_model)
107
+ raise 'to_openstudio is not yet implemented for this ModelObject.'
108
+ end
109
+ end # ModelObject
110
+ end # FromHoneybee
@@ -0,0 +1,124 @@
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
+ require 'from_honeybee/load/people'
35
+ require 'from_honeybee/load/lighting'
36
+ require 'from_honeybee/load/electric_equipment'
37
+ require 'from_honeybee/load/gas_equipment'
38
+ require 'from_honeybee/load/infiltration'
39
+ require 'from_honeybee/load/ventilation'
40
+ require 'from_honeybee/load/setpoint_thermostat'
41
+ require 'from_honeybee/load/setpoint_humidistat'
42
+
43
+ require 'openstudio'
44
+
45
+ module FromHoneybee
46
+ class ProgramTypeAbridged < ModelObject
47
+ attr_reader :errors, :warnings
48
+
49
+ def initialize(hash = {})
50
+ super(hash)
51
+
52
+ raise "Incorrect model type '#{@type}'" unless @type == 'ProgramTypeAbridged'
53
+ end
54
+
55
+ def defaults
56
+ @@schema[:components][:schemas][:ProgramTypeAbridged][:properties]
57
+ end
58
+
59
+ def find_existing_openstudio_object(openstudio_model)
60
+ model_space_type = openstudio_model.getSpaceTypeByName(@hash[:identifier])
61
+ return model_space_type.get unless model_space_type.empty?
62
+ nil
63
+ end
64
+
65
+ def to_openstudio(openstudio_model)
66
+ # create openstudio space type object
67
+ os_space_type = OpenStudio::Model::SpaceType.new(openstudio_model)
68
+ os_space_type.setName(@hash[:identifier])
69
+
70
+ # assign people
71
+ if @hash[:people]
72
+ people = PeopleAbridged.new(@hash[:people])
73
+ os_people = people.to_openstudio(openstudio_model)
74
+ os_people.setSpaceType(os_space_type)
75
+ end
76
+
77
+ # assign lighting
78
+ if @hash[:lighting]
79
+ lights = LightingAbridged.new(@hash[:lighting])
80
+ os_lights = lights.to_openstudio(openstudio_model)
81
+ os_lights.setSpaceType(os_space_type)
82
+ end
83
+
84
+ # assign electric equipment
85
+ if @hash[:electric_equipment]
86
+ electric_equipment = ElectricEquipmentAbridged.new(@hash[:electric_equipment])
87
+ os_electric_equipment = electric_equipment.to_openstudio(openstudio_model)
88
+ os_electric_equipment.setSpaceType(os_space_type)
89
+ end
90
+
91
+ # assign gas equipment
92
+ if @hash[:gas_equipment]
93
+ gas_equipment = GasEquipmentAbridged.new(@hash[:gas_equipment])
94
+ os_gas_equipment = gas_equipment.to_openstudio(openstudio_model)
95
+ os_gas_equipment.setSpaceType(os_space_type)
96
+ end
97
+
98
+ # assign infiltration
99
+ if @hash[:infiltration]
100
+ infiltration = InfiltrationAbridged.new(@hash[:infiltration])
101
+ os_infiltration = infiltration.to_openstudio(openstudio_model)
102
+ os_infiltration.setSpaceType(os_space_type)
103
+ end
104
+
105
+ # assign ventilation
106
+ if @hash[:ventilation]
107
+ ventilation = VentilationAbridged.new(@hash[:ventilation])
108
+ os_ventilation = ventilation.to_openstudio(openstudio_model)
109
+ os_space_type.setDesignSpecificationOutdoorAir(os_ventilation)
110
+ end
111
+
112
+ # add setpoints from to a global hash that will be used to assign them to rooms
113
+ if @hash[:setpoint]
114
+ $programtype_setpoint_hash[@hash[:identifier]] = @hash[:setpoint]
115
+ end
116
+
117
+ os_space_type
118
+ end
119
+
120
+ end #ProgramTypeAbridged
121
+ end #FromHoneybee
122
+
123
+
124
+
@@ -0,0 +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
@@ -0,0 +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