honeybee-openstudio 2.23.0 → 2.23.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8b1713bd43ce02933e6b62917cfd588f51b34474ab42cc964fac0707892ef6cb
4
- data.tar.gz: 1b63c7e6ef5ef775b1c6312170fc11cb2117685141e6e6c00d39bc14a4dcb7e9
3
+ metadata.gz: b883c23eb45c35c5ff82b420a7eba79e2cf2f4c228603531c8f049bf19ca4478
4
+ data.tar.gz: f2776a7b81b4cb648ecc5171fd50f79face62d79574c0651801a5bad0fd388d9
5
5
  SHA512:
6
- metadata.gz: b2ce15cb4c8761569e16fae90f1a378a34d4a662abe027458714ed2c11004e84d833dec91ab7795d14d019ada20803a96969ac08c9eb0e8b8f9f725d60911fd5
7
- data.tar.gz: 2ed1a4870310d697989c9af03079522af38459cba61280b2053e8b2e59cade74318e5ec43380ca85512ec74258d02b2f13305206c2a3a24e97395de428a95266
6
+ metadata.gz: 005e5223dd3db47c4a86760d54ed366ed6d2e2a23c31eddb00bab5398744e95de129cac8068708f976393763228953c9ab1e9f2d01949229ca1ed980b98edb67
7
+ data.tar.gz: 050271b5e95a661bcc489303f9362040a283e891410a1cb4cd71eb3af5f793a69122cbb147cf5fada554240a0a64c88f37a0b53a06188d350406ee319d3488ae
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = 'honeybee-openstudio'
7
- spec.version = '2.23.0'
7
+ spec.version = '2.23.4'
8
8
  spec.authors = ['Tanushree Charan', 'Dan Macumber', 'Chris Mackey', 'Mostapha Sadeghipour Roudsari']
9
9
  spec.email = ['tanushree.charan@nrel.gov', 'chris@ladybug.tools']
10
10
 
@@ -128,14 +128,10 @@ module Honeybee
128
128
  def self.energy_properties_from_model(openstudio_model)
129
129
  hash = {}
130
130
  hash[:type] = 'ModelEnergyProperties'
131
- hash[:constructions] = []
132
131
  hash[:constructions] = constructions_from_model(openstudio_model)
133
132
  hash[:materials] = materials_from_model(openstudio_model)
134
- hash[:construction_sets] = []
135
133
  hash[:construction_sets] = constructionsets_from_model(openstudio_model)
136
- hash[:schedule_type_limits] = []
137
134
  hash[:schedule_type_limits] = schedtypelimits_from_model(openstudio_model)
138
- hash[:schedules] = []
139
135
  hash[:schedules] = scheduleruleset_from_model(openstudio_model)
140
136
 
141
137
  hash
@@ -39,23 +39,49 @@ module Honeybee
39
39
  # create an empty hash
40
40
  hash = {}
41
41
  hash[:type] = 'ScheduleRulesetAbridged'
42
- # set hash values from OpenStudio Object
43
- hash[:identifier] = schedule_ruleset.nameString
44
- # check if boost optional object is empty
45
- hash[:default_day_schedule] = schedule_ruleset.defaultDaySchedule.nameString
46
- hash[:summer_designday_schedule] = schedule_ruleset.summerDesignDaySchedule.nameString
47
- hash[:winter_designday_schedule] = schedule_ruleset.winterDesignDaySchedule.nameString
48
- hash[:holiday_schedule] = schedule_ruleset.holidaySchedule.nameString
42
+ # set the primary (required) day schedules of the object
43
+ hash[:identifier] = clean_name(schedule_ruleset.nameString)
44
+ hash[:default_day_schedule] = clean_name(schedule_ruleset.defaultDaySchedule.nameString)
45
+ hash[:summer_designday_schedule] = clean_name(schedule_ruleset.summerDesignDaySchedule.nameString)
46
+ hash[:winter_designday_schedule] = clean_name(schedule_ruleset.winterDesignDaySchedule.nameString)
47
+ hash[:holiday_schedule] = clean_name(schedule_ruleset.holidaySchedule.nameString)
49
48
 
50
- schedule_days = [schedule_ruleset.defaultDaySchedule, schedule_ruleset.summerDesignDaySchedule, schedule_ruleset.winterDesignDaySchedule, schedule_ruleset.holidaySchedule]
51
- hash[:day_schedules] = []
52
- schedule_days.each do |schedule_day|
53
- hash[:day_schedules] << ScheduleRulesetAbridged.from_day_schedule(schedule_day)
49
+ # create a list of all day schedules referenced in the Ruleset
50
+ schedule_days, day_ids = [], []
51
+ required_days = [
52
+ schedule_ruleset.defaultDaySchedule,
53
+ schedule_ruleset.summerDesignDaySchedule,
54
+ schedule_ruleset.winterDesignDaySchedule,
55
+ schedule_ruleset.holidaySchedule
56
+ ]
57
+ required_days.each do |day_sch|
58
+ unless day_ids.include? day_sch.nameString
59
+ schedule_days << day_sch
60
+ day_ids << day_sch.nameString
61
+ end
54
62
  end
55
63
 
64
+ # loop through the rules and add them along with their day schedules
56
65
  hash[:schedule_rules] = []
57
66
  schedule_ruleset.scheduleRules.each do |schedule_rule|
58
67
  hash[:schedule_rules] << ScheduleRulesetAbridged.from_schedule_rule(schedule_rule)
68
+ day_sch = schedule_rule.daySchedule
69
+ unless day_ids.include? day_sch.nameString
70
+ schedule_days << day_sch
71
+ day_ids << day_sch.nameString
72
+ end
73
+ end
74
+
75
+ # write all of the day schedule specifications into the hash
76
+ hash[:day_schedules] = []
77
+ schedule_days.each do |schedule_day|
78
+ hash[:day_schedules] << ScheduleRulesetAbridged.from_day_schedule(schedule_day)
79
+ end
80
+
81
+ # assing any schedule type limits if they exist
82
+ unless schedule_ruleset.scheduleTypeLimits.empty?
83
+ typ_lim = schedule_ruleset.scheduleTypeLimits.get
84
+ hash[:schedule_type_limit] = clean_name(typ_lim.nameString)
59
85
  end
60
86
 
61
87
  hash
@@ -64,7 +90,7 @@ module Honeybee
64
90
  def self.from_day_schedule(day_schedule)
65
91
  hash = {}
66
92
  hash[:type] = 'ScheduleDay'
67
- hash[:identifier] = day_schedule.nameString
93
+ hash[:identifier] = clean_name(day_schedule.nameString)
68
94
  hash[:interpolate] = day_schedule.interpolatetoTimestep
69
95
  hash[:values] = day_schedule.values
70
96
  time_until = [[0,0]]
@@ -80,7 +106,7 @@ module Honeybee
80
106
  def self.from_schedule_rule(schedule_rule)
81
107
  hash = {}
82
108
  hash[:type] = 'ScheduleRuleAbridged'
83
- hash[:schedule_day] = schedule_rule.daySchedule.nameString
109
+ hash[:schedule_day] = clean_name(schedule_rule.daySchedule.nameString)
84
110
  hash[:apply_sunday] = schedule_rule.applySunday
85
111
  hash[:apply_monday] = schedule_rule.applyMonday
86
112
  hash[:apply_tuesday] = schedule_rule.applyTuesday
@@ -40,7 +40,7 @@ module Honeybee
40
40
  hash = {}
41
41
  hash[:type] = 'ScheduleTypeLimit'
42
42
  # set hash values from OpenStudio Object
43
- hash[:identifier] = schedule_type_limit.nameString
43
+ hash[:identifier] = clean_name(schedule_type_limit.nameString)
44
44
  # check if boost optional object is empty
45
45
  unless schedule_type_limit.lowerLimitValue.empty?
46
46
  hash[:lower_limit] = schedule_type_limit.lowerLimitValue.get
@@ -54,7 +54,21 @@ module Honeybee
54
54
  numeric_type = schedule_type_limit.numericType.get
55
55
  hash[:numeric_type] = numeric_type.titleize
56
56
  end
57
- hash[:unit_type] = schedule_type_limit.unitType
57
+
58
+ # make sure unit type always follows the capitalization of the Honeybee Enumeration
59
+ unit_type = schedule_type_limit.unitType.titleize
60
+ if unit_type == 'Deltatemperature'
61
+ unit_type = 'DeltaTemperature'
62
+ elsif unit_type == 'Precipitationrate'
63
+ unit_type = 'PrecipitationRate'
64
+ elsif unit_type == 'Convectioncoefficient'
65
+ unit_type = 'ConvectionCoefficient'
66
+ elsif unit_type == 'Activitylevel'
67
+ unit_type = 'ActivityLevel'
68
+ elsif unit_type == 'Controlmode'
69
+ unit_type = 'Control'
70
+ end
71
+ hash[:unit_type] = unit_type
58
72
 
59
73
  hash
60
74
  end
@@ -36,13 +36,6 @@ module Honeybee
36
36
 
37
37
  attr_reader :errors, :warnings
38
38
 
39
- @@encoding_options = {
40
- :invalid => :replace, # Replace invalid byte sequences
41
- :undef => :replace, # Replace anything not defined in ASCII
42
- :replace => '', # Use a blank for those replacements
43
- :universal_newline => true # Always break lines with \n
44
- }
45
-
46
39
  def method_missing(sym, *args)
47
40
  name = sym.to_s
48
41
  aname = name.sub('=', '')
@@ -107,12 +100,12 @@ module Honeybee
107
100
 
108
101
  # remove illegal characters in identifier
109
102
  def self.clean_name(str)
110
- ascii = str.encode(Encoding.find('ASCII'), @@encoding_options)
103
+ ascii = str.encode(Encoding.find('ASCII'))
111
104
  end
112
105
 
113
106
  # remove illegal characters in identifier
114
107
  def self.clean_identifier(str)
115
- encode_str = str.encode(Encoding.find('ASCII'), @@encoding_options)
108
+ encode_str = str.encode(Encoding.find('ASCII'))
116
109
  encode_str.gsub(/[^.A-Za-z0-9_-]/, '_').gsub(' ', '_')
117
110
  end
118
111
 
@@ -88,7 +88,7 @@ module Honeybee
88
88
 
89
89
  # set up the EMS sensor for the schedule value
90
90
  state_sch = openstudio_model.getScheduleByName(@hash[:schedule])
91
- @sch_sensor_name = replace_ems_special_characters(@hash[:identifier]) + '_Sensor' + @@sensor_count.to_s
91
+ @sch_sensor_name = replace_ems_special_characters(@hash[:identifier]) + 'Sensor' + @@sensor_count.to_s
92
92
  @@sensor_count = @@sensor_count + 1
93
93
  unless state_sch.empty? # schedule not specified
94
94
  sch_var = OpenStudio::Model::OutputVariable.new('Schedule Value', openstudio_model)
@@ -107,18 +107,15 @@ module Honeybee
107
107
  @sub_faces.each do |dyn_window|
108
108
  window_act = OpenStudio::Model::EnergyManagementSystemActuator.new(
109
109
  dyn_window, 'Surface', 'Construction State')
110
- dyn_window_name = dyn_window.name
111
- unless dyn_window_name.empty?
112
- act_name = replace_ems_special_characters(dyn_window_name.get) + '_Actuator' + @@actuator_count.to_s
113
- @@actuator_count = @@actuator_count + 1
114
- window_act.setName(act_name)
115
- actuator_names << act_name
116
- end
110
+ act_name = replace_ems_special_characters(dyn_window.nameString) + 'Actuator' + @@actuator_count.to_s
111
+ @@actuator_count = @@actuator_count + 1
112
+ window_act.setName(act_name)
113
+ actuator_names << act_name
117
114
  end
118
115
 
119
116
  # create the EMS Program to accout for each state according to the control logic
120
117
  ems_program = OpenStudio::Model::EnergyManagementSystemProgram.new(openstudio_model)
121
- prog_name = replace_ems_special_characters(@hash[:identifier]) + '_StateChange' + @@program_count.to_s
118
+ prog_name = replace_ems_special_characters(@hash[:identifier]) + 'StateChange' + @@program_count.to_s
122
119
  @@program_count = @@program_count + 1
123
120
  ems_program.setName(prog_name)
124
121
 
@@ -143,12 +140,9 @@ module Honeybee
143
140
  # create the construction index variable
144
141
  constr_i = OpenStudio::Model::EnergyManagementSystemConstructionIndexVariable.new(
145
142
  openstudio_model, construction)
146
- constr_name = construction.name
147
- unless constr_name.empty?
148
- constr_i_name = replace_ems_special_characters(constr_name.get) + '_State' + @@state_count.to_s
149
- @@state_count = @@state_count + 1
150
- constr_i.setName(constr_i_name)
151
- end
143
+ constr_i_name = replace_ems_special_characters(construction.nameString) + 'State' + @@state_count.to_s
144
+ @@state_count = @@state_count + 1
145
+ constr_i.setName(constr_i_name)
152
146
 
153
147
  # loop through the actuators and set the appropriate window state
154
148
  actuator_names.each do |act_name|
@@ -86,13 +86,13 @@ module Honeybee
86
86
  shd_mat_name = openstudio_model.getMaterialByName(@hash[:shade_material])
87
87
  unless shd_mat_name.empty?
88
88
  @shade_material = shd_mat_name.get
89
- obj_type = @shade_material.iddObject.name
89
+ obj_type = @shade_material.iddObject.name.to_s
90
90
  end
91
91
  unless @shade_material.nil?
92
- if obj_type == 'OS:WindowMaterial:StandardGlazing'
92
+ if obj_type == 'OS:WindowMaterial:StandardGlazing' || obj_type == 'OS:WindowMaterial:Glazing'
93
93
  if @shade_location == 'Interior'
94
94
  os_materials[-1] = @shade_material
95
- elsif @shade_location == 'Exterior' | os_materials.length < 2
95
+ elsif @shade_location == 'Exterior' || os_materials.length < 2
96
96
  os_materials[0] = @shade_material
97
97
  else # middle glass pane
98
98
  os_materials[-3] = @shade_material
@@ -150,9 +150,9 @@ module Honeybee
150
150
 
151
151
  # figure out the shading type
152
152
  unless @shade_material.nil?
153
- obj_type = @shade_material.iddObject.name
153
+ obj_type = @shade_material.iddObject.name.to_s
154
154
  end
155
- if obj_type == 'OS:WindowMaterial:StandardGlazing'
155
+ if obj_type == 'OS:WindowMaterial:StandardGlazing' || obj_type == 'OS:WindowMaterial:Glazing'
156
156
  shd_type = 'SwitchableGlazing'
157
157
  elsif obj_type == 'OS:WindowMaterial:Blind'
158
158
  if @shade_location == 'Between'
@@ -85,7 +85,7 @@ module Honeybee
85
85
  in_var.setKeyValue(os_zone_name)
86
86
  end
87
87
  in_air_temp = OpenStudio::Model::EnergyManagementSystemSensor.new(openstudio_model, in_var)
88
- in_sensor_name = replace_ems_special_characters(os_zone_name) + '_Sensor' + @@sensor_count.to_s
88
+ in_sensor_name = replace_ems_special_characters(os_zone_name) + 'Sensor' + @@sensor_count.to_s
89
89
  @@sensor_count = @@sensor_count + 1
90
90
  in_air_temp.setName(in_sensor_name)
91
91
 
@@ -97,7 +97,7 @@ module Honeybee
97
97
  sch_var.setReportingFrequency('Timestep')
98
98
  sch_var.setKeyValue(@hash[:schedule])
99
99
  sch_sens = OpenStudio::Model::EnergyManagementSystemSensor.new(openstudio_model, sch_var)
100
- sch_sensor_name = replace_ems_special_characters(os_zone_name) + '_Sensor' + @@sensor_count.to_s
100
+ sch_sensor_name = replace_ems_special_characters(os_zone_name) + 'Sensor' + @@sensor_count.to_s
101
101
  @@sensor_count = @@sensor_count + 1
102
102
  sch_sens.setName(sch_sensor_name)
103
103
  end
@@ -108,14 +108,11 @@ module Honeybee
108
108
  vent_opening_surfaces.each do |vent_srf|
109
109
  window_act = OpenStudio::Model::EnergyManagementSystemActuator.new(
110
110
  vent_srf, 'AirFlow Network Window/Door Opening', 'Venting Opening Factor')
111
- vent_srf_name = vent_srf.name
112
- unless vent_srf_name.empty?
113
- act_name = replace_ems_special_characters(vent_srf_name.get) + \
114
- '_OpenFactor' + @@actuator_count.to_s
115
- @@actuator_count = @@actuator_count + 1
116
- window_act.setName(act_name)
117
- actuator_names << act_name
118
- end
111
+ act_name = replace_ems_special_characters(vent_srf.nameString) + \
112
+ 'OpenFactor' + @@actuator_count.to_s
113
+ @@actuator_count = @@actuator_count + 1
114
+ window_act.setName(act_name)
115
+ actuator_names << act_name
119
116
  end
120
117
 
121
118
  # create the first line of the EMS Program to open each window according to the control logic
@@ -158,7 +155,7 @@ module Honeybee
158
155
 
159
156
  # initialize the program and add the complete logic
160
157
  ems_program = OpenStudio::Model::EnergyManagementSystemProgram.new(openstudio_model)
161
- prog_name = replace_ems_special_characters(os_zone_name) + '_WindowOpening' + @@program_count.to_s
158
+ prog_name = replace_ems_special_characters(os_zone_name) + 'WindowOpening' + @@program_count.to_s
162
159
  @@program_count = @@program_count + 1
163
160
  ems_program.setName(prog_name)
164
161
  ems_program.addLine(complete_logic)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: honeybee-openstudio
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.23.0
4
+ version: 2.23.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tanushree Charan
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: exe
13
13
  cert_chain: []
14
- date: 2021-09-15 00:00:00.000000000 Z
14
+ date: 2021-09-17 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: bundler