openstudio-common-measures 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (165) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +44 -0
  3. data/Rakefile +3 -0
  4. data/lib/measures/ChangeBuildingLocation/measure.xml +11 -11
  5. data/lib/measures/ExportScheduleCSV/measure.rb +1 -1
  6. data/lib/measures/ExportScheduleCSV/measure.xml +16 -15
  7. data/lib/measures/ImportEnvelopeAndInternalLoadsFromIdf/measure.xml +7 -6
  8. data/lib/measures/MeterFlodPlot/measure.rb +1 -1
  9. data/lib/measures/MeterFlodPlot/measure.xml +16 -15
  10. data/lib/measures/ReportModelChanges/measure.xml +2 -2
  11. data/lib/measures/RunPeriodMultiple/measure.xml +12 -11
  12. data/lib/measures/ServerDirectoryCleanup/README.md +97 -3
  13. data/lib/measures/ServerDirectoryCleanup/measure.rb +1 -1
  14. data/lib/measures/ServerDirectoryCleanup/measure.xml +10 -59
  15. data/lib/measures/UnmetLoadHoursTroubleshooting/README.md +9 -3
  16. data/lib/measures/UnmetLoadHoursTroubleshooting/measure.rb +1 -1
  17. data/lib/measures/UnmetLoadHoursTroubleshooting/measure.xml +66 -17
  18. data/lib/measures/VentilationQAQC/README.md +9 -3
  19. data/lib/measures/VentilationQAQC/measure.rb +52 -45
  20. data/lib/measures/VentilationQAQC/measure.xml +25 -30
  21. data/lib/measures/ZoneReport/README.md +2 -2
  22. data/lib/measures/ZoneReport/measure.rb +1 -1
  23. data/lib/measures/ZoneReport/measure.xml +10 -11
  24. data/lib/measures/add_ems_to_control_ev_charging/LICENSE.MD.txt +15 -0
  25. data/lib/measures/{AddDaylightSensors → add_ems_to_control_ev_charging}/LICENSE.md +0 -0
  26. data/lib/measures/add_ems_to_control_ev_charging/ReadMe.MD +29 -0
  27. data/lib/measures/add_ems_to_control_ev_charging/measure.rb +288 -0
  28. data/lib/measures/add_ems_to_control_ev_charging/measure.xml +87 -0
  29. data/lib/measures/add_ev_load/LICENSE.MD.txt +15 -0
  30. data/lib/measures/{EnableDemandControlledVentilation → add_ev_load}/LICENSE.md +0 -0
  31. data/lib/measures/add_ev_load/ReadMe.MD +34 -0
  32. data/lib/measures/add_ev_load/measure.rb +328 -0
  33. data/lib/measures/add_ev_load/measure.xml +153 -0
  34. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/PSN_BuildingKey.csv +104 -0
  35. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/PSN_BuildingKey_v2.csv +104 -0
  36. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow1_flex1.csv +96 -0
  37. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow1_flex2.csv +96 -0
  38. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow1_flex3.csv +96 -0
  39. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow2_flex1.csv +96 -0
  40. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow2_flex2.csv +96 -0
  41. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow2_flex3.csv +96 -0
  42. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow3_flex1.csv +96 -0
  43. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow3_flex2.csv +96 -0
  44. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow3_flex3.csv +96 -0
  45. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow1_flex1.csv +96 -0
  46. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow1_flex2.csv +96 -0
  47. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow1_flex3.csv +96 -0
  48. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow2_flex1.csv +96 -0
  49. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow2_flex2.csv +96 -0
  50. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow2_flex3.csv +96 -0
  51. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow3_flex1.csv +96 -0
  52. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow3_flex2.csv +96 -0
  53. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow3_flex3.csv +96 -0
  54. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow1_flex1.csv +96 -0
  55. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow1_flex2.csv +96 -0
  56. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow1_flex3.csv +96 -0
  57. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow2_flex1.csv +96 -0
  58. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow2_flex2.csv +96 -0
  59. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow2_flex3.csv +96 -0
  60. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow3_flex1.csv +96 -0
  61. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow3_flex2.csv +96 -0
  62. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow3_flex3.csv +96 -0
  63. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/fast_charge_15min_Saturday.csv +96 -0
  64. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/fast_charge_15min_Sunday.csv +96 -0
  65. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/fast_charge_15min_Weekday.csv +96 -0
  66. data/lib/measures/envelope_and_internal_load_breakdown/README.md +4 -3
  67. data/lib/measures/envelope_and_internal_load_breakdown/measure.rb +7 -4
  68. data/lib/measures/envelope_and_internal_load_breakdown/measure.xml +16 -17
  69. data/lib/measures/envelope_and_internal_load_breakdown/resources/report.html.erb +1 -0
  70. data/lib/measures/example_report/README.md +27 -5
  71. data/lib/measures/example_report/measure.rb +7 -4
  72. data/lib/measures/example_report/measure.xml +16 -29
  73. data/lib/measures/example_report/resources/report.html.erb +1 -0
  74. data/lib/measures/gem_env_report/measure.xml +1 -1
  75. data/lib/measures/generic_qaqc/README.md +187 -5
  76. data/lib/measures/generic_qaqc/measure.rb +1 -1
  77. data/lib/measures/generic_qaqc/measure.xml +15 -85
  78. data/lib/measures/generic_qaqc/resources/report.html.erb +1 -0
  79. data/lib/measures/hvac_psychrometric_chart/README.md +11 -5
  80. data/lib/measures/hvac_psychrometric_chart/measure.rb +1 -1
  81. data/lib/measures/hvac_psychrometric_chart/measure.xml +13 -18
  82. data/lib/measures/hvac_psychrometric_chart/resources/report.html.erb +1 -0
  83. data/lib/measures/inject_idf_objects/measure.xml +25 -24
  84. data/lib/measures/openstudio_results/README.md +195 -5
  85. data/lib/measures/openstudio_results/measure.rb +2 -2
  86. data/lib/measures/openstudio_results/measure.xml +30 -154
  87. data/lib/measures/openstudio_results/resources/report.html.erb +1 -0
  88. data/lib/measures/set_run_period/measure.xml +2 -2
  89. data/lib/measures/{EnableEconomizerControl → view_data}/LICENSE.md +0 -0
  90. data/lib/measures/view_data/README.md +64 -0
  91. data/lib/measures/{AddDaylightSensors → view_data}/README.md.erb +0 -0
  92. data/lib/measures/view_data/measure.rb +454 -0
  93. data/lib/measures/view_data/measure.xml +159 -0
  94. data/lib/measures/view_data/resources/report.html.in +2881 -0
  95. data/lib/measures/view_data/resources/va3c.rb +1021 -0
  96. data/lib/measures/{ImproveFanBeltEfficiency → view_model}/LICENSE.md +0 -0
  97. data/lib/measures/view_model/README.md +26 -0
  98. data/lib/measures/{EnableDemandControlledVentilation → view_model}/README.md.erb +0 -0
  99. data/lib/measures/view_model/measure.rb +146 -0
  100. data/lib/measures/view_model/measure.xml +98 -0
  101. data/lib/measures/view_model/resources/report.html.in +2881 -0
  102. data/lib/measures/view_model/resources/va3c.rb +1021 -0
  103. data/lib/openstudio/common_measures/version.rb +1 -1
  104. data/openstudio-common-measures.gemspec +1 -1
  105. metadata +61 -71
  106. data/lib/measures/AddDaylightSensors/README.md +0 -136
  107. data/lib/measures/AddDaylightSensors/measure.rb +0 -521
  108. data/lib/measures/AddDaylightSensors/measure.xml +0 -233
  109. data/lib/measures/EnableDemandControlledVentilation/README.md +0 -32
  110. data/lib/measures/EnableDemandControlledVentilation/measure.rb +0 -154
  111. data/lib/measures/EnableDemandControlledVentilation/measure.xml +0 -99
  112. data/lib/measures/EnableEconomizerControl/README.md +0 -48
  113. data/lib/measures/EnableEconomizerControl/README.md.erb +0 -42
  114. data/lib/measures/EnableEconomizerControl/measure.rb +0 -172
  115. data/lib/measures/EnableEconomizerControl/measure.xml +0 -124
  116. data/lib/measures/ImproveFanBeltEfficiency/README.md +0 -104
  117. data/lib/measures/ImproveFanBeltEfficiency/README.md.erb +0 -42
  118. data/lib/measures/ImproveFanBeltEfficiency/measure.rb +0 -366
  119. data/lib/measures/ImproveFanBeltEfficiency/measure.xml +0 -185
  120. data/lib/measures/ImproveMotorEfficiency/LICENSE.md +0 -27
  121. data/lib/measures/ImproveMotorEfficiency/README.md +0 -104
  122. data/lib/measures/ImproveMotorEfficiency/README.md.erb +0 -42
  123. data/lib/measures/ImproveMotorEfficiency/measure.rb +0 -365
  124. data/lib/measures/ImproveMotorEfficiency/measure.xml +0 -182
  125. data/lib/measures/IncreaseInsulationRValueForExteriorWalls/LICENSE.md +0 -27
  126. data/lib/measures/IncreaseInsulationRValueForExteriorWalls/README.md +0 -64
  127. data/lib/measures/IncreaseInsulationRValueForExteriorWalls/README.md.erb +0 -42
  128. data/lib/measures/IncreaseInsulationRValueForExteriorWalls/measure.rb +0 -422
  129. data/lib/measures/IncreaseInsulationRValueForExteriorWalls/measure.xml +0 -150
  130. data/lib/measures/IncreaseInsulationRValueForRoofs/LICENSE.md +0 -27
  131. data/lib/measures/IncreaseInsulationRValueForRoofs/README.md +0 -64
  132. data/lib/measures/IncreaseInsulationRValueForRoofs/README.md.erb +0 -42
  133. data/lib/measures/IncreaseInsulationRValueForRoofs/measure.rb +0 -422
  134. data/lib/measures/IncreaseInsulationRValueForRoofs/measure.xml +0 -143
  135. data/lib/measures/ReduceElectricEquipmentLoadsByPercentage/LICENSE.md +0 -27
  136. data/lib/measures/ReduceElectricEquipmentLoadsByPercentage/README.md +0 -97
  137. data/lib/measures/ReduceElectricEquipmentLoadsByPercentage/README.md.erb +0 -42
  138. data/lib/measures/ReduceElectricEquipmentLoadsByPercentage/measure.rb +0 -450
  139. data/lib/measures/ReduceElectricEquipmentLoadsByPercentage/measure.xml +0 -186
  140. data/lib/measures/ReduceLightingLoadsByPercentage/LICENSE.md +0 -27
  141. data/lib/measures/ReduceLightingLoadsByPercentage/README.md +0 -96
  142. data/lib/measures/ReduceLightingLoadsByPercentage/README.md.erb +0 -42
  143. data/lib/measures/ReduceLightingLoadsByPercentage/measure.rb +0 -513
  144. data/lib/measures/ReduceLightingLoadsByPercentage/measure.xml +0 -191
  145. data/lib/measures/ReduceSpaceInfiltrationByPercentage/LICENSE.md +0 -27
  146. data/lib/measures/ReduceSpaceInfiltrationByPercentage/README.md +0 -104
  147. data/lib/measures/ReduceSpaceInfiltrationByPercentage/README.md.erb +0 -42
  148. data/lib/measures/ReduceSpaceInfiltrationByPercentage/measure.rb +0 -349
  149. data/lib/measures/ReduceSpaceInfiltrationByPercentage/measure.xml +0 -181
  150. data/lib/measures/ReduceVentilationByPercentage/LICENSE.md +0 -27
  151. data/lib/measures/ReduceVentilationByPercentage/README.md +0 -40
  152. data/lib/measures/ReduceVentilationByPercentage/README.md.erb +0 -42
  153. data/lib/measures/ReduceVentilationByPercentage/measure.rb +0 -291
  154. data/lib/measures/ReduceVentilationByPercentage/measure.xml +0 -96
  155. data/lib/measures/VentilationQAQC/ExampleModel.osm +0 -28468
  156. data/lib/measures/create_variable_speed_rtu/LICENSE.md +0 -27
  157. data/lib/measures/create_variable_speed_rtu/README.md +0 -120
  158. data/lib/measures/create_variable_speed_rtu/README.md.erb +0 -42
  159. data/lib/measures/create_variable_speed_rtu/measure.rb +0 -539
  160. data/lib/measures/create_variable_speed_rtu/measure.xml +0 -207
  161. data/lib/measures/radiant_slab_with_doas/LICENSE.md +0 -27
  162. data/lib/measures/radiant_slab_with_doas/README.md +0 -156
  163. data/lib/measures/radiant_slab_with_doas/README.md.erb +0 -42
  164. data/lib/measures/radiant_slab_with_doas/measure.rb +0 -403
  165. data/lib/measures/radiant_slab_with_doas/measure.xml +0 -345
@@ -38,6 +38,7 @@
38
38
 
39
39
 
40
40
 
41
+
41
42
  <!DOCTYPE html>
42
43
  <html lang="en">
43
44
  <head>
@@ -3,8 +3,8 @@
3
3
  <schema_version>3.0</schema_version>
4
4
  <name>set_run_period</name>
5
5
  <uid>7a84292a-3975-4ab3-9284-6edabcbe750b</uid>
6
- <version_id>6e57d097-cd9e-4b3e-a5cf-2d86834e6e6c</version_id>
7
- <version_modified>20200509T041912Z</version_modified>
6
+ <version_id>4f0334fc-172b-40ec-99e5-1c83e308f760</version_id>
7
+ <version_modified>20200623T205026Z</version_modified>
8
8
  <xml_checksum>2AF3A68E</xml_checksum>
9
9
  <class_name>SetRunPeriod</class_name>
10
10
  <display_name>SetRunPeriod</display_name>
@@ -0,0 +1,64 @@
1
+
2
+
3
+ ###### (Automatically generated documentation)
4
+
5
+ # ViewData
6
+
7
+ ## Description
8
+ Visualize energy simulation data plotted on an OpenStudio model in a web based viewer
9
+
10
+ ## Modeler Description
11
+ Converts the OpenStudio model to vA3C JSON format and renders using Three.js, simulation data is applied to surfaces of the model
12
+
13
+ ## Measure Type
14
+ ReportingMeasure
15
+
16
+ ## Taxonomy
17
+
18
+
19
+ ## Arguments
20
+
21
+
22
+ ### Model Source
23
+
24
+ **Name:** file_source,
25
+ **Type:** Choice,
26
+ **Units:** ,
27
+ **Required:** true,
28
+ **Model Dependent:** false
29
+
30
+ ### Reporting Frequency
31
+
32
+ **Name:** reporting_frequency,
33
+ **Type:** Choice,
34
+ **Units:** ,
35
+ **Required:** true,
36
+ **Model Dependent:** false
37
+
38
+ ### Variable 1 Name
39
+
40
+ **Name:** variable1_name,
41
+ **Type:** String,
42
+ **Units:** ,
43
+ **Required:** true,
44
+ **Model Dependent:** false
45
+
46
+ ### Variable 2 Name
47
+
48
+ **Name:** variable2_name,
49
+ **Type:** String,
50
+ **Units:** ,
51
+ **Required:** true,
52
+ **Model Dependent:** false
53
+
54
+ ### Variable 3 Name
55
+
56
+ **Name:** variable3_name,
57
+ **Type:** String,
58
+ **Units:** ,
59
+ **Required:** true,
60
+ **Model Dependent:** false
61
+
62
+
63
+
64
+
@@ -0,0 +1,454 @@
1
+ # *******************************************************************************
2
+ # OpenStudio(R), Copyright (c) 2008-2020, Alliance for Sustainable Energy, LLC.
3
+ # All rights reserved.
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+ #
7
+ # (1) Redistributions of source code must retain the above copyright notice,
8
+ # this list of conditions and the following disclaimer.
9
+ #
10
+ # (2) Redistributions in binary form must reproduce the above copyright notice,
11
+ # this list of conditions and the following disclaimer in the documentation
12
+ # and/or other materials provided with the distribution.
13
+ #
14
+ # (3) Neither the name of the copyright holder nor the names of any contributors
15
+ # may be used to endorse or promote products derived from this software without
16
+ # specific prior written permission from the respective party.
17
+ #
18
+ # (4) Other than as required in clauses (1) and (2), distributions in any form
19
+ # of modifications or other derivative works may not use the "OpenStudio"
20
+ # trademark, "OS", "os", or any other confusingly similar designation without
21
+ # specific prior written permission from Alliance for Sustainable Energy, LLC.
22
+ #
23
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS
24
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
25
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE
27
+ # UNITED STATES GOVERNMENT, OR THE UNITED STATES DEPARTMENT OF ENERGY, NOR ANY OF
28
+ # THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
29
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
30
+ # OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
32
+ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33
+ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
+ # *******************************************************************************
35
+
36
+ require 'rubygems'
37
+ require 'json'
38
+ require 'erb'
39
+ require 'date'
40
+
41
+ require_relative 'resources/va3c'
42
+
43
+ # start the measure
44
+ class ViewData < OpenStudio::Ruleset::ReportingUserScript
45
+ # define the name that a user will see
46
+ def name
47
+ return 'ViewData'
48
+ end
49
+
50
+ # human readable description
51
+ def description
52
+ return 'Visualize energy simulation data plotted on an OpenStudio model in a web based viewer'
53
+ end
54
+
55
+ # human readable description of modeling approach
56
+ def modeler_description
57
+ return 'Converts the OpenStudio model to vA3C JSON format and renders using Three.js, simulation data is applied to surfaces of the model'
58
+ end
59
+
60
+ def energyPlusOutputRequests(runner, user_arguments)
61
+ super(runner, user_arguments)
62
+
63
+ result = OpenStudio::IdfObjectVector.new
64
+
65
+ # use the built-in error checking
66
+ if !runner.validateUserArguments(arguments, user_arguments)
67
+ return result
68
+ end
69
+
70
+ reporting_frequency = runner.getStringArgumentValue('reporting_frequency', user_arguments)
71
+
72
+ variable1_name = runner.getStringArgumentValue('variable1_name', user_arguments)
73
+ result << OpenStudio::IdfObject.load("Output:Variable,*,#{variable1_name},#{reporting_frequency};").get
74
+
75
+ variable2_name = runner.getStringArgumentValue('variable2_name', user_arguments)
76
+ result << OpenStudio::IdfObject.load("Output:Variable,*,#{variable2_name},#{reporting_frequency};").get
77
+
78
+ variable3_name = runner.getStringArgumentValue('variable3_name', user_arguments)
79
+ result << OpenStudio::IdfObject.load("Output:Variable,*,#{variable3_name},#{reporting_frequency};").get
80
+
81
+ return result
82
+ end
83
+
84
+ # define the arguments that the user will input
85
+ def arguments(model = nil)
86
+ args = OpenStudio::Ruleset::OSArgumentVector.new
87
+
88
+ chs = OpenStudio::StringVector.new
89
+ chs << 'Last OSM'
90
+ chs << 'Last IDF'
91
+ file_source = OpenStudio::Ruleset::OSArgument.makeChoiceArgument('file_source', chs, true)
92
+ file_source.setDisplayName('Model Source')
93
+ file_source.setDefaultValue('Last OSM')
94
+ args << file_source
95
+
96
+ chs = OpenStudio::StringVector.new
97
+ chs << 'Timestep'
98
+ chs << 'Hourly'
99
+ reporting_frequency = OpenStudio::Ruleset::OSArgument.makeChoiceArgument('reporting_frequency', chs, true)
100
+ reporting_frequency.setDisplayName('Reporting Frequency')
101
+ reporting_frequency.setDefaultValue('Hourly')
102
+ args << reporting_frequency
103
+
104
+ variable1_name = OpenStudio::Ruleset::OSArgument.makeStringArgument('variable1_name', true)
105
+ variable1_name.setDisplayName('Variable 1 Name')
106
+ variable1_name.setDefaultValue('Surface Outside Face Temperature')
107
+ args << variable1_name
108
+
109
+ variable2_name = OpenStudio::Ruleset::OSArgument.makeStringArgument('variable2_name', true)
110
+ variable2_name.setDisplayName('Variable 2 Name')
111
+ variable2_name.setDefaultValue('Surface Inside Face Temperature')
112
+ args << variable2_name
113
+
114
+ variable3_name = OpenStudio::Ruleset::OSArgument.makeStringArgument('variable3_name', true)
115
+ variable3_name.setDisplayName('Variable 3 Name')
116
+ variable3_name.setDefaultValue('Zone Mean Radiant Temperature')
117
+ args << variable3_name
118
+
119
+ return args
120
+ end
121
+
122
+ def datetimes_to_array(dateTimes)
123
+ result = []
124
+
125
+ dateTimes.each do |d|
126
+ date = d.date
127
+ time = d.time
128
+ result << DateTime.new(date.year, date.monthOfYear.value, date.dayOfMonth, time.hours, time.minutes, time.seconds).strftime('%s').to_i
129
+ end
130
+ return result
131
+ end
132
+
133
+ def vector_to_array(vector)
134
+ result = []
135
+ (0...vector.size).each do |i|
136
+ result << vector[i]
137
+ end
138
+ return result
139
+ end
140
+
141
+ def format_array(vector)
142
+ result = []
143
+ vector.each do |x|
144
+ result << format('%.6g', x).to_f
145
+ end
146
+ return result
147
+ end
148
+
149
+ # define what happens when the measure is run
150
+ def run(runner, user_arguments)
151
+ super(runner, user_arguments)
152
+
153
+ # use the built-in error checking
154
+ if !runner.validateUserArguments(arguments, user_arguments)
155
+ return false
156
+ end
157
+
158
+ file_source = runner.getStringArgumentValue('file_source', user_arguments)
159
+ from_idf = (file_source == 'Last IDF')
160
+ reporting_frequency = runner.getStringArgumentValue('reporting_frequency', user_arguments)
161
+ variable1_name = runner.getStringArgumentValue('variable1_name', user_arguments)
162
+ variable2_name = runner.getStringArgumentValue('variable2_name', user_arguments)
163
+ variable3_name = runner.getStringArgumentValue('variable3_name', user_arguments)
164
+
165
+ # 'Timestep' is the key in the input file, 'Zone Timestep' is the key in the SqlFile
166
+ if reporting_frequency == 'Timestep'
167
+ reporting_frequency = 'Zone Timestep'
168
+ end
169
+
170
+ variable_names = []
171
+
172
+ if /Zone/.match(variable1_name) || /Surface/.match(variable1_name)
173
+ variable_names << variable1_name
174
+ else
175
+ if !variable1_name.empty?
176
+ runner.registerWarning("Variable '#{variable1_name}' is not a zone or surface variable, skipping")
177
+ end
178
+ end
179
+
180
+ if variable_names.include?(variable2_name)
181
+ runner.registerWarning("Variable '#{variable2_name}' already requested, skipping")
182
+ elsif /Zone/.match(variable2_name) || /Surface/.match(variable2_name)
183
+ variable_names << variable2_name
184
+ else
185
+ if !variable2_name.empty?
186
+ runner.registerWarning("Variable '#{variable2_name}' is not a zone or surface variable, skipping")
187
+ end
188
+ end
189
+
190
+ if variable_names.include?(variable3_name)
191
+ runner.registerWarning("Variable '#{variable3_name}' already requested, skipping")
192
+ elsif /Zone/.match(variable3_name) || /Surface/.match(variable3_name)
193
+ variable_names << variable3_name
194
+ else
195
+ if !variable3_name.empty?
196
+ runner.registerWarning("Variable '#{variable3_name}' is not a zone or surface variable, skipping")
197
+ end
198
+ end
199
+
200
+ model = nil
201
+ if from_idf
202
+ # get the last workspace
203
+ workspace = runner.lastEnergyPlusWorkspace
204
+ if workspace.empty?
205
+ runner.registerError('Cannot find last workspace.')
206
+ return false
207
+ end
208
+ workspace = workspace.get
209
+ rt = OpenStudio::EnergyPlus::ReverseTranslator.new
210
+ model = rt.translateWorkspace(workspace)
211
+ runner.registerInfo("Loaded model with '#{model.getSpaces.size}' spaces")
212
+ else
213
+ # get the last model
214
+ model = runner.lastOpenStudioModel
215
+ if model.empty?
216
+ runner.registerError('Cannot find last model.')
217
+ return false
218
+ end
219
+ model = model.get
220
+ runner.registerInfo("Loaded model with '#{model.getSpaces.size}' spaces")
221
+ end
222
+
223
+ # get the last sql file
224
+ sqlFile = runner.lastEnergyPlusSqlFile
225
+ if sqlFile.empty?
226
+ runner.registerError('Cannot find last sql file.')
227
+ return false
228
+ end
229
+ sqlFile = sqlFile.get
230
+ model.setSqlFile(sqlFile)
231
+
232
+ # find the environment period
233
+ env_period = nil
234
+ sqlFile.availableEnvPeriods.each do |p|
235
+ if 'WeatherRunPeriod'.to_EnvironmentType == sqlFile.environmentType(p).get
236
+ env_period = p
237
+ break
238
+ end
239
+ end
240
+
241
+ if !env_period
242
+ runner.registerError('No WeatherRunPeriods found in results')
243
+ return false
244
+ end
245
+ runner.registerInfo("Gathering results for run period '#{env_period}'")
246
+
247
+ start_time = Time.now
248
+ # puts "printing variables"
249
+ # print all variables for reference
250
+ sqlFile.availableVariableNames(env_period, reporting_frequency).each do |variable|
251
+ runner.registerInfo("Available variable name '#{variable}'")
252
+ end
253
+ # puts "done printing variables, elapsed time #{Time.now-start_time}"
254
+
255
+ # start_time = Time.now
256
+ # puts "computing surface_data"
257
+ # list surface and thermal zone name for each surface
258
+ # surface_data is a temporary variable, it is not written to JSON
259
+ surface_data = []
260
+ model.getPlanarSurfaces.each do |surface|
261
+ surface_name = surface.name.to_s.upcase
262
+ thermal_zone_name = nil
263
+ if (space = surface.space) && !space.empty?
264
+ if from_idf
265
+ # if we translated from IDF, the space name will be the E+ zone name
266
+ thermal_zone_name = space.get.name.to_s.upcase
267
+ else
268
+ if (thermal_zone = space.get.thermalZone) && !thermal_zone.empty?
269
+ thermal_zone_name = thermal_zone.get.name.to_s.upcase
270
+ end
271
+ end
272
+ end
273
+
274
+ surface_data << { surface_name: surface_name, thermal_zone_name: thermal_zone_name, variables: [] }
275
+ end
276
+ # puts "done computing surface_data, elapsed time #{Time.now-start_time}"
277
+
278
+ # same across all variables for given timestep
279
+ times = nil
280
+ hoursPerInterval = nil
281
+ intervalsPerHour = nil
282
+ intervalsPerDay = nil
283
+ numDays = nil
284
+
285
+ # changes for each variable
286
+ start_time = Time.now
287
+ meta_variables = []
288
+ variables = []
289
+ variable_names.each do |variable_name|
290
+ units = nil
291
+ values = []
292
+ data_range = [Float::MAX, Float::MIN] # data max, data min
293
+
294
+ # puts "getting keys for variable, #{variable_name}"
295
+ keys = sqlFile.availableKeyValues(env_period, reporting_frequency, variable_name)
296
+ # puts "done getting #{keys.size} keys, elapsed time #{Time.now-start_time}"
297
+
298
+ if keys.empty?
299
+ runner.registerWarning("No data available for variable '#{variable_name}', skipping")
300
+ next
301
+ end
302
+
303
+ keys.each do |key|
304
+ runner.registerInfo("Available key '#{key}' for variable name '#{variable_name}'")
305
+
306
+ # puts "getting timeseries for key, #{key}"
307
+ ts = sqlFile.timeSeries(env_period, reporting_frequency, variable_name, key).get
308
+ units = ts.units
309
+ # puts "done getting timeseries, elapsed time #{Time.now-start_time}"
310
+
311
+ if times.nil?
312
+ times = datetimes_to_array(ts.dateTimes)
313
+ if !ts.intervalLength.empty?
314
+ hoursPerInterval = ts.intervalLength.get.totalHours
315
+ intervalsPerHour = 1.0 / hoursPerInterval.to_f
316
+ intervalsPerDay = 1.0 / ts.intervalLength.get.totalDays
317
+ numDays = times.size * ts.intervalLength.get.totalDays
318
+ end
319
+ end
320
+
321
+ this_values = vector_to_array(ts.values)
322
+
323
+ min = this_values.min
324
+ max = this_values.max
325
+ if min < data_range[0]
326
+ data_range[0] = min
327
+ end
328
+ if max > data_range[1]
329
+ data_range[1] = max
330
+ end
331
+
332
+ valueIndex = values.length
333
+ values << format_array(this_values)
334
+
335
+ if i = surface_data.index { |s| s[:surface_name] == key }
336
+ surface_data[i][:variables] << { name: variable_name, valueIndex: valueIndex, keyName: key }
337
+ else
338
+ surface_data.each do |s|
339
+ if s[:thermal_zone_name] == key
340
+ s[:variables] << { name: variable_name, valueIndex: valueIndex, keyName: key }
341
+ end
342
+ end
343
+ end
344
+
345
+ # puts "finished with key #{key}, elapsed time #{Time.now-start_time}"
346
+ end
347
+
348
+ meta_variables << { name: variable_name, intervalsPerHour: intervalsPerHour, intervalsPerDay: intervalsPerDay,
349
+ hoursPerInterval: hoursPerInterval, numDays: numDays, units: units,
350
+ valueMin: data_range[0], valueMax: data_range[1] }
351
+
352
+ variables << { name: variable_name, intervalsPerHour: intervalsPerHour, intervalsPerDay: intervalsPerDay,
353
+ hoursPerInterval: hoursPerInterval, numDays: numDays, units: units,
354
+ valueMin: data_range[0], valueMax: data_range[1], timeIndex: 0, values: values }
355
+
356
+ # puts "finished with variable #{variable_name}, elapsed time #{Time.now-start_time}"
357
+ end
358
+
359
+ # convert the model to vA3C JSON format
360
+ start_time = Time.now
361
+ # puts "converting model to vA3C"
362
+ json = nil
363
+ model_clone = model.clone(true).to_Model
364
+ begin
365
+ # try to use new implementation
366
+ ft = OpenStudio::Model::ThreeJSForwardTranslator.new
367
+ three_scene = ft.modelToThreeJS(model_clone, true)
368
+ json = JSON.parse(three_scene.toJSON(false), symbolize_names: true)
369
+ runner.registerInfo('Used new ThreeScene translator.')
370
+ rescue NameError, StandardError
371
+ # use old Ruby implementation
372
+ runner.registerInfo('Using Ruby VA3C translator.')
373
+ json = VA3C.convert_model(model_clone)
374
+ end
375
+ # puts "finished converting model, elapsed time #{Time.now-start_time}"
376
+
377
+ json[:metadata][:variables] = meta_variables
378
+ json[:times] = [times]
379
+ json[:variables] = variables
380
+
381
+ json[:object][:children].each do |child|
382
+ name = child[:userData][:name].upcase
383
+
384
+ surface = surface_data.find { |x| x[:surface_name] == name }
385
+
386
+ valueIndex = nil
387
+ keyName = nil
388
+ if surface
389
+ child[:userData][:variables] = surface[:variables]
390
+ end
391
+ end
392
+
393
+ # write json file
394
+ # start_time = Time.now
395
+ # puts "writing JSON"
396
+ json_out_path = './report.json'
397
+ File.open(json_out_path, 'w') do |file|
398
+ file << JSON.generate(json, object_nl: "\n", array_nl: '', indent: ' ')
399
+ # file << JSON::generate(json, {:object_nl=>"", :array_nl=>"", :indent=>""})
400
+ # make sure data is written to the disk one way or the other
401
+ begin
402
+ file.fsync
403
+ rescue StandardError
404
+ file.flush
405
+ end
406
+ end
407
+ # puts "finished writing JSON, elapsed time #{Time.now-start_time}"
408
+
409
+ # read in template
410
+ # start_time = Time.now
411
+ # puts "writing html"
412
+ html_in_path = "#{File.dirname(__FILE__)}/resources/report.html.in"
413
+ if File.exist?(html_in_path)
414
+ html_in_path = html_in_path
415
+ else
416
+ html_in_path = "#{File.dirname(__FILE__)}/report.html.in"
417
+ end
418
+ html_in = ''
419
+ File.open(html_in_path, 'r') do |file|
420
+ html_in = file.read
421
+ end
422
+
423
+ # configure template with variable values
424
+ os_data = JSON.generate(json, object_nl: '', array_nl: '', indent: '')
425
+ title = 'View Data'
426
+ renderer = ERB.new(html_in)
427
+ html_out = renderer.result(binding)
428
+
429
+ # write html file
430
+ html_out_path = './report.html'
431
+ File.open(html_out_path, 'w') do |file|
432
+ file << html_out
433
+
434
+ # make sure data is written to the disk one way or the other
435
+ begin
436
+ file.fsync
437
+ rescue StandardError
438
+ file.flush
439
+ end
440
+ end
441
+ # puts "finished writing html, elapsed time #{Time.now-start_time}"
442
+
443
+ # closing the sql file
444
+ # sqlFile.close()
445
+
446
+ # reporting final condition
447
+ # runner.registerFinalCondition("Model written.")
448
+
449
+ return true
450
+ end # end the run method
451
+ end # end the measure
452
+
453
+ # this allows the measure to be use by the application
454
+ ViewData.new.registerWithApplication