honeybee-openstudio 1.8.1

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 (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,65 @@
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 AirBoundaryConstructionAbridged < ModelObject
38
+ attr_reader :errors, :warnings
39
+
40
+ def initialize(hash = {})
41
+ super(hash)
42
+ end
43
+
44
+ def defaults
45
+ @@schema[:components][:schemas][:AirBoundaryConstructionAbridged][:properties]
46
+ end
47
+
48
+ def find_existing_openstudio_object(openstudio_model)
49
+ object = openstudio_model.getConstructionByName(@hash[:identifier])
50
+ return object.get if object.is_initialized
51
+ nil
52
+ end
53
+
54
+ def to_openstudio(openstudio_model)
55
+ os_construction = OpenStudio::Model::ConstructionAirBoundary.new(openstudio_model)
56
+ os_construction.setName(@hash[:identifier])
57
+ os_construction.setSolarAndDaylightingMethod('GroupedZones')
58
+ os_construction.setRadiantExchangeMethod('GroupedZones')
59
+ os_construction.setAirExchangeMethod('None')
60
+
61
+ os_construction
62
+ end
63
+
64
+ end #AirBoundaryConstructionAbridged
65
+ end #FromHoneybee
@@ -0,0 +1,77 @@
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 OpaqueConstructionAbridged < ModelObject
38
+ attr_reader :errors, :warnings
39
+
40
+ def initialize(hash = {})
41
+ super(hash)
42
+ end
43
+
44
+ def defaults
45
+ @@schema[:components][:schemas][:OpaqueConstructionAbridged][:properties]
46
+ end
47
+
48
+ def find_existing_openstudio_object(openstudio_model)
49
+ object = openstudio_model.getConstructionByName(@hash[:identifier])
50
+ return object.get if object.is_initialized
51
+ nil
52
+ end
53
+
54
+ def to_openstudio(openstudio_model)
55
+ # create construction and set identifier
56
+ os_construction = OpenStudio::Model::Construction.new(openstudio_model)
57
+ os_construction.setName(@hash[:identifier])
58
+
59
+ # create material vector
60
+ os_materials = OpenStudio::Model::MaterialVector.new
61
+ # loop through each layer and add to material vector
62
+ @hash[:layers].each do |layer|
63
+ material_identifier = layer
64
+ material = openstudio_model.getMaterialByName(material_identifier)
65
+ unless material.empty?
66
+ os_material = material.get
67
+ os_materials << os_material
68
+ end
69
+ end
70
+ os_construction.setLayers(os_materials)
71
+
72
+ os_construction
73
+ end
74
+
75
+ end #OpaqueConstructionAbridged
76
+ end #FromHoneybee
77
+
@@ -0,0 +1,108 @@
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 ShadeConstruction < ModelObject
38
+ attr_reader :errors, :warnings
39
+
40
+ def initialize(hash = {})
41
+ super(hash)
42
+ end
43
+
44
+ def defaults
45
+ @@schema[:components][:schemas][:ShadeConstruction][:properties]
46
+ end
47
+
48
+ def find_existing_openstudio_object(openstudio_model)
49
+ object = openstudio_model.getConstructionByName(@hash[:identifier])
50
+ return object.get if object.is_initialized
51
+ nil
52
+ end
53
+
54
+ def to_openstudio(openstudio_model)
55
+
56
+ os_construction = OpenStudio::Model::Construction.new(openstudio_model)
57
+ os_construction.setName(@hash[:identifier])
58
+ os_materials = OpenStudio::Model::MaterialVector.new
59
+
60
+ # create standard glazing if is specular is true
61
+ if @hash[:is_specular] == true
62
+ os_material = OpenStudio::Model::StandardGlazing.new(openstudio_model)
63
+
64
+ # assign solar reflectance
65
+ if @hash[:solar_reflectance]
66
+ os_material.setFrontSideSolarReflectanceatNormalIncidence(@hash[:solar_reflectance])
67
+ else
68
+ os_material.setFrontSideSolarReflectanceatNormalIncidence(defaults[:solar_reflectance][:default])
69
+ end
70
+
71
+ # assign visible reflectance
72
+ if @hash[:visible_reflectance]
73
+ os_material.setFrontSideVisibleReflectanceatNormalIncidence(@hash[:visible_reflectance])
74
+ else
75
+ os_material.setFrontSideVisibleReflectanceatNormalIncidence(defaults[:solar_reflectance][:default])
76
+ end
77
+
78
+ # create standard opaque material if is specular is false
79
+ else
80
+ os_material = OpenStudio::Model::StandardOpaqueMaterial.new(openstudio_model)
81
+
82
+ # assign solar reflectance
83
+ if @hash[:solar_reflectance]
84
+ os_material.setSolarReflectance(OpenStudio::OptionalDouble.new(@hash[:solar_reflectance]))
85
+ else
86
+ os_material.setSolarReflectance(OpenStudio::OptionalDouble.new(defaults[:visible_reflectance][:default]))
87
+ end
88
+
89
+ # assign visible reflectance
90
+ if @hash[:visible_reflectance]
91
+ os_material.setVisibleReflectance(OpenStudio::OptionalDouble.new(@hash[:visible_reflectance]))
92
+ else
93
+ os_material.setVisibleReflectance(OpenStudio::OptionalDouble.new(defaults[:solar_reflectance][:default]))
94
+ end
95
+
96
+ # assign specific heat
97
+ os_material.setSpecificHeat(100) # bug in OpenStudio default Specific Heat is 0.1.
98
+ end
99
+
100
+ # add materials and set layers to construction
101
+ os_materials << os_material
102
+ os_construction.setLayers(os_materials)
103
+ os_construction
104
+
105
+ end
106
+
107
+ end #ShadeConstruction
108
+ end #FromHoneybee
@@ -0,0 +1,80 @@
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 WindowConstructionAbridged < ModelObject
38
+ attr_reader :errors, :warnings
39
+
40
+ def initialize(hash = {})
41
+ super(hash)
42
+ end
43
+
44
+ def defaults
45
+ @@schema[:components][:schemas][:WindowConstructionAbridged][:properties]
46
+ end
47
+
48
+ def find_existing_openstudio_object(openstudio_model)
49
+ object = openstudio_model.getConstructionByName(@hash[:identifier])
50
+ return object.get if object.is_initialized
51
+ nil
52
+ end
53
+
54
+ def to_openstudio(openstudio_model)
55
+ # create construction and set identifier
56
+ os_construction = OpenStudio::Model::Construction.new(openstudio_model)
57
+ os_construction.setName(@hash[:identifier])
58
+
59
+ # create material vector
60
+ os_materials = OpenStudio::Model::MaterialVector.new
61
+ # loop through each layer and add to material vector
62
+ @hash[:layers].each do |layer|
63
+ material_identifier = layer
64
+ material = openstudio_model.getMaterialByName(material_identifier)
65
+ unless material.empty?
66
+ os_material = material.get
67
+ os_materials << os_material
68
+ end
69
+ end
70
+ os_construction.setLayers(os_materials)
71
+
72
+ os_construction
73
+ end
74
+
75
+ end #WindowConstructionAbridged
76
+ end #FromHoneybee
77
+
78
+
79
+
80
+
@@ -0,0 +1,278 @@
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
+
37
+ module FromHoneybee
38
+ class ConstructionSetAbridged < ModelObject
39
+ attr_reader :errors, :warnings
40
+
41
+ def initialize(hash = {})
42
+ super(hash)
43
+
44
+ raise "Incorrect model type '#{@type}'" unless @type == 'ConstructionSetAbridged'
45
+ end
46
+
47
+ def defaults
48
+ @@schema[:components][:schemas][:ConstructionSetAbridged][:properties]
49
+ end
50
+
51
+ def find_existing_openstudio_object(openstudio_model)
52
+ object = openstudio_model.getDefaultConstructionSetByName(@hash[:identifier])
53
+ return object.get if object.is_initialized
54
+ nil
55
+ end
56
+
57
+ def to_openstudio(openstudio_model)
58
+ # create the constructionset object
59
+ os_constr_set = OpenStudio::Model::DefaultConstructionSet.new(openstudio_model)
60
+ os_constr_set.setName(@hash[:identifier])
61
+
62
+ int_surf_const = OpenStudio::Model::DefaultSurfaceConstructions.new(openstudio_model)
63
+ ext_surf_const = OpenStudio::Model::DefaultSurfaceConstructions.new(openstudio_model)
64
+ grnd_surf_const = OpenStudio::Model::DefaultSurfaceConstructions.new(openstudio_model)
65
+ int_subsurf_const = OpenStudio::Model::DefaultSubSurfaceConstructions.new(openstudio_model)
66
+ ext_subsurf_const = OpenStudio::Model::DefaultSubSurfaceConstructions.new(openstudio_model)
67
+
68
+ os_constr_set.setDefaultInteriorSurfaceConstructions(int_surf_const)
69
+ os_constr_set.setDefaultExteriorSurfaceConstructions(ext_surf_const)
70
+ os_constr_set.setDefaultGroundContactSurfaceConstructions(grnd_surf_const)
71
+ os_constr_set.setDefaultInteriorSubSurfaceConstructions(int_subsurf_const)
72
+ os_constr_set.setDefaultExteriorSubSurfaceConstructions(ext_subsurf_const)
73
+
74
+ # assign any constructions in the wall set
75
+ if @hash[:wall_set]
76
+ if @hash[:wall_set][:interior_construction]
77
+ int_wall_ref = openstudio_model.getConstructionByName(@hash[:wall_set][:interior_construction])
78
+ unless int_wall_ref.empty?
79
+ interior_wall = int_wall_ref.get
80
+ int_surf_const.setWallConstruction(interior_wall)
81
+ os_constr_set.setAdiabaticSurfaceConstruction(interior_wall)
82
+ end
83
+ end
84
+ if @hash[:wall_set][:exterior_construction]
85
+ ext_wall_ref = openstudio_model.getConstructionByName(@hash[:wall_set][:exterior_construction])
86
+ unless ext_wall_ref.empty?
87
+ exterior_wall = ext_wall_ref.get
88
+ ext_surf_const.setWallConstruction(exterior_wall)
89
+ end
90
+ end
91
+ if @hash[:wall_set][:ground_construction]
92
+ grd_wall_ref = openstudio_model.getConstructionByName(@hash[:wall_set][:ground_construction])
93
+ unless grd_wall_ref.empty?
94
+ ground_wall = grd_wall_ref.get
95
+ grnd_surf_const.setWallConstruction(ground_wall)
96
+ end
97
+ end
98
+ end
99
+
100
+ # assign any constructions in the floor set
101
+ if @hash[:floor_set]
102
+ if @hash[:floor_set][:interior_construction]
103
+ constr_id_int = openstudio_model.getConstructionByName(@hash[:floor_set][:interior_construction])
104
+ assign_constr_to_set_int(openstudio_model, int_surf_const, 'Floor',
105
+ constr_id_int)
106
+ end
107
+ if @hash[:floor_set][:exterior_construction]
108
+ constr_id_ext = openstudio_model.getConstructionByName(@hash[:floor_set][:exterior_construction])
109
+ assign_constr_to_set_ext(openstudio_model, ext_surf_const, 'Floor',
110
+ constr_id_ext
111
+ )
112
+ end
113
+ if @hash[:floor_set][:ground_construction]
114
+ constr_id_grd = openstudio_model.getConstructionByName(@hash[:floor_set][:ground_construction])
115
+ assign_constr_to_set_grd(openstudio_model, grnd_surf_const, 'Floor',
116
+ constr_id_grd)
117
+ end
118
+ end
119
+
120
+ # assign any constructions in the roof ceiling set
121
+ if @hash[:roof_ceiling_set]
122
+ if @hash[:roof_ceiling_set][:interior_construction]
123
+ constr_id_int = openstudio_model.getConstructionByName(@hash[:roof_ceiling_set][:interior_construction])
124
+ assign_constr_to_set_int(openstudio_model, int_surf_const, 'Roof',
125
+ constr_id_int)
126
+ end
127
+ if @hash[:roof_ceiling_set][:exterior_construction]
128
+ constr_id_ext = openstudio_model.getConstructionByName(@hash[:roof_ceiling_set][:exterior_construction])
129
+ assign_constr_to_set_ext(openstudio_model, ext_surf_const, 'Roof',
130
+ constr_id_ext)
131
+ end
132
+ if @hash[:roof_ceiling_set][:ground_construction]
133
+ constr_id_grd = openstudio_model.getConstructionByName(@hash[:roof_ceiling_set][:ground_construction])
134
+ assign_constr_to_set_grd(openstudio_model, grnd_surf_const, 'Roof',
135
+ constr_id_grd)
136
+ end
137
+ end
138
+
139
+ # assign any constructions in the aperture set
140
+ if @hash[:aperture_set]
141
+ if @hash[:aperture_set][:interior_construction]
142
+ int_ap_ref = openstudio_model.getConstructionByName(
143
+ @hash[:aperture_set][:interior_construction])
144
+ unless int_ap_ref.empty?
145
+ interior_aperture = int_ap_ref.get
146
+ int_subsurf_const.setFixedWindowConstruction(interior_aperture)
147
+ int_subsurf_const.setOperableWindowConstruction(interior_aperture)
148
+ end
149
+ end
150
+ if @hash[:aperture_set][:window_construction]
151
+ window_ref = openstudio_model.getConstructionByName(
152
+ @hash[:aperture_set][:window_construction])
153
+ unless window_ref.empty?
154
+ window_aperture = window_ref.get
155
+ ext_subsurf_const.setFixedWindowConstruction(window_aperture)
156
+ end
157
+ end
158
+ if @hash[:aperture_set][:skylight_construction]
159
+ skylight_ref = openstudio_model.getConstructionByName(
160
+ @hash[:aperture_set][:skylight_construction])
161
+ unless skylight_ref.empty?
162
+ skylight_aperture = skylight_ref.get
163
+ ext_subsurf_const.setSkylightConstruction(skylight_aperture)
164
+ end
165
+ end
166
+ if @hash[:aperture_set][:operable_construction]
167
+ operable_ref = openstudio_model.getConstructionByName(
168
+ @hash[:aperture_set][:operable_construction])
169
+ unless operable_ref.empty?
170
+ operable_aperture = operable_ref.get
171
+ ext_subsurf_const.setOperableWindowConstruction(operable_aperture)
172
+ end
173
+ end
174
+ end
175
+
176
+ # assign any constructions in the door set
177
+ if @hash[:door_set]
178
+ if @hash[:door_set][:interior_construction]
179
+ int_door_ref = openstudio_model.getConstructionByName(
180
+ @hash[:door_set][:interior_construction])
181
+ unless int_door_ref.empty?
182
+ interior_door = int_door_ref.get
183
+ int_subsurf_const.setDoorConstruction(interior_door)
184
+ end
185
+ end
186
+ if @hash[:door_set][:exterior_construction]
187
+ ext_door_ref = openstudio_model.getConstructionByName(
188
+ @hash[:door_set][:exterior_construction])
189
+ unless ext_door_ref.empty?
190
+ exterior_door = ext_door_ref.get
191
+ ext_subsurf_const.setDoorConstruction(exterior_door)
192
+ end
193
+ end
194
+ if @hash[:door_set][:overhead_construction]
195
+ overhead_door_ref = openstudio_model.getConstructionByName(
196
+ @hash[:door_set][:overhead_construction])
197
+ unless overhead_door_ref.empty?
198
+ overhead_door = overhead_door_ref.get
199
+ ext_subsurf_const.setOverheadDoorConstruction(overhead_door)
200
+ end
201
+ end
202
+ if @hash[:door_set][:exterior_glass_construction]
203
+ ext_glz_door_ref = openstudio_model.getConstructionByName(
204
+ @hash[:door_set][:exterior_glass_construction])
205
+ unless ext_glz_door_ref.empty?
206
+ exterior_glass_door = ext_glz_door_ref.get
207
+ ext_subsurf_const.setGlassDoorConstruction(exterior_glass_door)
208
+ end
209
+ end
210
+ if @hash[:door_set][:interior_glass_construction]
211
+ int_glz_door_ref = openstudio_model.getConstructionByName(
212
+ @hash[:door_set][:interior_glass_construction])
213
+ unless int_glz_door_ref.empty?
214
+ interior_glass_door = int_glz_door_ref.get
215
+ int_subsurf_const.setGlassDoorConstruction(interior_glass_door)
216
+ end
217
+ end
218
+ end
219
+
220
+ # assign any shading constructions to construction set
221
+ if @hash[:shade_construction]
222
+ shade_ref = openstudio_model.getConstructionByName(@hash[:shade_construction])
223
+ unless shade_ref.empty?
224
+ shade_construction = shade_ref.get
225
+ os_constr_set.setSpaceShadingConstruction(shade_construction)
226
+ end
227
+ end
228
+
229
+ # assign any air boundary constructions to construction set
230
+ if @hash[:air_boundary_construction]
231
+ air_ref = openstudio_model.getConstructionAirBoundaryByName(
232
+ @hash[:air_boundary_construction])
233
+ unless air_ref.empty?
234
+ air_construction = air_ref.get
235
+ os_constr_set.setInteriorPartitionConstruction(air_construction)
236
+ end
237
+ end
238
+
239
+ os_constr_set
240
+ end
241
+
242
+ # get interior construction subset
243
+ def assign_constr_to_set_int(openstudio_model, constr_subset, face_type, constr_id_int)
244
+ unless constr_id_int.empty?
245
+ constr_id = constr_id_int.get
246
+ check_constr_type(constr_id, face_type, constr_subset)
247
+ end
248
+ end
249
+
250
+ # get exterior construction subset
251
+ def assign_constr_to_set_ext(openstudio_model, constr_subset, face_type, constr_id_ext)
252
+ unless constr_id_ext.empty?
253
+ constr_id = constr_id_ext.get
254
+ check_constr_type(constr_id, face_type, constr_subset)
255
+ end
256
+ end
257
+
258
+ # get ground construction subset
259
+ def assign_constr_to_set_grd(openstudio_model, constr_subset, face_type, constr_id_grd)
260
+ unless constr_id_grd.empty?
261
+ constr_id = constr_id_grd.get
262
+ check_constr_type(constr_id, face_type, constr_subset)
263
+ end
264
+ end
265
+
266
+ # check face type and assign to construction subset
267
+ def check_constr_type(constr_id, face_type, constr_subset)
268
+ if face_type == 'Wall'
269
+ constr_subset.setWallConstruction(constr_id)
270
+ elsif face_type == 'Floor'
271
+ constr_subset.setFloorConstruction(constr_id)
272
+ else
273
+ constr_subset.setRoofCeilingConstruction(constr_id)
274
+ end
275
+ end
276
+
277
+ end #ConstructionSetAbridged
278
+ end #FromHoneybee