Hallo zusammen,ich habe das Problem, dass mein fhem abstürzt, wenn ich einen Plot aufrufe, welcher logProxy nutzt und die zugrundeliegende MySQL-Datenbank zu diesem Zeitpunkt nicht erreichbar ist (z.B. wegen Datensicherung der Datenbank).Als Fehler im log wird folgendes gelistet:Can't use string ("") as a SCALAR ref while "strict refs" in use at ./FHEM/98_logProxy.pm line 538.
Kann man den Fehler irgendwie abfangen?
Gruß Peter
Für alle, die es interessiert.
Ich habe es so gelöst:
Ergänzung in 98_logProxy. Prüfung, ob meine DbLog-Instanz connectionstate=ok hat. Wenn nicht, bleibt der Plot leer.
sub
logProxy_Get($@)
{
my ($hash, $name, @a) = @_;
#Log 3, "logProxy_Get";
#Log 3, Dumper @a;
my $inf = shift @a;
my $outf = shift @a;
my $from = shift @a;
my $to = shift @a; # Now @a contains the list of column_specs
my $internal;
if($outf && $outf eq "INT") {
$outf = "-";
$internal = 1;
}
my $ret = "";
my %data;
for(my $i = 0; $i < int(@a); $i++) {
my $j = $i+1;
$data{"min$j"} = undef;
$data{"max$j"} = undef;
$data{"avg$j"} = undef;
$data{"sum$j"} = 0;
$data{"cnt$j"} = undef;
$data{"currval$j"} = 0;
$data{"currdate$j"} = undef;
$data{"mindate$j"} = undef;
$data{"maxdate$j"} = undef;
$data{"xmin$j"} = undef;
$data{"xmax$j"} = undef;
my @fld = split(":", $a[$i]);
if( $a[$i] =~ m/^(FileLog|DbLog):([^:]*):(.*)/ ) {
my @options = split( ',', $fld[1] );
my $log_dev = shift(@options);
my $infile = $fld[0] eq "DbLog" ? "HISTORY" : "CURRENT";
my $column_specs = $3;
my $extend;
my $extend_scale;
my $offset;
my $offset_scale;
my $interpolate;
my $clip;
my $predict;
my $postFn;
my $scale2reading;
if( !defined($defs{$log_dev}) ) {
Log3 $hash->{NAME}, 1, "$hash->{NAME}: $log_dev does not exist";
$ret .= "#$a[$i]\n";
next;
}
###################################################################################################
#pte check if LogDevice is connected when LogDevice is DbLog
if (($fld[0] eq "DbLog") && ($defs{$log_dev}{READINGS}{connectionstate}{VAL} ne "ok"))
{ Log3 $hash->{NAME}, 1, "$hash->{NAME}: $log_dev not connected, STATE=$defs{$log_dev}{READINGS}{connectionstate}{VAL}";
$ret .= "#$a[$i]\n";
next;
}
###################################################################################################
while (@options) {
my $option = shift(@options);
Damit kann ich auch über
set <logdevice> reopen 600
Shutdowns der Datenbank manuell oder zeitgesteuert für das logProxy schadlos stellen.
Falls die Idee für gut befunden wird, könnte sie ja in den Standard wandern.
Gruß Peter