Warning aus dem Chart-Widget

Begonnen von Wolfgang Hochweller, 27 Juni 2018, 19:06:50

Vorheriges Thema - Nächstes Thema

Wolfgang Hochweller

Diese Warning kommt aus dem LogProxy fuer ProPlanta:


2018.06.27 18:55:57 1: PERL WARNING: Argument "https://www.proplanta.de/wetterdaten/images/symbole/t4.g..." isn't numeric in numeric lt (<) at ./FHEM/99_myUtils.pm line 195.
2018.06.27 18:55:57 1: PERL WARNING: Argument "https://www.proplanta.de/wetterdaten/images/symbole/t6.g..." isn't numeric in numeric lt (<) at ./FHEM/99_myUtils.pm line 195.
2018.06.27 18:55:57 1: PERL WARNING: Argument "https://www.proplanta.de/wetterdaten/images/symbole/t8.g..." isn't numeric in numeric lt (<) at ./FHEM/99_myUtils.pm line 195.



Das hat sicher etwas mit den Icons zu tun, die ich im Chart anzeige.

LogProxy-Code



#---------------------------------------
# Proplanta LogProxy-Funktion
#---------------------------------------
sub logProxy_proplanta2Plot($$$$;$$) {
my ($device, $fcValue, $from, $to, $fcHour, $expMode) = @_;
    my $regex;
    my @rl;
   
return undef if(!$device);
   
    if($fcValue =~ s/_$//) {
        $regex = "^fc[\\d]+_".$fcValue."[\\d]{2}\$";
    }
    else {
        $regex = "^fc[\\d]+_".$fcValue."\$";
    }
   
    $fcHour = 12 if(!defined $fcHour);
    $expMode = "point" if(!defined $expMode);

if( defined($defs{$device}) ) {
if( $defs{$device}{TYPE} eq "PROPLANTA" ) {
            @rl = sort{
                my ($an) = ($a =~ m/fc(\d+)_.*/);
                my ($bn) = ($b =~ m/fc(\d+)_.*/);
                $an <=> $bn or $a cmp $b;
                }( grep /${regex}/,keys %{$defs{$device}{READINGS}} );
return undef if( !@rl );
} else {
Log3 undef, 2, "logProxy_proplanta2Plot: $device is not a PROPLANTA device";
return undef;
}
}

my $fromsec = SVG_time_to_sec($from);
my $tosec   = SVG_time_to_sec($to);
my $sec = $fromsec;
my ($h,$fcDay,$mday,$mon,$year);
my $timestamp;
   
my $reading;
my $value;
my $prev_value;
my $min = 999999;
my $max = -999999;
my $ret = "";

# while not end of plot range reached
while(($sec < $tosec) && @rl) {
#remember previous value for start of plot range
$prev_value = $value;

$reading = shift @rl;
        ($fcDay) = $reading =~ m/^fc(\d+).*/;
    $h = ($reading =~ m/.*(\d\d)$/)?$1:$fcHour;
$value = ReadingsVal($device,$reading,undef);
       
($mday,$mon,$year) = split('\.',ReadingsVal($device,"fc".$fcDay."_date",undef));
$timestamp = sprintf("%04d-%02d-%02d_%02d:%02d:%02d", $year, $mon, $mday, $h, 0, 0);
$sec = SVG_time_to_sec($timestamp);
       
# skip all values before start of plot range
next if( SVG_time_to_sec($timestamp) < $fromsec );

# add first value at start of plot range
if( !$ret && $prev_value ) {
$min = $prev_value if( $prev_value < $min );
$max = $prev_value if( $prev_value > $max );
$ret .= "$from $prev_value\n";
}

# done if after end of plot range
last if($sec > $tosec);
####
#####
####     Zeile 97

#####
$min = $value if( $value < $min );
$max = $value if( $value > $max );

# add actual controll point
$ret .= "$timestamp $value\n";

# Log 1, "$timestamp $value -0- $reading";
}
    if(($sec < $tosec) && !@rl && ($expMode eq "day")) {
    $timestamp = sprintf("%04d-%02d-%02d_%02d:%02d:%02d", $year, $mon, $mday, 23, 59, 59);
    if(SVG_time_to_sec($timestamp) < $tosec) {
        $ret .= "$timestamp $value\n";
        }
        else {
$ret .= "$to $value\n";
        }
    }
    elsif(($sec > $tosec) && ($expMode eq "day")) {
        $value = $prev_value + ($value - $prev_value)*(86400 + ($tosec - $sec))/86400;
        $ret .= "$to $value\n";
    }
return ($ret,$min,$max,$prev_value);
}




Die entsprechende Zeile ist oben markiert.
Es scheint aber trotzdem alles zu funktionieren.

eki

#1
Das kommt tatsächlich dann vor, wenn die Readings, die Du aus dem PROPLANTA Device holst nicht numerisch sind. Für die Plots im FTUI Chart Widget hat das keine Auswirkung, da in diesem Fall die berechneten min und max Werte gar nicht verwendet werden (für die Plots in FHEM eventuell schon).

Wenn Dich die Fehlermeldungen stören, dann kannst Du folgende Änderungen machen:

$min = $prev_value if( $prev_value < $min ); ändern zu $min = $prev_value if( (looks_like_number($prev_value) && ($prev_value < $min))  || ($value lt $min) );
$max = $prev_value if( $prev_value > $max ); ändern zu $max = $prev_value if( (looks_like_number($prev_value) && ($prev_value > $max))  || ($value gt $max) );
$min = $value if( $value < $min ); ändern zu $min = $value if( (looks_like_number($value) && ($value < $min ))  || ($value lt $min) );
$max = $value if( $value > $max ); ändern zu $max = $value if( (looks_like_number($value) && ($value > $max )) || ($value gt $max) );

Das Ergebnis in den Fällen nichtnumerischer Readings ist dann zwar immer noch Quatsch, aber es kommt keine Fehlermeldung mehr (Plotergebnis bei FTUI Chart Widget ist davon wie gesagt eh nicht beeinflusst).

Wolfgang Hochweller

Danke.
Die Fehlermeldungen stoeren dann nicht wirklich, wollte nur darauf hinweisen.
Nicht , dass sich noch etwas anderes dahinter verbirgt.