fhem instanz stürzt ab bei Aufruf eines Plot über logProxy

Begonnen von pte, 16 April 2021, 21:03:08

Vorheriges Thema - Nächstes Thema

pte

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

Lichtenstein/Sa. grüßt den Rest der Welt

pte

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
Lichtenstein/Sa. grüßt den Rest der Welt