Neues Modul readingsGroup

Begonnen von Niko, 24 August 2013, 11:59:11

Vorheriges Thema - Nächstes Thema

Spartacus

Hallo,
also irgendwie habe ich die Syntax nicht durchblickt. Je länger ich mit den readingsGroup spiele desto verwirrter bin ich. Deshalb hier noch einmal ein paar Fragen und ein Überblick, was überhaupt Ziel der Anzeige über readingsGroup ist:

Diese Zeile im DEF-Bereich
Sonos_Buero:<%icoSONOSPLAYER_icon-S3.png>,<Büro>,currentSender,transportState,
erzeugt Folgende Dartstellung:
Sonos_Buero    -> ist das DEVICE
<%ico...>      -> Das Bild des Players
<Büro>         -> Ausgabe des Textes "Büro"
currentSender  -> Reading des Devices.currentSender
transportState -> Reading des Devices.transportState


Warum funktioniert bsp. ein Leerzeichen in den spitzen Klammern nicht z.B <Player Büro>?

Was will ich überhaupt erreichen...
Es soll neben dem Symbol des Players und dessen Name ein Button angezeigt werden, der den transportState anzeigt. Neben dem Button soll angezeigt werden, was gerade abgespielt wird. Dabei gibt es zwei Möglichkeiten:

1. Radiosender: Anzeige des readings "currentSender"
2. mp3: Anzeige des readings "currentAlbum (alternativ currentTitle)

Dabei tauchen folgende Probleme auf:
Der Wert der Readings "currentSender" bzw. "currentAlbum" wird nur gelöscht, wenn das jeweils andere Medium abgespielt wird. Wird der Player angehalten (z.B  Druck auf den "Stop"-Button) bleibt der Wert des zuletzt abgespielten Mediums (currentSender oder currentAlbum) erhalten. Deshalb sollte hier das jeweils gültige Reading nur beim transportState=PLAYING angezeigt werden. Wenn der transportState = STOPPED ist, sollte entweder nichts angezeigt werden, oder man könnte den Wert des zuletzt abgespielte Readings (currentSender oder currentAlbum)in einer blassen Farbe anzeigen.

Hier mein Ansatz, der so leider nicht funzt:
Sonos_Buero:<%icoSONOSPLAYER_icon-S3.png>,<Büro>, {if(ReadingsVal("$DEVICE","currentSender","") eq "") {"currentAlbum"}else{"currentSender"}} ,transportState,

Das Symbol in der readingsGroup zeigt an, ob der Player läuft, oder angehalten ist. Man kann auch durch einen Klick auf das Symbol zwischen "Play" und "Stop" umschalten. Das funktioniert mit nachstehendem Code:

commands:
{ 'transportState.PLAYING' => 'set $DEVICE Stop', 'transportState.STOPPED' => 'set $DEVICE Play' }
valueIcon:
{'transportState.PLAYING' => 'remotecontrol/black_btn_PLAY', 'transportState.STOPPED' => 'remotecontrol/black_btn_STOP'}
valueStyle:
{if($READING eq "currentSender" && ReadingsVal($DEVICE, "transportState", "") eq "PLAYING" ) { 'style="color:green"' } elsif ($READING eq "currentSender" && ReadingsVal($DEVICE, "transportState", "") eq "STOPPED" ) { 'style="color:red"' } }

Im Moment bin ich etwas überfordert, und weiß nicht so recht, wie ich das vernünftig aufgleisen kann und wo ich anfangen soll!

Sparatcus
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

justme1968

ein Lesezeichen funktioniert nicht weil es das trennzeichen zwischen verschiedenen devices ist. du kannst einfach &nbsp; statt des leerzeichens verwenden, also ...,<Player&nbsp;Büro>,....

das was bei dir nicht funktioniert funktioniert aus den folgenden gründen nicht:

  • da sind zu viele leerzeichen an stellen an denen sie nicht hin gehören
  • ...,{...},... ist keine gültige syntax und ist so auch nirgendwo beschrieben. es muss immer ...,<{...}>,... heißen
  • du machst dir das leben unnötig schwer in dem du alles ins define packen willst bzw den kompletten code in ein attribut packst.
    es ist viel einfacher und übersichtlicher den code in eine sub in 99_myUtis zu stecken und im define und attribut nur noch aufzurufen.
  • das ausblenden eines wertes ist vielleicht viel einfacher :) und es hilft oft nicht nur in der readingsGroup zu denken sondern readings schon ausserhalb 'vorzubereiten'.

im folgenden setze ich mal voraus das dir das nicht anzeigen lieber wäre als das farbig machen.

zwei ideen in der readingsGroup:

  • schau dir mal die doku zum valueFormat attribut an. wenn du an der passenden stelle undef zurück gibst wird das reading übersprungen. d.h. das einfachste ist es du steckst in das define deiner readingsGroup beide readings currentSender und currentAlbum und sorgst über valueFormat dafür das das gerade nicht aktive reading nicht angezeigt wird. z.b. über den readingsTimestamp.
  • du verwendest ...,<{myDisplay($DEVICE)}@currentSender|currentAlbum> und legst in 99_myUtils eine sub myDisplay an die dir abhängig vom timestamp das neuere von currentSender und currentAlbum zurück gibt.

und zwei ideen zum ausserhalb vorbereiten:

  • für dein sonos device legst du ein notify an das sobald transportState auf STOPPED geht löschst du mit deletereading currentSender und currentAlbum.
  • du kannst auch über ein solches notify immer jeweils das neueste der beiden currentSender und currentAlbum in ein neues reading currentX kopieren (und dieses bei stop löschen) und dann currentX in der readingsGroup anzeigen.

damit das ganze auch dann funktioniert wenn auf stop gedrückt wird musst du eine der ersten beiden ideen (die sind dazu da das bei play jeweils das richtige reading angezeigt wird) mit einer der letzten beiden (die sind dazu da das bei stop kein falsches reading mehr angezeigt wird) kombinieren.

gruss
  andre

ps: ich würde den play/stop knopf links vom titel anzeigen dann bewegt sich der knopf nicht horizontal abhängig von der tiel länge.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Spartacus

Hallo Andre,
ganz, ganz lieben Dank für die Tipps! Das hilft mir auf jeden Fall weiter!
Das userReading habe ich im Sonos angelegt und kopiere nun je nach Mucke currentSender oder currentAlbum rein, das klappt auch schon!

Ich melde mich, wenn ich weitere Unterstützung brauche!
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Spartacus

    Hallo,
    ich bin wieder am Werk!
Zitat von: justme1968 am 23 Oktober 2014, 20:43:21
......

  • du kannst auch über ein solches notify immer jeweils das neueste der beiden currentSender und currentAlbum in ein neues reading currentX kopieren (und dieses bei stop löschen) und dann currentX in der readingsGroup anzeigen.
........

Ich habe jetzt mal Folgendes ausprobiert:
userReadings:
[/list] currentX {if(ReadingsVal("Sonos_Buero", "currentSender", "") eq "" ) {ReadingsVal("Sonos_Buero", "currentAlbum", "")}  else {ReadingsVal("Sonos_Buero", "currentSender", "")}}
Notify:
define Sonos_Buero_Stop notify Sonos_Buero:transportState:.STOPPED
deletereading Sonos_Buero currentX


Das currentX lasse ich nun in meiner readingsGroup anzeigen.
Wahlweise steht nun currentAlbum oder currentSender drin. Wenn ich den Player anhalte, dann wird currentX gelöscht.

Allerdings wird dies auch erst nach einem Browser-Refresh in der readingsGroup angezeigt. Außerdem verändert sich die Größe des Anzeigefensters der Gruppe.

Das mit dem automatischen Refresh habe ich noch nicht durchblickt.
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

justme1968

diese zeile currentX {if(ReadingsVal("Sonos_Buero", "currentSender", "") eq "" ) {ReadingsVal("Sonos_Buero", "currentAlbum", "")}  else {ReadingsVal("Sonos_Buero", "currentSender", "")}}verstehe ich nicht. hier fehlt der zusammenhang.

ich vermute das ist dein notify? ann geht es auch noch etwas einfacher denke ich:define currentX notify Sonos_Buero:currentSender|currentAlbum setreading Sonos_Buero currentX $EVTPART1

damit wird einfach currentX jeweils mit dem neuesten der beiden readings überschrieben.

das mit dem löschen war mein fehler. du musst das currentX reading auf einen leeren string setzen statt es zu löschen. ein gelöschtes reading erzeugt kein event.

statt einem leeren string kannst du natürlich auch jeden anderen text verwenden falls du auch bei nicht spielen etwas anzeigen willst. hier kannst du dann auch mit valueStyle ansetzen und anders einfärben.

die größe ändert sich natürlich abhängig vom inhalt so lange du über ein style attribut keine feste größe vorgibst.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Spartacus

#740
Hi Andre,
ok! Danke.

attr Sonos_Buero userReadings currentX {if(ReadingsVal("Sonos_Buero", "currentSender", "") eq "" ) {ReadingsVal("Sonos_Buero", "currentAlbum", "")}  else {ReadingsVal("Sonos_Buero", "currentSender", "")}}

Hiermit lege ich das userReading an und schreibe curretAlbum oder current Sender hinein. Wird die Betriebsart vom Radio-Mode in den mp3-Mode geschaltet, wird currentSender automatisch gelöscht, umgekehrt wird currentAlbum gelöscht, wenn ich in den Radio-Mode zurückkehre. Dehalb ist m.E. sichergestellt, dass hier immer das aktuelle Reading in currentX geschrieben wird.

Christian

P.S.
define currentX notify Sonos_Buero:currentSender|currentAlbum setreading Sonos_Buero currentX $EVTPART1
Dieses notify funktioniert nicht! In currentX steht dann alles Mögliche, aber nicht currentSender bzw. currentAlbum. Mit meinem userReading stehen zumindet die korrekten Werte in currentX drin.
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Spartacus

Hallo,
so! Das hier funktioniert soweit ganz gut!
attr Sonos_Buero userReadings currentX 
{
  if(ReadingsVal("Sonos_Buero", "transportState", "") eq "STOPPED" ) 
   {
    sprintf('nichts')
   }
elsif(ReadingsVal("Sonos_Buero", "currentSender", "") eq "" )
   {
     ReadingsVal("Sonos_Buero", "currentAlbum", "")
   }
   elsif(ReadingsVal("Sonos_Buero", "currentAlbum", "") eq "")
   {
     ReadingsVal("Sonos_Buero", "currentSender", "")
   }
}


Wenn ich jetzt das Reading cuurentX in der readingsGroup anzeigen lasse,
dann wechselt die Anzeige auch korrekt zwischen
Radiosender, Album und "nichts"
...ist das jetzt Zufall, bzw. nachvollziehbar?
Christian.
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

justme1968

kein zufall sondern ziemlich genau das was ich oben vorgeschlagen hatte.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Spartacus

#743
Hi andre,
;D ...aber ich brauche die notifys nicht! Das "userReading" ist der gesamte Code!  Jetzt muss ich das nur noch einfärben...

btw. wie kann man eigentlich den Wert eines Readings löschen? Habe irgendwie nen Knoten im Kopf!

Bis bald,
Sparatcus
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

justme1968

du nimmst statt einem notify userReadings. das ist vom code menge her nicht wirklich ein unterschied. aber du hast weniger devices.

und das du nicht genau nachbaust was ich vorgeschlagen habe sondern selber was gefunden hast ist doch schön :)

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Spartacus

Zitatund das du nicht genau nachbaust was ich vorgeschlagen habe sondern selber was gefunden hast ist doch schön :)
.... war Zufall! :)

btw.
wie kann man eigentlich den Wert eines Readings löschen? Habe irgendwie nen Knoten im Kopf! Muss noch andere ReadingInhalte im Device löschen. z.B. den RDS-Text, der bei Stop nicht automatisch gelöscht wird und mit "deletereading" lösche ich das ganze Reading und nicht den Wert. Das will ich ja nicht!

Thanks,
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

justme1968

das löschen bzw. mit 'nichts' füllen würde mit readingsSingleUpdate($defs{<device>},"<reading>", "", 1); gehen.

ps: du kannst in deinem userReadings statt Sonos_Buero auch $name verwenden. das ist automatisch das device zu dem die userReadings gehören.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Spartacus

Genial! Besten Dank!
Ich lerne.......
Spartacus
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Spartacus

Hi,
jetzt muss ich doch noch mal nachhaken!

Die readingsGroup sieht so aus:
Sonos_Buero:<%icoSONOSPLAYER_icon-S3.png>,<Büro>,transportState,<es&nbspläuft...>,currentX,<br>,<{rgMarquee(ReadingsVal($DEVICE,"currentPlaying",""))}>,<>,<>,<>

In der zweiten Zeile lasse ich das Reading currentPlaying anzeigen, welches genau wie das currentX, als userReading ermittelt wird. In der myutils sieht das so aus:
sub rgMarquee($)
{           
  my ($txt) = @_;
  return "<marquee scrollamount=2 width=\"220\">$txt</marquee>";
}


Schalte ich nun zwischen Radio und mp3 um, wird automatisch das currentX aktualisiert. Allerding funktioniert das beim Lauftext erst nach Browser Resfresh. Warum klappt das beim currentX automatisch und beim currentPlaying nicht? Wenn ich die Readings im Device direkt anschaue, ändern sich beide zusammengesetzten Readings sofort!

Hier das userReading:
attr Sonos_Buero userReadings currentX 
{
if(ReadingsVal("Sonos_Buero", "transportState", "") eq "STOPPED" ) 
  {
   sprintf('nichts')
  }
elsif(ReadingsVal("Sonos_Buero", "currentSender", "") eq "" )
  {
   ReadingsVal("Sonos_Buero", "currentAlbum", "")
  }
elsif(ReadingsVal("Sonos_Buero", "currentAlbum", "") eq "")
  {
   ReadingsVal("Sonos_Buero", "currentSender", "")
  }
}, currentPlaying
{
if(ReadingsVal("Sonos_Buero", "transportState", "") eq "STOPPED" ) 
  {
   sprintf('kein Titel')
  }
elsif(ReadingsVal("Sonos_Buero", "currentSenderInfo", "") eq "" )
  {
   ReadingsVal("Sonos_Buero", "currentTitle", "")
  }
elsif(ReadingsVal("Sonos_Buero", "currentTitle", "") eq "")
  {
   ReadingsVal("Sonos_Buero", "currentSenderInfo", "")
  }
}


Christian.
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

justme1968

du musst bei der <{...}> variante angeben welches reading dahinter steht wenn die aktualisierung greifen soll weil die readingsGroup sonst nicht weiss bei welchem reading da etwas aktualisiert werden soll.

es muss also so aussehen:...,<{rgMarquee(ReadingsVal($DEVICE,"currentPlaying",""))}@currentPlaying>,...

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968