this post was submitted on 16 Nov 2024
10 points (100.0% liked)

homeassistant

12080 readers
4 users here now

Home Assistant is open source home automation that puts local control and privacy first. Powered by a worldwide community of tinkerers and DIY enthusiasts. Perfect to run on a Raspberry Pi or a local server. Available for free at home-assistant.io

founded 1 year ago
MODERATORS
 

But it's not working, where did I mess up?

Currently {{ (states.switch | rejectattr('attributes.light.lamp_left', 'defined') | selectattr('state', 'eq', 'on') | list | count)+(states.switch | rejectattr('attributes.light.lamp_right', 'defined') | selectattr('state', 'eq', 'on') | list | count)+(states.switch | rejectattr('attributes.light.hall', 'defined') | selectattr('state', 'eq', 'on') | list | count)+(states.switch | rejectattr('attributes.switch.bedroom', 'defined') | selectattr('state', 'eq', 'on') | list | count)+(states.switch | rejectattr('attributes.switch.kitchen', 'defined') | selectattr('state', 'eq', 'on') | list | count)+(states.switch | rejectattr('attributes.switch.lounge', 'defined') | selectattr('state', 'eq', 'on') | list | count)+(states.switch | rejectattr('attributes.switch.bath_left', 'defined') | selectattr('state', 'eq', 'on') | list | count)+(states.switch | rejectattr('attributes.switch.bath_right', 'defined') | selectattr('state', 'eq', 'on') | list | count) }}
  lights are on!
top 3 comments
sorted by: hot top controversial new old
[–] phobiac@lemmy.world 9 points 1 day ago

I'm trying to word this kindly yet directly, but the whole chain of additions you've done is messed up.

If you just want working code then try the examples in this post but note that you can edit template sensors in the GUI now so directly editing the config file isn't needed. https://community.home-assistant.io/t/trying-to-show-how-many-lights-are-on/527089/12

For an actual explanation of what's going wrong with your code I'll start with this bit, which will not work as written and when fixed doesn't do what you currently are intending it to do.

I highly suggest reading through this page of documentation while looking over this as it will clarify a lot better than I can.

{{ (states.switch | rejectattr('attributes.light.lamp_left', 'defined') | selectattr('state', 'eq', 'on') | list | count) }}

I'd like to work through this backwards:

count is, as the name implies, counting. It'll take an input and then spit out a number. In this case, it's going to count the members of a list piped into it from...

list takes an input object and converts it to a list. In this case it's creating a list from the output of...

selectattr() is a way to filter an input object based on some criteria. For this we're filtering the input for only objects with an attribute named state whose value is equal to on. The result should be a group of entities that have a state listed as on. The input it's filtering from is...

rejectattr() is basically the same as selectattr(), except it removes based on the filtering criteria and outputs everything that didn't match. This is where your code is failing, and it's actually not even necessary for this single line to work. I'm assuming you saw example code that used attributes.entity_id and then you replaced the entity_id portion with your targeted entity. This is failing because the rejectattr() filter is looking for the name of what attribute to filter on and its state. This portion is actually doing absolutely nothing even if it's working, as far as I can tell, because as originally written it would just remove any object with an entity_id named defined. That all said, it's filtering input from...

states.switch, which is a way to reference and get the state result of every entity in the switch domain. There's a whole section in the HA documentation I linked about states and how to get them for templates that is very relevant to what you're doing. In this case, unless your lights are set up as switches, you'd actually want to use states.light.

The end result if you follow this advice will instead give you a single line that counts all lights currently turned on, so no need for adding them all together like your original code. If you only want to know the states of a specific group of your lights then see the forum link from the top of my post that shows how to manually write a group into the template, or alternatively create a helper group in the GUI and reference that.

[–] scrubbles@poptalk.scrubbles.tech 5 points 1 day ago (1 children)

Oh man I can't tell. But, deductive reasoning. Remove half, see if that works. If it does, dive into the other half, otherwise dive into this one. Keep removing half until you found the problem

[–] 9point6@lemmy.world 4 points 1 day ago

This man binary searches