Sprachassistenten sprechen nur, wenn auch jemand im Raum ist

Hallo zusammen,

heute möchte ich mich mal nicht mit einem Problem bei euch melden sondern mit einer Lösung :slight_smile:

Bisher habe ich meine Sprachassistenten, bei mir ist es Alexa über die Alexa Media Player Custom Integration, alle Benachrichtigungen auf allen Geräten gleichzeitig abgespielt. So erschallte im gesamten Haus “Der Geschirrspüler ist fertig” ob jemand im Raum ist oder nicht. Lediglich wurden die Meldungen unterdrückt, wenn keiner da war.

Hat mich schon ein wenig gestört. Somit habe ich an eine Möglichkeit gearbeitet, nur die Alexas sprechen zu lassen, in denen sich auch eine Person aufhält. Da ich in fast allen Räumen Bewegungs- und Präsenzmelder installiert habe kann ich dies ja einfach prüfen.

Da ich mir aber denke, dass es da draußen den ein oder anderen gibt, der dies auch gerne umsetzen würde, habe ich mir gedacht, ich veröffentliche dies mal hier - quasi als kleines Danke, weil die Community mir bei vielen Problemen geholfen hat :slight_smile:

Er es brauchen kann, darf sich bedienen, wer nicht kann weiterklicken :joy:

Das schöne daran ist, dass man an dem eigenen Script kaum was ändern muss, man muss nur zwei Variablen definieren echo_zu_bereich und ziel_liste:

variables:
  # Liste der Echo-Geräte, die grundsätzlich für die Ausgabe in Frage kommen
  ausgabegerate_echos:
    entity_id:
      - media_player.echo_show_buro
      - media_player.echo_show_8_kuche
      - media_player.echo_dot_loft
      - media_player.echo_studio_wohnzimmer
      - media_player.echo_dot_masterbad
      - media_player.echo_flex_toilette
      - media_player.echo_schlafzimmer
      - media_player.echo_dot_keller
  
  # Welches Gerät gehört zu welchem Bereich (Area) oder welcher Logik-Gruppe
  echo_zu_bereich:
    media_player.echo_show_buro: buro
    media_player.echo_show_8_kuche: kuche
    media_player.echo_dot_loft: loft
    media_player.echo_studio_wohnzimmer: wz_kombi # Hier ziehen wir andere Bedingungen heran, da wir hier keinen Präsenz- bzw. Bewegungsmelder haben
    media_player.echo_dot_masterbad: masterbad
    media_player.echo_flex_toilette: gaste_wc
    media_player.echo_schlafzimmer: schlafzimmer
    media_player.echo_dot_keller: check_light # Hier ziehen wir ebenso andere Bedingungen heran, da wir hier auch keinen Präsenz- bzw. Bewegungsmelder haben

  # Erstellen der Ziel-Liste 
  ziel_liste: >-
    {% set aktive_echos = namespace(ids=[]) %} 

# Jedes Gerät wird in der Liste einzeln geprüft
    {% for echo in ausgabegerate_echos.entity_id %}
      {% set mode = echo_zu_bereich.get(echo) %}

# Keller (Nur Ansage, wenn Licht an ist)
      {% if mode == "check_light" %}
        {% if states.light | selectattr('entity_id', 'in', area_entities('legolager')) | selectattr('state', 'eq', 'on') | list | length > 0 %}
          {% set aktive_echos.ids = aktive_echos.ids + [echo] %}
        {% endif %}

# Wohnzimmer (Prüft WZ-Geräte, EZ-Bewegung und Diele-Bewegung)
      {% elif mode == "wz_kombi" %}
# Prüfen, ob im Wohnzimmer Entitäten mit dem Label 'gerate' den Status 'on' aufweisen
        {% set wz_relevante = label_entities('gerate') | intersect(area_entities('wohnzimmer')) %}
        {% set wz_an = states | selectattr('entity_id', 'in', wz_relevante) | selectattr('state', 'eq', 'on') | list | length > 0 %}
        
# Prüfen auf Bewegung/Präsenz im Esszimmer
        {% set ez_an = states.binary_sensor | selectattr('entity_id', 'in', area_entities('esszimmer')) | selectattr('attributes.device_class', 'defined') | selectattr('attributes.device_class', 'in', ['motion', 'occupancy', 'presence']) | selectattr('state', 'eq', 'on') | list | length > 0 %}
        
# Prüfen auf Bewegung/Präsenz in der Diele EG
        {% set diele_an = states.binary_sensor | selectattr('entity_id', 'in', area_entities('diele_eg')) | selectattr('attributes.device_class', 'defined') | selectattr('attributes.device_class', 'in', ['motion', 'occupancy', 'presence']) | selectattr('state', 'eq', 'on') | list | length > 0 %}
        
# Wenn in einem der drei Bereiche Aktivität ist, Echo zur Liste hinzufügen
        {% if wz_an or ez_an or diele_an %}
          {% set aktive_echos.ids = aktive_echos.ids + [echo] %}
        {% endif %}

# Die Standard-Logik: Für alle anderen Bereiche (Büro, Küche, etc.)
      {% elif mode is not none %}
# Alle Bewegungs-/Präsenzsensoren des jeweiligen Bereichs suchen
        {% set sensoren = states.binary_sensor | selectattr('entity_id', 'in', area_entities(mode)) | selectattr('attributes.device_class', 'defined') | selectattr('attributes.device_class', 'in', ['motion', 'occupancy', 'presence']) | list %}
        
# Falls Sensoren existieren, prüfen ob einer auf 'on' steht
        {% if sensoren | length > 0 %}
          {% if sensoren | selectattr('state', 'eq', 'on') | list | length > 0 %}
            {% set aktive_echos.ids = aktive_echos.ids + [echo] %}
          {% endif %}
# Falls gar keine Sensoren im Bereich vorhanden sind, Echo sicherheitshalber immer aktivieren
        {% else %}
          {% set aktive_echos.ids = aktive_echos.ids + [echo] %}
        {% endif %}
      {% endif %}
    {% endfor %} 

# Ergebnis-Ausgabe: Wenn aktive Echos gefunden wurden, nimm diese. Wenn alles leer ist, nimm alle (Backup)
    {{ aktive_echos.ids if aktive_echos.ids | length > 0 else ausgabegerate_echos.entity_id }}

Jetzt brauchen wir nur noch die Meldung in unserer Aktion definieren:

action: notify.alexa_media
metadata: {}
data:
  target: "{{ ziel_liste }}" # Hier stehen alle Echos drin, die oben ermittelt wurden
  data:
    type: announce # Mitteilung wird als Ankündigung ausgegeben
    method: all
  message: Die Waschmaschine ist fertig # Die Benachrichtigung die ich ausgeben will.

ANMERKUNG:
Natürlich ist es nun sehr spezifisch auf meine Bedürfnisse eingestellt. Aber ich hoffe es hilft den ein oder anderen weiter, ich habe auch versucht jeden Bereich des Scriptes kenntlich zu machen, so dass es mit ein bisschen Fleißarbeit gut anpassbar ist.

Ich selber nutze dies in allen meinen “Alexa-Benachrichtigungen” und es funktioniert sehr gut für mich. Ich habe es auch in meiner eigenen Lösung zu Simons Tutorial Home Assistant Benachrichtigungen, wenn du heimkommst! - #19 von deladusde integriert.

Fragen versuche ich natürlich so gut wie möglich zu beantworten…

Gruß
Dennis

1 „Gefällt mir“