Sonos Alarm im FTUI

Begonnen von dj, 29 September 2018, 12:39:58

Vorheriges Thema - Nächstes Thema

dj

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?)



Reinerlein

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

dj

Hallo Reinerlein,
Danke für Deine rasche umd konstruktive Antwort.
Werde es morgen sofort ausprobieren.
Gruss
Dj

dj

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




Reinerlein

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

dj

Hallo Reinerlein,
Deine Variante hatte im FTUI nicht funktioniert.
Ich habe aber keine Ahnung warum nicht
Gruss
dj

Reinerlein

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

dj

Hallo Reinerlein,
Werde beides ausprobieren.
Komme aber erst nächstes Wochenende dazu.
Danke für Deine schnellen Hilfen.
Gruss
Dj

dj

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

dj

#9
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>