hanze/iwa-panda1

logic/datavalidator.php in tak
Repositories | Summary | Log | Files

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}