mirror of
https://github.com/agdsn/ancient-weatherstation.git
synced 2026-06-19 23:07:59 +00:00
heavy database optimizions
git-svn-id: file:///home/jan/tmp/wetterstation/trunk@243 dd492736-c11a-0410-ad51-8c26713eaf7f
This commit is contained in:
@@ -9,6 +9,18 @@
|
||||
|
||||
include_once($path."php_inc/connection.inc.php");
|
||||
|
||||
$sensor_data = NULL;
|
||||
$extrema_fields = array(
|
||||
0 => array('temp'),
|
||||
1 => array('temp', 'hum'),
|
||||
2 => array('count'),
|
||||
6 => array('intens'),
|
||||
5 => array('bight'),
|
||||
4 => array('temp', 'hum', 'press'),
|
||||
3 => array('geschw')
|
||||
);
|
||||
$sensor_extrema = array();
|
||||
$sensor_average = array();
|
||||
|
||||
/* Klasse, Die Daten ueben die Einzelnen Sensoren bereitstellt */
|
||||
class Sensor{
|
||||
@@ -18,22 +30,30 @@ class Sensor{
|
||||
var $descr; /* Beschreibung des Sensors */
|
||||
var $typ; /* Typ des Sensors */
|
||||
var $address; /* Addresse des Sensors */
|
||||
var $tabelle; /* Tabelle in der die Werte des Sensors stehen */
|
||||
|
||||
/* Konstruktor, Initialisiert die Klasse mit den Werten */
|
||||
function Sensor($sensId, & $connection){
|
||||
$this->_fetchSensorData($sensId, &$connection);
|
||||
}
|
||||
|
||||
/* Holt die Daten ueber den Sensor aus der Datenbank */
|
||||
function _fetchSensorData($sensId, &$connection){
|
||||
$query = "SELECT * FROM sensoren WHERE id=".$sensId;
|
||||
$data = $connection->fetchQueryResultLine($query);
|
||||
|
||||
$data = $this->_fetchSensorData($sensId, &$connection);
|
||||
$this->id = $data['id'];
|
||||
$this->location = $data['standort'];
|
||||
$this->descr = $data['beschreibung'];
|
||||
$this->typ = $data['typ'];
|
||||
$this->address = $data['addresse'];
|
||||
$this->table = $data['tabelle'];
|
||||
}
|
||||
|
||||
/* Holt die Daten ueber den Sensor aus der Datenbank */
|
||||
function _fetchSensorData($sensId, &$connection){
|
||||
global $sensor_data;
|
||||
if ($sensor_data == NULL){
|
||||
$query = "SELECT sensoren.*, typen.tabelle FROM sensoren, typen where typen.typ = sensoren.typ";
|
||||
$result = $connection->getRawResult($query);
|
||||
while ($array = pg_fetch_assoc($result)){
|
||||
$sensor_data[$array['id']] = $array;
|
||||
}
|
||||
}
|
||||
return $sensor_data[$sensId];
|
||||
}
|
||||
|
||||
/* --- Funktionen, die die Einzelnen Eigenschaften des Sensors zurueckgeben --- */
|
||||
@@ -56,6 +76,65 @@ class Sensor{
|
||||
function get_address(){
|
||||
return $this->address;
|
||||
}
|
||||
|
||||
function get_table(){
|
||||
return $this->table;
|
||||
}
|
||||
|
||||
/* Statisch,
|
||||
* Holt Extrema (Min/Max)
|
||||
* Braucht: Sensor-Id, Connection, Das Feld fuer das die Extrema ausgegeben werden sollen */
|
||||
function get_sensor_extrema($sensId, &$connection, $field){
|
||||
global $extrema_fields, $sensor_extrema;
|
||||
if (! array_key_exists($sensId, $sensor_extrema)){
|
||||
$data = Sensor::_fetchSensorData($sensId, &$connection);
|
||||
$query = "SELECT ";
|
||||
for ($i = 0; $i < count($extrema_fields[$data['typ']]); $i++){
|
||||
if ($i != 0)
|
||||
$query .= ", ";
|
||||
$query .= "min(".$extrema_fields[$data['typ']][$i].") AS min_".$extrema_fields[$data['typ']][$i].", ";
|
||||
$query .= "max(".$extrema_fields[$data['typ']][$i].") AS max_".$extrema_fields[$data['typ']][$i]." ";
|
||||
}
|
||||
$query .= "FROM ".$data['tabelle']." WHERE sens_id = ".$sensId;
|
||||
$res = $connection->fetchQueryResultLine($query);
|
||||
$sensor_extrema[$sensId] = $res;
|
||||
}
|
||||
return array('min' => $sensor_extrema[$sensId]['min_'.$field], 'max' => $sensor_extrema[$sensId]['max_'.$field]);
|
||||
}
|
||||
|
||||
|
||||
/* Statisch,
|
||||
* Holt Durchschnittswerte
|
||||
* Braucht: Sensor-Id, Connection, Das Feld fuer das die Extrema ausgegeben werden sollen,
|
||||
* optional ein interval ueber das gemittelt werden soll */
|
||||
function get_sensor_average($sensId, &$connection, $field, $init_interval = 0){
|
||||
global $extrema_fields, $sensor_average;
|
||||
if ((! array_key_exists($init_interval, $sensor_average)) || (! array_key_exists($sensId, $sensor_average[$init_interval]))){
|
||||
$interval = $init_interval;
|
||||
$data = Sensor::_fetchSensorData($sensId, &$connection);
|
||||
$query = "SELECT count(".$extrema_fields[$data['typ']][0].") AS count, ";
|
||||
for ($i = 0; $i < count($extrema_fields[$data['typ']]); $i++){
|
||||
if ($i != 0)
|
||||
$query .= ", ";
|
||||
$query .= "avg(".$extrema_fields[$data['typ']][$i].") AS ".$extrema_fields[$data['typ']][$i]." ";
|
||||
}
|
||||
$query .= "FROM ".$data['tabelle']." WHERE sens_id = ".$sensId." AND timestamp>(select(current_timestamp - INTERVAL '";
|
||||
$res = array('count' => 0, 'average' => 0);
|
||||
$m = 0;
|
||||
if ($interval == 0){
|
||||
while ($res['count'] < 4) {
|
||||
$m++;
|
||||
$interval = $m*(Config::getAvInterval());
|
||||
$res = $connection->fetchQueryResultLine($query.$interval." minutes'))");
|
||||
}
|
||||
} else {
|
||||
$res = $connection->fetchQueryResultLine($query.$interval." minutes'))");
|
||||
}
|
||||
$res['interval'] = $interval;
|
||||
$sensor_average[$init_interval][$sensId] = $res;
|
||||
}
|
||||
return array('average' => $sensor_average[$init_interval][$sensId][$field], 'count' => $sensor_average[$init_interval][$sensId]['count'], 'interval' => $sensor_average[$init_interval][$sensId]['interval']);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
Reference in New Issue
Block a user