Karte zum Anzeigen aller Alexa Media Player/Echo Timer

Ich habe immer wieder den Fall, dass mehrere Timer auf meinem Echo in der Küche oder an anderen Echos laufen. Ich hatte hierfür bisher eine statische Karte, die immer den kürzesten Timer pro einem Gerät angezeigt hat. Da ich grade für die Übersicht meiner Docker Container eh mit der Auto Entity Card gespielt habe, habe ich damit eine Karte für die Echo Timer gebastelt. Da ich da doch ein paar Stunden dran gesessen habe, würde ich sie gerne teilen um vielleicht dem ein oder anderem diese Zeit zu ersparen oder einfach um Inspiration zu geben

Die Karte macht folgendes

  • Sie sammelt alle laufenden Timer von einem über Alexa Media Player eingebundenen Device
  • Sie gibt die Timer mit Restlaufzeit sortiert nach Gerät an
  • Es werden nur die aktiven grade laufenden Timer angezeigt
  • Timer ohne Namen werden als „kein Name“ angezeigt

Für die Karte braucht ihr folgende HACS Plugins:

Auto entities

Template-entity-row

Timer Bar Card

Alexa Media Player

type: custom:auto-entities
card:
  type: entities
filter:
  template: >-
    {%- set echo_boxes = states.sensor
      | selectattr('entity_id', 'search', '_next_timer')
      | rejectattr('state', 'in', ['unknown','unavailable'])
      | map(attribute='entity_id')|unique|sort
      | list -%}
    
    {%- for echo in echo_boxes -%} 
    {%- if loop.index0 > 0 -%} 
      {{{
      "type": "section"
      }}},
    {%- endif -%}
      {{{ 'type': 'custom:template-entity-row',
      "name": state_attr(echo,"friendly_name")|regex_replace(find=" next Timer", replace="", ignorecase=True),
      "state": [],
      "card_mod": {
          "style": ":host{\nfont-weight: bold\n}\nstate-badge {\n  display: none;\n}"
        }
      }}},
    {%- set echo_timer = state_attr(echo,'sorted_active')| from_json -%}
    {%- for key,value in echo_timer -%}              
    {%- set hours = (value.originalDurationInMillis / 3600000) | int -%} 
    {%- set minutes = (((value.originalDurationInMillis /1000) % 3600) / 60)| int -%} 
    {%- set seconds = ((value.originalDurationInMillis /1000)  % 60) | int -%}
    {%- set endtime = (as_datetime((value.triggerTime) / 1000| int(0)) | as_local).isoformat() -%}  
    {%- set duration = '%02d:%02d:%02d' | format(hours, minutes, seconds) -%}  
    {%- if((state_attr(echo,'sorted_active') | from_json)[loop.index0][1].timerLabel is none) -%} 
    {%- set ent = 'kein Name' -%} 
    {%- else -%} 
    {%- set ent = (state_attr(echo,'sorted_active') | from_json)[loop.index0][1].timerLabel -%} 
    {%- endif -%}
    {{{
        "type": "custom:timer-bar-card",
          "entity" : echo,
        "end_time": {
          "fixed": endtime
          },
        "duration": {
          "fixed": duration
          },
        "name": ent,
        "guess_mode": "true",
        "bar_foreground": "#44739d",
        "bar_direction": "ltr",
        "text_width": "5em",
        "bar_background": '#DDDDDD',
        "bar_width": "45%",
        "bar_height": "15px",
        "guess_mode": true,
        "bar_radius": "4px",
        "debug": false  
        }}},
    {%- endfor -%}  
    {%- endfor -%}

Anpassungen

Der Zeitbalken kann natürlich farblich angepasst werden unter “bar_foreground” und “bar_background”.

Ich habe die Karte mit state switch noch so eingestellt, dass sie nur angezeigt wird, wenn auch wirklich ein Timer läuft.

type: custom:state-switch
entity: >-
  {%- set echo_box_count = states.sensor | selectattr('entity_id', 'search',
  '_next_timer') | rejectattr('state', 'in', ['unknown','unavailable']) |
  map(attribute='entity_id')|unique|sort  | list  | count -%} 
  {% if echo_box_count > 0 %} on {% endif %}
states:
  'on':
    type: custom:auto-entities
    card:
      type: entities
    filter:
      template: >-
      ...

Prinzipiell würde das auch mit anderen Geräten/Timer funktionieren, dafür müsste im Code aber viel angepasst werden, da der Alexa Mediaplayer die Timer in einem wundervollen json object versteckt.

1 „Gefällt mir“