datavalidator.php (2308B) download
1<?php
2/**
3 * Validates the temperature against the average of the last 30 rows for the given station name.
4 *
5 * @param string $station The station name to validate against.
6 * @param float $temperature The temperature value to validate.
7 * @param Redis $redis The Redis connection object.
8 * @return float Returns the correct temperature.
9 */
10function validate_temperature($station, $temperature, $redis) {
11 // Return the correct temperature validated with last 30 values.
12
13 //Deze checkt of het de eerste value is en maakt 2 queues aan en knalt de waardes erin.
14 if(!$redis->exists('values'.$station)) {
15 $redis->lpush('values'.$station, $temperature);
16 $redis->lpush('average'.$station, $temperature);
17 return 0;
18 }
19 //Als het aantal values de 30 nog niet bereikt heeft, berekend hij gewoon het gemiddelde en voegt de value toe aan de queue
20 else {
21 if($redis->llen('values'.$station) < 3) {
22 $avg = ($redis->rpop('average'.$station) * $redis->llen('values'.$station) + $temperature) / ($redis->llen('values'.$station) + 1);
23 $redis->lpush('average'.$station, $avg);
24 $redis->lpush('values'.$station, $temperature);
25 return 0;
26 }
27 //Bij 30 values zal de volgende value eerst gecheckt worden met het bekende gemiddelde en eventueel aangepast worden.
28 //Daarna zal deze toegevoegd worden aan de value en average queue. De laatste waarde zal eruit gehaald worden.
29 else {
30 $current_avg = $redis->lIndex('average'.$station, 0) ?: 0.000000000000001;
31 if(abs(($temperature - $current_avg) / $current_avg) > 0.2) {
32 $temperature = $current_avg;
33 $new_avg = (($redis->rpop('average'.$station) * 3) - $redis->rpop('values'.$station) + $temperature) / 3;
34 $redis->lpush('average'.$station, $new_avg);
35 $redis->lpush('values'.$station, $temperature);
36 return -1;
37 }
38 else {
39 $new_avg = (($redis->rpop('average'.$station) * 3) - $redis->rpop('values'.$station) + $temperature) / 3;
40 $redis->lpush('average'.$station, $new_avg);
41 $redis->lpush('values'.$station, $temperature);
42 return 1;
43 }
44 }
45 }
46}