Autor Thema: Sonos Alarm im FTUI  (Gelesen 992 mal)

Offline dj

  • New Member
  • *
  • Beiträge: 12
Sonos Alarm im FTUI
« am: 29 September 2018, 12:39:58 »
Hallo Zusammen,
Ich habe im Sonos 3 Alarme definiert. Im FTUI möchte ich mir anzeigen lassen, welcher der drei Alarme aktiviert ist.
Die Anzeige möche ich mir mit etwas ähnlichem wie:
data-get-on =".*('1' => {'ProgramURI' => 'x-sonosapi-stream:s24896?sid=254&flags=8224&sn=0','Enabled' => '1').*"
data-get-off=".*('1' => {'ProgramURI' => 'x-sonosapi-stream:s24896?sid=254&flags=8224&sn=0','Enabled' => '0').*"
holen.
Mein Problem ist, dass die Alarmlist sich immer wieder verändert und ich damit kein Ergebnis mehr erhalte.
Hat hier einer eine Idee. (ohne dass ich als Anfänger in die Tiefen der Programmierung steigen muss?)



Offline Reinerlein

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2129
Antw:Sonos Alarm im FTUI
« Antwort #1 am: 29 September 2018, 18:21:01 »
Hi dj,

da das ganze die String-Darstellung eines Perl-Hashes von Hashes ist, kannst du das auch so in deinem regulärem Ausdruck abfragen:
data-get-on ="'1' => \{'ProgramURI' => 'x-sonosapi-stream:s24896?sid=254&flags=8224&sn=0','Enabled' => '1'\}"
data-get-off="'1' => \{'ProgramURI' => 'x-sonosapi-stream:s24896?sid=254&flags=8224&sn=0','Enabled' => '0'\}"

Du kannst das aber auch vereinfachen, wenn es dir nur um die ID (1) geht, und du sichergehen willst, dass es auch dann geht, wenn "Enabled" woanders steht:
data-get-on ="'1' => \{.*?'Enabled' => '1'.*?\}"
data-get-off="'1' => \{.*?'Enabled' => '0'.*?\}"

Grüße
Reinerlein

Offline dj

  • New Member
  • *
  • Beiträge: 12
Antw:Sonos Alarm im FTUI
« Antwort #2 am: 29 September 2018, 19:39:52 »
Hallo Reinerlein,
Danke für Deine rasche umd konstruktive Antwort.
Werde es morgen sofort ausprobieren.
Gruss
Dj

Offline dj

  • New Member
  • *
  • Beiträge: 12
Antw:Sonos Alarm im FTUI
« Antwort #3 am: 30 September 2018, 17:49:23 »
Hallo Reinerlein,
Habe Deinen Lösungsansatz verwendet und rumgespielt.
Habe einen Alarm gelöscht. Nun arbeite ich nur noch mit zwei Alarmen.
Im FTUI schaut es bei mir nun so aus
data-get-on  =".*('2' =>).*('1' => \{.*?'Enabled' => '1'.*?\}).*"
data-get-off  =".*('2' =>).*('1' => \{.*?'Enabled' => '0'.*?\}).*"
Da zweimal Enabled in der Alarmlist vorhanden ist, muss ich doch sicherstellen, dass ich das richtige Enabled zu dem Alarm abfrage. Deshalb habe ich zuerst Alarm 2 genommen und dann Alarm 1 mit der Enabled Prüfung.
Das funktioniert aber nur solange, wie beim Neu einlesen der Alarmlist nicht mal Alarm 1 zuerst vorkommt.
Kann ich irgendwie sicherstellen, dass die Alarmlist immer in einer vorgegebenen Reihenfolge die Alarme einliest?
Oder besteht die Möglichkeit im FHEM eigene Readings zu erstellen. Ein Reading das nur Alarm 1 einliest. Ein weiteres Reading das nur Alarm 2 einliest?
Sorry für die viele Fragen. Ich hoffe die sind nicht zu doof.
Danke und viele Grüsse
dj




Offline Reinerlein

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2129
Antw:Sonos Alarm im FTUI
« Antwort #4 am: 30 September 2018, 18:02:28 »
Hi Dj,

in deiner Variante bist du ja wieder abhängig von einer Reihenfolge im Hash.
Per Definition ist eine Reihenfolge in einem Hash nicht definiert. Das hängt mit der Art und Weise zusammen, wie ein Hash im Speicher gehalten wird (und damit auch wieder in einen String umgewandelt wird).
Das kann man so nicht beeinflussen. Deshalb musst du das beim Auslesen entsprechend beachten.

Warum hast du denn die "2" für den anderen Alarm hinzugefügt? Hatte meine vorgeschlagene Variante nicht funktioniert?
in dem regulären Ausdruck:
'1' => \{.*?'Enabled' => '1'.*?\}
ist alles drin, um sicherzustellen, dass das Enabled nur für den Alarm mit der ID "1" zutrifft. Mehr braucht es nicht.
Es kann nur sein, dass für FTUI noch eine andere Herangehensweise notwendig ist, deshalb meine Frage, ob es geht...

Grüße
Reinerlein

Offline dj

  • New Member
  • *
  • Beiträge: 12
Antw:Sonos Alarm im FTUI
« Antwort #5 am: 30 September 2018, 18:09:25 »
Hallo Reinerlein,
Deine Variante hatte im FTUI nicht funktioniert.
Ich habe aber keine Ahnung warum nicht
Gruss
dj

Offline Reinerlein

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2129
Antw:Sonos Alarm im FTUI
« Antwort #6 am: 30 September 2018, 19:54:20 »
Hi Dj,

hast du auch das folgende versucht?
.*'1' => \{.*?'Enabled' => '1'.*?\}.*
Dann matcht es auf den gesamten AlarmList-Eintrag.

Alternativ kannst du dir mit meinem regulären Ausdruck auch ein Userreading bauen, welches das auf 0 oder 1 reduziert:
Alarm1:AlarmList.* {
  if (ReadingsVal($name, 'AlarmList', '') =~ m/'1' => \{.*?'Enabled' => '1'.*?\}/i) {
    return 1;
  } else {
    return 0;
  }
}

Grüße
Reinerlein

Offline dj

  • New Member
  • *
  • Beiträge: 12
Antw:Sonos Alarm im FTUI
« Antwort #7 am: 30 September 2018, 20:32:43 »
Hallo Reinerlein,
Werde beides ausprobieren.
Komme aber erst nächstes Wochenende dazu.
Danke für Deine schnellen Hilfen.
Gruss
Dj

Offline dj

  • New Member
  • *
  • Beiträge: 12
Antw:Sonos Alarm im FTUI
« Antwort #8 am: 02 Oktober 2018, 10:06:56 »
Hallo Reinerlein

Habe die Startzeit noch ergänzt. Dann funktioniert es.
data-get-on  =".*'1' => \{.*?'Enabled' => '1'.*'05:55:00'.*?\}.*"
data-get-off =".*'1' => \{.*?'Enabled' => '0'.*'05:55:00'.*?\}.*"
Vermutlich funktioniert es nur solange wie Enabled vor der Startzeit steht.
Aber damit kann ich leben.
Danke vielmals für Deine Unterstützung.
Alleine hätte ich das nicht fertig gebracht.
Gruss
dj

Offline dj

  • New Member
  • *
  • Beiträge: 12
Antw:Sonos Alarm im FTUI
« Antwort #9 am: 26 November 2019, 10:20:57 »
Hallo Zusammen,
Schlussendlich habe ich das Problem mit datapart gelöst.
Für alle, die es interessiert:
<div class="sheet">
<div class="row">
<div class="cell">
<header>5:55</header>
<div data-type="switch"
                data-device='Sonos_Schlafzimmer'
        data-get="AlarmList"
        data-get-on  =".*'1''Enabled' => '1'.*"
        data-get-off =".*'1''Enabled' => '0'.*"
data-part=".*('1'|'2').*('Enabled' => '1'|'Enabled' => '0').*('1'|'2').*('Enabled' => '1'|'Enabled' => '0').*"
data-on-color="white"
data-off-color="#808080"
data-on-background-color="cornflowerblue"
data-off-background-color="#3D4C66"
data-set-on= 'Alarm Update 1 {Enabled => 1}'
data-set-off='Alarm Update 1 {Enabled => 0}'
data-icon="dj-clock02"
class="nocache">
</div>
</div>
        <div class="cell">
<header>7:00</header>
<div data-type="switch"
data-device='Sonos_Schlafzimmer'
data-get="AlarmList"
data-get-on  =".*'2''Enabled' => '1'.*"
data-get-off =".*'2''Enabled' => '0'.*"
data-part=".*('1'|'2').*('Enabled' => '1'|'Enabled' => '0').*('1'|'2').*('Enabled' => '1'|'Enabled' => '0').*"
data-on-color="white"
data-off-color="#808080"
data-on-background-color="cornflowerblue"
data-off-background-color="#3D4C66"
data-set-on= 'Alarm Update 2 {Enabled => 1}'
data-set-off='Alarm Update 2 {Enabled => 0}'
data-icon="dj-clock02"
class="nocache">
      </div>
      </div>
        </div>
</div>
               
« Letzte Änderung: 26 November 2019, 16:11:18 von dj »