diff --git a/fhem/FHEM/93_DbLog.pm b/fhem/FHEM/93_DbLog.pm index b79ab145c..6e79e16a6 100644 --- a/fhem/FHEM/93_DbLog.pm +++ b/fhem/FHEM/93_DbLog.pm @@ -98,9 +98,9 @@ DbLog_Attr(@) # ################################################################ sub -DbLog_ParseEvent($$) +DbLog_ParseEvent($$$) { - my ($type, $event)= @_; + my ($device, $type, $event)= @_; my @result; # split the event into reading and argument @@ -124,8 +124,13 @@ DbLog_ParseEvent($$) elsif(($type eq "OWAD") || ($type eq "OWSWITCH") || ($type eq "OWMULTI")) { - $reading = "data"; - $value = $event; + if(int(@parts)>1) { + $reading = "data"; + $value = $event; + } else { + @parts = split(/\|/, AttrVal($device, $reading."Unit", "")); + $unit = $parts[1] if($parts[1]); + } } # FS20 elsif(($type eq "FS20") || @@ -283,11 +288,13 @@ DbLog_ParseEvent($$) } } - # DUMMY + # DUMMY elsif($type eq "DUMMY") { - $reading= "data"; - $value= $event; - $unit= ""; + if( $value eq "" ) { + $reading= "data"; + $value= $event; + } + $unit= ""; } @result= ($reading,$value,$unit); @@ -342,7 +349,7 @@ DbLog_Log($$) $ts = $dev->{CHANGETIME}[$i] if(defined($dev->{CHANGETIME}[$i])); # $ts is in SQL format YYYY-MM-DD hh:mm:ss - my @r= DbLog_ParseEvent($t, $s); + my @r= DbLog_ParseEvent($n, $t, $s); my $reading= $r[0]; my $value= $r[1]; my $unit= $r[2]; @@ -676,11 +683,16 @@ DbLog_Get($@) $out_tstamp = ""; ############ Auswerten des 5. Parameters: Regexp ################### + # die Regexep wird vor der Function ausgewertet und der Wert im Feld + # Value angepasst. + #################################################################### if($readings[$i]->[4] && $readings[$i]->[4]) { #evaluate my $val = $sql_value; + my $ts = $sql_timestamp; eval("$readings[$i]->[4]"); $sql_value = $val; + $sql_timestamp = $ts; if($@) {Log 3, "DbLog: Error in inline function: <".$readings[$i]->[4].">, Error: $@";} $out_tstamp = $sql_timestamp; $writeout=1; @@ -694,11 +706,24 @@ DbLog_Get($@) $writeout=1; } elsif ($readings[$i]->[3] && $readings[$i]->[3] =~ m/^int(\d+).*/o) { - #Übernehme den Dezimalwert mit den angegebenen Stellen an Nachkommastellen + #Uebernehme den Dezimalwert mit den angegebenen Stellen an Nachkommastellen $out_value = $1 if($sql_value =~ m/^([-\.\d]+).*/o); $out_tstamp = $sql_timestamp; $writeout=1; + } elsif ($readings[$i]->[3] && $readings[$i]->[3] eq "delta-ts" && lc($sql_value) !~ m(ignore)) { + #Berechung der vergangen Sekunden seit dem letten Logeintrag + #zb. die Zeit zwischen on/off + my @a = split("[- :]", $sql_timestamp); + my $akt_ts = mktime($a[5],$a[4],$a[3],$a[2],$a[1]-1,$a[0]-1900,0,0,-1); + if($lastd[$i] ne "undef") { + @a = split("[- :]", $lastd[$i]); + } + my $last_ts = mktime($a[5],$a[4],$a[3],$a[2],$a[1]-1,$a[0]-1900,0,0,-1); + $out_tstamp = $sql_timestamp; + $out_value = sprintf("%02d", $akt_ts - $last_ts); + if(lc($sql_value) =~ m(hide)){$writeout=0;} else {$writeout=1;} + } elsif ($readings[$i]->[3] && $readings[$i]->[3] eq "delta-h") { #Berechnung eines Stundenwertes %tstamp = DbLog_explode_datetime($sql_timestamp, ()); @@ -1226,14 +1251,23 @@ sub chartQuery($@) { Return the delta of the values for a given hour or a given day. Used if the column contains a counter, as is the case for the KS300 rain column. +
get myDbLog - - 2012-11-10 2012-11-20 Bodenfeuchte:data:::$val=~s/.*B:\s([-\.\d]+).*/$1/eg
"A: 49.527 % B: 66.647 % C: 9.797 % D: 0.097 V"
2012-11-20_10:23:54 66.647
get DbLog - - 2013-05-26 2013-05-28 Pumpe:data::delta-ts:$val=~s/on/hide/
get myDbLog - - 2012-11-10 2012-11-20 Bodenfeuchte:data:::$val=~s/.*B:\s([-\.\d]+).*/$1/eg
"A: 49.527 % B: 66.647 % C: 9.797 % D: 0.097 V"
2012-11-20_10:23:54 66.647
get DbLog - - 2013-05-26 2013-05-28 Pumpe:data::delta-ts:$val=~s/on/hide/