[GELÖST] DevStateIcon abhängig von Wert

Begonnen von rih, 28 Mai 2019, 12:19:09

Vorheriges Thema - Nächstes Thema

rih

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.

Uwe S.

was mir nur auffällt, ist dass bei den Grenzwerten 1000, 700, 400 und Werten <= 100 $icon nicht belegt wird

Beta-User

#2
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.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Uwe S.

Vorsicht: auch hier fehlt die 400!

rih

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.