Created
March 21, 2025 02:41
-
-
Save ismell/d432a311ae1371cdae251e979c0594e0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
blueprint: | |
name: Distinct Random | |
description: > | |
Creates a sensor which holds a random value from the referenced | |
input_select. When the sensor receives the DISTINCT_UPDATE event, a new | |
random value will be chosen. The random value will be distinct, meaning that | |
a duplicate will not be returned until all options are exhaused. | |
For Example if an Input Select has items: a, b, c | |
On creation the template might contain `a`, then after a refresh it might | |
contain `b`, and then finally `c`. Once the list has been exhausted, the | |
"seen" values will be reset and it will be possible to return a, b, c again. | |
The DISTINCT_UPDATE event must contain `name: "<sensor name>"` for the event | |
to match. | |
domain: template | |
input: | |
reference_entity: | |
name: Input select | |
description: The input_select to use as the source of options. | |
selector: | |
entity: | |
domain: input_select | |
sensor_name: | |
name: Sensor Name | |
description: The name of the new distinct random sensor to create. | |
variables: | |
reference_entity: !input reference_entity | |
sensor_name: !input sensor_name | |
trigger: | |
# Recalculate the state if an option was removed. | |
- trigger: state | |
entity_id: "{{ reference_entity }}" | |
attribute: options | |
# Ideally we would use homeassistant.update_entity | |
# but it's not available for trigger templates. | |
# So we define a new event that needs to be fired. | |
- trigger: event | |
event_type: DISTINCT_UPDATE | |
event_data: | |
name: "{{ sensor_name }}" | |
# Causes the template to render when first created. | |
- trigger: event | |
event_type: event_template_reloaded | |
sensor: | |
- name: "{{ sensor_name }}" | |
state: > | |
{% set seen = (state_attr(this.entity_id, 'seen') | default([], true)) %} | |
{% if trigger.platform == "event" and trigger.event.type == "DISTINCT_UPDATE" %} | |
{% set seen = seen + ([states(this.entity_id)] | reject('eq', 'unknown') | list ) %} | |
{% endif %} | |
{% set available = (state_attr(reference_entity, "options") | reject("in", seen) | list) %} | |
{% if available %} | |
{{ available | random }} | |
{% else %} | |
{{ state_attr(this.entity_id, 'seen') | random }} | |
{% endif %} | |
attributes: | |
trigger: > | |
{{ trigger | pprint}} | |
seen: > | |
{% set seen = (state_attr(this.entity_id, 'seen') | default([], true)) %} | |
{% if trigger.platform == "event" and trigger.event.type == "DISTINCT_UPDATE" %} | |
{% set seen = seen + ([states(this.entity_id)] | reject('eq', 'unknown') | list ) %} | |
{% endif %} | |
{% set available = (state_attr(reference_entity, "options") | reject("in", seen) | list) %} | |
{% if available %} | |
{{ seen }} | |
{% else %} | |
{{ [] }} | |
{% endif %} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment