FWIW
It is possible to create a template binary sensor to find the state of all the motion sensors in a specified area or list of areas. That would reduce your need to do code maintenance on your groups if you change a sensor’s physical location, but you would still have to do some maintenance updating the entity’s area…
{% set ns = namespace(m_areas = []) %}
{% set x = states.binary_sensor|selectattr('attributes.device_class', 'eq', 'motion')|map(attribute='entity_id')|list %}
{% for y in x %}
{% if area_name(y) == 'Kitchen' %}
{% set ns.m_areas = ns.m_areas + ['{}'.format(states(y))] %}
{% endif %}{% endfor %}
{{ 'on' if 'on' in (ns.m_areas|join(', ')) else 'off'}}
To check a list of areas ( like your “First Floor Motion” example) you would modify the “{% if area_name(y)…” line :
{% if area_name(y) in ['Kitchen', 'Living Room', 'Dining Room'] %}
I don’t know for sure, but I think this approach would use more processing resources than using a group… the template is going to render any time any binary_sensor updates.