honeybee-openstudio 2.25.1 → 2.27.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/honeybee-openstudio.gemspec +1 -1
- data/lib/files/urbanopt_Gemfile +1 -1
- data/lib/from_openstudio/construction/air.rb +3 -0
- data/lib/from_openstudio/construction/opaque.rb +3 -0
- data/lib/from_openstudio/construction/shade.rb +3 -0
- data/lib/from_openstudio/construction/window.rb +3 -0
- data/lib/from_openstudio/construction_set.rb +3 -0
- data/lib/from_openstudio/material/opaque.rb +16 -1
- data/lib/from_openstudio/material/opaque_no_mass.rb +16 -1
- data/lib/from_openstudio/material/window_blind.rb +3 -0
- data/lib/from_openstudio/material/window_gas.rb +3 -0
- data/lib/from_openstudio/material/window_gas_custom.rb +3 -0
- data/lib/from_openstudio/material/window_gas_mixture.rb +3 -0
- data/lib/from_openstudio/material/window_glazing.rb +3 -0
- data/lib/from_openstudio/material/window_simpleglazsys.rb +3 -0
- data/lib/from_openstudio/schedule/fixed_interval.rb +3 -0
- data/lib/from_openstudio/schedule/ruleset.rb +3 -0
- data/lib/from_openstudio/schedule/type_limit.rb +3 -0
- data/lib/honeybee/_defaults/model.json +661 -29
- data/lib/honeybee/load/process.rb +42 -0
- data/lib/honeybee/model.rb +2 -1
- data/lib/honeybee/model_object.rb +41 -3
- data/lib/honeybee/simulation/parameter_model.rb +2 -1
- data/lib/honeybee.rb +1 -0
- data/lib/to_openstudio/construction/air.rb +3 -0
- data/lib/to_openstudio/construction/opaque.rb +3 -0
- data/lib/to_openstudio/construction/shade.rb +3 -0
- data/lib/to_openstudio/construction/window.rb +3 -1
- data/lib/to_openstudio/construction/windowshade.rb +3 -2
- data/lib/to_openstudio/construction_set.rb +3 -2
- data/lib/to_openstudio/geometry/aperture.rb +4 -0
- data/lib/to_openstudio/geometry/door.rb +4 -0
- data/lib/to_openstudio/geometry/face.rb +3 -0
- data/lib/to_openstudio/geometry/room.rb +12 -0
- data/lib/to_openstudio/geometry/shade.rb +3 -1
- data/lib/to_openstudio/hvac/ideal_air.rb +3 -1
- data/lib/to_openstudio/load/electric_equipment.rb +6 -0
- data/lib/to_openstudio/load/gas_equipment.rb +6 -0
- data/lib/to_openstudio/load/infiltration.rb +3 -1
- data/lib/to_openstudio/load/lighting.rb +3 -0
- data/lib/to_openstudio/load/people.rb +3 -0
- data/lib/to_openstudio/load/process.rb +100 -0
- data/lib/to_openstudio/load/service_hot_water.rb +1 -1
- data/lib/to_openstudio/load/ventilation.rb +3 -0
- data/lib/to_openstudio/material/opaque.rb +3 -0
- data/lib/to_openstudio/material/opaque_no_mass.rb +3 -1
- data/lib/to_openstudio/material/window_blind.rb +3 -1
- data/lib/to_openstudio/material/window_gas.rb +3 -1
- data/lib/to_openstudio/material/window_gas_custom.rb +3 -0
- data/lib/to_openstudio/material/window_gas_mixture.rb +3 -1
- data/lib/to_openstudio/material/window_glazing.rb +3 -1
- data/lib/to_openstudio/material/window_shade.rb +3 -1
- data/lib/to_openstudio/material/window_simpleglazsys.rb +3 -1
- data/lib/to_openstudio/program_type.rb +3 -1
- data/lib/to_openstudio/schedule/fixed_interval.rb +6 -1
- data/lib/to_openstudio/schedule/ruleset.rb +6 -1
- data/lib/to_openstudio/schedule/type_limit.rb +3 -1
- data/lib/to_openstudio.rb +1 -0
- metadata +4 -2
@@ -0,0 +1,42 @@
|
|
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 'honeybee/model_object'
|
33
|
+
|
34
|
+
module Honeybee
|
35
|
+
class ProcessAbridged < ModelObject
|
36
|
+
|
37
|
+
def defaults
|
38
|
+
@@schema[:components][:schemas][:ProcessAbridged][:properties]
|
39
|
+
end
|
40
|
+
|
41
|
+
end #ProcessAbridged
|
42
|
+
end #Honeybee
|
data/lib/honeybee/model.rb
CHANGED
@@ -40,7 +40,8 @@ module Honeybee
|
|
40
40
|
def self.read_from_disk(file)
|
41
41
|
hash = nil
|
42
42
|
File.open(File.join(file), 'r') do |f|
|
43
|
-
hash = JSON.parse(
|
43
|
+
hash = JSON.parse(File.read(f, :external_encoding => 'UTF-8',
|
44
|
+
:internal_encoding => 'UTF-8'), symbolize_names: true, encoding: 'UTF-8')
|
44
45
|
end
|
45
46
|
Model.new(hash)
|
46
47
|
end
|
@@ -30,12 +30,34 @@
|
|
30
30
|
# *******************************************************************************
|
31
31
|
|
32
32
|
module Honeybee
|
33
|
+
class FakeOptionalString
|
34
|
+
def initialize(str)
|
35
|
+
@str = str
|
36
|
+
end
|
37
|
+
|
38
|
+
def empty?
|
39
|
+
false
|
40
|
+
end
|
41
|
+
|
42
|
+
def get
|
43
|
+
@str
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
33
47
|
class ModelObject
|
34
48
|
# Base class from which all other objects in this module inherit.
|
35
49
|
# Attributes and methods of this class should be overwritten in each inheriting object.
|
36
50
|
|
37
51
|
attr_reader :errors, :warnings
|
38
52
|
|
53
|
+
@@encoding_options = {
|
54
|
+
:invalid => :replace, # Replace invalid byte sequences
|
55
|
+
:undef => :replace, # Replace anything not defined in ASCII
|
56
|
+
:replace => '', # Use a blank for those replacements
|
57
|
+
:universal_newline => true # Always break lines with \n
|
58
|
+
}
|
59
|
+
|
60
|
+
|
39
61
|
def method_missing(sym, *args)
|
40
62
|
name = sym.to_s
|
41
63
|
aname = name.sub('=', '')
|
@@ -57,7 +79,8 @@ module Honeybee
|
|
57
79
|
def self.read_from_disk(file)
|
58
80
|
hash = nil
|
59
81
|
File.open(File.join(file), 'r') do |f|
|
60
|
-
hash = JSON.parse(
|
82
|
+
hash = JSON.parse(File.read(f, :external_encoding => 'UTF-8',
|
83
|
+
:internal_encoding => 'UTF-8'), symbolize_names: true, encoding: 'UTF-8')
|
61
84
|
end
|
62
85
|
new(hash)
|
63
86
|
end
|
@@ -100,15 +123,30 @@ module Honeybee
|
|
100
123
|
|
101
124
|
# remove illegal characters in identifier
|
102
125
|
def self.clean_name(str)
|
103
|
-
ascii = str.encode(Encoding.find('ASCII'))
|
126
|
+
ascii = str.encode(Encoding.find('ASCII'), **@@encoding_options)
|
104
127
|
end
|
105
128
|
|
106
129
|
# remove illegal characters in identifier
|
107
130
|
def self.clean_identifier(str)
|
108
|
-
encode_str = str.encode(Encoding.find('ASCII'))
|
131
|
+
encode_str = str.encode(Encoding.find('ASCII'), **@@encoding_options)
|
109
132
|
encode_str.gsub(/[^.A-Za-z0-9_-]/, '_').gsub(' ', '_')
|
110
133
|
end
|
111
134
|
|
135
|
+
# Create methods to get and set display name
|
136
|
+
if !OpenStudio::Model::ModelObject.method_defined?(:displayName)
|
137
|
+
OpenStudio::Model::ModelObject.class_eval do
|
138
|
+
define_method(:displayName) do
|
139
|
+
result = additionalProperties.getFeatureAsString("DisplayName")
|
140
|
+
if !result.empty?
|
141
|
+
result = FakeOptionalString.new(result.get.force_encoding(Encoding::UTF_8))
|
142
|
+
end
|
143
|
+
result
|
144
|
+
end
|
145
|
+
define_method(:setDisplayName) do |value|
|
146
|
+
additionalProperties.setFeature("DisplayName", value)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
112
150
|
|
113
151
|
end # ModelObject
|
114
152
|
end # Honeybee
|
@@ -40,7 +40,8 @@ module Honeybee
|
|
40
40
|
def self.read_from_disk(file)
|
41
41
|
hash = nil
|
42
42
|
File.open(File.join(file), 'r') do |f|
|
43
|
-
hash = JSON.parse(
|
43
|
+
hash = JSON.parse(File.read(f, :external_encoding => 'UTF-8',
|
44
|
+
:internal_encoding => 'UTF-8'), symbolize_names: true, encoding: 'UTF-8')
|
44
45
|
end
|
45
46
|
|
46
47
|
SimulationParameter.new(hash)
|
data/lib/honeybee.rb
CHANGED
@@ -79,6 +79,7 @@ require 'honeybee/load/ventilation'
|
|
79
79
|
require 'honeybee/load/setpoint_thermostat'
|
80
80
|
require 'honeybee/load/setpoint_humidistat'
|
81
81
|
require 'honeybee/load/daylight'
|
82
|
+
require 'honeybee/load/process'
|
82
83
|
|
83
84
|
# import the schedule objects
|
84
85
|
require 'honeybee/schedule/type_limit'
|
@@ -46,6 +46,9 @@ module Honeybee
|
|
46
46
|
os_construction = OpenStudio::Model::ConstructionAirBoundary.new(openstudio_model)
|
47
47
|
os_construction.setName(@hash[:identifier])
|
48
48
|
os_construction.setAirExchangeMethod('None')
|
49
|
+
unless @hash[:display_name].nil?
|
50
|
+
os_construction.setDisplayName(@hash[:display_name])
|
51
|
+
end
|
49
52
|
|
50
53
|
os_construction
|
51
54
|
end
|
@@ -46,6 +46,9 @@ module Honeybee
|
|
46
46
|
# create construction and set identifier
|
47
47
|
os_construction = OpenStudio::Model::Construction.new(openstudio_model)
|
48
48
|
os_construction.setName(@hash[:identifier])
|
49
|
+
unless @hash[:display_name].nil?
|
50
|
+
os_construction.setDisplayName(@hash[:display_name])
|
51
|
+
end
|
49
52
|
|
50
53
|
# create material vector
|
51
54
|
os_materials = OpenStudio::Model::MaterialVector.new
|
@@ -46,6 +46,9 @@ module Honeybee
|
|
46
46
|
|
47
47
|
os_construction = OpenStudio::Model::Construction.new(openstudio_model)
|
48
48
|
os_construction.setName(@hash[:identifier])
|
49
|
+
unless @hash[:display_name].nil?
|
50
|
+
os_construction.setDisplayName(@hash[:display_name])
|
51
|
+
end
|
49
52
|
os_materials = OpenStudio::Model::MaterialVector.new
|
50
53
|
|
51
54
|
# create standard glazing if is specular is true
|
@@ -46,7 +46,9 @@ module Honeybee
|
|
46
46
|
# create construction and set identifier
|
47
47
|
os_construction = OpenStudio::Model::Construction.new(openstudio_model)
|
48
48
|
os_construction.setName(@hash[:identifier])
|
49
|
-
|
49
|
+
unless @hash[:display_name].nil?
|
50
|
+
os_construction.setDisplayName(@hash[:display_name])
|
51
|
+
end
|
50
52
|
# create material vector
|
51
53
|
os_materials = OpenStudio::Model::MaterialVector.new
|
52
54
|
# loop through each layer and add to material vector
|
@@ -51,7 +51,6 @@ module Honeybee
|
|
51
51
|
shd_id = @hash[:window_construction][:identifier]
|
52
52
|
@hash[:window_construction][:identifier] = unshd_id
|
53
53
|
@hash[:identifier] = shd_id
|
54
|
-
|
55
54
|
# create the unshaded construction
|
56
55
|
unshd_constr_obj = WindowConstructionAbridged.new(@hash[:window_construction])
|
57
56
|
@construction = unshd_constr_obj.to_openstudio(openstudio_model)
|
@@ -59,7 +58,9 @@ module Honeybee
|
|
59
58
|
# create the shaded construction
|
60
59
|
@shade_construction = OpenStudio::Model::Construction.new(openstudio_model)
|
61
60
|
@shade_construction.setName(shd_id)
|
62
|
-
|
61
|
+
unless @hash[:display_name].nil?
|
62
|
+
@shade_construction.setDisplayName(@hash[:display_name])
|
63
|
+
end
|
63
64
|
# create the layers of the unshaded construction into which we will insert the shade
|
64
65
|
os_materials = []
|
65
66
|
if @hash.key?(:layers)
|
@@ -30,7 +30,6 @@
|
|
30
30
|
# *******************************************************************************
|
31
31
|
|
32
32
|
require 'honeybee/construction_set'
|
33
|
-
|
34
33
|
require 'to_openstudio/model_object'
|
35
34
|
|
36
35
|
module Honeybee
|
@@ -46,7 +45,9 @@ module Honeybee
|
|
46
45
|
# create the constructionset object
|
47
46
|
os_constr_set = OpenStudio::Model::DefaultConstructionSet.new(openstudio_model)
|
48
47
|
os_constr_set.setName(@hash[:identifier])
|
49
|
-
|
48
|
+
unless @hash[:display_name].nil?
|
49
|
+
os_constr_set.setDisplayName(@hash[:display_name])
|
50
|
+
end
|
50
51
|
int_surf_const = OpenStudio::Model::DefaultSurfaceConstructions.new(openstudio_model)
|
51
52
|
ext_surf_const = OpenStudio::Model::DefaultSurfaceConstructions.new(openstudio_model)
|
52
53
|
grnd_surf_const = OpenStudio::Model::DefaultSurfaceConstructions.new(openstudio_model)
|
@@ -114,6 +114,10 @@ module Honeybee
|
|
114
114
|
os_subsurface.setName(@hash[:identifier])
|
115
115
|
end
|
116
116
|
|
117
|
+
unless @hash[:display_name].nil?
|
118
|
+
os_subsurface.setDisplayName(@hash[:display_name])
|
119
|
+
end
|
120
|
+
|
117
121
|
# assign the construction if it exists
|
118
122
|
if @hash[:properties][:energy][:construction]
|
119
123
|
construction_identifier = @hash[:properties][:energy][:construction]
|
@@ -114,6 +114,10 @@ module Honeybee
|
|
114
114
|
os_subsurface.setName(@hash[:identifier])
|
115
115
|
end
|
116
116
|
|
117
|
+
unless @hash[:display_name].nil?
|
118
|
+
os_subsurface.setDisplayName(@hash[:display_name])
|
119
|
+
end
|
120
|
+
|
117
121
|
# assign the construction if it exists
|
118
122
|
if @hash[:properties][:energy][:construction]
|
119
123
|
construction_identifier = @hash[:properties][:energy][:construction]
|
@@ -60,6 +60,9 @@ module Honeybee
|
|
60
60
|
# create the openstudio surface and assign the type
|
61
61
|
os_surface = OpenStudio::Model::Surface.new(reordered_vertices, openstudio_model)
|
62
62
|
os_surface.setName(@hash[:identifier])
|
63
|
+
unless @hash[:display_name].nil?
|
64
|
+
os_surface.setDisplayName(@hash[:display_name])
|
65
|
+
end
|
63
66
|
os_surface.setSurfaceType(@hash[:face_type])
|
64
67
|
|
65
68
|
# assign the construction if it is present
|
@@ -76,6 +76,9 @@ module Honeybee
|
|
76
76
|
# create the space and thermal zone
|
77
77
|
os_space = OpenStudio::Model::Space.new(openstudio_model)
|
78
78
|
os_space.setName(@hash[:identifier])
|
79
|
+
unless @hash[:display_name].nil?
|
80
|
+
os_space.setDisplayName(@hash[:display_name])
|
81
|
+
end
|
79
82
|
os_thermal_zone = OpenStudio::Model::ThermalZone.new(openstudio_model)
|
80
83
|
os_thermal_zone.setName(@hash[:identifier])
|
81
84
|
os_space.setThermalZone(os_thermal_zone)
|
@@ -382,6 +385,15 @@ module Honeybee
|
|
382
385
|
end
|
383
386
|
end
|
384
387
|
|
388
|
+
# assign any process loads if specified
|
389
|
+
if @hash[:properties][:energy][:process_loads]
|
390
|
+
@hash[:properties][:energy][:process_loads].each do |p_load|
|
391
|
+
hb_p_load = ProcessAbridged.new(p_load)
|
392
|
+
os_p_load = hb_p_load.to_openstudio(openstudio_model)
|
393
|
+
os_p_load.setSpace(os_space)
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
385
397
|
os_space
|
386
398
|
end
|
387
399
|
|
@@ -59,7 +59,9 @@ module Honeybee
|
|
59
59
|
|
60
60
|
os_shading_surface = OpenStudio::Model::ShadingSurface.new(reordered_vertices, openstudio_model)
|
61
61
|
os_shading_surface.setName(@hash[:identifier])
|
62
|
-
|
62
|
+
unless @hash[:display_name].nil?
|
63
|
+
os_shading_surface.setDisplayName(@hash[:display_name])
|
64
|
+
end
|
63
65
|
# assign the construction if it exists
|
64
66
|
if @hash[:properties][:energy][:construction]
|
65
67
|
construction_identifier = @hash[:properties][:energy][:construction]
|
@@ -40,7 +40,9 @@ module Honeybee
|
|
40
40
|
# create the ideal air system and set the identifier
|
41
41
|
os_ideal_air = OpenStudio::Model::ZoneHVACIdealLoadsAirSystem.new(openstudio_model)
|
42
42
|
os_ideal_air.setName(@hash[:identifier])
|
43
|
-
|
43
|
+
unless @hash[:display_name].nil?
|
44
|
+
os_ideal_air.setDisplayName(@hash[:display_name])
|
45
|
+
end
|
44
46
|
# assign the economizer type
|
45
47
|
if @hash[:economizer_type]
|
46
48
|
os_ideal_air.setOutdoorAirEconomizerType(@hash[:economizer_type])
|
@@ -47,6 +47,9 @@ module Honeybee
|
|
47
47
|
os_electric_equip_def = OpenStudio::Model::ElectricEquipmentDefinition.new(openstudio_model)
|
48
48
|
os_electric_equip = OpenStudio::Model::ElectricEquipment.new(os_electric_equip_def)
|
49
49
|
os_electric_equip_def.setName(@hash[:identifier])
|
50
|
+
unless @hash[:display_name].nil?
|
51
|
+
os_electric_equip_def.setDisplayName(@hash[:display_name])
|
52
|
+
end
|
50
53
|
os_electric_equip.setName(@hash[:identifier])
|
51
54
|
|
52
55
|
# assign watts per area
|
@@ -59,6 +62,9 @@ module Honeybee
|
|
59
62
|
os_electric_equip.setSchedule(electric_equipment_schedule_object)
|
60
63
|
end
|
61
64
|
|
65
|
+
# ensure that it's always reported under electric equipment
|
66
|
+
os_electric_equip.setEndUseSubcategory('Electric Equipment')
|
67
|
+
|
62
68
|
# assign radiant fraction if it exists
|
63
69
|
if @hash[:radiant_fraction]
|
64
70
|
os_electric_equip_def.setFractionRadiant(@hash[:radiant_fraction])
|
@@ -48,6 +48,9 @@ module Honeybee
|
|
48
48
|
os_gas_equip_def = OpenStudio::Model::GasEquipmentDefinition.new(openstudio_model)
|
49
49
|
os_gas_equip = OpenStudio::Model::GasEquipment.new(os_gas_equip_def)
|
50
50
|
os_gas_equip_def.setName(@hash[:identifier])
|
51
|
+
unless @hash[:display_name].nil?
|
52
|
+
os_gas_equip_def.setDisplayName(@hash[:display_name])
|
53
|
+
end
|
51
54
|
os_gas_equip.setName(@hash[:identifier])
|
52
55
|
|
53
56
|
# assign watts per space floor area
|
@@ -60,6 +63,9 @@ module Honeybee
|
|
60
63
|
os_gas_equip.setSchedule(gas_equipment_schedule_object)
|
61
64
|
end
|
62
65
|
|
66
|
+
# ensure that it's always reported under electric equipment
|
67
|
+
os_gas_equip.setEndUseSubcategory('Gas Equipment')
|
68
|
+
|
63
69
|
# assign radiant fraction if it exists
|
64
70
|
if @hash[:radiant_fraction]
|
65
71
|
os_gas_equip_def.setFractionRadiant(@hash[:radiant_fraction])
|
@@ -47,7 +47,9 @@ module Honeybee
|
|
47
47
|
# create infiltration OpenStudio object and set identifier
|
48
48
|
os_infilt = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(openstudio_model)
|
49
49
|
os_infilt.setName(@hash[:identifier])
|
50
|
-
|
50
|
+
unless @hash[:display_name].nil?
|
51
|
+
os_infilt.setDisplayName(@hash[:display_name])
|
52
|
+
end
|
51
53
|
# assign flow per surface
|
52
54
|
os_infilt.setFlowperExteriorSurfaceArea(@hash[:flow_per_exterior_area])
|
53
55
|
|
@@ -48,6 +48,9 @@ module Honeybee
|
|
48
48
|
os_lights_def = OpenStudio::Model::LightsDefinition.new(openstudio_model)
|
49
49
|
os_lights = OpenStudio::Model::Lights.new(os_lights_def)
|
50
50
|
os_lights_def.setName(@hash[:identifier])
|
51
|
+
unless @hash[:display_name].nil?
|
52
|
+
os_lights_def.setDisplayName(@hash[:display_name])
|
53
|
+
end
|
51
54
|
os_lights.setName(@hash[:identifier])
|
52
55
|
|
53
56
|
# assign watts per space floor area
|
@@ -48,6 +48,9 @@ module Honeybee
|
|
48
48
|
os_people_def = OpenStudio::Model::PeopleDefinition.new(openstudio_model)
|
49
49
|
os_people = OpenStudio::Model::People.new(os_people_def)
|
50
50
|
os_people_def.setName(@hash[:identifier])
|
51
|
+
unless @hash[:display_name].nil?
|
52
|
+
os_people_def.setDisplayName(@hash[:display_name])
|
53
|
+
end
|
51
54
|
os_people.setName(@hash[:identifier])
|
52
55
|
|
53
56
|
# assign people per space floor area
|
@@ -0,0 +1,100 @@
|
|
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 'honeybee/load/process'
|
33
|
+
|
34
|
+
require 'to_openstudio/model_object'
|
35
|
+
|
36
|
+
module Honeybee
|
37
|
+
class ProcessAbridged
|
38
|
+
|
39
|
+
def find_existing_openstudio_object(openstudio_model)
|
40
|
+
model_other_equipment = openstudio_model.getOtherEquipmentByName(@hash[:identifier])
|
41
|
+
return model_other_equipment.get unless model_other_equipment.empty?
|
42
|
+
nil
|
43
|
+
end
|
44
|
+
|
45
|
+
def to_openstudio(openstudio_model)
|
46
|
+
# create process load and set identifier
|
47
|
+
os_other_equip_def = OpenStudio::Model::OtherEquipmentDefinition.new(openstudio_model)
|
48
|
+
os_other_equip = OpenStudio::Model::OtherEquipment.new(os_other_equip_def)
|
49
|
+
os_other_equip_def.setName(@hash[:identifier])
|
50
|
+
unless @hash[:display_name].nil?
|
51
|
+
os_other_equip_def.setDisplayName(@hash[:display_name])
|
52
|
+
end
|
53
|
+
os_other_equip.setName(@hash[:identifier])
|
54
|
+
|
55
|
+
# assign watts
|
56
|
+
os_other_equip_def.setDesignLevel(@hash[:watts])
|
57
|
+
|
58
|
+
# assign schedule
|
59
|
+
other_equipment_schedule = openstudio_model.getScheduleByName(@hash[:schedule])
|
60
|
+
unless other_equipment_schedule.empty?
|
61
|
+
other_equipment_schedule_object = other_equipment_schedule.get
|
62
|
+
os_other_equip.setSchedule(other_equipment_schedule_object)
|
63
|
+
end
|
64
|
+
|
65
|
+
# assign the fuel type
|
66
|
+
os_other_equip.setFuelType(@hash[:fuel_type])
|
67
|
+
|
68
|
+
# assign the end use category if it exists
|
69
|
+
if @hash[:end_use_category]
|
70
|
+
os_other_equip.setEndUseSubcategory(@hash[:end_use_category])
|
71
|
+
else
|
72
|
+
os_other_equip.setEndUseSubcategory(defaults[:end_use_category][:default])
|
73
|
+
end
|
74
|
+
|
75
|
+
# assign radiant fraction if it exists
|
76
|
+
if @hash[:radiant_fraction]
|
77
|
+
os_other_equip_def.setFractionRadiant(@hash[:radiant_fraction])
|
78
|
+
else
|
79
|
+
os_other_equip_def.setFractionRadiant(defaults[:radiant_fraction][:default])
|
80
|
+
end
|
81
|
+
|
82
|
+
# assign latent fraction if it exists
|
83
|
+
if @hash[:latent_fraction]
|
84
|
+
os_other_equip_def.setFractionLatent(@hash[:latent_fraction])
|
85
|
+
else
|
86
|
+
os_other_equip_def.setFractionLatent(defaults[:latent_fraction][:default])
|
87
|
+
end
|
88
|
+
|
89
|
+
# assign lost fraction if it exists
|
90
|
+
if @hash[:lost_fraction]
|
91
|
+
os_other_equip_def.setFractionLost(@hash[:lost_fraction])
|
92
|
+
else
|
93
|
+
os_other_equip_def.setFractionLost(defaults[:lost_fraction][:default])
|
94
|
+
end
|
95
|
+
|
96
|
+
os_other_equip
|
97
|
+
end
|
98
|
+
|
99
|
+
end #ProcessAbridged
|
100
|
+
end #Honeybee
|
@@ -168,7 +168,7 @@ module Honeybee
|
|
168
168
|
if eq_type == 'HeatPump_WaterHeater'
|
169
169
|
# create a coil for the heat pump
|
170
170
|
heat_pump = OpenStudio::Model::CoilWaterHeatingAirToWaterHeatPump.new(openstudio_model)
|
171
|
-
heat_pump.setName('HPWH DX Coil' + @@sys_count.to_s)
|
171
|
+
heat_pump.setName('SHW HPWH DX Coil' + @@sys_count.to_s)
|
172
172
|
if shw_hash[:heater_efficiency].nil?
|
173
173
|
heat_pump.setRatedCOP(3.5)
|
174
174
|
else
|
@@ -46,6 +46,9 @@ module Honeybee
|
|
46
46
|
# create ventilation openstudio object and set identifier
|
47
47
|
os_vent = OpenStudio::Model::DesignSpecificationOutdoorAir.new(openstudio_model)
|
48
48
|
os_vent.setName(@hash[:identifier])
|
49
|
+
unless @hash[:display_name].nil?
|
50
|
+
os_vent.setDisplayName(@hash[:display_name])
|
51
|
+
end
|
49
52
|
|
50
53
|
# assign air changes per hour if it exists
|
51
54
|
if @hash[:air_changes_per_hour]
|
@@ -46,6 +46,9 @@ module Honeybee
|
|
46
46
|
# create standard opaque OpenStudio material
|
47
47
|
os_opaque_mat = OpenStudio::Model::StandardOpaqueMaterial.new(openstudio_model)
|
48
48
|
os_opaque_mat.setName(@hash[:identifier])
|
49
|
+
unless @hash[:display_name].nil?
|
50
|
+
os_opaque_mat.setDisplayName(@hash[:display_name])
|
51
|
+
end
|
49
52
|
os_opaque_mat.setThickness(@hash[:thickness])
|
50
53
|
os_opaque_mat.setConductivity(@hash[:conductivity])
|
51
54
|
os_opaque_mat.setDensity(@hash[:density])
|
@@ -47,7 +47,9 @@ module Honeybee
|
|
47
47
|
# create no mass material OpenStudio object and set identifier
|
48
48
|
os_nomass_mat = OpenStudio::Model::MasslessOpaqueMaterial.new(openstudio_model)
|
49
49
|
os_nomass_mat.setName(@hash[:identifier])
|
50
|
-
|
50
|
+
unless @hash[:display_name].nil?
|
51
|
+
os_nomass_mat.setDisplayName(@hash[:display_name])
|
52
|
+
end
|
51
53
|
# assign thermal resistance
|
52
54
|
os_nomass_mat.setThermalResistance(@hash[:r_value])
|
53
55
|
|
@@ -46,7 +46,9 @@ module Honeybee
|
|
46
46
|
# create blind OpenStudio object
|
47
47
|
os_blind = OpenStudio::Model::Blind.new(openstudio_model)
|
48
48
|
os_blind.setName(@hash[:identifier])
|
49
|
-
|
49
|
+
unless @hash[:display_name].nil?
|
50
|
+
os_blind.setDisplayName(@hash[:display_name])
|
51
|
+
end
|
50
52
|
# assign slat orientation
|
51
53
|
if @hash[:slat_orientation]
|
52
54
|
os_blind.setSlatOrientation(@hash[:slat_orientation])
|
@@ -46,7 +46,9 @@ module Honeybee
|
|
46
46
|
# create window gas OpenStudio object
|
47
47
|
os_window_gas = OpenStudio::Model::Gas.new(openstudio_model)
|
48
48
|
os_window_gas.setName(@hash[:identifier])
|
49
|
-
|
49
|
+
unless @hash[:display_name].nil?
|
50
|
+
os_window_gas.setDisplayName(@hash[:display_name])
|
51
|
+
end
|
50
52
|
# assign thickness
|
51
53
|
if @hash[:thickness]
|
52
54
|
os_window_gas.setThickness(@hash[:thickness])
|
@@ -46,6 +46,9 @@ module Honeybee
|
|
46
46
|
# create window gas openstudio object
|
47
47
|
os_gas_custom = OpenStudio::Model::Gas.new(openstudio_model)
|
48
48
|
os_gas_custom.setName(@hash[:identifier])
|
49
|
+
unless @hash[:display_name].nil?
|
50
|
+
os_gas_custom.setDisplayName(@hash[:display_name])
|
51
|
+
end
|
49
52
|
os_gas_custom.setGasType('Custom')
|
50
53
|
os_gas_custom.setConductivityCoefficientA(@hash[:conductivity_coeff_a])
|
51
54
|
os_gas_custom.setViscosityCoefficientA(@hash[:viscosity_coeff_a])
|
@@ -46,7 +46,9 @@ module Honeybee
|
|
46
46
|
# create the gas mixture
|
47
47
|
os_gas_mixture = OpenStudio::Model::GasMixture.new(openstudio_model)
|
48
48
|
os_gas_mixture.setName(@hash[:identifier])
|
49
|
-
|
49
|
+
unless @hash[:display_name].nil?
|
50
|
+
os_gas_mixture.setDisplayName(@hash[:display_name])
|
51
|
+
end
|
50
52
|
# set the thickness
|
51
53
|
if @hash[:thickness]
|
52
54
|
os_gas_mixture.setThickness(@hash[:thickness])
|
@@ -46,7 +46,9 @@ module Honeybee
|
|
46
46
|
# create openstudio standard glazing object and set identifier
|
47
47
|
os_glazing = OpenStudio::Model::StandardGlazing.new(openstudio_model)
|
48
48
|
os_glazing.setName(@hash[:identifier])
|
49
|
-
|
49
|
+
unless @hash[:display_name].nil?
|
50
|
+
os_glazing.setDisplayName(@hash[:display_name])
|
51
|
+
end
|
50
52
|
# assign thickness
|
51
53
|
if @hash[:thickness]
|
52
54
|
os_glazing.setThickness(@hash[:thickness])
|
@@ -46,7 +46,9 @@ module Honeybee
|
|
46
46
|
# create openstudio shade object
|
47
47
|
os_shade_mat = OpenStudio::Model::Shade.new(openstudio_model)
|
48
48
|
os_shade_mat.setName(@hash[:identifier])
|
49
|
-
|
49
|
+
unless @hash[:display_name].nil?
|
50
|
+
os_shade_mat.setDisplayName(@hash[:display_name])
|
51
|
+
end
|
50
52
|
# assign solar transmittance
|
51
53
|
if @hash[:solar_transmittance]
|
52
54
|
os_shade_mat.setSolarTransmittance(@hash[:solar_transmittance])
|
@@ -48,7 +48,9 @@ module Honeybee
|
|
48
48
|
os_simple_glazing.setName(@hash[:identifier])
|
49
49
|
os_simple_glazing.setUFactor(@hash[:u_factor])
|
50
50
|
os_simple_glazing.setSolarHeatGainCoefficient(@hash[:shgc])
|
51
|
-
|
51
|
+
unless @hash[:display_name].nil?
|
52
|
+
os_simple_glazing.setDisplayName(@hash[:display_name])
|
53
|
+
end
|
52
54
|
# assign visible transmittance
|
53
55
|
if @hash[:vt]
|
54
56
|
os_simple_glazing.setVisibleTransmittance(@hash[:vt])
|
@@ -46,7 +46,9 @@ module Honeybee
|
|
46
46
|
# create openstudio space type object
|
47
47
|
os_space_type = OpenStudio::Model::SpaceType.new(openstudio_model)
|
48
48
|
os_space_type.setName(@hash[:identifier])
|
49
|
-
|
49
|
+
unless @hash[:display_name].nil?
|
50
|
+
os_space_type.setDisplayName(@hash[:display_name])
|
51
|
+
end
|
50
52
|
# assign people
|
51
53
|
if @hash[:people]
|
52
54
|
people = PeopleAbridged.new(@hash[:people])
|