FHEM Forum

FHEM => Frontends => Thema gestartet von: Spook112 am 09 August 2021, 15:42:10

Titel: devStateIcon in Abhängigkeit von 2 Readings
Beitrag von: Spook112 am 09 August 2021, 15:42:10
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.





Titel: Antw:devStateIcon in Abhängigkeit von 2 Readings
Beitrag von: DeeSPe am 09 August 2021, 16:09:14
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
Titel: Antw:devStateIcon in Abhängigkeit von 2 Readings
Beitrag von: Spook112 am 09 August 2021, 23:03:09
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.
Titel: Antw:devStateIcon in Abhängigkeit von 2 Readings
Beitrag von: xenos1984 am 09 August 2021, 23:10:19
Statt
eq 'Play.*'
brauchst du
=~ /Play.*/
http://perldoc.perl.org/perlretut
Titel: Antw:devStateIcon in Abhängigkeit von 2 Readings
Beitrag von: Spook112 am 10 August 2021, 10:56:40
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.