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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +44 -0
- data/Rakefile +3 -0
- data/lib/measures/ChangeBuildingLocation/measure.xml +11 -11
- data/lib/measures/ExportScheduleCSV/measure.rb +1 -1
- data/lib/measures/ExportScheduleCSV/measure.xml +16 -15
- data/lib/measures/ImportEnvelopeAndInternalLoadsFromIdf/measure.xml +7 -6
- data/lib/measures/MeterFlodPlot/measure.rb +1 -1
- data/lib/measures/MeterFlodPlot/measure.xml +16 -15
- data/lib/measures/ReportModelChanges/measure.xml +2 -2
- data/lib/measures/RunPeriodMultiple/measure.xml +12 -11
- data/lib/measures/ServerDirectoryCleanup/README.md +97 -3
- data/lib/measures/ServerDirectoryCleanup/measure.rb +1 -1
- data/lib/measures/ServerDirectoryCleanup/measure.xml +10 -59
- data/lib/measures/UnmetLoadHoursTroubleshooting/README.md +9 -3
- data/lib/measures/UnmetLoadHoursTroubleshooting/measure.rb +1 -1
- data/lib/measures/UnmetLoadHoursTroubleshooting/measure.xml +66 -17
- data/lib/measures/VentilationQAQC/README.md +9 -3
- data/lib/measures/VentilationQAQC/measure.rb +52 -45
- data/lib/measures/VentilationQAQC/measure.xml +25 -30
- data/lib/measures/ZoneReport/README.md +2 -2
- data/lib/measures/ZoneReport/measure.rb +1 -1
- data/lib/measures/ZoneReport/measure.xml +10 -11
- data/lib/measures/add_ems_to_control_ev_charging/LICENSE.MD.txt +15 -0
- data/lib/measures/{AddDaylightSensors → add_ems_to_control_ev_charging}/LICENSE.md +0 -0
- data/lib/measures/add_ems_to_control_ev_charging/ReadMe.MD +29 -0
- data/lib/measures/add_ems_to_control_ev_charging/measure.rb +288 -0
- data/lib/measures/add_ems_to_control_ev_charging/measure.xml +87 -0
- data/lib/measures/add_ev_load/LICENSE.MD.txt +15 -0
- data/lib/measures/{EnableDemandControlledVentilation → add_ev_load}/LICENSE.md +0 -0
- data/lib/measures/add_ev_load/ReadMe.MD +34 -0
- data/lib/measures/add_ev_load/measure.rb +328 -0
- data/lib/measures/add_ev_load/measure.xml +153 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/PSN_BuildingKey.csv +104 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/PSN_BuildingKey_v2.csv +104 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow1_flex1.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow1_flex2.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow1_flex3.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow2_flex1.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow2_flex2.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow2_flex3.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow3_flex1.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow3_flex2.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow3_flex3.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow1_flex1.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow1_flex2.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow1_flex3.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow2_flex1.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow2_flex2.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow2_flex3.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow3_flex1.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow3_flex2.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow3_flex3.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow1_flex1.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow1_flex2.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow1_flex3.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow2_flex1.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow2_flex2.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow2_flex3.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow3_flex1.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow3_flex2.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow3_flex3.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/fast_charge_15min_Saturday.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/fast_charge_15min_Sunday.csv +96 -0
- data/lib/measures/add_ev_load/resources/EV_Load_Profiles/fast_charge_15min_Weekday.csv +96 -0
- data/lib/measures/envelope_and_internal_load_breakdown/README.md +4 -3
- data/lib/measures/envelope_and_internal_load_breakdown/measure.rb +7 -4
- data/lib/measures/envelope_and_internal_load_breakdown/measure.xml +16 -17
- data/lib/measures/envelope_and_internal_load_breakdown/resources/report.html.erb +1 -0
- data/lib/measures/example_report/README.md +27 -5
- data/lib/measures/example_report/measure.rb +7 -4
- data/lib/measures/example_report/measure.xml +16 -29
- data/lib/measures/example_report/resources/report.html.erb +1 -0
- data/lib/measures/gem_env_report/measure.xml +1 -1
- data/lib/measures/generic_qaqc/README.md +187 -5
- data/lib/measures/generic_qaqc/measure.rb +1 -1
- data/lib/measures/generic_qaqc/measure.xml +15 -85
- data/lib/measures/generic_qaqc/resources/report.html.erb +1 -0
- data/lib/measures/hvac_psychrometric_chart/README.md +11 -5
- data/lib/measures/hvac_psychrometric_chart/measure.rb +1 -1
- data/lib/measures/hvac_psychrometric_chart/measure.xml +13 -18
- data/lib/measures/hvac_psychrometric_chart/resources/report.html.erb +1 -0
- data/lib/measures/inject_idf_objects/measure.xml +25 -24
- data/lib/measures/openstudio_results/README.md +195 -5
- data/lib/measures/openstudio_results/measure.rb +2 -2
- data/lib/measures/openstudio_results/measure.xml +30 -154
- data/lib/measures/openstudio_results/resources/report.html.erb +1 -0
- data/lib/measures/set_run_period/measure.xml +2 -2
- data/lib/measures/{EnableEconomizerControl → view_data}/LICENSE.md +0 -0
- data/lib/measures/view_data/README.md +64 -0
- data/lib/measures/{AddDaylightSensors → view_data}/README.md.erb +0 -0
- data/lib/measures/view_data/measure.rb +454 -0
- data/lib/measures/view_data/measure.xml +159 -0
- data/lib/measures/view_data/resources/report.html.in +2881 -0
- data/lib/measures/view_data/resources/va3c.rb +1021 -0
- data/lib/measures/{ImproveFanBeltEfficiency → view_model}/LICENSE.md +0 -0
- data/lib/measures/view_model/README.md +26 -0
- data/lib/measures/{EnableDemandControlledVentilation → view_model}/README.md.erb +0 -0
- data/lib/measures/view_model/measure.rb +146 -0
- data/lib/measures/view_model/measure.xml +98 -0
- data/lib/measures/view_model/resources/report.html.in +2881 -0
- data/lib/measures/view_model/resources/va3c.rb +1021 -0
- data/lib/openstudio/common_measures/version.rb +1 -1
- data/openstudio-common-measures.gemspec +1 -1
- metadata +61 -71
- data/lib/measures/AddDaylightSensors/README.md +0 -136
- data/lib/measures/AddDaylightSensors/measure.rb +0 -521
- data/lib/measures/AddDaylightSensors/measure.xml +0 -233
- data/lib/measures/EnableDemandControlledVentilation/README.md +0 -32
- data/lib/measures/EnableDemandControlledVentilation/measure.rb +0 -154
- data/lib/measures/EnableDemandControlledVentilation/measure.xml +0 -99
- data/lib/measures/EnableEconomizerControl/README.md +0 -48
- data/lib/measures/EnableEconomizerControl/README.md.erb +0 -42
- data/lib/measures/EnableEconomizerControl/measure.rb +0 -172
- data/lib/measures/EnableEconomizerControl/measure.xml +0 -124
- data/lib/measures/ImproveFanBeltEfficiency/README.md +0 -104
- data/lib/measures/ImproveFanBeltEfficiency/README.md.erb +0 -42
- data/lib/measures/ImproveFanBeltEfficiency/measure.rb +0 -366
- data/lib/measures/ImproveFanBeltEfficiency/measure.xml +0 -185
- data/lib/measures/ImproveMotorEfficiency/LICENSE.md +0 -27
- data/lib/measures/ImproveMotorEfficiency/README.md +0 -104
- data/lib/measures/ImproveMotorEfficiency/README.md.erb +0 -42
- data/lib/measures/ImproveMotorEfficiency/measure.rb +0 -365
- data/lib/measures/ImproveMotorEfficiency/measure.xml +0 -182
- data/lib/measures/IncreaseInsulationRValueForExteriorWalls/LICENSE.md +0 -27
- data/lib/measures/IncreaseInsulationRValueForExteriorWalls/README.md +0 -64
- data/lib/measures/IncreaseInsulationRValueForExteriorWalls/README.md.erb +0 -42
- data/lib/measures/IncreaseInsulationRValueForExteriorWalls/measure.rb +0 -422
- data/lib/measures/IncreaseInsulationRValueForExteriorWalls/measure.xml +0 -150
- data/lib/measures/IncreaseInsulationRValueForRoofs/LICENSE.md +0 -27
- data/lib/measures/IncreaseInsulationRValueForRoofs/README.md +0 -64
- data/lib/measures/IncreaseInsulationRValueForRoofs/README.md.erb +0 -42
- data/lib/measures/IncreaseInsulationRValueForRoofs/measure.rb +0 -422
- data/lib/measures/IncreaseInsulationRValueForRoofs/measure.xml +0 -143
- data/lib/measures/ReduceElectricEquipmentLoadsByPercentage/LICENSE.md +0 -27
- data/lib/measures/ReduceElectricEquipmentLoadsByPercentage/README.md +0 -97
- data/lib/measures/ReduceElectricEquipmentLoadsByPercentage/README.md.erb +0 -42
- data/lib/measures/ReduceElectricEquipmentLoadsByPercentage/measure.rb +0 -450
- data/lib/measures/ReduceElectricEquipmentLoadsByPercentage/measure.xml +0 -186
- data/lib/measures/ReduceLightingLoadsByPercentage/LICENSE.md +0 -27
- data/lib/measures/ReduceLightingLoadsByPercentage/README.md +0 -96
- data/lib/measures/ReduceLightingLoadsByPercentage/README.md.erb +0 -42
- data/lib/measures/ReduceLightingLoadsByPercentage/measure.rb +0 -513
- data/lib/measures/ReduceLightingLoadsByPercentage/measure.xml +0 -191
- data/lib/measures/ReduceSpaceInfiltrationByPercentage/LICENSE.md +0 -27
- data/lib/measures/ReduceSpaceInfiltrationByPercentage/README.md +0 -104
- data/lib/measures/ReduceSpaceInfiltrationByPercentage/README.md.erb +0 -42
- data/lib/measures/ReduceSpaceInfiltrationByPercentage/measure.rb +0 -349
- data/lib/measures/ReduceSpaceInfiltrationByPercentage/measure.xml +0 -181
- data/lib/measures/ReduceVentilationByPercentage/LICENSE.md +0 -27
- data/lib/measures/ReduceVentilationByPercentage/README.md +0 -40
- data/lib/measures/ReduceVentilationByPercentage/README.md.erb +0 -42
- data/lib/measures/ReduceVentilationByPercentage/measure.rb +0 -291
- data/lib/measures/ReduceVentilationByPercentage/measure.xml +0 -96
- data/lib/measures/VentilationQAQC/ExampleModel.osm +0 -28468
- data/lib/measures/create_variable_speed_rtu/LICENSE.md +0 -27
- data/lib/measures/create_variable_speed_rtu/README.md +0 -120
- data/lib/measures/create_variable_speed_rtu/README.md.erb +0 -42
- data/lib/measures/create_variable_speed_rtu/measure.rb +0 -539
- data/lib/measures/create_variable_speed_rtu/measure.xml +0 -207
- data/lib/measures/radiant_slab_with_doas/LICENSE.md +0 -27
- data/lib/measures/radiant_slab_with_doas/README.md +0 -156
- data/lib/measures/radiant_slab_with_doas/README.md.erb +0 -42
- data/lib/measures/radiant_slab_with_doas/measure.rb +0 -403
- data/lib/measures/radiant_slab_with_doas/measure.xml +0 -345
@@ -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>
|
7
|
-
<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>
|
File without changes
|
@@ -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
|
+
|
File without changes
|
@@ -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
|