Wert eines Sonos Helfers benutzen Thema ist als GELÖST markiert

Bereich rings rum zum Thema Yaml und seine Tücken.


Antworten
Benutzeravatar
Figuhr
Beiträge: 14
Registriert: So 5. Feb 2023, 12:21
1
Has thanked: 1 time

Wert eines Sonos Helfers benutzen

Beitrag von Figuhr »

Moin,

ich habe in Homeassistant mein Sonos-System integriert.

Nun habe ich zwei Helfer erstellt. Einmal "Masterplayer" und dann für jeden Lautsprecher einen Helfer "Status Play_Pause". Zweiter ist wichtig, wenn beim Koppeln Situationen entstehen, wo ein Speakter zwar gekoppelt ist aber Lautstärke 0 hat.

Wenn ich das Licht eines Raumes einschalte wechselt mein Helfer "Masterplayer" auf den entsprechenden Raum (zB. Badezimmer). Wenn ich jetzt im Schlafzimmer das Licht einschalte soll sich der Speakter mit dem Masterplayer koppeln, aber nur, wenn dieser den Status=Play hat.

Also müsste eine verschachtelte Abfrage erfolgen.
Wer ist Masterplayer?
Hat dieser den Status Play?
Dann Sonos-Schlafzimmer: Snapshot + join Masterplayer.

Meine Lösung war bisher eine sehr umständliche Automation mit Wenn und Dann. Gute 80 Zeilen in Yaml. Gibt es vielleicht eine Möglichkeit dies mit Hilfe von Templates umzusetzen? Leider ist mein Verständnis von Jinja fast null.

Mein erster Ansatz:

Code: Alles auswählen

{% if is_state('input_select.sonos_masterplayer' = 'input_select.sonos_badezimmer_status_play_pause', 'Play'') %}
{% endif %}

Das ergibt leider keinen Sinn, ich weiß. Vielleicht kann mir jemand einen Rat geben?

Benutzeravatar
Osorkon
Administrator
Beiträge: 1905
Registriert: Sa 17. Jul 2021, 16:53
2
Wohnort: Langenargen
Has thanked: 60 times
Been thanked: 516 times
Kontaktdaten:

Re: Wert eines Sonos Helfers benutzen

Beitrag von Osorkon »

Hallo @Figuhr und Herzlich Willkommen bei den SmartHome for Dummies. :D :D

Bin mir nicht sicher, ob ich dich richtig verstanden habe.
Ausgehend davon, das DU einen input_select.masterplayer in Verwendung hast. Mit diesen gibst Du vor, welcher der MediaPlayer als Master agiert, richtig.

Der Aktion Teil kann dann so aussehen. Wenn der Master gerade abspielt, wird der media_player.bad mit dem Master Gruppiert.

Code: Alles auswählen

{% set masterplayer = "media_player."+states('input_select.masterplayer') | lower  %}
{% if is_state(masterplayer, 'playing') %}
service: media_player.join
data:
  group_members:
    - media_player.bad
target:
  entity_id: {{masterplayer}}
{% endif %}

Gruß
Osorkon

Einer muss ja für Ordnung sorgen. :D
Benutzeravatar
Figuhr
Beiträge: 14
Registriert: So 5. Feb 2023, 12:21
1
Has thanked: 1 time

Re: Wert eines Sonos Helfers benutzen

Beitrag von Figuhr »

Cooool, vielen Dank für deine schnelle Antwort!
Wenn man es dann so sieht, ist es irgendwie logisch. Bis auf das lower.

Jetzt aber kommt die Deppenfrage überhaupt:
Wie zum Teufel bekomme ich das jetzt in eine Automation? Als "action:" kann ich ja nicht einfach "value_template:" wählen...

Benutzeravatar
Osorkon
Administrator
Beiträge: 1905
Registriert: Sa 17. Jul 2021, 16:53
2
Wohnort: Langenargen
Has thanked: 60 times
Been thanked: 516 times
Kontaktdaten:

Re: Wert eines Sonos Helfers benutzen

Beitrag von Osorkon »

Mit

Code: Alles auswählen

| lower 

wandelst Du alle Großbuchstaben in Kleinbuchstaben.

Eine Automatisierung könnte so ausschauen:

Code: Alles auswählen

description: ""
mode: single
variables:
  masterplayer: |
    {{"media_player."+states('input_select.masterplayer') | lower}}
trigger:
  - platform: state
    entity_id:
      - light.bad
    from: "off"
    to: "on"
condition:
  - condition: template
    value_template: "{{  is_state(masterplayer, 'playing') }}"
action:
  - service: media_player.join
    data:
      group_members:
        - media_player.bad
    target:
      entity_id:  "{{masterplayer}}"
alias: Test - Masterplayer

Zuerst wird eine Variable definiert, die sich aus dem String "media_player." + dem Wert von input_select.masterplayer zusammensetzt.
Also als Bsp. Du hast den input_select.masterplayer die Auswahl Schlafzimmer ausgewählt. das ergibt dann masterplayer = media_player.schlafzimmer
Diese Variable kannst Du jetzt sowohl in der Bedingung als auch im Aktion Teil verwenden.

Wenn das Badlicht wird eingeschaltet und der Masterplayer spielt gerade was ab.
Wird der service media_player.join ausgeführt mit dem masterplayer als Ziel und dem media_player.bad als Gruppenmitglied.

Ich hoffe, das war einigermaßen verständlich, ansonsten gerne weitere Deppenfragen stellen, :D :D

Gruß
Osorkon

Einer muss ja für Ordnung sorgen. :D
Benutzeravatar
Figuhr
Beiträge: 14
Registriert: So 5. Feb 2023, 12:21
1
Has thanked: 1 time

Re: Wert eines Sonos Helfers benutzen

Beitrag von Figuhr »

Irgendwie scheint es nicht funktionieren zu wollen.

Ich werde morgen noch mal in Ruhe probieren, vielleicht habe ich ja auch einen Denkfehler bei der Umsetzung...

Benutzeravatar
Osorkon
Administrator
Beiträge: 1905
Registriert: Sa 17. Jul 2021, 16:53
2
Wohnort: Langenargen
Has thanked: 60 times
Been thanked: 516 times
Kontaktdaten:

Re: Wert eines Sonos Helfers benutzen

Beitrag von Osorkon »

Ansonsten mal die Aufgabenstellung in eigenen Worten ein wenig detaillierter beschreiben und Deine aktuelle Automatisierung posten.

Dann kriegen wir das bestimmt hin. :D

Gruß
Osorkon

Einer muss ja für Ordnung sorgen. :D
Benutzeravatar
Figuhr
Beiträge: 14
Registriert: So 5. Feb 2023, 12:21
1
Has thanked: 1 time

Re: Wert eines Sonos Helfers benutzen

Beitrag von Figuhr »

Ich habe jetzt nochmal etwas rumprobiert.

momentan sieht die Automation so aus:

Code: Alles auswählen

alias: aaa sonos2
description: ""
trigger:
  - platform: state
    entity_id:
      - light.licht_schlafzimmer
    to: "on"
action:
  - service: media_player.join
    data:
      group_members:
        - media_player.sonos_schlafzimmer
    target:
      entity_id: "{{masterplayer}}"
variables:
  masterplayer: |
    {{"media_player."+states('input_select.masterplayer') | lower}}
mode: single

Erst einmal ohne Bedingung, um eine zusätzliche Fehlerquelle auszuschließen. Leider passiert hier nichts.

Ersetze ich die Aktion wie folgt, klappt es einwandfrei:

Code: Alles auswählen

action:
  - service: media_player.join
    data:
      group_members:
        - media_player.sonos_schlafzimmer
    target:
      entity_id: media_player.sonos_badezimmer

Wenn ich den Masterplayer abfrage mit

Code: Alles auswählen

 Wie lautet der Masterplayer? {{masterplayer}}

ist die Antwort

Code: Alles auswählen

"Wie lautet der Masterplayer? media_player.sonos_badezimmer
Benutzeravatar
Osorkon
Administrator
Beiträge: 1905
Registriert: Sa 17. Jul 2021, 16:53
2
Wohnort: Langenargen
Has thanked: 60 times
Been thanked: 516 times
Kontaktdaten:

Re: Wert eines Sonos Helfers benutzen

Beitrag von Osorkon »

Wenn Du unter Entwicklungswerkzeuge im Template Editor folgendes Template eingeben tust.

Code: Alles auswählen

{{ states('input_select.masterplayer') }}

Wie lautet das Ergebnis?

Gruß
Osorkon

Einer muss ja für Ordnung sorgen. :D
Benutzeravatar
Figuhr
Beiträge: 14
Registriert: So 5. Feb 2023, 12:21
1
Has thanked: 1 time

Re: Wert eines Sonos Helfers benutzen

Beitrag von Figuhr »

"unknown"

Benutzeravatar
Osorkon
Administrator
Beiträge: 1905
Registriert: Sa 17. Jul 2021, 16:53
2
Wohnort: Langenargen
Has thanked: 60 times
Been thanked: 516 times
Kontaktdaten:

Re: Wert eines Sonos Helfers benutzen

Beitrag von Osorkon »

Wie heißt den dann Dein Input_select Helfer mit dem Du den Masterplayer definieren tust?

Gruß
Osorkon

Einer muss ja für Ordnung sorgen. :D
Benutzeravatar
Figuhr
Beiträge: 14
Registriert: So 5. Feb 2023, 12:21
1
Has thanked: 1 time

Re: Wert eines Sonos Helfers benutzen

Beitrag von Figuhr »

Der Helfer heißt: "input_select.sonos_masterplayer"

In den Entwicklungswerkzeugen wird deine Formel auch richtig angewendet.

Der "input_select.sonos_masterplayer" stellt den Wert "Badezimmer" bereit aus dem dann richtig in "media_player.sonos_badezimmer" umgewandelt wird.

Benutzeravatar
Osorkon
Administrator
Beiträge: 1905
Registriert: Sa 17. Jul 2021, 16:53
2
Wohnort: Langenargen
Has thanked: 60 times
Been thanked: 516 times
Kontaktdaten:

Re: Wert eines Sonos Helfers benutzen

Beitrag von Osorkon »

Wenn Dein Helfer "input_select.sonos_masterplayer" lautet und dieser den Wert Badezimmer bereitstellt Du den Mediaplayer media_player.sonos_badezimmer ansprechen möchtest.
Muss das ganze dann so aussehen:

Code: Alles auswählen

alias: aaa sonos2
description: ""
trigger:
  - platform: state
    entity_id:
      - light.licht_schlafzimmer
    to: "on"
action:
  - service: media_player.join
    data:
      group_members:
        - media_player.sonos_schlafzimmer
    target:
      entity_id: "{{masterplayer}}"
variables:
  masterplayer: |
    {{"media_player.sonos_"+states('input_select.sonos_masterplayerr') | lower}}
mode: single

Gruß
Osorkon

Einer muss ja für Ordnung sorgen. :D
Benutzeravatar
Figuhr
Beiträge: 14
Registriert: So 5. Feb 2023, 12:21
1
Has thanked: 1 time

Re: Wert eines Sonos Helfers benutzen

Beitrag von Figuhr »

Da steckt irgendwie der Wurm drin:

Code: Alles auswählen

1 {% set masterplayer = "media_player.sonos_"+states('input_select.sonos_masterplayer') | lower %}  
2 {{ is_state('input_select.sonos_masterplayer', 'Badezimmer') }} 3 {{ states('input_select.sonos_masterplayer') }} 4 {{ masterplayer }}

Output:

Code: Alles auswählen

2 True
3 Badezimmer
4 media_player.sonos_badezimmer

Meine Automation habe ich nun um folgendes ergänzt um zu prüfen, ob der Wert "masterplayer" innerhalb der Automation überhaupt zur Verfügung steht, bzw. generiert wird:

Code: Alles auswählen

  - service: notify.telegram_an_simon
    data:
      message: Nachricht1 {{ states('input_select.sonos_masterplayer') }}
  - service: notify.telegram_an_simon
    data:
      message: Nachricht2 {{ states('masterplayer') }}
  - service: notify.telegram_an_simon
    data:
      message: Nachricht3 "{{masterplayer}}"
  - service: notify.telegram_an_simon
    data:
      message: Nachricht4 {{'masterplayer'}}
    - service: notify.telegram_an_simon
    data:
      message: Nachricht5 {{masterplayer}}

Output in Telegram:

Code: Alles auswählen

Nachricht1 Badezimmer
Nachricht2 unknown
Nachricht3 ""
Nachricht4 masterplayer
Nachricht5

Komischerweise kann ich in den Entwicklerwerkzeugen den Wert von "masterplayer" problemlos abfragen.

Benutzeravatar
Osorkon
Administrator
Beiträge: 1905
Registriert: Sa 17. Jul 2021, 16:53
2
Wohnort: Langenargen
Has thanked: 60 times
Been thanked: 516 times
Kontaktdaten:

Re: Wert eines Sonos Helfers benutzen

Beitrag von Osorkon »

Sieht doch alles gut aus:

  1. Definition der Variable „masterplayer“
  2. Bedingung input select Auswahl = Badezimmer erfüllt
  3. Den Wert von input select ausgelesen
  4. Aufruf der Variablen „Masterplayer“ = media_player.sonos_badezimmer

Zu Deinen notifies:
Die Variable Masterplayer scheinst Du in der Automatisierung nicht angelegt zu haben:

  1. Der Wert Deines input select
  2. Du kannst kein State von einer Variablen ermitteln, deshalb unknown
  3. Du übergibst einen leeren String in “”. Leer deshalb weil die Variable Masterplayer nicht definiert ist.
  4. Du übergibst den String Masterplayer
  5. Du übergibst die Variable Masterplayer. Da diese nicht existiert, bzw. Nicht definiert ist, ist das Ergebnis ein leerer String.

Lass doch mal bitte Deine aktuelle Automatisierung sehen.

Gruß
Osorkon

Einer muss ja für Ordnung sorgen. :D
Benutzeravatar
Figuhr
Beiträge: 14
Registriert: So 5. Feb 2023, 12:21
1
Has thanked: 1 time

Re: Wert eines Sonos Helfers benutzen

Beitrag von Figuhr »

Code: Alles auswählen

alias: aaa sonos2
description: ""
trigger:
  - platform: state
    entity_id:
      - light.licht_schlafzimmer
    to: "on"
action:
  - service: media_player.join
    data:
      group_members:
        - media_player.sonos_schlafzimmer
    target:
      entity_id:
        - "{{masterplayer}}"
  - service: notify.telegram_an_simon
    data:
      message: Nachricht {{masterplayer}}
variables:
  masterplayer: >
    {% set masterplayer = "media_player.sonos_"+states('input_select.sonos_masterplayer') | lower %}  
mode: single
Benutzeravatar
Osorkon
Administrator
Beiträge: 1905
Registriert: Sa 17. Jul 2021, 16:53
2
Wohnort: Langenargen
Has thanked: 60 times
Been thanked: 516 times
Kontaktdaten:

Re: Wert eines Sonos Helfers benutzen

Beitrag von Osorkon »

@Figuhr wenn Du mal Deine Automatisierung mit der, die ich Dir zur verfügung gestellt habe, vergleichen tust.
Werden Dir vielleicht kleine aber feine Unterschiede auffallen. 😉

Vor allem die Definition der Variablem "masterplayer" ist falsch.

Code: Alles auswählen

alias: aaa sonos2
description: ""
trigger:
  - platform: state
    entity_id:
      - light.licht_schlafzimmer
    from: "off"
    to: "on"
action:
  - service: media_player.join
    data:
      group_members:
        - media_player.sonos_schlafzimmer
    target:
      entity_id: "{{masterplayer}}"
  - service: notify.telegram_an_simon
    data:
      message: Nachricht {{masterplayer}}
variables:
  masterplayer: |
    {{"media_player.sonos_"+states('input_select.sonos_masterplayer') | lower}}

Gruß
Osorkon

Einer muss ja für Ordnung sorgen. :D
Benutzeravatar
Figuhr
Beiträge: 14
Registriert: So 5. Feb 2023, 12:21
1
Has thanked: 1 time

Re: Wert eines Sonos Helfers benutzen

Beitrag von Figuhr »

Ich habe so manche nicht-Übereinstimmung entdeckt und korrigiert. Schlussendlich habe ich deine komplette Automation 1:1 kopiert.

Wenn ich dann auf "Ausführen" klicke bekomme ich per Telegram nur ein

Code: Alles auswählen

Nachricht

gesendet.

Ändere ich die Automation für die Benachrichtigung so:

Code: Alles auswählen

  - service: notify.telegram_an_simon
    data:
      message: Nachricht "{{masterplayer}}"

erhalte ich ein

Code: Alles auswählen

Nachricht "mediaplayer.sonosbadezimmer"

Wo sind jetz Komma und und Unterstriche geblieben?

SCHEIßE, es funktioniert!!!
Die Nachricht funktioniert zwar nicht (warum auch immer) aber Sonos macht jetzt was es soll!!! Der Wahnsinn.

Antworten