my $buf;
my $dbg;
my $ser; # the serial port Mojo::IOLoop::Stream
+my $last_min_h;
+my $last_hour_h;
our $json = JSON->new->canonical(1);
+our $WS = {}; # websocket connections
our $ld = {};
$SIG{HUP} = 'IGNORE';
-get '/' => 'index';
-
# WebSocket weather service
-websocket '/index' => sub {
+websocket '/weather' => sub {
my $c = shift;
-
+ my $msg = shift;
+ my $tx = $c->tx;
+
# Opened
- $c->app->log->debug('WebSocket opened.');
+ app->log->debug('WebSocket opened.');
dbg 'WebSocket opened' if isdbg 'chan';
-
- # Increase inactivity timeout for connection a bit
- $c->inactivity_timeout(300);
+ $WS->{$tx} = $tx;
+
+ # send historical data
+ $c->send($ld->{lasthour_h}) if exists $ld->{lasthour_h};
+ $c->send($ld->{lastmin_h}) if exists $ld->{lastmin_h};
+
+ # disable timeout
+ $c->inactivity_timeout(3615);
# Incoming message
$c->on(
message => sub {
my ($c, $msg) = @_;
- dbg "websocket: $msg" if isdbg 'chan';
+ dbg "websocket: text $msg" if isdbg 'chan';
},
json => sub {
my ($c, $msg) = @_;
- dbg "websocket: $msg" if isdbg 'chan';
+ dbg "websocket: json $msg" if isdbg 'chan';
}
);
# Closed
$c->on(finish => sub {
my ($c, $code, $reason) = @_;
- $c->app->log->debug("WebSocket closed with status $code.");
- dbg 'WebSocket closed with status $code' if isdbg 'chan';
+ app->log->debug("WebSocket closed with status $code.");
+ dbg 'webwocket closed with status $code' if isdbg 'chan';
+ delete $WS->{$tx};
});
-
- $c->render;
-
};
+get '/' => {template => 'index'};
+
+
dbginit();
if (@ARGV) {
dbgadd(@ARGV);
}
$ld->{last_rain_min} = $ld->{last_rain_hour} = $rain;
+ $last_hour_h = {%h};
$s = genstr($ts, 'h', \%h);
+ $ld->{lasthour_h} = $s;
$ld->{last_hour} = int($ts/1800)*1800;
$ld->{last_min} = int($ts/60)*60;
$h{Temp_Out_Max} = $ld->{Temp_Out_Max};
$h{Temp_Out_Min} = $ld->{Temp_Out_Min};
+ $last_min_h = {%h};
$s = genstr($ts, 'm', \%h);
+ $ld->{lastmin_h} = $s;
$ld->{last_min} = int($ts/60)*60;
@{$ld->{wind_min}} = ();
dbg $s;
# say $s;
$dlog->writenow($s);
+ foreach my $ws (keys $WS) {
+ my $tx = $WS->{$ws};
+ if ($tx) {
+ $tx->send($s);
+ } else {
+ delete $WS->{$tx};
+ }
+ }
}
sub gen_hash_diff
# sort out rain stats
my $c;
- if (($c = @{$ld->{rain24}}) < 24*60) {
+ if ($ld->{rain24} && ($c = @{$ld->{rain24}}) < 24*60) {
my $diff = 24*60 - $c;
unshift @{$ld->{rain24}}, 0 for 0 .. $diff;
}
my $rain;
- $rain += $_ for @{$ld->{rain24}};
+
+ if ($ld->{rain24}) {
+ $rain += $_ for @{$ld->{rain24}};
+ }
+
$ld->{rain_24} = nearest(0.1, $rain);
delete $ld->{hour};
delete $ld->{min};
__DATA__
@@ index.html.ep
+% my $url = url_for 'weather';
<!DOCTYPE html>
<html>
<head><title>DWeather</title></head>
<body>
+ <h1>DWeather</h1>
+
<script>
- var ws;
- if ("WebSocket" in window) {
- ws = new WebSocket('<%= url_for('index')->to_abs %>');
- //ws = new WebSocket();
- }
- if(typeof(ws) !== 'undefined') {
- ws.onmessage = function (event) {
- document.body.innerHTML += JSON.parse(event.data).test;
- };
- ws.onopen = function (event) {
- ws.send(JSON.stringify({weather: 'WebSocket support works! ♥'}));
- };
- }
- else {
- document.body.innerHTML += 'Browser does not support WebSockets.';
- }
-
- var ws = new WebSocket('<%= url_for('weather')->to_abs %>');
-
- // Incoming messages
- ws.onmessage = function(event) {
- document.body.innerHTML += event.data + '<br/>';
- };
+ 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>
- <h1>DWeather</h1>
+<br><br>
+<table border=1 width=80%>
+<th>Time:<td><span id="tm"> </span>
+<tr>
+<th>Pressure:<td><span id="Pressure"> </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:<td> <span id="Dir_1m"> </span>
+<th>Speed:<td> <span id="Wind"> </span>
+<th>Minute:<td> <span id="Wind_1m"> </span>
+<tr>
+<th>Rain Hour:<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>