Servus,
ich mal wieder ^^
Ich bin jetzt vom Filelog auf DB Log umgestiegen und habe ein Problem mit dem Loggen vom "
mode" des Thermostat
In der Datenbank wird beim entsprechenden Eintrag vom Mode bei
VALUE kein Wert eingetragen, bei
EVENT steht es aber schon drin im Format
mode: autoTemperatur und Ventilstellung werden richtig geloggt.
In der fhem.cfg habe ich momentan noch das Logging für alles aktiviert: (Ja das wird noch Optimiert, damit wollte ich gerade anfangen als mir das aufgefallen ist)
define logdb DbLog ./db.conf .*:.*und als Attribute noch
DbLogExclude unter global
Das gplot File (was ich aus dem alten FileLog angepasst habe) dazu schaut so aus falls das ne Rolle spielt (sollte es aber ja eigentlich nicht beim loggen)
# Created by FHEM/98_SVG.pm, 2015-12-07 14:10:07
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<TL> <L1>'
set ytics
set y2tics ("100%" 100, "50%" 50, "0%" 0, "Auto" 20, "Manu" 10)
set grid ytics y2tics
set ylabel "Temperatur °C"
set y2label "Ventil / Mode"
set yrange [5:40]
set y2range [-0.2:110]
#logdb Heizung.Arbeitszimmer:temperature
#logdb Heizung.Arbeitszimmer:valveposition
#logdb Heizung.Arbeitszimmer:mode:::$val=($val=~'auto'?20:10)
plot "<IN>" using 1:2 axes x1y1 title 'Temperatur' ls l1fill lw 0.2 with lines,\
"<IN>" using 1:2 axes x1y2 title 'Ventilstellung' ls l3 lw 3 with lines,\
"<IN>" using 1:2 axes x1y2 title 'Mode' ls l0 lw 3 with lines
Ich habe jetzt erst mal die Zeile
Zitat#logdb Heizung.Arbeitszimmer:mode:::$val=($val=~'auto'?20:10)
einfach "umgedreht" um den Plot wieder richtig zu haben
#logdb Heizung.Arbeitszimmer:mode:::$val=($val=~'manual'?10:20)
aber ändert ja nichts dran das auto nicht in der DB geloggt wird
Da es hier keine Antwort gab, und ich gut 1Jahr später das gleiche Verhalten festgestellt habe, wollte ich mal fragen, ob und wenn wo es dazu Info's gibt ?
Ähnliches habe ich auch festgestellt. Zusätzlich gibt es Werte, wo der eigentliche "value" in die Units-Spalte verschoben wird.
Da ich in SQL besser bin als in Perl, habe ich mir in MySQL eine StoredProcedure gemacht, die es direkt am SQL-Server korrigiert.
Funktioniert, sollte abe rnicht die Standardlösung sein...
Hallo,
da auf meine Frage sonst niemand geantwortet hat spiele ich mal Alleinunterhalter...
Die Ursache sehe ich in inkompatiblen Log Einträgen, also außerhalb der eigentlichen DB Logging Funktionalität.
Im Modul 10_MAX.pm werden die Log Einträge aufbereitet. Das nützt natürlich nichts, wenn schon der Input ungeeignet ist :(
Auch wenn das dblog nicht die richtige Stelle sein dürfte, habe ich mich trotzdem mal dran versucht, zumindest die wesentlichen Teile gerade zu biegen.
Das geht natürlich nicht für jede Eingabe ...
- Die geloggten Daten zu "weekprofile" passen inhaltlich normiert schon mal gar nicht in eine DB-Zeile. Da muss ein anderer Mechanismus her.
- Dann gibt es noch die "20°C 20°C" Zeilen ohne Angabe um welche Werte es sich überhaupt handelt. Habe die einfach mal zu "displayTemperature" gemacht.
- Mode liefert jetzt schön brav "manual" und "auto"
- Dann hatte ich im 3 Minuten Rythmus immer schön abwechselnd noch Events folgender Art. "desiredTemperature auto 17°C" und "desiredTemperature 17°C"
Scheint mit dem MAXScanner zusammen zu hängen.
Daraus habe ich 2 READINGS gemacht -> ""desiredTemperature auto" und "desiredTemperature".
Da die beiden abwechselnd kommen gibt das leider eine Menge überflüssiger Einträge in der DB :(
Bis vor ein paar Tagen habe ich noch nie eine Zeile perl kodiert. Man möge mir den Stil daher verzeihen ...
sub
MAX_DbLog_splitFn($)
{
my ($event) = @_;
my ($reading, $value, $unit) = "";
my @parts = split(/ /,$event);
$reading = shift @parts;
$reading =~ tr/://d;
$value = $parts[0];
if($value =~ m/°C/) {
# Temperatur ohne Führungstext, wurde also in reading gespeichert
$value = $reading;
$reading = "displayTemperature";
} else {
if($reading =~ m/desiredTemperature/) {
# desiredTemperature kann auch "auto 20°C" enthalten
# dann ist die Temperatur in parts[1]
if($value =~ m/auto/) {
$value = $parts[1];
$reading = "desiredTemperature auto";
}
}
}
$unit = "°C" if(lc($reading) =~ m/temp/);
$unit = "%" if(lc($reading) =~ m/valve/);
$unit = "dBm" if(uc($reading) =~ m/RSSI/);
return ($reading, $value, $unit);
}
Werde weiter graben ...
Gruß
Henning