Hilfe: Szenen einen fiktiven Status via Helfer zuweisen?

Hallo an alle,

ich benötige eure Hilfe, da ich mit meinem Vorhaben sprichwörtlich wie der Ochs vorm Berge stehe. Szenen haben in Home Assistant ja keinen Status, man kann sie aktivieren und im Dashboard ist nicht ersichtlich, welche Szene derzeit aktiv ist.

Ich habe je Leuchte jeweils einzelne Standardszenen erstehlt (z.B. Abendlicht). Meine Idee ist, vielleicht über einen input_text Helfer im Dashboard (als vorgegaukelter fiktiver Status) angezeigt zu bekommen, welche Szene bei welcher Leuchte derzeit aktiv ist – tatsächlich zuletzt aktiviert wurde. Probiert habe ich schon die Abfrage des Attributs last_changed, brachte aber kein zufriedenstellendes Ergebnis.

Ich stelle es mir so vor:

  1. input_text Helfer für jede Leuchte erstellen
  2. wenn über das Dashboard eine Szene für eine Leuchte aktiviert wird, wird in den input_text Helfer dieser Leuchte der Name dieser Szene eingetragen, so dass dieser dann auf dem Dashboard angezeigt wird.
  3. wenn an derselben Leuchte eine andere Szene aktiviert wird, dann wird der input_text Helfer mit diesem Namen der neuen Szene überschrieben
  4. wenn die Leuchte ausgeschaltet wird, wird der Helfer geleert, das keine “aktive” Szene mehr angezeigt wird.

Soweit die Theorie, ich haben nur keine Ahnung ob das so funktioniert und vorallem nicht wie?

Offen bliebe damit der Fall, wenn eine Szene aktiviert wurde und man dann Werte wie Farbe oder Helligkeit manuell ändert, diese immernoch als “aktiv” angezeigt werden würde. Für dieses Problem hätte ich noch nichtmal eine Theorie, könnte es aber verschmerzen. :wink:

Vielleicht hat hier jemand eine Idee wie ich das umsetzen könnte und lenkt mich in die richtige Richtung. Bitte nicht wundern, wenn ich nicht sofort auf evtl. Vorschläge reagieren kann. Es kann ein paar Tage dauern, bis ich mich an die Umsetzung machen kann. Aber gerne schon Ideen posten.

Danke im Voraus.

Edit: siehe Kommentar 3. Es sind zigbee2mqtt Szenen.

Wenn du HACS hast dann empfehle ich dir GitHub - hugobloem/stateful_scenes: Stateful Scenes in Home Assistant (Home Kit scene compatible)

Der nimmt dir die ganze Arbeit ab und erstellt automatisch eine Kopie deiner Szene wo du dann die Szenen ein/aus schalten kannst und auch den Status siehst.

2 „Gefällt mir“

@ciddi89 Super, danke für den Tipp!

Da gibt es nur ein kleines Problem und ich hätte es noch dazuschreiben sollen, es sind zigbee2mqtt Szenen. Diese landen nicht in der scenes.yaml und daher geht diese tolle Integration leider bei mir nicht.

Ok das stimmt. Gibt es einen bestimmten Grund die Szenen über Z2M zu verwalten? Hatte es Anfangs auch. Habe diese aber mittlerweile alle in HA übertragen. Wirkliche Unterschiede im auslösen habe ich nicht gemerkt. Und Verwaltungsaufwand ist geringer :slight_smile:

Ja, den Grund kannst du hier nachlesen:

Daher warte ich weiter, vielleicht kommt noch der ein oder andere Tipp. Aber danke dir schon einmal für deine Zeit.

1 „Gefällt mir“

Ich habe nochmal drüber nachgedacht und glaube der von mir angedachte Weg ist zu kompliziert und vielleicht auch nicht wirklich umsetzbar. Vermutlich kam daher auch so wenig Feedback.

Die neue Überlegung ist, die festen Werte (state_attr) brightness und color_temp der jeweiligenen Leuchte abzufragen, die in der entsprechenden Szene gesetzt sind und anhand dieser zu erkennen, dass die Szene aktiv ist.

Beispiel: Szene “Hell” = brightness 255 color_temp 280

Jetzt stehe ich gerade nur auf dem Schlauch, wie ich das am besten bewerkstellige. Lege ich dafür einen sensor, ein template oder irgendetwas anderes an, der die Werte abgleicht und dann evtl. einen helfer aktiviert oder mit bestimmten Text füllt?

Was stellst Du Dir genau vor?
Hier mal ein Möglicher Lösungsansatz.
Die Aktivierte Szene wird als Input Text ausgegeben.
Wird über die GUI manuell die Lichtfarbe/ Dimmlevel oder das Licht eingeschaltet.
Erhält der Input Test den Inhalt “Manuel” Wird das Licht ausgeschaltet, dann “Aus”

Szenen Merker

Gruß
Osorkon

Guten Morgen @Osorkon

Super, dass sieht schon sehr vielversprechend aus! Genau so hatte ich es mir zuerst vorgestellt.

Nur habe ich auch Automationen und physikalische Schalter, die Szenen aktivieren. Das würde der Helfer dann nicht mitbekommen, richtig? Daher habe ich überlegt, da ich ja die festen Werte wie zB. brightness und color_temp der Szenen kenne, diese irgendwie als Bedingung für die Anzeige des „Status“ abzufragen. Also unabhängig worüber die Szene aktiviert wurde bzw. falls man sogar manuell über die Schieberegler die Werte zufällig eingestellt haben sollte.

Ich hoffe ich habe mich verständlich ausgedrückt. Aber vielen Dank schon einmal für deinen Lösungsansatz! Echt super.

Ob du jetzt direkt die Szene aufrufen tust (GUI) oder über eine Automatisierung oder Script, ist egal.

Du kannst das aktivieren der Szene als Auslöser verwenden um den Input Text mit dem Szenen Namen zu füttern.

Werde mal heute Abend die Automatisierung, rein stellen, muss diese nur noch ein wenig aufhüpschen. Hate sie gestern nur mal schnell zusammengeschustert.

Gruß
Osorkon

1 „Gefällt mir“

Hey @Osorkon das wäre super nett! Danke.

Aber wie ist es, wenn beispielsweise nicht die Szene selbst aktiviert wurde, sondern die exakten Werte der Leuchte manuell eingestellt wurden? Dann wird ja die Automation garnicht ausgelöst. Daher die Idee die Werte der einzelnen Szenen als Bedingung, Auslöser oder Status zu nehmen.

Beispiel:
Wenn bei Leuchte A, brightness = 255 und color_temp = 200, dann ist Szene „Leuchte A Tageslicht“ aktiv.

Geht das auch irgendwie?

Hintergrund des ganzen ist Homekit. Ich bin in der Familie der einzige Home Assistant Benutzer. Aus Akzeptanz- und Einfachheits-Gründen nutzen die anderen Homekit. Dort werden Szenen ja auch anhand der Werte erkannt und eingerichtet. Schaltet dort jemand diese Szenen an, werden sie dort aktiv gezeigt. In Home Assistant natürlich nicht, da zwar die Werte der Leuchten eingestellt werden, aber scene.turn_on ja eben nicht. Somit wird der Status der Home Assistant Szene nicht geändert.

Ich weiß ist ein bisschen kompliziert, aber so der Stand bei uns.

Siehe oben das GIF. Das Licht wurde manuell auf Blau geändert. Der Input Text, nimmt dann den Wert manuell an. Auch wenn Du manuell die Lichtfarbe oder den Dimmlevel änderst, wird manuell angezeigt. Wenn Das Licht ausgeschaltet wurde, dann Aus. Du musst nur den Zustand der Lampe als Trigger nehmen und wenn der Zustand der Lampe nicht durch eine Szene geändert wurde, dann → manuell.

Gruß
Osorkon

Das verstehe ich. Nur nehmen wir an, es wurden aber exakt die Werte (Helligkeit und Farbtemp oder Farbe) der Szene manuell eingegeben. Dann würde “manuell” im Helfer ankommen und nicht der Szenen-Name, da diese ja nicht mit scene.turn_on aktiviert wurde. Wohl aber die Leuchte genauso leuchtet. Dies kann eben passieren, wenn Homekit die Leuchte wie oben beschrieben schaltet.

Ich weiß nicht, ob ich mich immer klar genug ausdrücke. Daher sorry, wenn es nicht immer sofort verständlich rüber kommt.

Daher mein Einwurf, ob ich mit dem Helfer für meine Konstellation auf dem falschen Weg war. Ich hatte anhand des obigen Beispiels mit Leuchte A schon daran gedacht, diese Werte mit templating abzufragen und somit den Button/ die Karte (zB. Mushroom Template Card) der Szene mit einer Farbe oder Badge zu versehen, die signalisiert das die Szene aktiv ist. Das wäre zwar sehr aufwändig, aber würde das Szenario abdecken.

Die Syntax für die Abfrage ist mir allerdings auch nicht ganz klar. Ich denke so etwas in der Art, als Beispiel um eine Icon- oder Badge-Farbe zu ändern:

{% if state_attr('light.leuchte_A', 'brightness') == '255' %} and {% if state_attr('light.leuchte_A', 'color_temp') == '200' %}
  cyan
{% endif %}

Bin mir nicht sicher ob das gehen würde. Kann es gerade nicht testen. Wahrscheinlich die Syntax falsch?

Edit: Es sei denn, man kann in deiner Automation nicht den Zustand der Leuchte, sondern diese Attribute (Helligkeit und Farbtemperatur) der Leuchte als Trigger nehmen. Dann ginge es auch mit dem Helfer und ich könnte eine Automation mit unterschiedlichen Werten der unterschiedlichen Szenen, als unterschiedliche Trigger nehmen. Okay, klingt kompliziert.

Dann werfe ich mal den ersten Ansatz über Bord.

Hier mal etwas, dass wahrscheinlich eher Deinen Anforderungen Entspricht.

Als Bsp. habe ich hier das Licht light.wandleuchten als Input Text dient der input_text.szenen_wandleuchten

Damit es Überschaubar bleibt, habe ich zum Abgleich der Szenen nur

  • color
  • brightness

Und zwei Szenen

  • Sonnenuntergang
  • Abendrot

Verwendet.

alias: Szenen Abfrage Wandleuchten
description: ""
trigger:
  - platform: state
    entity_id:
      - light.wandleuchten
    variables:
      entity: 'light.wandleuchten'
condition: []
action:
  - service: input_text.set_value
    metadata: {}
    data:
      value: |
        {% set color = state_attr(entity, 'color') %}
        {% set brightness = state_attr(entity, 'brightness') %}
        {% if trigger.to_state.state == "on" %}
          {% if brightness == 130 and color == {'x': 0.521, 'y': 0.451} %}
          Sonnenuntergang
          {% elif brightness == 102 and color == {'x': 0.582, 'y': 0.399} %}
          Abendrot
          {% else %}
          Manuell  
        {% endif %}
        {% else %}
        Aus
        {% endif %}
    target:
      entity_id: input_text.szenen_wandleuchten
mode: single

Solange das Licht an ist, und color und brightness nicht der 2 definierten Szenen ansprechen, gibt der Input Text Manuell aus. Sobald color und brightness einer der 2 Szenen entspricht, wird der Name der Szene ausgegeben.
Wenn das Licht aus ist, wird Aus ausgegeben.

Gruß
Osorkon

1 „Gefällt mir“

Oh @Osorkon das sieht sehr gut aus.

Herzlichen Dank! Ich werde es ab morgen Abend erst testen können und berichte dann sofort.

Hallo @Osorkon.

Nachdem ich nun eine Nacht drüber geschlafen habe, kam mir die Idee mit deinem Beispiel zu arbeiten und anstatt einen Helfer zu füllen, direkt der Szene einen Status zu setzen. Ich musste dann allerdings feststellen, dass man zwar in den Entwicklerwerkzeugen den Status setzen kann, aber sonst nirgends. Auch nicht mit einer Automation! Glücklicherweise erinnerte ich mich dann an Simons Video zu seiner Waschmaschine und an das folgende, speziell zu dem Python Script Set State:

Und so habe ich es dann auch hinbekommen, dass wenn die entsprechenden Werte der Leuchte eingestellt sind, die Szene den Status “Aktiv” erhält. Ich füge den YAML-Code der Automation hier mal ein. Dieser ist erstmal nur vereinfacht mit einer Szene erstellt:

alias: Test
description: ""
trigger:
  - platform: state
    entity_id:
      - light.testleuchte
    variables:
      entity: light.testleuchte
condition: []
action:
  - choose:
      - conditions:
          - condition: state
            entity_id: light.testleuchte
            attribute: brightness
            state: 255
          - condition: state
            entity_id: light.testleuchte
            attribute: color_temp
            state: 200
        sequence:
          - service: python_script.set_state
            metadata: {}
            data:
              entity_id: scene.testleuchte_1_hell
              state: Aktiv
    default:
      - service: python_script.set_state
        metadata: {}
        data:
          entity_id: scene.testleuchte_1_hell
          state: unknown
mode: single

Vielleicht ist es ja für den ein oder anderen hilfreich, wenn er über dieses Thema stolpert.

Da du so hilfsbereit bist und mich erst in die richtige Richtung gelenkt hast, habe ich deinen Beitrag als Lösung geklickt. Ohne deine Unterstützung hätte ich es nicht geschafft.

1 „Gefällt mir“

Sorry, ich war zu übereifrig. Obiger Code funktioniert so nur mit einer Szene je Leuchte. Bei mehreren Szenen müssten die einzelnen Blöcke der Aktionen für jede Szene mit wenn dann sonst aufgebaut werden:


alias: Test
description: ""
trigger:
  - platform: state
    entity_id:
      - light.testleuchte
    variables:
      entity: light.testleuchte
condition: []
action:
  - if:
      - condition: state
        entity_id: light.testleuchte
        attribute: brightness
        state: 255
      - condition: state
        entity_id: light.testleuchte
        attribute: color_temp
        state: 200
    then:
      - service: python_script.set_state
        metadata: {}
        data:
          entity_id: scene.kuche_testleuchte_1_hell
          state: Aktiv
    else:
      - service: python_script.set_state
        metadata: {}
        data:
          entity_id: scene.kuche_testleuchte_1_hell
          state:
mode: single


Zusätzlich habe ich im else Block bei state das unknown entfernt, da watchman gemeckert hat und mit diesem Status eine missing Entity angezeigt hat. Anstelle von leer könnte sicher auch Aus genommen werden.

Nur zur Info bzgl der Integration strateful scenes: mit den neuen Update wird es in Zukunft für alle Szenen möglich diesen zu nutzen. Heißt also auch die von Z2M bin gespannt und werde es später mal ausprobieren. :slight_smile: damit kann man sich dann auf jedenfall eigene automationen, Helfer und Arbeit sparen. :slight_smile:

1 „Gefällt mir“

Hey @ciddi89 vielen Dank! Sehr interessant.

Würde tatsächlich einiges an Arbeit sparen.

Nachdem ich die Automationen nochmal geändert habe und statt state die Plattform numeric_state verwende, laufen die mit dem python.script allerdings sehr gut und 100% zuverlässig. Wie gesagt, ist es halt nur Arbeit.

1 „Gefällt mir“

Das ist doch sehr gut. :slight_smile: Ja, wollte auch nur Bescheid geben. Vielleicht ist es auch für den ein oder anderen interessant der diesen Beitrag findet.

1 „Gefällt mir“

Ja bestimmt! Ich finde jedwede Information hilfreich. :+1:t2:

1 „Gefällt mir“