Conserve order of button presses for automation

Here’s a Trigger-based Template Sensor that allows you to use custom events to add/delete room names to/from a list. Each room name also includes the time when it was added. A Trigger-based Template Sensor retains its data after a restart.

template:
  - trigger:
      - platform: event
        event_type:
          - room_add
          - room_delete
          - room_delete_all
    sensor:
      - name: Rooms
        state: "{{ now().timestamp() | timestamp_custom() }}"
        attributes:
          rooms: >
            {% set rooms = this.attributes.get('rooms', []) %}
            {% if trigger.event.event_type == 'room_add'
              and trigger.event.data.room is defined
              and trigger.event.data.room | length > 0 %}
              {% set new = [{
                  "name": trigger.event.data.room,
                  "time": now().isoformat() }] %}
              {{ (rooms + new) }}
            {% elif trigger.event.event_type == 'room_delete' %}
              {% if trigger.event.data.room is defined %}
                {% set rooms = rooms | rejectattr('name', 'eq', trigger.event.data.room) | list %}
              {% elif trigger.event.data.index is defined and trigger.event.data.index | is_number %}
                {% set t = trigger.event.data.index | int(0) - 1 %}
                {% if 0 <= t < rooms|count %}
                  {% set rooms = rooms | rejectattr('name', 'eq', rooms[t].name) | list %}
                {% endif %}
              {% endif %}
              {{ rooms }}
            {% else %}
              {{ [] }}
            {% endif %}

Here are the three custom events for managing rooms (for example, each one of your Button cards would use its call_action option to post a room_add event):

1. room_add

Add a room to the list.

Example

  - event: room_add
    event_data:
      room: kitchen

2. room_delete

Delete a room by either its name or index value (i.e. its index position in the list of all messages). Index values start with 1 (not 0).

Example by name

  - event: room_delete
    event_data:
      name: kitchen 

Example by index

  - event: room_delete
    event_data:
      index: 1

3. room_delete_all

Deletes all rooms in the list.

Example

  - event: room_delete_all

Here’s a simple template to list all room names separated by commas:

{{ state_attr('sensor.rooms', 'rooms') 
  | map(attribute='name') | list | join(', ') }}


NOTE

This Trigger-based Template Sensor is based on a similar one I had created for an entirely different purpose. The other one was well tested but this one is not. While adapting it to your needs I may have made a mistake or two so be sure to test it thoroughly and let me know if you encounter any bugs.


EDIT

Correction. Overlooked to rename messages to rooms.

1 Like