diff --git a/webstuff/frontend/php_inc/connection.inc.php b/webstuff/frontend/php_inc/connection.inc.php index 59a1229..32197a3 100644 --- a/webstuff/frontend/php_inc/connection.inc.php +++ b/webstuff/frontend/php_inc/connection.inc.php @@ -20,7 +20,7 @@ class Connection{ /* Verbindung herstellen (wenn noch net besteht)*/ function _createConn(){ - //print $this->conn."
"; + #print $this->conn."
"; if($this->conn === NULL){ $this->conn = pg_pconnect(Config::getPgConnString()) or die('Verbindungsaufbau fehlgeschlagen: ' . pg_last_error()); @@ -37,12 +37,12 @@ class Connection{ /* Eine Zeile holen */ function fetchQueryResultLine($query){ - $this->_createConn(); - $result = pg_query($this->conn, $query) - or die('Abfrage fehlgeschlagen: ' . pg_last_error(). "\n
\nquery: '".$query."'"); - $array = pg_fetch_assoc($result); - //print_r($array); - return $array; + $this->_createConn(); + $result = pg_query($this->conn, $query) + or die('Abfrage fehlgeschlagen: ' . pg_last_error(). "\n
\nquery: '".$query."'"); + $array = pg_fetch_assoc($result); + //print_r($array); + return $array; } /* mehrere Zeilen holen */ diff --git a/webstuff/frontend/php_inc/module.inc.php b/webstuff/frontend/php_inc/module.inc.php index 7465254..8fb69ec 100644 --- a/webstuff/frontend/php_inc/module.inc.php +++ b/webstuff/frontend/php_inc/module.inc.php @@ -40,7 +40,8 @@ class Module{ $this->modName = $modName; $this->connection = &$connection; $this->parserInstance = &$parser; - $this->table = $this->_getTableName(); + $this->sensInstance = new Sensor($sensId, $connection); + $this->table = $this->sensInstance->get_table(); if (ModuleSet::isStandardPage($_REQUEST['setType'])) $parser->parseContent($this->_getModuleFilename("frame"), & $this, "top"); /* Oberen Modulrahmen parsen */ @@ -49,13 +50,6 @@ class Module{ $parser->parseContent($this->_getModuleFilename("frame"), & $this, "bottom"); /* unteren Modulrahmen Parsen */ } - function _getTableName(){ - /* Tabelle des Sensors bestimmen */ - $tableQuery = "SELECT tabelle FROM sensoren, typen WHERE sensoren.id=".$this->sensId." AND typen.typ = sensoren.typ"; - $table = $this->connection->fetchQueryResultLine($tableQuery); - return $table['tabelle']; - } - /* Dateinamen des Modul-Files zusammenbauen */ function _getModuleFilename($modName){ global $path; diff --git a/webstuff/frontend/php_inc/modules/hum.inc.php b/webstuff/frontend/php_inc/modules/hum.inc.php index 4517570..c619dff 100644 --- a/webstuff/frontend/php_inc/modules/hum.inc.php +++ b/webstuff/frontend/php_inc/modules/hum.inc.php @@ -43,8 +43,7 @@ class Hum{ } function _fetchMinMax(){ - $Query = "SELECT max(hum) as max, min(hum) as min FROM ".$this->table." WHERE sens_id=".$this->sensId.""; - $Data = $this->connection->fetchQueryResultLine($Query); + $Data = Sensor::get_sensor_extrema($this->sensId, &$this->connection, "hum"); $this->minHum = $Data['min']; $this->maxHum = $Data['max']; } @@ -59,31 +58,19 @@ class Hum{ $this->maxDate = $Data[1]['text_timestamp']; } - /* liefert den Durchschnittswert in einem bestimmtem Interval */ - function _getAverage($interval){ - $avQuery = "SELECT avg(hum) as average, count(hum) as count FROM ".$this->table." WHERE sens_id=".$this->sensId." AND timestamp>(current_timestamp - INTERVAL '".$interval."')"; - $avData = $this->connection->fetchQueryResultLine($avQuery); - return $avData; - } /* momentanen Durchschnittswert bestimmen */ function _fetchAverage(){ - $avData = array('average'=>0, 'count'=>0); /* Array initialisieren */ - $i = 1; /* Laufvariable */ - while($avData['count']<5){ /* Schleife prueft, in welchem Interval 5 Werte zusammenkommen */ - $i++; /* Laufvariable erhoehen */ - $avData = $this->_getAverage(($i*(Config::getAvInterval()))." minutes"); /* Holt Werte mit gegebenem Interval */ - } - + $Data = Sensor::get_sensor_average($this->sensId, &$this->connection, "hum"); /* Werte den Klassenvariablen zuordnen */ - $this->avVal = $avData['average']; - $this->avInter = $i*(Config::getAvInterval()); + $this->avVal = $Data['average']; + $this->avInter = $Data['interval']; } /* Bestimmt die Tendenz */ function _fetchMoving(){ - $shortAvData = $this->_getAverage("15 minutes"); /* Durchschnitt der letzten 15 minuten */ - $longAvData = $this->_getAverage("120 minutes"); /* Durchschnitt der letzten 120 Minuten */ + $shortAvData = Sensor::get_sensor_extrema($this->sensId, &$this->connection, "hum", 15); /* Durchschnitt der letzten 15 minuten */ + $longAvData = Sensor::get_sensor_extrema($this->sensId, &$this->connection, "hum", 120); /* Durchschnitt der letzten 120 Minuten */ if($shortAvData['count'] < 1 || $longAvData['count'] < 2){ /* Wenn in den letzten 5 minuten kein Wert kam oder in den letzten 120 min weniger als 3 Werte kamen */ $this->changing = "Berechnung momentan nicht moeglich"; /* Dann ausgeben, dass momentan nichts berechnet werden kann */ return; /* und aus der Funktion huepfen */ diff --git a/webstuff/frontend/php_inc/modules/press.inc.php b/webstuff/frontend/php_inc/modules/press.inc.php index 450f5de..44ce4eb 100644 --- a/webstuff/frontend/php_inc/modules/press.inc.php +++ b/webstuff/frontend/php_inc/modules/press.inc.php @@ -42,8 +42,7 @@ class Press{ } function _fetchMinMax(){ - $Query = "SELECT max(press) as max, min(press) as min FROM ".$this->table." WHERE sens_id=".$this->sensId.""; - $Data = $this->connection->fetchQueryResultLine($Query); + $Data = Sensor::get_sensor_extrema($this->sensId, &$this->connection, "press"); $this->minPress = $Data['min']; $this->maxPress = $Data['max']; } @@ -58,31 +57,19 @@ class Press{ $this->maxDate = $Data[1]['text_timestamp']; } - /* liefert den Durchschnittswert in einem bestimmtem Interval */ - function _getAverage($interval){ - $avQuery = "SELECT avg(press) as average, count(press) as count FROM ".$this->table." WHERE sens_id=".$this->sensId." AND timestamp>(current_timestamp - INTERVAL '".$interval."')"; - $avData = $this->connection->fetchQueryResultLine($avQuery); - return $avData; - } /* momentanen Durchschnittswert bestimmen */ function _fetchAverage(){ - $avData = array('average'=>0, 'count'=>0); /* Array initialisieren */ - $i = 1; /* Laufvariable */ - while($avData['count']<5){ /* Schleife prueft, in welchem Interval 5 Werte zusammenkommen */ - $i++; /* Laufvariable erhoehen */ - $avData = $this->_getAverage(($i*(Config::getAvInterval()))." minutes"); /* Holt Werte mit gegebenem Interval */ - } - + $Data = Sensor::get_sensor_average($this->sensId, &$this->connection, "press"); /* Werte den Klassenvariablen zuordnen */ - $this->avVal = $avData['average']; - $this->avInter = $i*(Config::getAvInterval()); + $this->avVal = $Data['average']; + $this->avInter = $Data['interval']; } /* Bestimmt die Tendenz */ function _fetchMoving(){ - $shortAvData = $this->_getAverage("15 minutes"); /* Durchschnitt der letzten 15 minuten */ - $longAvData = $this->_getAverage("120 minutes"); /* Durchschnitt der letzten 120 Minuten */ + $shortAvData = Sensor::get_sensor_extrema($this->sensId, &$this->connection, "press", 15); /* Durchschnitt der letzten 15 minuten */ + $longAvData = Sensor::get_sensor_extrema($this->sensId, &$this->connection, "press", 120); /* Durchschnitt der letzten 120 Minuten */ if($shortAvData['count'] < 1 || $longAvData['count'] < 2){ /* Wenn in den letzten 5 minuten kein Wert kam oder in den letzten 120 min weniger als 3 Werte kamen */ $this->changing = "Berechnung momentan nicht moeglich"; /* Dann ausgeben, dass momentan nichts berechnet werden kann */ return; /* und aus der Funktion huepfen */ diff --git a/webstuff/frontend/php_inc/modules/rain.inc.php b/webstuff/frontend/php_inc/modules/rain.inc.php index 86bbac1..a9b6f08 100644 --- a/webstuff/frontend/php_inc/modules/rain.inc.php +++ b/webstuff/frontend/php_inc/modules/rain.inc.php @@ -34,13 +34,13 @@ class Rain{ /* Momentane Werte aus der Datenbank holen */ function _getNowValues($interval){ - $result = $this->connection->fetchQueryResultLine("SELECT sum(count) as rain FROM ".$this->table." WHERE sens_id=".$this->sensId." AND timestamp>(current_timestamp - INTERVAL '".$interval."')"); + $result = $this->connection->fetchQueryResultLine("SELECT sum(count) as rain FROM ".$this->table." WHERE sens_id=".$this->sensId." AND timestamp>(select (current_timestamp - INTERVAL '".$interval."'))"); return $result['rain']; } /* Maximal gemessene Werte aus der Datenbank holen */ function _getMaxValues($unit, $dateFormat){ // unit = hour, minute, ... - return $this->connection->fetchQueryResultLine("SELECT to_char(ts, '".$dateFormat."') as date, val FROM ".$this->table."_".$unit." WHERE sens_id=".$this->sensId." AND val=(SELECT max(val) FROM ".$this->table."_".$unit." WHERE sens_id=".$this->sensId.") ORDER BY ts DESC LIMIT 1"); + return $this->connection->fetchQueryResultLine("SELECT to_char(ts, '".$dateFormat."') as date, val FROM ".$this->table."_".$unit." WHERE sens_id=".$this->sensId." ORDER BY val DESC, ts DESC LIMIT 1"); } diff --git a/webstuff/frontend/php_inc/modules/sensor.inc.php b/webstuff/frontend/php_inc/modules/sensor.inc.php index d789dd0..263e3f7 100644 --- a/webstuff/frontend/php_inc/modules/sensor.inc.php +++ b/webstuff/frontend/php_inc/modules/sensor.inc.php @@ -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']); + } } ?> diff --git a/webstuff/frontend/php_inc/modules/temp.inc.php b/webstuff/frontend/php_inc/modules/temp.inc.php index 27668d4..9c7015e 100644 --- a/webstuff/frontend/php_inc/modules/temp.inc.php +++ b/webstuff/frontend/php_inc/modules/temp.inc.php @@ -42,8 +42,7 @@ class Temp{ } function _fetchMinMax(){ - $Query = "SELECT max(temp) as max, min(temp) as min FROM ".$this->table." WHERE sens_id=".$this->sensId.""; - $Data = $this->connection->fetchQueryResultLine($Query); + $Data = Sensor::get_sensor_extrema($this->sensId, &$this->connection, "temp"); $this->minTemp = $Data['min']; $this->maxTemp = $Data['max']; } @@ -58,31 +57,19 @@ class Temp{ $this->maxDate = $Data[1]['text_timestamp']; } - /* liefert den Durchschnittswert in einem bestimmtem Interval */ - function _getAverage($interval){ - $avQuery = "SELECT avg(temp) as average, count(temp) as count FROM ".$this->table." WHERE sens_id=".$this->sensId." AND timestamp>(current_timestamp - INTERVAL '".$interval."')"; - $avData = $this->connection->fetchQueryResultLine($avQuery); - return $avData; - } /* momentanen Durchschnittswert bestimmen */ function _fetchAverage(){ - $avData = array('average'=>0, 'count'=>0); /* Array initialisieren */ - $i = 1; /* Laufvariable */ - while($avData['count']<5){ /* Schleife prueft, in welchem Interval 5 Werte zusammenkommen */ - $i++; /* Laufvariable erhoehen */ - $avData = $this->_getAverage(($i*(Config::getAvInterval()))." minutes"); /* Holt Werte mit gegebenem Interval */ - } - + $Data = Sensor::get_sensor_average($this->sensId, &$this->connection, "temp"); /* Werte den Klassenvariablen zuordnen */ - $this->avVal = $avData['average']; - $this->avInter = $i*(Config::getAvInterval()); + $this->avVal = $Data['average']; + $this->avInter = $Data['interval']; } /* Bestimmt die Tendenz */ function _fetchMoving(){ - $shortAvData = $this->_getAverage("15 minutes"); /* Durchschnitt der letzten 15 minuten */ - $longAvData = $this->_getAverage("120 minutes"); /* Durchschnitt der letzten 120 Minuten */ + $shortAvData = Sensor::get_sensor_extrema($this->sensId, &$this->connection, "temp", 15); /* Durchschnitt der letzten 15 minuten */ + $longAvData = Sensor::get_sensor_extrema($this->sensId, &$this->connection, "temp", 120); /* Durchschnitt der letzten 120 Minuten */ if($shortAvData['count'] < 1 || $longAvData['count'] < 2){ /* Wenn in den letzten 5 minuten kein Wert kam oder in den letzten 120 min weniger als 3 Werte kamen */ $this->changing = "Berechnung momentan nicht moeglich"; /* Dann ausgeben, dass momentan nichts berechnet werden kann */ return; /* und aus der Funktion huepfen */ diff --git a/webstuff/frontend/php_inc/modules/wind.inc.php b/webstuff/frontend/php_inc/modules/wind.inc.php index 20f9ba3..61ddb61 100644 --- a/webstuff/frontend/php_inc/modules/wind.inc.php +++ b/webstuff/frontend/php_inc/modules/wind.inc.php @@ -126,7 +126,7 @@ class Wind{ /* liefert den Durchschnittswert in einem bestimmtem Interval */ function _getAverage($interval){ - $avQuery = "SELECT avg(geschw) as average, count(geschw) as count FROM ".$this->table." WHERE sens_id=".$this->sensId." AND timestamp>(current_timestamp - INTERVAL '".$interval."')"; + $avQuery = "SELECT avg(geschw) as average, count(geschw) as count FROM ".$this->table." WHERE sens_id=".$this->sensId." AND timestamp>(select (current_timestamp - INTERVAL '".$interval."'))"; $avData = $this->connection->fetchQueryResultLine($avQuery); return $avData; }