condition: template
value_template: "{{ states.light|selectattr('state','equalto','on')|list|length > 0 }}
And if you want to know which ones in your message:
data:
message: "These lights are on, {{ states.light|selectattr('state','equalto','on')|map(attribute='name')|list|join(', ') }}"
The same thing can be done for the switch domain. Though using both requires a bit of glue logic:
conditions:
- condition: or
conditions:
- condition: template
value_template: "{{ states.light|selectattr('state','equalto','on')|list|length > 0 }}"
- condition: template
value_template: "{{ states.switch|selectattr('state','equalto','on')|list|length > 0 }}"
Or using the shorthand notation:
conditions:
- condition: or
conditions:
- "{{ states.light|selectattr('state','equalto','on')|list|length > 0 }}"
- "{{ states.switch|selectattr('state','equalto','on')|list|length > 0 }}"
And your message:
data:
message: >
{% if states.light|selectattr('state','equalto','on')|list|length > 0 %}
These lights are on, {{ states.light|selectattr('state','equalto','on')|map(attribute='name')|list|join(', ') }}.
{% else %}
No lights are on.
{% endif %}
{% if states.switch|selectattr('state','equalto','on')|list|length > 0 %}
These switches are on, {{ states.switch|selectattr('state','equalto','on')|map(attribute='name')|list|join(', ') }}.
{% else %}
No switches are on.
{% endif %}