Setting up a Message Box in Home Assistant
Home Assistant Script
This has been replaced now with the new improved todo list options.
I wanted a way to store up messages, such as “You have a new voicemail”, which could be read out easily when we get in and be used to flash the lights if we needed to read them. I found a very useful post by “123 Taras” and worked it up to a fairly easy solution.
- Add the template trigger to the Template: section of your Configuration.yaml
- Create a new script using the code below. It is fully prompted and can be tested easily in Dev tools.
- To add a message use call service to call the script and select “create message” with optional id
- Messages with id’s can be removed using “delete message” with the id
- All messages can be removed using “Delete All Messages”
- The macro can be used to list all the messages in a Markdown box or Template Card.
The core is a template sensor controlled by a trigger, which needs to be added to a package or to the configuration.yaml.
Template Trigger:
# ------------------------------------------------------------ Messaging System - trigger: - platform: event event_type: - message_create - message_delete - message_delete_all sensor: - name: Messages state: "{{ now().timestamp() | timestamp_custom() }}" attributes: messages: > {% set msgs = this.attributes.get('messages', []) %} {% if trigger.event.event_type == 'message_create' %} {% set new = [{ "id": trigger.event.data.id | default('TS' ~ now().timestamp()), "title": trigger.event.data.title | default(''), "message": trigger.event.data.message | default(''), "time": now().isoformat() }] %} {{ (msgs + new) }} {% elif trigger.event.event_type == 'message_delete' %} {% if trigger.event.data.id is defined %} {% set msgs = msgs | rejectattr('id', 'eq', trigger.event.data.id) | 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 < msgs|count %} {% set msgs = msgs | rejectattr('id', 'eq', msgs[t].id) | list %} {% endif %} {% endif %} {{ msgs }} {% else %} {{ [] }} {% endif %}
This can add messages and remove them by ID or all messages. In order to make it easy to remember the calls, I created a single Messages Update Script complete with parameters to allow messages to be added, removed etc.
Message update script:
alias: Messages Update sequence: - choose: - conditions: - condition: template value_template: "{{action == 'create_message'}}" sequence: - event: message_create event_data: id: "{{id | default('TS' ~ now().timestamp())}}" title: "{{title}}" message: "{{message}}" - conditions: - condition: template value_template: "{{action == 'delete_message'}}" sequence: - event: message_delete event_data: id: "{{id | default('TS' ~ now().timestamp())}}" - conditions: - condition: template value_template: "{{action == 'delete_all_messages'}}" sequence: - event: message_delete_all event_data: {} mode: single fields: action: name: Action description: Action to take, title and message are only required for Create selector: select: options: - label: Create value: create_message - label: Delete Message By ID value: delete_message - label: Delete All Messages value: delete_all_messages id: name: Message ID description: Optional for Create, mandatory for delete by id selector: text: null title: name: Message Title description: title for message selector: text: null message: name: Message description: Message Text, mandatory for Create only selector: text: null
The script above can be called easily in the Script UI or from the Developers tools. Finally a quick Jinja macro to read the messages or tell you there are none, which can be called direct from an intent or via a script for Alexa.
Jinja Macro to read the messages:
{%- macro read_messages() -%} {% from 'easy_time.jinja' import easy_time %} {% set msgs = state_attr('sensor.messages', 'messages') %} {% set count = msgs| count %} {%- if count == 0 -%} You have no messages. {%- else -%} {% for m in msgs %} Message {{loop.index}} received {{easy_time(m.time) }} ago {{ m.title }}, {{ m.message }}. {%- endfor %} {%- endif -%} {%- endmacro -%}
Note: The above script uses Petro31’s easy_time macros available on HACS to read out how old the message is.