+
+sub read_ld
+{
+ unless ($dataf) {
+ open $dataf, "+>>", $datafn or die "cannot open $datafn $!";
+ $dataf->autoflush(1);
+ }
+
+ seek $dataf, 0, 0;
+ my $s = <$dataf>;
+ chomp $s;
+ dbg "read loop data: $s" if isdbg 'json';
+ $ld = $json->decode($s) if length $s;
+
+ # sort out rain stats
+ my $c;
+ if ($ld->{rain24} && ($c = @{$ld->{rain24}}) < 24*60) {
+ my $diff = 24*60 - $c;
+ unshift @{$ld->{rain24}}, 0 for 0 .. $diff;
+ }
+ my $rain;
+
+ if ($ld->{rain24}) {
+ $rain += $_ for @{$ld->{rain24}};
+ }
+
+ $ld->{rain_24} = nearest(0.1, $rain);
+ delete $ld->{hour};
+ delete $ld->{min};
+}
+
+sub write_ld
+{
+ unless ($dataf) {
+ open $dataf, "+>>", $datafn or die "cannot open $datafn $!";
+ $dataf->autoflush(1);
+ }
+
+ seek $dataf, 0, 0;
+ truncate $dataf, 0;
+ $ld->{ts} = time;
+ my $s = $json->encode($ld);
+ dbg "write loop data: $s" if isdbg 'json';
+ print $dataf "$s\n";
+}
+
+sub cycle_loop_data_files
+{
+ close $dataf if $dataf;
+
+ rename "$datafn.oooo", "$datafn.ooooo";
+ rename "$datafn.ooo", "$datafn.oooo";
+ rename "$datafn.oo", "$datafn.ooo";
+ rename "$datafn.o", "$datafn.oo";
+ copy $datafn, "$datafn.o";
+}
+
+__DATA__
+
+@@ index.html.ep
+% my $url = url_for 'weather';
+<!DOCTYPE html>
+<html>
+ <head><title>DWeather</title></head>
+ <body>
+ <h1>DWeather</h1>
+
+ <script>
+ var ws;
+
+ function process(key,value) {
+ var d = document.getElementById(key);
+ if (d !== null) {
+ d.innerHTML = value;
+ }
+ }
+
+ function traverse(o) {
+ console.log(o);
+ for (var i in o) {
+ process(i, o[i]);
+ if (o[i] !== null && typeof(o[i])=="object") {
+ traverse(o[i]);
+ }
+ }
+ }
+
+
+ ws = new WebSocket('<%= $url->to_abs %>');
+ document.body.innerHTML += 'ws connecting to: <%= $url->to_abs %> type_of: ' + typeof(ws) + '<br>';
+ if (typeof(ws) === 'object') {
+ ws.onmessage = function (event) {
+ var js = JSON.parse(event.data);
+ if (js !== null && typeof(js) === 'object') {
+ traverse(js);
+ }
+ };
+ ws.onopen = function (event) {
+ ws.send('WebSocket support works! ♥');
+ };
+ } else {
+ document.body.innerHTML += 'Webserver only works with Websocket aware browsers';
+ }
+
+ </script>
+
+<br><br>
+<table border=1 width=80%>
+<tr>
+<th>Time:<td><span id="tm"> </span>
+<th>Sunrise:<td><span id="Sunrise"> </span>
+<th>Sunset:<td><span id="Sunset"> </span>
+<th>Console Volts:<td><span id="Batt_Console"> </span>
+<th>TX Battery OK:<td><span id="Batt_TX_OK"> </span>
+
+<tr>
+<th>Pressure:<td><span id="Pressure"> </span>
+<th>Trend:<td><span id="Pressure_Trend_txt"> </span>
+
+<tr>
+<th>Temperature in:<td> <span id="Temp_In"> </span>
+<th>Humidity:<td> <span id="Humidity_In"> </span>
+
+<tr>
+<th>Temperature out:<td> <span id="Temp_Out"> </span>
+<th>Min:<td> <span id="Temp_Out_Min"> </span>
+<th>Max:<td> <span id="Temp_Out_Max"> </span>
+<th>Humidity:<td> <span id="Humidity_Out"> </span>
+<th>Dew Point:<td> <span id="Dew_Point"> </span>
+
+<tr>
+<th>Wind Direction:<td> <span id="Dir"> </span>
+<th>Minute Avg:<td> <span id="Dir_1m"> </span>
+<th>Speed:<td> <span id="Wind"> </span>
+<th>Minute Avg:<td> <span id="Wind_1m"> </span>
+
+<tr>
+<th>Rain 30mins:<td> <span id="Rain_1h"> </span>
+<th>Day:<td> <span id="Rain_Day"> </span>
+<th>24hrs:<td> <span id="Rain_24h"> </span>
+<th>Month:<td> <span id="Rain_Month"> </span>
+<th>Year:<td> <span id="Rain_Year"> </span>
+</table>
+</body>
+</html>