Hallo,
nach stundenlangen probieren und suchen wende ich mich nun doch ans Forum. Ziel: ich möchte abhängig vom Wert (hier ca. 100 - 1150) des selbstgebauten Regensensors dessen DevStateIcon ändern. Genauer gesagt soll das DevStateIcon aus der 99_myUtils.pm bereitgestellt werden. Dazu habe ich im entsprechenden Attribut folgenden Perl-Aufruf eingetragen:
attr devStateIcon { Regensensor_Icon() }
Die Routine in der 99_myUtils.pm sieht so aus:
sub Regensensor_Icon() {
my $Rw = ReadingsVal('HM_Regensensor_Rain', 'state', undef);
my $icon = "";
if ($Rw > 1000)
{ $icon = "weather_sun"; }
elsif ($Rw > 700 && $Rw < 999)
{ $icon = "weather_rain_light"; }
elsif ($Rw > 400 && $Rw < 699)
{ $icon = "weather_rain"; }
elsif ($Rw > 100 && $Rw < 399)
{ $icon = "weather_rain_heavy"; };
return $icon;
}
Leider funktioniert das so nicht, sprich es erscheint kein Icon. Fehlermeldungen im Logfile bekomme ich keine. Kann also nichts grundsätzlich falsch sein. Fehlt bestimmt nur eine Kleinigkeit, aber ich komme nicht dahinter. Bitte um Hilfe.
was mir nur auffällt, ist dass bei den Grenzwerten 1000, 700, 400 und Werten <= 100 $icon nicht belegt wird
versuch mal den return code zu erweitern: ".*:$icon"
Ansonsten noch folgende Anmerkungen: Zum einen würde ich grundsätzlich immer den Namen übergeben, also aufrufen mit attr devStateIcon { Regensensor_Icon($name) }
Das überlebt dann auch Umbenennungen usw..
Dann muss in der sub vor Verwendung des Namens folgendes stehen:
"my ($name) = @_;"
Dann ist die Entscheidungskaskade eigentlich "des Guten zu viel", und kann für die Zwischenstufen vereinfacht werden, da elsif.
Im Zusammenhang also:
sub Regensensor_Icon($) {
my ($name) = @_;
my $Rw = ReadingsVal($name, 'state', "unknown");
my $icon = $Rw; #unknown, wenn noch nicht bekannt
if ($Rw > 1000)
{ $icon = "weather_sun"; }
elsif ($Rw > 700)
{ $icon = "weather_rain_light"; }
elsif ($Rw > 400)
{ $icon = "weather_rain"; }
elsif ($Rw <= 400)
{ $icon = "weather_rain_heavy"; };
return ".*:$icon";
}
EDIT: Code nach Hinweis von Uwe S angepaßt.
Vorsicht: auch hier fehlt die 400!
Ich danke Euch beiden, vor allem Beta-User. Alleine die Erweiterung des Return-Codes hat bewirkt, dass die Icon-Anzeige funktioniert. Die restlichen Tipps habe ich verstanden und auch übernommen. Wieder etwas dazugelernt.