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