. */ namespace Volkszaehler\Interpreter; /** * Meter interpreter * * @package default * @author Steffen Vogel (info@steffenvogel.de) * */ use Volkszaehler; use Volkszaehler\Util; class MeterInterpreter extends Interpreter { protected $min = NULL; protected $max = NULL; protected $first = NULL; protected $last = NULL; protected $pulseCount = NULL; protected $resolution; /** * Calculates the consumption * * @return float total consumption in Wh */ public function getConsumption() { return 1000 * $this->pulseCount / $this->resolution; } /** * Get minimum * * @return array (0 => timestamp, 1 => value) */ public function getMin() { return ($this->min) ? array_map('floatval', array_slice($this->min, 0 , 2)) : NULL; } /** * Get maximum * * @return array (0 => timestamp, 1 => value) */ public function getMax() { return ($this->max) ? array_map('floatval', array_slice($this->max, 0 , 2)) : NULL; } /** * Get Average * * @return float 3600: 3600 s/h; 1000: ms -> s */ public function getAverage() { if ($consumption = $this->getConsumption()) { return (3600 * 1000 * $consumption) / ($this->last[0] - $this->first[0]); } else { // prevents division by zero return 0; } } /** * Raw pulses to power conversion * * @param $callback a callback called each iteration for output * @return array with timestamp, values, and pulse count */ public function processData($callback) { $tuples = array(); $pulses = parent::getData(); $this->resolution = $this->channel->getProperty('resolution'); $this->pulseCount = 0; $last = $pulses->rewind(); $next = $pulses->next(); while ($pulses->valid()) { $tuple = $callback($this->raw2differential($last, $next)); if (is_null($this->max) || $tuple[1] > $this->max[1]) { $this->max = $tuple; } if (is_null($this->min) || $tuple[1] < $this->min[1]) { $this->min = $tuple; } $this->pulseCount += $tuple[2]; $tuples[] = $tuple; $last = $next; $next = $pulses->next(); } $this->first = reset($tuples); $this->last = end($tuples); return $tuples; } /** * Calculates the differential quotient of two consecutive pulses * * @param array $last the last pulse * @param array $next the next pulse */ protected function raw2differential(array $last, array $next) { $delta = $next[0] - $last[0]; return array( //($next[0] - $delta / 2), // timestamp in the middle $last[0], // timestamp at the start $next[1] * (3600000 / (($this->resolution / 1000) * $delta)), // value $next[2] // num of pulses ); } } ?>