My impression is that there’s no threshold beyond which a Feature Request ‘wins the lottery’ and becomes implemented. I feel the odds of that happening largely depend on how much a Feature Request piques a developer’s interest.
In recent 0.85.x changes, entity_id: all is required to target all entities of a particular domain. The following warning appears in the log if entity_id: all is not specified:
"Not passing an entity ID to a service to target all entities is deprecated. Use instead: entity_id: "all."
Therefore, I feel that it is even more useful and appropriate to implement an “EXCLUDE” feature.
The use case is simple:
- service: light.turn_off
entity_id: all
exclude: light.porch_light
This would greatly simplify configurations and for users such as myself with many devices, would be of great value. Putting lights (and other devices) into internal and external groups is a poor workaround at best, while this method would be far more scalable and flexible in my opinion and does not appear to be overly complex to implement.
Maybe this also comes close to what you request. It’s a way to create groups excluding members of other groups. You could then use the new group to turn off your lights (minus the few excluded ones). And you can use the groups in triggers, too, if you like.
this probably works … but the idea is to have a simple way to do this where any user can understand.
The way I described my use case seems super simple and fast and I don’t think it would take much to implement, although I’m not a dev, so if there is a caveat then someone would have to explain it to me.
I’ll like also to see this implemented , I usually turn off all lights when I tell Alexa “Good Night”, but I want the security lights in the garden to remain on…
Now that 0.104 is out and the default group.all_entity feature has been removed, the need for exclusions is potentially greater.
Using “entity: all” is great for service calls but now “all” groups need to be manually created and worse, maintained.
For example, Consider a user who has manually created a new group.all_lights in 0.104.0 and wishes to use this group as a trigger.
- alias: 'An automation'
trigger:
platform: state
entity_id: group.all_lights
exclude: light.porch_lights, light.driveway_lights
to: 'on'
for:
hours: 12
This user’s config could be more-easily managed if exclusions were implemented; however, without exclusions, the user must maintain separate groups, resulting an onboarding/offboarding process for all new lights.
Manually maintaining separate groups introduces a lot of unnecessary administrative overhead.
Maybe somebody is looking to switch off lights, switches etc… I was looking for a good way and now I’ve found this too… but in case somebody finds this useful with the formatting…
- service: light.turn_off
data_template:
entity_id: >-
{% set domain = 'light' %}
{% set state = 'on' %}
{% set compare = 'eq' %}
{% set filter =['nothing to exclude'] %}
{% set MyVal= states[domain] | selectattr('state',compare, state)
| rejectattr('entity_id','in', filter)
| rejectattr('attributes.is_hue_group', '==' , true)
| map(attribute='entity_id')
| join(',')
%}
{% if MyVal.count('.') >=1 %}
{{ MyVal }}
{% else %}
light.dummy
{% endif %}
- service: switch.turn_off
data_template:
entity_id: >-
{% set domain = 'switch' %}
{% set state = 'unavailable' %}
{% set compare = 'ne' %}
{% set filter =['switch.57281806d8bfc004de91_1'] %}
{% set MyVal= states[domain] | selectattr('state',compare, state)
| rejectattr('entity_id','in', filter)
| rejectattr('attributes.is_hue_group', '==' , true)
| map(attribute='entity_id')
| join(',')
%}
{% if MyVal.count('.') >=1 %}
{{ MyVal }}
{% else %}
switch.dummy
{% endif %}
- service: media_player.turn_off
data_template:
entity_id: >-
{% set domain = 'media_player' %}
{% set state = 'off' %}
{% set compare = 'ne' %}
{% set filter =['nothing-to-exclude'] %}
{% set MyVal= states[domain] | selectattr('state',compare, state)
| rejectattr('entity_id','in', filter)
| rejectattr('attributes.is_hue_group', '==' , true)
| map(attribute='entity_id')
| join(',')
%}
{% if MyVal.count('.') >=1 %}
{{ MyVal }}
{% else %}
media_player.dummy
{% endif %}
It should be self explaining. At the beginning you tell what Domain, eq or ne of status, and an exception list. I’m able to switch off all lights except them in the bedroom. I hope somebody finds this useful too.
With the mediaplayers I’m not finished at the moment it works, but they have playing, pause on off etc… so checking for on is not usefull… so I’m checking for not off
Cool! Question: How do we format multiple entities in the exclude list? Also, can you explain what the ‘in’ and ‘hue’ references do here? rejectattr('entity_id','in', filter) | rejectattr('attributes.is_hue_group', '==' , true)
OK, the HUE-GROUP is only for lights important. in HUE you can group and if you turn a group off, all lights will go off. So I exclude them all. [ ‘multi1’,‘multi2’,‘multi3’ ] it’s too easy and that’s the reason I like this solution, hope that helps
I would love this as well.
At night I turn off all switches (about 30) but I have one I want to exclude. I would like to use the all switches group and just exclude the one specific switch instead of turning off all switches at the same time.
An other option would be a group of groups except the specific entity.
This is super frustrating. The ability to create custom groups where we can include whatever we’d like. That a light can only be part of one room/group (outside of hue – I use smart dimmers/switches) is sad.
My solution was to remove the device from the home. Now when I say Turn off all lights, it excludes those.
Example use case: turn off all upstairs lights, except for the guest bedroom.
Groups are not a good solution because you end up duplicating groups like “upstairs lights” many times minus the exclusion list for each specific use case, more or less defeating the purpose of groups. It would be easier to exclude one-offs as needed and otherwise use the same group (upstairs lights) everywhere.
More generally, the decision to use allowslist vs. excludelist in software engineering should depend on which is more concise. In my case, it is much more concise to say “all upstairs lights, except this one light” than to list all upstairs light groups with the one group I want to skip omitted.
For now I usually use the same workaround as @AllThings_Moo , removing whole rooms from the floor, but this means when I try to turn off upstairs lights that room is skipped. In some cases I do manually list all rooms except the one I want effected. Either way is clunky and doesn’t scale.
I actually wound up using a Label to get around this. I personally leave my Kitchen Cabinet LEDs on dim overnight - that way I don’t need to turn on all my lights if I get up to grab some water.
I created one group called “Lights” that contains everything (I have a dashboard that shows me what lights in this group are turned on) and one called “Lights Off Allowed” - which I leverage for scripts/scenes/autmations.
For example, my Bedtime scene turns off all lights in my “Lights Off Allowed” - leaving my Kitchen Cabinet lights alone