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!

I found a blog, https://www.devwithimagination.com/2023/01/21/counting-sensors-in-home-assistant/ , which pointed me in the right direction and subsequently I ended up with this working code

Currently {{ (states.light | selectattr('entity_id', 'in', ['light.0xa4c138643f553454', 'light.0xa4c138d8db3aa654', 'light.0xa4c138df3493b345', 'light.frontroom_lamp']) | selectattr('state', 'eq', 'on') | list | count)+(states.switch | selectattr('entity_id', 'in', ['switch.0xa4c1382764f5a877', 'switch.0xa4c1387c75807865', 'switch.0xa4c138a638208375', 'switch.0xa4c138bfbbe76454_left', 'switch.0xa4c138bfbbe76454_right']) | selectattr('state', 'eq', 'on') | list | count) }}
  lights are on!
  • phobiac@lemmy.world
    link
    fedilink
    English
    arrow-up
    13
    ·
    1 month 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.

    • sabreW4K3@lazysoci.alOP
      link
      fedilink
      English
      arrow-up
      5
      ·
      1 month ago

      I would like to express my massive thanks for the time and effort you put into making me better at Home Assistant. I truly appreciate it. Thank you from me and everyone in the future that may see this and find it helpful.