blueprint:
  name: Create device class groups by room and class itself
  description: >-
    A script that sends an actionable notification with a confirmation before
    running the specified action.
  domain: script
  input: 
    areas:
      selector:
        object:
      default: []
    device_classes:
      selector:
        object:
      default: []

mode: restart

sequence:
  - variables:
      areas: !input areas
      device_classes: !input device_classes
      num_areas: >-
        {{ areas|length if areas is not string and areas is iterable else 0 }}
      num_device_classes: >-
        {{ device_classes|length if areas is not string and device_classes is iterable else 0 }}
  - repeat:
      while: "{{ repeat.index <= num_device_classes }}"
      sequence:
        - variables:
            device_class: "{{ device_classes[ repeat.index - 1 ] }}"
        - choose:
            conditions: "{{ states|selectattr('attributes.device_class', 'eq', device_class)|list|length > 0 }}"
            sequence: 
              - service: group.set
                data:
                  object_id: "{{ device_class }}"
                  add_entities: "{{ states|selectattr('attributes.device_class', 'eq', device_class)|map(attribute='entity_id')|list }}"
              - repeat:
                  while: "{{ repeat.index <= num_areas }}"
                  sequence:
                    - variables:
                        area: "{{ areas[ repeat.index - 1 ] }}"
                        area_entities: >-
                          {% set entities = namespace(list=[]) %}
                          {% for entity in expand('group.' + device_class) if area_name(entity.entity_id) == area %}
                            {% set entities.list = entities.list + [ entity.entity_id ] %}
                          {% endfor %}
                          {{ entities.list }}
                    - choose:
                        conditions: "{{ area_entities|length > 0 }}"
                        sequence:
                          - service: group.set
                            data:
                              object_id: "{{ area.replace(' ', '_')|lower + '_' + device_class }}"
                              add_entities: "{{ area_entities }}"