Mercurial > ~darius > hgwebdir.cgi > iwws
annotate static/iwws.js @ 15:ebf411c89a3d
Fix bar width now we get data more frequently.
author | Daniel O'Connor <darius@dons.net.au> |
---|---|
date | Fri, 31 May 2013 13:35:56 +0930 |
parents | 294e6a7fbb6e |
children | 5a9b33dcdb2c |
rev | line source |
---|---|
0 | 1 /* |
2 * Copyright 2011 Daniel O'Connor <darius@dons.net.au> | |
3 * | |
4 * Redistribution and use in source and binary forms, with or without modification, are | |
5 * permitted provided that the following conditions are met: | |
6 * | |
7 * 1. Redistributions of source code must retain the above copyright notice, this list of | |
8 * conditions and the following disclaimer. | |
9 * | |
10 * 2. Redistributions in binary form must reproduce the above copyright notice, this list | |
11 * of conditions and the following disclaimer in the documentation and/or other materials | |
12 * provided with the distribution. | |
13 * | |
14 * THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> ''AS IS'' AND ANY EXPRESS OR IMPLIED | |
15 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | |
16 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> OR | |
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
19 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
21 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | |
22 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
23 * | |
24 * The views and conclusions contained in the software and documentation are those of the | |
25 * authors and should not be interpreted as representing official policies, either expressed | |
26 * or implied, of Daniel O'Connor. | |
27 */ | |
28 | |
7
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
29 var timer = null; |
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
30 var datacache = null; |
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
31 |
0 | 32 $.jQTouch({ |
14 | 33 icon: 'static/icon.png', |
0 | 34 startupScreen: 'img/startup.png' |
35 }); | |
36 | |
7
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
37 function draw_graph() { |
0 | 38 var temp_out = []; |
8 | 39 var dewpt = []; |
0 | 40 var wavg = []; |
41 var wgust = []; | |
42 var rain = []; | |
8 | 43 var pressure = []; |
0 | 44 var i, mint = 5, maxt = 35; |
7
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
45 var l = datacache['idx'].length - 1; |
0 | 46 var d = new Date(); |
47 var tzofs = d.getTimezoneOffset() * 60; | |
13 | 48 var wavgtmp = 0; |
49 var wgusttmp = 0; | |
50 var winddir = 0; | |
51 var windavgs = 0; | |
52 var windnavg = 4; | |
0 | 53 for (i = 0; i < l; i++) { |
13 | 54 // Apply offset so Flot times look right (it always shows UTC) |
55 t = (datacache['idx'][i] - tzofs) * 1000.0; | |
56 | |
57 // Keep track of min/max temperature | |
9
6edb93c20971
Fix stretching the graph limits for temperature.
Daniel O'Connor <darius@dons.net.au>
parents:
8
diff
changeset
|
58 if (datacache['temp_out'][i] < mint) |
7
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
59 mint = datacache['temp_out'] |
9
6edb93c20971
Fix stretching the graph limits for temperature.
Daniel O'Connor <darius@dons.net.au>
parents:
8
diff
changeset
|
60 if (datacache['temp_out'][i] > maxt) |
6edb93c20971
Fix stretching the graph limits for temperature.
Daniel O'Connor <darius@dons.net.au>
parents:
8
diff
changeset
|
61 maxt = datacache['temp_out'][i] |
13 | 62 |
63 // Store outside temperature if valid | |
64 if (datacache['temp_out'][i] != null) { | |
65 temp_out.push([t, datacache['temp_out'][i]]); | |
66 | |
67 // Calculate dewpoint if outside humidity is valid | |
68 if (datacache['hum_out'][i] != null) { | |
69 dewpt.push([t, hum2dp(datacache['hum_out'][i], datacache['temp_out'][i])]); | |
70 } | |
8 | 71 } |
13 | 72 |
73 // Store baro | |
74 pressure.push([t, datacache['abs_pressure'][i]]); | |
75 | |
76 // Store rain if there was any | |
7
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
77 if (datacache['rain'][i] > 0) |
13 | 78 rain.push([t, datacache['rain'][i]]); |
79 | |
80 // Store wind (convert to km/r) | |
81 // Average the average wind speed | |
82 wavgtmp += datacache['wind_ave'][i] * 60.0 * 60.0 / 1000.0 | |
83 // Pick highest speed gusts | |
84 var g = datacache['wind_gust'][i] * 60.0 * 60.0 / 1000.0; | |
85 if (g > wgusttmp) { | |
86 wgusttmp = g; | |
87 } | |
88 // Accumulate speed/gust direction | |
89 winddir += wind2angle(datacache['wind_dir'][i]); | |
90 windavgs++; | |
91 // Normalise | |
92 if (windavgs == windnavg) { | |
93 windavgs = 0; | |
94 wavgtmp /= windnavg; | |
95 // Note: gust is peak, so nothing to do | |
96 winddir /= windnavg; | |
97 | |
98 // Store | |
99 wavg.push([t, wavgtmp, winddir]); | |
100 wgust.push([t, wgusttmp, winddir]); | |
101 | |
102 // Reset accumulators | |
103 wavgtmp = 0; | |
104 wgusttmp = 0; | |
105 winddir = 0; | |
106 } | |
0 | 107 } |
9
6edb93c20971
Fix stretching the graph limits for temperature.
Daniel O'Connor <darius@dons.net.au>
parents:
8
diff
changeset
|
108 |
0 | 109 $.plot($("#graph1"), [ |
13 | 110 { data : pressure, label: "Baro", yaxis : 1, points : { show : true, radius : 0 }, lines : { show : true } }, |
111 { data : temp_out, label: "Temp.", yaxis : 2, points : { show : true, radius : 0 }, lines : { show : true } }, | |
112 { data : dewpt, label: "Dew point", yaxis : 2, points : { show : true, radius : 0 }, lines : { show : true } }, | |
0 | 113 ], |
114 { xaxis : { mode : 'time' }, | |
115 legend : { backgroundOpacity : 0, position : 'nw' }, | |
8 | 116 yaxis : { min : 950, max : 1050, tickFormatter : baroFormatter }, |
117 y2axis : { min : mint, max : maxt, tickFormatter : degCFormatter }, | |
0 | 118 }); |
119 $.plot($("#graph2"), [ | |
120 { data : wavg, label: "Wind (Avg)", yaxis : 1, points : { show : true }, lines : { show : true }, direction : true }, | |
13 | 121 { data : wgust, label: "Wind (Gust)", yaxis : 1, points : { show : true }, lines : { show : true }, direction : true }, |
15
ebf411c89a3d
Fix bar width now we get data more frequently.
Daniel O'Connor <darius@dons.net.au>
parents:
14
diff
changeset
|
122 { data : rain, label: "Rain", yaxis : 2, bars : { show : true, barWidth : 5 * 60 * 1000, align : "centre" } }, |
0 | 123 ], |
124 { xaxis : { mode : 'time' }, | |
125 legend : { backgroundOpacity : 0, position : 'nw' }, | |
126 yaxis : { tickFormatter : spdFormatter }, | |
127 y2axis : { min : 0, tickFormatter : mmFormatter } | |
128 }); | |
13 | 129 // Reverse tzofs calculation as Date does local time |
130 var dobj = new Date(datacache['lastdata'] * 1000.0); | |
131 $('#stamp').html(sprintf("Last data: %02d/%02d/%02d %02d:%02d:%02d", dobj.getFullYear(), dobj.getMonth() + 1, dobj.getDate(), | |
132 dobj.getHours(), dobj.getMinutes(), dobj.getSeconds())); | |
0 | 133 } |
134 | |
135 function wind2angle(dir) { | |
136 var a = dir * (360.0 / 16.0); | |
137 return a; | |
138 } | |
139 | |
8 | 140 // Formula from http://www.paroscientific.com/dewpoint.htm |
141 function alpha(temp, rh, a, b) { | |
142 return (((a * temp) / (b + temp)) + Math.log(rh / 100.0)); | |
143 } | |
144 | |
145 function hum2dp(rh, temp) { | |
146 var a = 17.27; | |
147 var b = 237.7; | |
148 var Td = (b * alpha(temp, rh, a, b)) / (a - alpha(temp, rh, a, b)); | |
149 return Td; | |
150 } | |
151 | |
0 | 152 function degCFormatter(v, axis) { |
153 return v.toFixed(axis.tickDecimals) +"°C"; | |
154 } | |
155 | |
156 function pctFormatter(v, axis) { | |
157 return v.toFixed(axis.tickDecimals) +"%"; | |
158 } | |
159 | |
160 function spdFormatter(v, axis) { | |
161 return v.toFixed(axis.tickDecimals) + "kph"; | |
162 } | |
163 | |
164 function mmFormatter(v, axis) { | |
165 return v.toFixed(axis.tickDecimals) + "mm"; | |
166 } | |
167 | |
8 | 168 function baroFormatter(v, axis) { |
169 return v.toFixed(axis.tickDecimals) + "hPa"; | |
170 } | |
171 | |
7
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
172 function got_data(data, status) { |
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
173 if (status != "success") { |
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
174 $.log("Couldn't load data. status = " + status); |
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
175 return; |
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
176 } |
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
177 |
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
178 datacache = data; |
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
179 draw_graph(); |
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
180 } |
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
181 |
0 | 182 function update_data() { |
7
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
183 /* Cancel any pending timeout (eg if the user pressed update) */ |
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
184 if (timer != null) |
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
185 clearTimeout(timeout); |
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
186 jQuery.getJSON('iwws/getdata.json', got_data); |
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
187 /* Set to refresh in 10 minutes */ |
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
188 timeout = setTimeout(update_data, 10 * 60 * 60); |
0 | 189 } |
190 | |
191 $(document).ready(function(){ | |
192 update_data(); | |
7
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
193 |
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
194 $('body').bind('turn', function(event, info) { |
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
195 draw_graph(); |
24e9b717722d
- Update every 10 minutes.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
196 }); |
0 | 197 }); |