Entiteiten ophalen per ruimte

Scripts kunnen gebruikt worden in automatiseringen, bijvoorbeeld als actions om dynamisch een groep entiteiten te selecteren voor die actions. Dit voorkomt dat een automatisering aangepast moet worden als bijvoorbeeld een entiteit in een ruimte aangepast wordt.

Wat te denken van het toevoegen van een lamp in een ruimte en die wordt dan automatisch meegenomen in de verlichtings-automatisering voor die ruimte?

Of het vervangen van een bewegings-sensor die dan automatisch opgenomen wordt om de verlichting aan te schakelen?

In onderstaand voorbeeld wordt een script gebruikt om alle sensors en binary_sensors met een attribuut device_class ‘motion’ te selecteren als list in response_variable ‘entities’:

get_room_motion_sensors:
  sequence:
    - variables:
        area: >
          {{ room }}
        entities: >
          {% set sensors = states.sensor |
              selectattr('entity_id', 'in', area_entities(area)) |
              selectattr('attributes.device_class', 'search', 'motion') |
              map(attribute='entity_id') |
            list | join(',') %}

          {% set binary_sensors = states.binary_sensor |
              selectattr('entity_id', 'in', area_entities(area)) |
              selectattr('attributes.device_class', 'search', 'motion') |
              map(attribute='entity_id') |
            list | join(',') %}

          {"sensors":"{{sensors}}","binary_sensors":"{{binary_sensors}}"}
    - stop: "klaar"
      response_variable: "entities"

Als variable wordt ‘area’ gebruikt waarin de naam van de ruimte gebruikt wordt. In de Ontwikkelhulpmiddelen kan de Service getest worden voor de ruimte ‘Kantoor Nico’:


Op dezelfde manier kan met een script, alle lampen in een bepaalde ruimte opgevraagd worden:

get_room_lights:
  sequence:
    - variables:
        area: >
          {{ room }}
        entities: >
          {% set lights = states.light |
              selectattr('entity_id', 'in', area_entities(area)) |
              map(attribute='entity_id') |
            list | join(',') %}
            
          {"lights":"{{lights}}"}
    - stop: "klaar"
      response_variable: "entities"

In de test:

Als area input voor de variable wordt ‘Kantoor Nico’ gebruikt. De output komt in de response_variable ‘lights’.


Een script om de eerste media_player in een bepaalde ruimte op te vragen:

get_room_media_player:
  sequence:
    - variables:
        area: >
          {{ room }}
        media_players: >-
          {% set audio_speaker = states.media_player |
              selectattr('entity_id', 'in', area_entities(area)) |
              map(attribute='entity_id') |
            list | first %}

          {"audio_speaker":"{{audio_speaker}}"}
    - stop: "klaar"
      response_variable: "media_players"