energyplus 0.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.
@@ -0,0 +1,129 @@
1
+ ######################################################################
2
+ # Copyright (c) 2008-2013, Alliance for Sustainable Energy.
3
+ # All rights reserved.
4
+ #
5
+ # This library is free software; you can redistribute it and/or
6
+ # modify it under the terms of the GNU Lesser General Public
7
+ # License as published by the Free Software Foundation; either
8
+ # version 2.1 of the License, or (at your option) any later version.
9
+ #
10
+ # This library is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ # Lesser General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public
16
+ # License along with this library; if not, write to the Free Software
17
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
+ ######################################################################
19
+
20
+ module EnergyPlus
21
+
22
+ class DictionaryEntry
23
+ attr_reader :id, :key, :var_name, :units, :interval
24
+ def initialize(id,key,var_name,units,interval)
25
+ @id,@key,@var_name,@units,@interval = id,key,var_name,units,interval
26
+ end
27
+ end
28
+
29
+ class Variable
30
+ # attr_reader :data
31
+ def initialize(dictionary_entry,data,timestamps)
32
+ @dictionary_entry = dictionary_entry
33
+ @data = data
34
+ @timestamps = timestamps
35
+ end
36
+
37
+ def name
38
+ return @dictionary_entry.var_name
39
+ end
40
+
41
+ def key
42
+ return @dictionary_entry.key
43
+ end
44
+
45
+ def id
46
+ return @dictionary_entry.id
47
+ end
48
+
49
+ def units
50
+ return @dictionary_entry.units
51
+ end
52
+
53
+ def interval
54
+ return @dictionary_entry.interval
55
+ end
56
+
57
+ def values
58
+ @data.map { |entry| entry[1] }
59
+ end
60
+
61
+ def hours
62
+ @timestamps.map { |entry| entry[5] }
63
+ end
64
+
65
+ def days
66
+ @timestamps.map { |entry| entry[1] }
67
+ end
68
+
69
+ def months
70
+ @timestamps.map { |entry| entry[2] }
71
+ end
72
+ end
73
+
74
+ class EpEsoFile
75
+ def initialize(path)
76
+ File.open(path) do |f|
77
+ @variables = nil
78
+ # first six lines are discarded
79
+ 6.times {f.gets}
80
+ @text = f.read
81
+ end
82
+ end
83
+
84
+ def dictionary
85
+ return @text.match(/(.*?)(End\sof\sData\sDictionary)/m)[1]
86
+ end
87
+
88
+ def data
89
+ return @text.match(/(End\sof\sData\sDictionary)(.*?)(End\sof\sData)/m)[2]
90
+ end
91
+
92
+ def dictionary_entries
93
+ dictionary_entries = []
94
+ dictionary.split("\n").each do |entry|
95
+ interval = entry.match(/(!)(\w+)(\s*)/)[2].strip
96
+ fields = entry.match(/(.*?)(!)/)[1].split(',')
97
+ id = fields[0]
98
+ key,var_name = fields[2,3] if fields[1] =~ /2/
99
+ key,var_name = nil, fields[2] if fields[1] =~ /1/
100
+ units = var_name.match(/(.*?)(\[)(.*?)(\])/)[3]
101
+ var_name = $1.strip
102
+ dictionary_entries << DictionaryEntry.new(id,key,var_name,units,interval)
103
+ end
104
+ return dictionary_entries
105
+ end
106
+
107
+ def variables
108
+ unless @variables
109
+ @variables = []
110
+ text = data
111
+ dictionary_entries.each do |dictionary_entry|
112
+ if dictionary_entry.interval =~ /Hourly/
113
+ timestamps = text.scan(/^2,.*?,\s0\.00,60\.00,.*/).map { |entry| entry.split(',') }
114
+ elsif dictionary_entry.interval =~ /TimeStep/
115
+ timestamps = text.scan(/^2,.*/).reject { |entry| entry =~ /^2,.*?,\s0\.00,60\.00,.*/}.map { |entry| entry.split(',') }
116
+ elsif dictionary_entry.interval =~ /Daily/
117
+ timestamps = text.scan(/^3,/).map { |entry| entry.split(',') }
118
+ elsif dictionary_entry.interval =~ /Monthly/
119
+ timestamps = text.scan(/^4,/).map { |entry| entry.split(',') }
120
+ end
121
+ var_data = text.scan(Regexp.new("^#{dictionary_entry.id},.*")).map { |entry| entry.split(',') }
122
+ @variables << Variable.new(dictionary_entry,var_data,timestamps)
123
+ end
124
+ end
125
+ return @variables
126
+ end
127
+ end
128
+
129
+ end #module
@@ -0,0 +1,55 @@
1
+ ######################################################################
2
+ # Copyright (c) 2008-2013, Alliance for Sustainable Energy.
3
+ # All rights reserved.
4
+ #
5
+ # This library is free software; you can redistribute it and/or
6
+ # modify it under the terms of the GNU Lesser General Public
7
+ # License as published by the Free Software Foundation; either
8
+ # version 2.1 of the License, or (at your option) any later version.
9
+ #
10
+ # This library is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ # Lesser General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public
16
+ # License along with this library; if not, write to the Free Software
17
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
+ ######################################################################
19
+
20
+ module EnergyPlus
21
+
22
+ class IdfObject
23
+ attr_accessor :type, :fields, :comment
24
+
25
+ def initialize(object_type, object_fields, object_comment)
26
+ @type = object_type
27
+ @fields = object_fields
28
+ @comment = object_comment
29
+ end
30
+
31
+ def fieldValue(fieldIdx)
32
+ fieldValue = @fields[fieldIdx].split(',')
33
+ fieldValue = fieldValue[0].split(';')[0].gsub(" ", "")
34
+
35
+ return fieldValue.to_f
36
+
37
+ end
38
+
39
+ def fieldString(fieldIdx)
40
+ fieldString = @fields[fieldIdx].split(',')
41
+ fieldString = fieldString[0].split(';')[0].gsub(" ", "")
42
+
43
+ return fieldString
44
+ end
45
+
46
+
47
+ def to_s
48
+ string = ''
49
+ string << @comment + "\n" if @comment
50
+ string << @type + "\n"
51
+ @fields.each { |field| string << field + "\n" }
52
+ string << "\n"
53
+ end
54
+ end
55
+ end #module
@@ -0,0 +1,168 @@
1
+ ######################################################################
2
+ # Copyright (c) 2008-2013, Alliance for Sustainable Energy.
3
+ # All rights reserved.
4
+ #
5
+ # This library is free software; you can redistribute it and/or
6
+ # modify it under the terms of the GNU Lesser General Public
7
+ # License as published by the Free Software Foundation; either
8
+ # version 2.1 of the License, or (at your option) any later version.
9
+ #
10
+ # This library is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ # Lesser General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public
16
+ # License along with this library; if not, write to the Free Software
17
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
+ ######################################################################
19
+
20
+
21
+ module EnergyPlus
22
+
23
+ require 'pathname'
24
+ require 'csv'
25
+ require 'builder'
26
+
27
+ class KmlFile
28
+ attr_accessor :data
29
+
30
+ def initialize(path)
31
+ @path = path
32
+ @data = []
33
+
34
+ @region_lu = Hash.new("regions")
35
+ @region_lu["1_africa_wmo_region_1"] = "Africa, WMO Region 1"
36
+ @region_lu["2_asia_wmo_region_2"] = "Asia, WMO Region 2"
37
+ @region_lu["3_south_america_wmo_region_3"] = "South America, WMO Region 3"
38
+ @region_lu["4_north_and_central_america_wmo_region_4"] = "North and Central America, WMO Region 4"
39
+ @region_lu["5_southwest_pacific_wmo_region_5"] = "Southwest Pacific Ocean, WMO Region 5"
40
+ @region_lu["6_europe_wmo_region_6"] = "Europe, WMO Region 6"
41
+
42
+ end
43
+
44
+ def savefile
45
+ kmlfile = File.new(@path, 'w')
46
+ kmlxml = Builder::XmlMarkup.new(:target => kmlfile, :indent=>2)
47
+
48
+ #setup the xml/kml file
49
+ kmlxml.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
50
+ kmlxml.kml("xmlns" => "http://www.opengis.net/kml/2.2") {
51
+ kmlxml.Document {
52
+ kmlxml.name "EnergyPlus Weather Data"
53
+ kmlxml.visibility "0"
54
+ kmlxml.description {
55
+ kmlxml.cdata!("<img src=\"kml/ep_header6.png\" width=280><p>Weather data for use with EnergyPlus building energy simulation software (http://www.energyplus.gov).<p>Locations are organized by World Meteorological Organization (WMO) region, country, and state/province. Download individual weather data files through links in each location description.")
56
+ }
57
+ kmlxml.LookAt {
58
+ kmlxml.longitude "-105"
59
+ kmlxml.latitude "15"
60
+ kmlxml.altitude "0"
61
+ kmlxml.range "15000000"
62
+ kmlxml.tilt "6.880472140100155e-015"
63
+ kmlxml.heading "4.971764876159099e-015"
64
+ kmlxml.altitudeMode "relativeToGround"
65
+ }
66
+ kmlxml.Style("id" => "weatherlocation_normal") {
67
+ kmlxml.IconStyle {
68
+ kmlxml.scale "0.6"
69
+ kmlxml.Icon {
70
+ kmlxml.href "kml/E+_logo.png"
71
+ }
72
+ }
73
+ kmlxml.BalloonStyle {
74
+ kmlxml.text {
75
+ kmlxml.cdata!("<b><font color=\"#CC0000\" size=\"+3\">$[name]</font></b><br/><font>$[description]</font>")
76
+ }
77
+ kmlxml.bgColor "ffffffbb"
78
+ }
79
+ }
80
+ kmlxml.StyleMap("id" => "weatherlocation") {
81
+ kmlxml.Pair {
82
+ kmlxml.key "normal"
83
+ kmlxml.styleUrl "#weatherlocation_normal"
84
+ }
85
+ kmlxml.Pair {
86
+ kmlxml.key "highlight"
87
+ kmlxml.styleUrl "#weatherlocation_hiliteicon"
88
+ }
89
+ }
90
+ kmlxml.Style("id" => "weatherlocation_hiliteicon") {
91
+ kmlxml.IconStyle {
92
+ kmlxml.scale "0.9"
93
+ kmlxml.Icon {
94
+ kmlxml.href "kml/E+_logo.png"
95
+ }
96
+ kmlxml.hotSpot {
97
+ kmlxml.x "0.5"
98
+ kmlxml.y "0.5"
99
+ kmlxml.xunits "fraction"
100
+ kmlxml.yunits "fraction"
101
+ }
102
+ kmlxml.BalloonStyle {
103
+ kmlxml.text {
104
+ kmlxml.cdata!("<b><font color=\"#CC0000\" size=\"+3\">$[name]</font></b> <br/><font>$[description]</font>")
105
+ }
106
+ kmlxml.bgColor "ffffffbb"
107
+ }
108
+ }
109
+ }
110
+
111
+ #write out each location
112
+ #the data is stored in a custom format that is two layers dep using the DataHash.rb
113
+ #file that Nicholas Long wrote
114
+
115
+ @data.each do |region|
116
+ kmlxml.Folder {
117
+ kmlxml.name @region_lu[region.name]
118
+ kmlxml.visibility "0"
119
+ kmlxml.description {
120
+ kmlxml.cdata!("<img src=\"kml/ep_header7.png\" align=right>")
121
+ }
122
+
123
+ region.data.each do |country|
124
+ kmlxml.Folder {
125
+ kmlxml.name country.name
126
+ kmlxml.visibility "0"
127
+ country.data.each do |state|
128
+ if state != "" && state != "-" then
129
+ kmlxml.Folder {
130
+ kmlxml.name state.name
131
+ kmlxml.visibility "0"
132
+ state.data.each do |weather|
133
+ weather.toKml(kmlxml)
134
+ end
135
+ }
136
+ else
137
+ state.data.each do |weather|
138
+ weather.toKml(kmlxml)
139
+ end
140
+ end
141
+ end
142
+ }
143
+ end
144
+ }
145
+ end
146
+
147
+
148
+ @data.each do |reg|
149
+ puts reg.name
150
+ reg.data.each do |reg_data|
151
+ puts " #{reg_data.name}"
152
+ reg_data.data.each do |reg_data_2|
153
+ puts " #{reg_data_2.name}"
154
+ reg_data_2.data.each do |reg_data_3|
155
+ puts " #{reg_data_3.path}"
156
+ end
157
+ end
158
+ end
159
+
160
+ end
161
+ }
162
+ }
163
+
164
+ end
165
+
166
+
167
+ end
168
+ end #module
@@ -0,0 +1,99 @@
1
+ ######################################################################
2
+ # Copyright (c) 2008-2013, Alliance for Sustainable Energy.
3
+ # All rights reserved.
4
+ #
5
+ # This library is free software; you can redistribute it and/or
6
+ # modify it under the terms of the GNU Lesser General Public
7
+ # License as published by the Free Software Foundation; either
8
+ # version 2.1 of the License, or (at your option) any later version.
9
+ #
10
+ # This library is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ # Lesser General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public
16
+ # License along with this library; if not, write to the Free Software
17
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
+ ######################################################################
19
+
20
+ module EnergyPlus
21
+
22
+ require 'pathname'
23
+
24
+ class ResultsLog
25
+ def initialize(path)
26
+ @path = Pathname.new(path)
27
+ @entries = []
28
+ @initialized = false
29
+ @valid = false
30
+ end
31
+
32
+ def find_entries(*search_terms)
33
+ init if not @initialized
34
+ entries = @entries.select do |entry|
35
+ found = true
36
+ search_terms.each do |search_term|
37
+ if not entry[:description] =~ Regexp.new(search_term)
38
+ found = false
39
+ end
40
+ end
41
+ found
42
+ end
43
+ return entries
44
+ end
45
+
46
+ def find_entry(*search_terms)
47
+ return find_entries(*search_terms).first
48
+ end
49
+
50
+ def entries
51
+ init if not @initialized
52
+ return @entries
53
+ end
54
+
55
+ def valid?
56
+ init if not @initialized
57
+ return @valid
58
+ end
59
+
60
+ private
61
+
62
+ def init
63
+ @initialized = true
64
+
65
+ if @path.exist?
66
+ File.open(@path) do |f|
67
+ text = f.read
68
+ @entries = parse_entries(text)
69
+ end
70
+ end
71
+
72
+ total_site_energy = find_entry('Total Energy','Total Site Energy')
73
+ if not total_site_energy.nil?
74
+ if total_site_energy[:value].to_f > 0
75
+ @valid = true
76
+ end
77
+ end
78
+ end
79
+
80
+ def parse_entries(text)
81
+ entries = []
82
+ lines = text.split("\n")
83
+ lines.each do |line|
84
+ entry = Hash.new
85
+ begin
86
+ entry[:units] = line.match(/\[(.*?)\]/)[1]
87
+ rescue
88
+ entry[:units] = ''
89
+ end
90
+ entry[:description] = line.match(/(.*?),/)[1].sub(/\[.*?\]/,'').strip
91
+ entry[:value] = line.match(/,(.*)/)[1]
92
+ entries << entry
93
+ end
94
+ return entries
95
+ end
96
+
97
+ end
98
+
99
+ end #module