openstudio-common-measures 0.2.0 → 0.2.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 (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