+ my $str;
+ if ($ts >= $last_hour + 3600) {
+ $h{Pressure_Trend} = unpack("C", substr $blk,3,1);
+ $h{Pressure_Trend_txt} = $bar_trend{$h{Pressure_Trend}};
+ $h{Batt_TX_OK} = (unpack("C", substr $blk,86,1)+0) ^ 1;
+ $h{Batt_Console} = sprintf("%0.2f", unpack("s", substr $blk,87,2) * 0.005859375)+0;
+ $h{Forecast_Icon} = unpack("C", substr $blk,89,1);
+ $h{Forecast_Rule} = unpack("C", substr $blk,90,1);
+ $h{Sunrise} = sprintf( "%04d", unpack("S", substr $blk,91,2) );
+ $h{Sunrise} =~ s/(\d{2})(\d{2})/$1:$2/;
+ $h{Sunset} = sprintf( "%04d", unpack("S", substr $blk,93,2) );
+ $h{Sunset} =~ s/(\d{2})(\d{2})/$1:$2/;
+
+ if ($loop_count) { # i.e not the first
+ my $a = average(scalar @hour ? @hour : {w => $h{Wind}, d => $h{Dir}});
+
+ $h{Wind_1h} = sprintf("%0.1f", $a->{w})+0;
+ $h{Dir_1h} = sprintf("%0.0f", $a->{d})+0;
+ $h{Rain_1h} = $rain >= $last_rain_hour ? $rain - $last_rain_hour : $rain;
+
+ $h{Wind_1m} = sprintf("%0.1f", $a->{w})+0;
+ $h{Dir_1m} = sprintf("%0.0f", $a->{d})+0;
+ $h{Rain_1m} = $rain >= $last_rain_min ? $rain - $last_rain_min : $rain;
+ }
+ $last_rain_min = $last_rain_hour = $rain;
+
+ $j = $json->encode(\%h);
+ $str = qq|{"t":$ts,"h":$j}|;
+ $last_hour = int($ts/3600)*3600;
+ $last_min = int($ts/60)*60;
+ @hour = ();
+ @min = ();
+ } elsif ($ts >= $last_min + 60) {
+ my $a = average(@min);
+ my %save;
+
+ push @hour, $a;
+
+ if ($loop_count) { # i.e not the first
+ $h{Wind_1m} = sprintf("%0.1f", $a->{w})+0;
+ $h{Dir_1m} = sprintf("%0.0f", $a->{d})+0;
+ $h{Rain_1h} = $rain >= $last_rain_hour ? $rain - $last_rain_hour : $rain; # this is the rate for this hour, so far
+ $h{Rain_1m} = $rain >= $last_rain_min ? $rain - $last_rain_min : $rain;
+ }
+ $last_rain_min = $rain;
+
+ $j = $json->encode(\%h);
+ $str = qq|{"t":$ts,"m":$j}|;
+ $last_min = int($ts/60)*60;
+ @min = ();
+ } else {
+ my $o = gen_hash_diff($last_reading, \%h);
+ if ($o) {
+ $j = $json->encode($o);
+ $str = qq|{"t":$ts,"r":$j}|;
+ } else {
+ dbg "loop rec not changed" if isdbg 'chan';
+ }