devStateIcon in Abhängigkeit von 2 Readings

Begonnen von Spook112, 09 August 2021, 15:42:10

Vorheriges Thema - Nächstes Thema

Spook112

Hallo Freunde von FHEM,

ich google und durchforsche nun schon eine ganze Weile das Internet und die Command Ref sowie das Wiki, aber irgendwie kriege ich das was ich möchte mit den vorhandenen Informationen nicht hin. (Liegt vermutlich an meinem Unvermögen)
Ich hoffe also auf einen Anstoß wie man es machen könnte:

Was möchte ich erreichen?
Ich möchte mein Device (Sonos Player) in Abhängigkeit von 2 Readings (presence und LastActionResult) mittels eines Icons auf meinem Floorplan visualisieren.
Hintergrund:
- Presence zeigt an ob der Player überhaupt an/erreichbar ist
- LastActionResult zeigt an ob der Player spielt oder pausiert oder gestoppt wurde.

Nun möchte ich in meinem Floorplan nicht zwei Icons für das Gerät darstellen, um die beiden Status darzustellen, sondern beides in einem Icon kombinieren.
Verbal beschrieben:
Wenn presence = appeared und zusätzlich LastActionResult = PlayURITemp: Success! dann zeige das Icon xx@green
Wenn presence = appeared und zusätzlich LastActionResult = Pause: Success! dann zeige das Icon xx@gray
Wenn presence = disappeared und zusätzlich LastActionResult = irgendein Status dann zeige das Icon yy@red

In Abhängigkeit von nur einem Reading alles kein Problem:
stateFormat = LastActionResult
devStateIcon = Stop.*Success.*:it_radio@grey:play Play.*Success.*:it_radio@green:stop Pause.*Success.*:it_radio@blue:play
funktioniert,
Ich bekomme auch zwei Readings als Text angezeigt mittels stateFormat = LastActionResult . presence

Nur das dann mittels devStateIcon in ein oder auch zwei Icons umzuwandeln bekomme ich nicht hin.

Vermutlich werde ich da Perl brauchen, aber daran scheitere ich bisher.
Wie schon geschrieben - ideal wäre ein variables Icon in Abhängigkeit von beiden Readings und deren verschiedenen Statuskombinatonen.

Bin für jeden Tipp und Beispiel dankbar.

P.S.: Habe das Gerät eine ganze Weile mit stateFormat = state betrieben, aber der Status wechselt leider nicht zuverlässig.
Häufig spielt der Player und state zeigt trotzdem Stopped an und umgekehrt.





Raspberry PI / RaZberry ZWAVE Modul / RFXTRX433E / 13 Fibaro FGS-222-EN-A-v1.00 / 17 VISION ZD2102-5 / 10 Somfy RTS / 4 Greenwave GWRENS310-F / Gardena Sileno City / 3 Gardena Gartensteckdosen / 2 devolo Home Control Funkschalter / 8 FIBARO System FGSD002 Smoke Sensoren

DeeSPe

z.B.
attr TYPE=SONOSPLAYER devStateIcon {\
  return ".*:on\@green" if (ReadingsVal($name,"presence","") eq "appeared" && ReadingsVal($name,"LastActionResult","") eq "PlayURITemp: Success!");;\
  return ".*:on\@gray" if (ReadingsVal($name,"presence","") eq "appeared" && ReadingsVal($name,"LastActionResult","") eq "Pause: Success!");;\
  return ".*:on\@red" if (ReadingsVal($name,"presence","") eq "disappeared");;\
}


Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Spook112

Danke - das funktioniert und kann ich entsprechend adaptieren.
{ return ".*:it_radio\@green" if (ReadingsVal($name,"presence","") eq "appeared" && ReadingsVal($name,"LastActionResult","") eq "Play: Success!");
  return ".*:it_radio\@gray" if (ReadingsVal($name,"presence","") eq "appeared" && ReadingsVal($name,"LastActionResult","") eq "Pause: Success!");
  return ".*:it_radio\@red" if (ReadingsVal($name,"presence","") eq "disappeared");
}


was ich irgendwie noch nicht hin bekomme ist Wildcards einzubauen - statt eq "Play: Success!" etwas in der Richtung eq 'Play.*'
Irgendwie klappt es weder mit einfchen Hochkomma noch mit doppelten Hochkomma  und auch nicht komplett ohne.

Zwischenzeitlich habe ich das hier ausgetüftelt, was auch funktioniert.
{if(ReadingsVal($name,"presence","0") eq "appeared") {'Play.*Success.*:it_radio@green:stop Stop.*Success.*:it_radio@grey:play Pause.*Success.*:it_radio@blue:play .*Proxy.*Success.*:it_radio@orange .*Error.*:it_radio@orange .*Volume.*:it_radio@orange'}
elsif (ReadingsVal($name,"presence","0") eq "disappeared") {'.*:it_radio@red'}
}

Hier funktionieren auch die Wildcards.

Was mich etwas stört, dass es da doch recht viele verschiedene Status geben kann, die ich alle berücksichtigen muss (deshalb Wildcards), weil da sonst Text erscheint.

Hat noch jemand eine Idee wie man es erreichen kann, dass bei bestimmten Statuswerten das "alte" (also das bis dahin verwendete) Icon beibehalten wird.
Wenn ich beispielsweise die Lautstärke verändere möchte ich natürlich weder Text noch ein anderes Icon haben.
Es sollte das Icon angezeigt bleoiben, das vorher ausgewählt war.

Danke im Voraus für jeden Tipp.
Raspberry PI / RaZberry ZWAVE Modul / RFXTRX433E / 13 Fibaro FGS-222-EN-A-v1.00 / 17 VISION ZD2102-5 / 10 Somfy RTS / 4 Greenwave GWRENS310-F / Gardena Sileno City / 3 Gardena Gartensteckdosen / 2 devolo Home Control Funkschalter / 8 FIBARO System FGSD002 Smoke Sensoren

xenos1984


Spook112

Danke für den Tipp.

Ich hatte gar nicht realisiert, dass bei DeeSPe's Lösung ja der Vergleich in Perl stattfindet und da "zieht" dann natürlich Dein Vorschlag - eingebaut und funktioniert.

Bei meinem ausgetüftelten Ansatz kommen die Wildcards (.*) ja innerhalb fhem zum Einsatz.
Darin liegt der Unterschied :-)

Jetzt fehlt mir nur noch eine Lösung wie man es hin kriegt, dass bei Verstellung der Lautstärke (LastActionResult = SetVolume: xx)  das Icon sich nicht ändert - sprich das bis dahin angezeigte Icon weiterhin angezeigt wird.

Hat da noch jemand einen Tipp.
Raspberry PI / RaZberry ZWAVE Modul / RFXTRX433E / 13 Fibaro FGS-222-EN-A-v1.00 / 17 VISION ZD2102-5 / 10 Somfy RTS / 4 Greenwave GWRENS310-F / Gardena Sileno City / 3 Gardena Gartensteckdosen / 2 devolo Home Control Funkschalter / 8 FIBARO System FGSD002 Smoke Sensoren