- Verarbeitung für den Type WEATHER hinzugefügt (danke an Erwin)
- Fehlermeldungen auf Konsole gefixt
- Fehlerhafte Abfrage bei MySQl DBMS gefixt
- Doku auf UTF8 angepasst



git-svn-id: https://fhem.svn.sourceforge.net/svnroot/fhem/trunk/fhem@2275 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
tobiasfaust
2012-12-07 19:14:58 +00:00
parent d10176b03d
commit 9e4324c708

View File

@@ -231,6 +231,25 @@ DbLog_ParseEvent($$)
}
}
# Weather
elsif($type eq "WEATHER") {
if($event =~ m(^wind_condition)) {
@parts= split(/ /,$event); # extract wind direction from event
if(defined $parts[0]) {
$reading = "wind_direction";
$value= $parts[2];
# $unit= "";
}
}
if($reading =~ m(^wind)) { $unit= "km/h"; } # wind, wind_speed
if($reading eq "wind_chill") { $unit= "°C"; }
if($reading eq "wind_direction") { $unit= ""; }
if($reading =~ m(^temperature)) { $unit= "°C"; } # wenn reading mit temperature beginnt
if($reading =~ m(^humidity)) { $unit= "%"; }
if($reading =~ m(^pressure)) { $unit= "hPa"; }
if($reading =~ m(^pressure_trend)) { $unit= ""; }
}
@result= ($reading,$value,$unit);
return @result;
}
@@ -459,8 +478,8 @@ DbLog_Get($@)
#moegliche Formate: YYYY | YYYY-MM | YYYY-MM-DD | YYYY-MM-DD_HH24
$from =~ s/_/\ /g;
$to =~ s/_/\ /g;
%from_datetime = DbLog_explode_datetime($from, DbLog_explode_datetime("2000-01-01 00:00:00", undef));
%to_datetime = DbLog_explode_datetime($to, DbLog_explode_datetime("2099-01-01 00:00:00", undef));
%from_datetime = DbLog_explode_datetime($from, DbLog_explode_datetime("2000-01-01 00:00:00", ()));
%to_datetime = DbLog_explode_datetime($to, DbLog_explode_datetime("2099-01-01 00:00:00", ()));
$from = $from_datetime{datetime};
$to = $to_datetime{datetime};
@@ -487,26 +506,33 @@ DbLog_Get($@)
$sqlspec{get_timestamp} = "TO_CHAR(TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS')";
$sqlspec{from_timestamp} = "TO_TIMESTAMP('$from', 'YYYY-MM-DD HH24:MI:SS')";
$sqlspec{to_timestamp} = "TO_TIMESTAMP('$to', 'YYYY-MM-DD HH24:MI:SS')";
$sqlspec{reading_clause} = "(DEVICE || '|' || READING)";
} elsif ($hash->{DBMODEL} eq "ORACLE") {
$sqlspec{get_timestamp} = "TO_CHAR(TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS')";
$sqlspec{from_timestamp} = "TO_TIMESTAMP('$from', 'YYYY-MM-DD HH24:MI:SS')";
$sqlspec{to_timestamp} = "TO_TIMESTAMP('$to', 'YYYY-MM-DD HH24:MI:SS')";
$sqlspec{reading_clause} = "(DEVICE || '|' || READING)";
} elsif ($hash->{DBMODEL} eq "MYSQL") {
$sqlspec{get_timestamp} = "DATE_FORMAT(TIMESTAMP, '%Y-%m-%d %H:%i:%s')";
$sqlspec{from_timestamp} = "STR_TO_DATE('$from', '%Y-%m-%d %H:%i:%s')";
$sqlspec{to_timestamp} = "STR_TO_DATE('$to', '%Y-%m-%d %H:%i:%s')";
$sqlspec{reading_clause} = "CONCAT(DEVICE,'|',READING)"
} elsif ($hash->{DBMODEL} eq "SQLITE") {
$sqlspec{get_timestamp} = "TIMESTAMP";
$sqlspec{from_timestamp} = "'$from'";
$sqlspec{to_timestamp} = "'$to'";
$sqlspec{reading_clause} = "(DEVICE || '|' || READING)";
} else {
$sqlspec{get_timestamp} = "TIMESTAMP";
$sqlspec{from_timestamp} = "'$from'";
$sqlspec{to_timestamp} = "'$to'";
$sqlspec{reading_clause} = "(DEVICE || '|' || READING)";
}
if(uc($outf) eq "ALL") {
$sqlspec{all} = ",TYPE,EVENT,UNIT";
} else {
$sqlspec{all} = "";
}
for(my $i=0; $i<int(@readings); $i++) {
@@ -526,10 +552,10 @@ DbLog_Get($@)
DEVICE,
READING,
VALUE
".$sqlspec{all}."
$sqlspec{all}
FROM history
WHERE 1=1
AND (DEVICE || '|' || READING) = ('".$readings[$i]->[0]."|".$readings[$i]->[1]."')
AND $sqlspec{reading_clause} = ('".$readings[$i]->[0]."|".$readings[$i]->[1]."')
AND TIMESTAMP > $sqlspec{from_timestamp}
AND TIMESTAMP < $sqlspec{to_timestamp}
ORDER BY TIMESTAMP";
@@ -556,7 +582,7 @@ DbLog_Get($@)
my $val = $sql_value;
eval("$readings[$i]->[4]");
$sql_value = $val;
if($@) {Log 3, "DbLog: Fehler in der übergebenen Funktion: <".$readings[$i]->[4].">, Fehler: $@";}
if($@) {Log 3, "DbLog: Fehler in der übergebenen Funktion: <".$readings[$i]->[4].">, Fehler: $@";}
$out_tstamp = $sql_timestamp;
$writeout=1;
}
@@ -576,11 +602,11 @@ DbLog_Get($@)
} elsif ($readings[$i]->[3] eq "delta-h") {
#Berechnung eines Stundenwertes
%tstamp = DbLog_explode_datetime($sql_timestamp, undef);
%tstamp = DbLog_explode_datetime($sql_timestamp, ());
if($lastd[$i] eq "undef") {
%lasttstamp = DbLog_explode_datetime($sql_timestamp, undef);
%lasttstamp = DbLog_explode_datetime($sql_timestamp, ());
} else {
%lasttstamp = DbLog_explode_datetime($lastd[$i], undef);
%lasttstamp = DbLog_explode_datetime($lastd[$i], ());
}
if("$tstamp{hour}" ne "$lasttstamp{hour}") {
# Aenderung der stunde, Berechne Delta
@@ -592,11 +618,11 @@ DbLog_Get($@)
}
} elsif ($readings[$i]->[3] eq "delta-d") {
#Berechnung eines Tageswertes
%tstamp = DbLog_explode_datetime($sql_timestamp, undef);
%tstamp = DbLog_explode_datetime($sql_timestamp, ());
if($lastd[$i] eq "undef") {
%lasttstamp = DbLog_explode_datetime($sql_timestamp, undef);
%lasttstamp = DbLog_explode_datetime($sql_timestamp, ());
} else {
%lasttstamp = DbLog_explode_datetime($lastd[$i], undef);
%lasttstamp = DbLog_explode_datetime($lastd[$i], ());
}
if("$tstamp{day}" ne "$lasttstamp{day}") {
# Aenderung des Tages, Berechne Delta
@@ -851,13 +877,13 @@ DbLog_Get($@)
definiert in <code>&lt;configfilename&gt;</code>. (Vergleiche
Beipspielkonfigurationsdatei in <code>contrib/dblog/db.conf</code>).<br>
Die Konfiguration ist in einer sparaten Datei abgelegt um das Datenbankpasswort
nicht in Klartext in der FHEM-Haupt-Konfigurationsdatei speichern zu m<EFBFBD>ssen.
Ansonsten w<EFBFBD>re es mittels des <a href="../docs/commandref.html#list">list</a>
nicht in Klartext in der FHEM-Haupt-Konfigurationsdatei speichern zu müssen.
Ansonsten wäre es mittels des <a href="../docs/commandref.html#list">list</a>
Befehls einfach auslesbar.
<br><br>
Die Perl-Module <code>DBI</code> and <code>DBD::&lt;dbtype&gt;</code>
m<EFBFBD>ssen installiert werden (use <code>cpan -i &lt;module&gt;</code>
müssen installiert werden (use <code>cpan -i &lt;module&gt;</code>
falls die eigene Distribution diese nicht schon mitbringt).
<br><br>
@@ -866,7 +892,7 @@ DbLog_Get($@)
Ein Beispielcode zum Erstellen einer MySQL/PostGreSQL Datenbak ist in
<code>contrib/dblog/&lt;DBType&gt;_create.sql</code> zu finden.
Die Datenbank beinhaltet 2 Tabellen: <code>current</code> und
<code>history</code>. Die Tabelle <code>current</code> enth<EFBFBD>lt den letzten Stand
<code>history</code>. Die Tabelle <code>current</code> enthält den letzten Stand
pro Device und Reading. In der Tabelle <code>history</code> sind alle
Events historisch gespeichert.
@@ -884,10 +910,10 @@ DbLog_Get($@)
z.B. <code>71</code></li>
<li>UNIT: Einheit, ermittelt aus dem Event, z.B. <code>%</code></li>
</ol>
Der Wert des Rreadings ist optimiert f<EFBFBD>r eine automatisierte Nachverarbeitung
Der Wert des Rreadings ist optimiert für eine automatisierte Nachverarbeitung
z.B. <code>yes</code> ist transformiert nach <code>1</code>
<br><br>
Die gespeicherten Werte k<EFBFBD>nnen mittels GET Funktion angezeigt werden:
Die gespeicherten Werte können mittels GET Funktion angezeigt werden:
<ul>
<code>get myDbLog - - 2012-11-10 2012-11-10 KS300:temperature</code>
</ul>
@@ -910,20 +936,20 @@ DbLog_Get($@)
<code>get &lt;name&gt; &lt;infile&gt; &lt;outfile&gt; &lt;from&gt;
&lt;to&gt; &lt;column_spec&gt; </code>
<br><br>
Lie<EFBFBD>t Daten aus der Datenbank. Wird durch die Frontends benutzt um Plots
zu generieren ohne selbst auf die Datenank zugreifen zu m<EFBFBD>ssen.
Ließt Daten aus der Datenbank. Wird durch die Frontends benutzt um Plots
zu generieren ohne selbst auf die Datenank zugreifen zu müssen.
<br>
<ul>
<li>&lt;in&gt;<br>
Ein Dummy Parameter um eine Kompatibilit<EFBFBD>t zum Filelog herzustellen.
Ein Dummy Parameter um eine Kompatibilität zum Filelog herzustellen.
Dieser Parameter ist immer auf <code>-</code> zu setzen.
</li>
<li>&lt;out&gt;<br>
Ein Dummy Parameter um eine Kompatibilit<EFBFBD>t zum Filelog herzustellen.
Ein Dummy Parameter um eine Kompatibilität zum Filelog herzustellen.
Dieser Parameter ist immer auf <code>-</code> zu setzen um die
Ermittlung der Daten aus der Datenbank f<EFBFBD>r die Plotgenerierung zu pr<EFBFBD>fen.<br>
Durchd ie Angabe des Schl<EFBFBD>sselworts <code>all</code> werden alle
Ermittlung der Daten aus der Datenbank für die Plotgenerierung zu prüfen.<br>
Durchd ie Angabe des Schlüsselworts <code>all</code> werden alle
Spalten der Datenbank ausgegeben.
</li>
<li>&lt;from&gt; / &lt;to&gt;<br>
@@ -931,16 +957,16 @@ DbLog_Get($@)
Zeitformat oder ein Teilstring davon zu benutzen:<br>
<ul><code>YYYY-MM-DD_HH24:MI:SS</code></ul></li>
<li>&lt;column_spec&gt;<br>
F<EFBFBD>r jede column_spec Gruppe wird ein Datenset zur<EFBFBD>ckgegeben welches
durch einen Kommentar getrennt wird. Dieser Kommentar repr<EFBFBD>sentiert
Für jede column_spec Gruppe wird ein Datenset zurückgegeben welches
durch einen Kommentar getrennt wird. Dieser Kommentar repräsentiert
die column_spec.<br>
Syntax: &lt;device&gt;:&lt;reading&gt;:&lt;default&gt;:&lt;fn&gt;:&lt;regexp&gt;<br>
<ul>
<li>&lt;device&gt;<br>
Der Name des Devices. Achtung: Gro<EFBFBD>/Kleinschreibung beachten!</li>
Der Name des Devices. Achtung: Groß/Kleinschreibung beachten!</li>
<li>&lt;reading&gt;<br>
Das REading des angegebenen Devices zur Datenselektion.
Achtung: Gro<EFBFBD>/Kleinschreibung beachten!
Achtung: Groß/Kleinschreibung beachten!
</li>
<li>&lt;default&gt;<br>
Zur Zeit noch nicht implementiert.
@@ -950,24 +976,24 @@ DbLog_Get($@)
<ul>
<li>int<br>
Ermittelt den Zahlenwert ab dem Anfang der Zeichenkette aus der
Spalte "VALUE". Benutzt z.B. f<EFBFBD>r Auspr<EFBFBD>gungen wie 10%.
Spalte "VALUE". Benutzt z.B. für Ausprägungen wie 10%.
</li>
<li>int&lt;digit&gt;<br>
Ermittelt den Zahlenwert ab dem Anfang der Zeichenkette aus der
Spalte "VALUE", inclusive negativen Vorzeichen und Dezimaltrenner.
Benutzt z.B. f<EFBFBD>r Auspr<EFBFBD>gungen wie -5.7&deg;C.
Benutzt z.B. für Ausprägungen wie -5.7&deg;C.
</li>
<li>delta-h / delta-d<br>
Ermittelt die relative Ver<EFBFBD>nderung eines Zahlenwertes pro Stunde
oder pro Tag. Wird benutzt z.B. f<EFBFBD>r Spalten die einen
hochlaufenden Z<EFBFBD>hler enthalten wie im Falle f<EFBFBD>r ein KS300 Regenz<EFBFBD>hler
Ermittelt die relative Veränderung eines Zahlenwertes pro Stunde
oder pro Tag. Wird benutzt z.B. für Spalten die einen
hochlaufenden Zähler enthalten wie im Falle für ein KS300 Regenzähler
oder dem 1-wire Modul OWCOUNT.
</li>
</ul></li>
<li>&lt;regexp&gt;<br>
Diese Zeichenkette wird als Perl Befehl ausgewertet. $val ist der
aktuelle Wert die die Datenbank f<EFBFBD>r ein Device/Reading ausgibt.
Die regexp wird vor dem angegebenen &lt;fn&gt; Parameter ausgef<EFBFBD>hrt.
aktuelle Wert die die Datenbank für ein Device/Reading ausgibt.
Die regexp wird vor dem angegebenen &lt;fn&gt; Parameter ausgeführt.
<br>
Bitte zur Beachtung: Diese Zeichenkette darf keine Leerzeichen
enthalten da diese sonst als &lt;column_spec&gt; Trennung
@@ -985,10 +1011,10 @@ DbLog_Get($@)
<li><code>get myDbLog - all 2012-11-10 2012-11-20 KS300:temperature</code></li>
<li><code>get myDbLog - - 2012-11-10 2012-11-20 KS300:temperature KS300:rain::delta-h KS300:rain::delta-d</code></li>
<li><code>get myDbLog - - 2012-11-10 2012-11-20 MyFS20:data:::$val=~s/(on|off).*/$1eq"on"?1:0/eg</code><br>
gibt 1 zur<EFBFBD>ck f<EFBFBD>r alle Auspr<EFBFBD>gungen von on* (on|on-for-timer etc) und 0 f<EFBFBD>r alle off*</li>
gibt 1 zurück für alle Ausprägungen von on* (on|on-for-timer etc) und 0 für alle off*</li>
<li><code>get myDbLog - - 2012-11-10 2012-11-20 Bodenfeuchte:data:::$val=~s/.*B:\s([-\.\d]+).*/$1/eg</code><br>
Beispiel von OWAD: Ein Wert wie z.B.: <code>"A: 49.527 % B: 66.647 % C: 9.797 % D: 0.097 V"</code><br>
und die Ausgabe ist f<EFBFBD>r das Reading B folgende: <code>2012-11-20_10:23:54 66.647</code></li>
und die Ausgabe ist für das Reading B folgende: <code>2012-11-20_10:23:54 66.647</code></li>
</ul>
<br><br>
</ul>