Working at home
git-svn-id: file:///home/jan/tmp/wetterstation/trunk@31 dd492736-c11a-0410-ad51-8c26713eaf7f
This commit is contained in:
parent
18643bb643
commit
b8cc79937b
|
|
@ -8,6 +8,14 @@ INCL = -I$$(pg_config --includedir)
|
|||
BIN_NAME = weatherdeamon
|
||||
OBJS = main.o config.o input.o process.o write.o
|
||||
|
||||
CONF_NAME = weatherd.conf
|
||||
|
||||
INSTDIR = /usr/bin/
|
||||
CONFDIR = /etc/
|
||||
INSTGRP = losinski
|
||||
INSTUSR = losinski
|
||||
|
||||
DESTDIR = /home/losinski
|
||||
|
||||
# Alles bauen
|
||||
all: $(BIN_NAME)
|
||||
|
|
@ -34,11 +42,33 @@ $(OBJS):
|
|||
|
||||
# Programm mit debug-ausgabe bauen
|
||||
debug:
|
||||
$(MAKE) all DEBUG=-DDEBUG
|
||||
@ echo "baue Version mit Debugoutput ..."
|
||||
@ $(MAKE) all DEBUG=-DDEBUG
|
||||
|
||||
# Programm ohne Log-ausgabe bauen
|
||||
nolog:
|
||||
$(MAKE) all NOLOG=-DNO_LOGING
|
||||
@ echo "baue Version ohne Logoutput ..."
|
||||
@ $(MAKE) all NOLOG=-DNO_LOGING
|
||||
|
||||
# Installieren
|
||||
install:
|
||||
@ echo "kopiere $(BIN_NAME) nach $(DESTDIR)$(INSTDIR)"
|
||||
@ mkdir -p $(DESTDIR)$(INSTDIR); \
|
||||
cp $(BIN_NAME) $(DESTDIR)$(INSTDIR)
|
||||
@ echo "setze Rechte auf $(BIN_NAME)"
|
||||
@ cd $(DESTDIR)$(INSTDIR); \
|
||||
chmod 755 $(BIN_NAME); \
|
||||
chgrp $(INSTGRP) $(BIN_NAME); \
|
||||
chown $(INSTUSR) $(BIN_NAME)
|
||||
@ echo "kopiere $(CONF_NAME) nach $(DESTDIR)$(CONFDIR)"
|
||||
@ mkdir -p $(DESTDIR)$(CONFDIR); \
|
||||
cp $(CONF_NAME) $(DESTDIR)$(CONFDIR)
|
||||
@ echo "setze Rechte auf $(CONF_NAME)"
|
||||
@ cd $(DESTDIR)$(CONFDIR); \
|
||||
chmod 755 $(CONF_NAME); \
|
||||
chgrp $(CONFGRP) $(CONF_NAME); \
|
||||
chown $(CONFUSR) $(CONF_NAME)
|
||||
|
||||
|
||||
# Aufräumnen (alle Object-Files löschen)
|
||||
cleanup:
|
||||
|
|
|
|||
|
|
@ -57,6 +57,7 @@
|
|||
#define ERROR_READ "sensor-rs232interface: Fehler beim Lesen\n"
|
||||
#define ERROR_LOGFILE "Log-Error: Kann Logfile nicht öffnen\n"
|
||||
#define ERROR_FORK "Fork-Fehler: Kann den Prozess nicht in den Hintergrund schieben\n"
|
||||
#define ERROR_SEIINST "Signal-Fehler: Kann Signalhandler zum beenden nicht installieren\n"
|
||||
|
||||
|
||||
/* Parameter-Flags ----------------------------------------------------- */
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
|
||||
weatherdeamon -- Weather Data Capture Program for the
|
||||
'ELV-PC-Wettersensor-Empfänger'
|
||||
'ELV-PC-Wettersensor-Empfaenger'
|
||||
main.c -- Part of the weatherdeamon
|
||||
|
||||
Copyright (C) 2006 Jan Losinski
|
||||
|
|
@ -30,6 +30,7 @@
|
|||
#include <stdio.h>
|
||||
#include <fcntl.h> /* O_WRONLY O_APPEND O_CREAT ... */
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
#include "definitions.h"
|
||||
#include "config.h"
|
||||
#include "main.h"
|
||||
|
|
@ -39,7 +40,7 @@
|
|||
w_opts global_opts;
|
||||
clean_struct_ptr clean_ptr = NULL;
|
||||
#ifndef NO_LOGING
|
||||
static char *error_buffer = NULL; /* Puffer für Fehler-ausgaben */
|
||||
static char *error_buffer = NULL; /* Puffer fuer Fehler-ausgaben */
|
||||
#endif
|
||||
|
||||
/* Funktionen ----------------------------------------------------------*/
|
||||
|
|
@ -53,7 +54,7 @@ static void merge_options(w_opts *);
|
|||
#endif
|
||||
static clean_struct_ptr get_last_clean(clean_struct_ptr);
|
||||
static void clean();
|
||||
|
||||
static void exit_sig_handler(int);
|
||||
|
||||
/* Jetzt gehts los.... --------------------------------------------------*/
|
||||
|
||||
|
|
@ -76,6 +77,19 @@ int main(int argc, char *argv[]){
|
|||
|
||||
DEBUGOUT1("Programm gestartet\n");
|
||||
|
||||
if(signal(SIGABRT, exit_sig_handler) == SIG_ERR)
|
||||
exit_error(ERROR_SEIINST);
|
||||
DEBUGOUT1("Signalhandler zum beenden per SIGABRT installiert\n");
|
||||
if(signal(SIGINT, exit_sig_handler) == SIG_ERR)
|
||||
exit_error(ERROR_SEIINST);
|
||||
DEBUGOUT1("Signalhandler zum beenden per SIGINT installiert\n");
|
||||
if(signal(SIGQUIT, exit_sig_handler) == SIG_ERR)
|
||||
exit_error(ERROR_SEIINST);
|
||||
DEBUGOUT1("Signalhandler zum beenden per SIGQUIT installiert\n");
|
||||
if(signal(SIGTERM, exit_sig_handler) == SIG_ERR)
|
||||
exit_error(ERROR_SEIINST);
|
||||
DEBUGOUT1("Signalhandler zum beenden per SIGTERM installiert\n");
|
||||
|
||||
read_config(DEFAULT_CONFIG_FILE,1);
|
||||
|
||||
/* Optionen auswerten */
|
||||
|
|
@ -116,7 +130,7 @@ int main(int argc, char *argv[]){
|
|||
read_config(extra_conf_file,0);
|
||||
}
|
||||
|
||||
/* Komandozeilen-Optionen zu denen aus der Config-File hinzufügen */
|
||||
/* Komandozeilen-Optionen zu denen aus der Config-File hinzufuegen */
|
||||
merge_options(&opts);
|
||||
|
||||
/* Debug-Ausgaben, um zu sehen, ob die Optionen richtig gesetzt werden */
|
||||
|
|
@ -138,8 +152,8 @@ int main(int argc, char *argv[]){
|
|||
|
||||
/* Programm in den Hintergrund schicken ? */
|
||||
background();
|
||||
|
||||
DEBUGOUT1("\nBeginne Interface zu öffnen\n\n");
|
||||
while (1);
|
||||
DEBUGOUT1("\nBeginne Interface zu oeffnen\n\n");
|
||||
|
||||
/* Port Pollen */
|
||||
read_port();
|
||||
|
|
@ -159,7 +173,7 @@ static void background(){
|
|||
}
|
||||
}
|
||||
|
||||
/* Führt die Optionen aus der Komandozeile und die aus dem Conf-File zusammen */
|
||||
/* Fuehrt die Optionen aus der Komandozeile und die aus dem Conf-File zusammen */
|
||||
static void merge_options(w_opts *priv){
|
||||
if((*priv).device != NULL)
|
||||
global_opts.device = (*priv).device;
|
||||
|
|
@ -196,8 +210,8 @@ int get_flag(int mask){
|
|||
}
|
||||
|
||||
/* Diese Funktion beendet das Programm mit einer Fehlermeldung. */
|
||||
void exit_error(char* err)
|
||||
{
|
||||
void exit_error(char* err){
|
||||
DEBUGOUT1("\nEtwas unschoenes ist passiert\n");
|
||||
clean();
|
||||
if(errno != 0){
|
||||
perror("Fehler");
|
||||
|
|
@ -206,9 +220,27 @@ void exit_error(char* err)
|
|||
exit(1);
|
||||
}
|
||||
|
||||
/* Wird bei Beendigungssignalen ausgefuehrt */
|
||||
static void exit_sig_handler(int signr){
|
||||
#ifdef DEBUG
|
||||
DEBUGOUT1("\n");
|
||||
switch (signr){
|
||||
case SIGABRT:
|
||||
DEBUGOUT1("SIGABRT Interupt erhalten!\n");
|
||||
case SIGTERM:
|
||||
DEBUGOUT1("SIGTERM Interupt erhalten!\n");
|
||||
case SIGQUIT:
|
||||
DEBUGOUT1("SIGQUIT Interupt erhalten!\n");
|
||||
case SIGINT:
|
||||
DEBUGOUT1("SIGINT Interupt erhalten!\n");
|
||||
}
|
||||
#endif
|
||||
clean();
|
||||
DEBUGOUT1("Beende Programm...\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
/* Funktionen für die Logfiles */
|
||||
/* Funktionen fuer die Logfiles */
|
||||
|
||||
#ifndef NO_LOGING
|
||||
/* Schreiben einer Fehlermeldung in das fehler-Logfile */
|
||||
|
|
@ -225,7 +257,7 @@ void log_data(time_t timestamp, char *msg){
|
|||
DEBUGOUT1(" -->Data Logged \n");
|
||||
}
|
||||
|
||||
/* Logfile öffnen */
|
||||
/* Logfile oeffnen */
|
||||
static int open_logfile(char *file){
|
||||
int log_fd;
|
||||
|
||||
|
|
@ -278,11 +310,11 @@ static clean_struct_ptr get_last_clean(clean_struct_ptr ptr){
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/* Ein neues Clean-Element anfügen. Ein Clean-Element ist eine Datenstruktur, die
|
||||
/* Ein neues Clean-Element anfuegen. Ein Clean-Element ist eine Datenstruktur, die
|
||||
* einen Pointer auf eine Funktion vom Typ
|
||||
* void func(void *data),
|
||||
* einen Zeiger auf beliebige Daten und einen Zeiger auf das nächste Element hält.
|
||||
* Die Funktionen werden beim regulären beenden des Programmes aufgerufen um zum bsp.
|
||||
* einen Zeiger auf beliebige Daten und einen Zeiger auf das naechste Element haelt.
|
||||
* Die Funktionen werden beim regulaeren beenden des Programmes aufgerufen um zum bsp.
|
||||
* datenbankverbindungen zu schließen, etc. */
|
||||
void add_clean(void (*func)(void *data), void *data){
|
||||
clean_struct_ptr p, temp = (clean_struct_ptr) malloc(sizeof(clean_data));
|
||||
|
|
@ -297,8 +329,9 @@ void add_clean(void (*func)(void *data), void *data){
|
|||
}
|
||||
}
|
||||
|
||||
/* 'Säuberung' ausführen */
|
||||
/* 'Saeuberung' ausfuehren */
|
||||
static void clean(){
|
||||
DEBUGOUT1("\nRaeume auf...\n");
|
||||
clean_struct_ptr p = clean_ptr;
|
||||
while(p != NULL){
|
||||
p->func(p->data);
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
{content:addModule:rain_3}{content:addModule:temp_1}{content:addModule:temp_4}
|
||||
{content:addModule:press_1}{content:addModule:hum_1}{content:addModule:hum_4}{content:addModule:rain_3}{content:addModule:temp_1}{content:addModule:temp_4}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,23 @@
|
|||
<h3 class="mod_headline">Luftfeuchtigkeit - {content:fill:sens_location}</h3>
|
||||
<p class="mod_description">{content:fill:sens_description}</p>
|
||||
<h4 class="mod_subhead">Momentane Werte</h4>
|
||||
<table class="mod_hum_now_data">
|
||||
<tr class="mod_hum_current_row">
|
||||
<td class="mod_line_desc">Momentan:</td><td class="mod_line_val">{content:fill:hum_now_val}%</td><td class="mod_line_date">{content:fill:hum_now_date}</td>
|
||||
</tr>
|
||||
<tr class="mod_hum_average_row">
|
||||
<td class="mod_line_desc">Durchschnitt ({content:fill:hum_av_interval} min.):</td><td class="mod_line_val">{content:fill:hum_av_value}%</td><td> </td>
|
||||
</tr>
|
||||
<tr class="mod_hum_moving_row">
|
||||
<td class="mod_line_desc">Tendenz (2 std.):</td><td class="mod_line_val">{content:fill:hum_changing}</td><td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
<h4 class="mod_subhead">Extrema</h4>
|
||||
<table>
|
||||
<tr class="mod_hum_max_row">
|
||||
<td class="mod_line_desc">Max:</td><td class="mod_line_val">{content:fill:hum_max_val}%</td><td class="mod_line_date">{content:fill:hum_max_date}</td>
|
||||
</tr>
|
||||
<tr class="mod_hum_min_row">
|
||||
<td class="mod_line_desc">Min:</td><td class="mod_line_val">{content:fill:hum_min_val}%</td><td class="mod_line_date">{content:fill:hum_min_date}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
<h3 class="mod_headline">Luftdruck - {content:fill:sens_location}</h3>
|
||||
<p class="mod_description">{content:fill:sens_description}</p>
|
||||
<h4 class="mod_subhead">Momentane Werte</h4>
|
||||
<table class="mod_press_now_data">
|
||||
<tr class="mod_press_current_row">
|
||||
<td class="mod_line_desc">Momentan:</td><td class="mod_line_val">{content:fill:press_now_val} hPa</td><td class="mod_line_date">{content:fill:press_now_date}</td>
|
||||
</tr>
|
||||
<tr class="mod_press_average_row">
|
||||
<td class="mod_line_desc">Durchschnitt ({content:fill:press_av_interval} min.):</td><td class="mod_line_val">{content:fill:press_av_value} hPa</td><td> </td>
|
||||
</tr>
|
||||
<tr class="mod_press_moving_row">
|
||||
<td class="mod_line_desc">Tendenz (2 std.):</td><td class="mod_line_val">{content:fill:press_changing}</td><td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
<h4 class="mod_subhead">Extrema</h4>
|
||||
<table>
|
||||
<tr class="mod_press_max_row">
|
||||
<td class="mod_line_desc">Max:</td><td class="mod_line_val">{content:fill:press_max_val} hPa</td><td class="mod_line_date">{content:fill:press_max_date}</td>
|
||||
</tr>
|
||||
<tr class="mod_press_min_row">
|
||||
<td class="mod_line_desc">Min:</td><td class="mod_line_val">{content:fill:press_min_val} hPa</td><td class="mod_line_date">{content:fill:press_min_date}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
@ -1,8 +1,10 @@
|
|||
<?
|
||||
include_once("php_inc/parser.inc.php"); /* Parser */
|
||||
include_once("php_inc/sensor.inc.php"); /* Sensor-Klasse */
|
||||
include_once("php_inc/temp.inc.php"); /* Temp-Klasse */
|
||||
include_once("php_inc/rain.inc.php"); /* Rain-Klasse */
|
||||
include_once("php_inc/parser.inc.php"); /* Parser */
|
||||
include_once("php_inc/modules/sensor.inc.php"); /* Sensor-Klasse */
|
||||
include_once("php_inc/modules/temp.inc.php"); /* Temp-Klasse */
|
||||
include_once("php_inc/modules/rain.inc.php"); /* Rain-Klasse */
|
||||
include_once("php_inc/modules/hum.inc.php"); /* Hum-Klasse */
|
||||
include_once("php_inc/modules/press.inc.php"); /* Press-Klasse */
|
||||
|
||||
/* Representiert ein Modul */
|
||||
class Module{
|
||||
|
|
@ -14,6 +16,7 @@ class Module{
|
|||
var $sensInstance = NULL; /* Sensor-Instanz */
|
||||
var $tempInstance = NULL; /* Temp-Instanz */
|
||||
var $rainInstance = NULL; /* Rain-Instanz */
|
||||
var $humInstance = NULL; /* Hum-Instanz */
|
||||
|
||||
/* Konstruktor */
|
||||
function Module($modName, $sensId, &$parser, &$connection){
|
||||
|
|
@ -54,6 +57,20 @@ class Module{
|
|||
return $this->rainInstance;
|
||||
}
|
||||
|
||||
/* Instanz der Hum-Klasse holen */
|
||||
function &_get_hum(){
|
||||
if($this->humInstance == NULL)
|
||||
$this->humInstance = new Hum($this->sensId, $this->connection);
|
||||
return $this->humInstance;
|
||||
}
|
||||
|
||||
/* Instanz der Press-Klasse holen */
|
||||
function &_get_press(){
|
||||
if($this->pressInstance == NULL)
|
||||
$this->pressInstance = new Press($this->sensId, $this->connection);
|
||||
return $this->pressInstance;
|
||||
}
|
||||
|
||||
/* Callback-Funktion, wird ausgeführt wenn {content:fill:xyz} gefunden wird */
|
||||
function fill($contentId){
|
||||
$content_split = explode("_", $contentId); /* Modultyp bekommen */
|
||||
|
|
|
|||
|
|
@ -0,0 +1,130 @@
|
|||
<?
|
||||
/* Hum-Klasse, Holt Werte zur Luftfeuchtigkeit */
|
||||
class Hum{
|
||||
|
||||
var $nowHum; /* Momentane Luftfeuchtigkeit */
|
||||
var $nowDate; /* datum des letzten Messvorgangs */
|
||||
var $avVal; /* Durchschnittswert */
|
||||
var $avInter; /* Interval des Durchschnittswertes */
|
||||
var $minHum; /* Minimale Luftfeuchtigkeit */
|
||||
var $minDate; /* Datum, wann die Minimale Luftfeuchtigkeit gemessen wurde */
|
||||
var $maxHum; /* Maximale Luftfeuchtigkeit */
|
||||
var $maxDate; /* Datum, wann die Max. Luftfeuchtigkeit. gemessen wurde */
|
||||
var $changing; /* Tendenz */
|
||||
|
||||
/* Konstruktor */
|
||||
function Hum($sensId, & $connection){
|
||||
$this->_fetchHumData($sensId, &$connection);
|
||||
}
|
||||
|
||||
/* Funktion, die die Klasse mit den Weten initialisiert */
|
||||
function _fetchHumData($sensId, &$connection){
|
||||
|
||||
/* Tabelle des Sensors bestimmen */
|
||||
$tableQuery = "SELECT tabelle FROM sensoren, typen WHERE sensoren.id=".$sensId." AND typen.typ = sensoren.typ";
|
||||
$table = $connection->fetchQueryResultLine($tableQuery);
|
||||
|
||||
/* Aktuelle Luftfeuchtigkeit bestimmen */
|
||||
$nowQuery = "SELECT hum, to_char(timestamp, 'DD.MM.YYYY HH24:MI') as timestamp FROM ".$table['tabelle']." WHERE timestamp=(select max(timestamp) from ".$table['tabelle']." where sens_id=".$sensId.")";
|
||||
$nowData = $connection->fetchQueryResultLine($nowQuery);
|
||||
|
||||
/* Max und Min-Werte bestimmen */
|
||||
$maxQuery = "SELECT hum, to_char(timestamp, 'DD.MM.YYYY HH24:MI') as timestamp FROM ".$table['tabelle']." WHERE sens_id=".$sensId." AND hum=(SELECT max(hum) FROM ".$table['tabelle']." WHERE sens_id=".$sensId.")";
|
||||
$maxData = $connection->fetchQueryResultLine($maxQuery);
|
||||
$minQuery = "SELECT hum, to_char(timestamp, 'DD.MM.YYYY HH24:MI') as timestamp FROM ".$table['tabelle']." WHERE sens_id=".$sensId." AND hum=(SELECT min(hum) FROM ".$table['tabelle']." WHERE sens_id=".$sensId.")";
|
||||
$minData = $connection->fetchQueryResultLine($minQuery);
|
||||
|
||||
/* Bestimmte Werte den Klassenvariablen zuordnen */
|
||||
$this->nowHum = $nowData['hum'];
|
||||
$this->nowDate = $nowData['timestamp'];
|
||||
$this->maxHum = $maxData['hum'];
|
||||
$this->maxDate = $maxData['timestamp'];
|
||||
$this->minHum = $minData['hum'];
|
||||
$this->minDate = $minData['timestamp'];
|
||||
|
||||
/* Durchschnittswert bestimmen lassen */
|
||||
$this->_fetchAverage($sensId, $table['tabelle'], &$connection);
|
||||
|
||||
/* Tendenz bestimmen lassen */
|
||||
$this->_fetchMoving($sensId, $table['tabelle'], &$connection);
|
||||
}
|
||||
|
||||
/* liefert den Durchschnittswert in einem bestimmtem Interval */
|
||||
function _getAverage($sensId, $table, &$connection, $interval){
|
||||
$avQuery = "SELECT (sum(hum)/count(hum)) as average, count(hum) as count FROM ".$table." WHERE sens_id=".$sensId." AND timestamp>(current_timestamp - INTERVAL '".$interval."')";
|
||||
$avData = $connection->fetchQueryResultLine($avQuery);
|
||||
return $avData;
|
||||
}
|
||||
|
||||
/* momentanen Durchschnittswert bestimmen */
|
||||
function _fetchAverage($sensId, $table, &$connection){
|
||||
$avData = array('average'=>0, 'count'=>0); /* Array initialisieren */
|
||||
$i = 3; /* Laufvariable */
|
||||
while($avData['count']<5){ /* Schleife prüft, in welchem Interval 5 Werte zusammenkommen */
|
||||
$avData = $this->_getAverage($sensId, $table, &$connection, ($i*10)." minutes"); /* Holt Werte mit gegebenem Interval */
|
||||
$i++; /* Laufvariable erhöhen */
|
||||
}
|
||||
|
||||
/* Werte den Klassenvariablen zuordnen */
|
||||
$this->avVal = $avData['average'];
|
||||
$this->avInter = $i*10;
|
||||
}
|
||||
|
||||
/* Bestimmt die Tendenz */
|
||||
function _fetchMoving($sensId, $table, &$connection){
|
||||
$shortAvData = $this->_getAverage($sensId, $table, &$connection, "15 minutes"); /* Durchschnitt der letzten 15 minuten */
|
||||
$longAvData = $this->_getAverage($sensId, $table, &$connection, "120 minutes"); /* 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 möglich"; /* Dann ausgeben, dass momentan nichts berechnet werden kann */
|
||||
return; /* und aus der Funktion huepfen */
|
||||
}
|
||||
$changing = $shortAvData['average'] - $longAvData['average']; /* Aenderung berechnen */
|
||||
if($changing > 0){ /* Wenn Aenderung positiv */
|
||||
$this->changing = "steigend (+ ".abs($changing * 0.1)."%)"; /* dann steigende Tendenz ausgeben */
|
||||
} elseif($changing < 0) { /* wenn Negativ */
|
||||
$this->changing = "fallend (- ".abs($changing * 0.1)."%)"; /* Fallende Tendenz ausgeben */
|
||||
} else { /* an sonsten */
|
||||
$this->changing = "gleichbleibend (± 0%)"; /* sagen, das es gleich geblieben ist */
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* --- Funktionen, die aufgerufen werden um die geholeten Werte auszugeben --- */
|
||||
function get_now_val(){
|
||||
return $this->nowHum;
|
||||
}
|
||||
|
||||
function get_now_date(){
|
||||
return $this->nowDate;
|
||||
}
|
||||
|
||||
function get_av_value(){
|
||||
return $this->avVal;
|
||||
}
|
||||
|
||||
function get_av_interval(){
|
||||
return $this->avInter;
|
||||
}
|
||||
|
||||
function get_changing(){
|
||||
return $this->changing;
|
||||
}
|
||||
|
||||
function get_max_val(){
|
||||
return $this->maxHum;
|
||||
}
|
||||
|
||||
function get_max_date(){
|
||||
return $this->maxDate;
|
||||
}
|
||||
|
||||
function get_min_val(){
|
||||
return $this->minHum;
|
||||
}
|
||||
|
||||
function get_min_date(){
|
||||
return $this->minDate;
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
|
|
@ -0,0 +1,129 @@
|
|||
<?
|
||||
class Press{
|
||||
|
||||
var $nowPress; /* Momentaner Luftdruck */
|
||||
var $nowDate; /* datum des letzten Messvorgangs */
|
||||
var $avVal; /* Durchschnittswert */
|
||||
var $avInter; /* Interval des Durchschnittswertes */
|
||||
var $minPress; /* Minimaler Luftdruck */
|
||||
var $minDate; /* Datum, wann der Minimale Luftdruck gemessen wurde */
|
||||
var $maxPress; /* Maximale Luftdruck */
|
||||
var $maxDate; /* Datum, wann der Max. Luftdruck gemessen wurde */
|
||||
var $changing; /* Tendenz */
|
||||
|
||||
/* Konstruktor */
|
||||
function Press($sensId, & $connection){
|
||||
$this->_fetchPressData($sensId, &$connection);
|
||||
}
|
||||
|
||||
/* Funktion, die die Klasse mit den Weten initialisiert */
|
||||
function _fetchPressData($sensId, &$connection){
|
||||
|
||||
/* Tabelle des Sensors bestimmen */
|
||||
$tableQuery = "SELECT tabelle FROM sensoren, typen WHERE sensoren.id=".$sensId." AND typen.typ = sensoren.typ";
|
||||
$table = $connection->fetchQueryResultLine($tableQuery);
|
||||
|
||||
/* Aktuelle Luftdruck bestimmen */
|
||||
$nowQuery = "SELECT press, to_char(timestamp, 'DD.MM.YYYY HH24:MI') as timestamp FROM ".$table['tabelle']." WHERE timestamp=(select max(timestamp) from ".$table['tabelle']." where sens_id=".$sensId.")";
|
||||
$nowData = $connection->fetchQueryResultLine($nowQuery);
|
||||
|
||||
/* Max und Min-Werte bestimmen */
|
||||
$maxQuery = "SELECT press, to_char(timestamp, 'DD.MM.YYYY HH24:MI') as timestamp FROM ".$table['tabelle']." WHERE sens_id=".$sensId." AND press=(SELECT max(press) FROM ".$table['tabelle']." WHERE sens_id=".$sensId.")";
|
||||
$maxData = $connection->fetchQueryResultLine($maxQuery);
|
||||
$minQuery = "SELECT press, to_char(timestamp, 'DD.MM.YYYY HH24:MI') as timestamp FROM ".$table['tabelle']." WHERE sens_id=".$sensId." AND press=(SELECT min(press) FROM ".$table['tabelle']." WHERE sens_id=".$sensId.")";
|
||||
$minData = $connection->fetchQueryResultLine($minQuery);
|
||||
|
||||
/* Bestimmte Werte den Klassenvariablen zuordnen */
|
||||
$this->nowPress = $nowData['press'];
|
||||
$this->nowDate = $nowData['timestamp'];
|
||||
$this->maxPress = $maxData['press'];
|
||||
$this->maxDate = $maxData['timestamp'];
|
||||
$this->minPress = $minData['press'];
|
||||
$this->minDate = $minData['timestamp'];
|
||||
|
||||
/* Durchschnittswert bestimmen lassen */
|
||||
$this->_fetchAverage($sensId, $table['tabelle'], &$connection);
|
||||
|
||||
/* Tendenz bestimmen lassen */
|
||||
$this->_fetchMoving($sensId, $table['tabelle'], &$connection);
|
||||
}
|
||||
|
||||
/* liefert den Durchschnittswert in einem bestimmtem Interval */
|
||||
function _getAverage($sensId, $table, &$connection, $interval){
|
||||
$avQuery = "SELECT (sum(press)/count(press)) as average, count(press) as count FROM ".$table." WHERE sens_id=".$sensId." AND timestamp>(current_timestamp - INTERVAL '".$interval."')";
|
||||
$avData = $connection->fetchQueryResultLine($avQuery);
|
||||
return $avData;
|
||||
}
|
||||
|
||||
/* momentanen Durchschnittswert bestimmen */
|
||||
function _fetchAverage($sensId, $table, &$connection){
|
||||
$avData = array('average'=>0, 'count'=>0); /* Array initialisieren */
|
||||
$i = 3; /* Laufvariable */
|
||||
while($avData['count']<5){ /* Schleife prüft, in welchem Interval 5 Werte zusammenkommen */
|
||||
$avData = $this->_getAverage($sensId, $table, &$connection, ($i*10)." minutes"); /* Holt Werte mit gegebenem Interval */
|
||||
$i++; /* Laufvariable erhöhen */
|
||||
}
|
||||
|
||||
/* Werte den Klassenvariablen zuordnen */
|
||||
$this->avVal = $avData['average'];
|
||||
$this->avInter = $i*10;
|
||||
}
|
||||
|
||||
/* Bestimmt die Tendenz */
|
||||
function _fetchMoving($sensId, $table, &$connection){
|
||||
$shortAvData = $this->_getAverage($sensId, $table, &$connection, "15 minutes"); /* Durchschnitt der letzten 15 minuten */
|
||||
$longAvData = $this->_getAverage($sensId, $table, &$connection, "120 minutes"); /* 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 möglich"; /* Dann ausgeben, dass momentan nichts berechnet werden kann */
|
||||
return; /* und aus der Funktion huepfen */
|
||||
}
|
||||
$changing = $shortAvData['average'] - $longAvData['average']; /* Aenderung berechnen */
|
||||
if($changing > 0){ /* Wenn Aenderung positiv */
|
||||
$this->changing = "steigend (+ ".abs($changing * 0.1)." hPa)"; /* dann steigende Tendenz ausgeben */
|
||||
} elseif($changing < 0) { /* wenn Negativ */
|
||||
$this->changing = "fallend (- ".abs($changing * 0.1)." hPa)"; /* Fallende Tendenz ausgeben */
|
||||
} else { /* an sonsten */
|
||||
$this->changing = "gleichbleibend (± 0 hPa)"; /* sagen, das es gleich geblieben ist */
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* --- Funktionen, die aufgerufen werden um die geholeten Werte auszugeben --- */
|
||||
function get_now_val(){
|
||||
return $this->nowPress;
|
||||
}
|
||||
|
||||
function get_now_date(){
|
||||
return $this->nowDate;
|
||||
}
|
||||
|
||||
function get_av_value(){
|
||||
return $this->avVal;
|
||||
}
|
||||
|
||||
function get_av_interval(){
|
||||
return $this->avInter;
|
||||
}
|
||||
|
||||
function get_changing(){
|
||||
return $this->changing;
|
||||
}
|
||||
|
||||
function get_max_val(){
|
||||
return $this->maxPress;
|
||||
}
|
||||
|
||||
function get_max_date(){
|
||||
return $this->maxDate;
|
||||
}
|
||||
|
||||
function get_min_val(){
|
||||
return $this->minPress * 0.1;
|
||||
}
|
||||
|
||||
function get_min_date(){
|
||||
return $this->minDate;
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
Loading…
Reference in New Issue