Documentation for template expand (#9394)

* Documentation for template expand

* ✏️ Tweak
This commit is contained in:
Penny Wood 2019-06-23 01:44:03 +08:00 committed by Franck Nijhof
parent 8d99182d78
commit 4e9d88c40d

View File

@ -33,7 +33,6 @@ We will not go over the basics of the syntax, as Jinja2 does a great job of this
The frontend has a template editor tool to help develop and debug templates. Click on the <img src='/images/screenshots/developer-tool-templates-icon.png' alt='template developer tool icon' class="no-shadow" height="38" /> icon, create your template in the _Template editor_ and check the results on the right.
Templates can get big pretty fast. To keep a clear overview, consider using YAML multiline strings to define your templates:
{% raw %}
@ -54,9 +53,10 @@ script:
## {% linkable_title Home Assistant template extensions %}
Extensions allow templates to access all of the Home Assistant specific states and adds other convenience functions and filters.
Extensions allow templates to access all of the Home Assistant specific states and adds other convenience functions and filters.
### {% linkable_title States %}
- Iterating `states` will yield each state sorted alphabetically by entity ID.
- Iterating `states.domain` will yield each state of that domain sorted alphabetically by entity ID.
- `states.sensor.temperature` returns the state object for `sensor.temperature`.
@ -67,7 +67,6 @@ script:
Besides the normal [state object methods and properties](/topics/state_object/), `states.sensor.temperature.state_with_unit` will print the state of the entity and, if available, the unit.
#### {% linkable_title States examples %}
The next two statements result in the same value if the state exists. The second one will result in an error if the state does not exist.
@ -112,7 +111,6 @@ Other state examples:
```
{% endraw %}
### {% linkable_title Attributes %}
You can print an attribute with `state_attr` if state is defined.
@ -143,8 +141,33 @@ With strings:
```
{% endraw %}
### {% linkable_title Working with Groups %}
The `expand` function and filter can be used to sort entities and expand groups. It outputs a sorted array of entities with no duplicates.
#### {% linkable_title Expand examples %}
{% raw %}
```text
{% for tracker in expand('device_tracker.paulus', 'group.child_trackers') %}
{{ state_attr(tracker, 'battery') }}
{%- if not loop.last %}, {% endif -%}
{% endfor %}
```
{% endraw %}
The same thing can also be expressed as a filter:
{% raw %}
```text
{{ ['device_tracker.paulus', 'group.child_trackers'] | expand
| selectattr("attributes.battery", 'defined')
| join(', ', attribute="attributes.battery") }}
```
{% endraw %}
### {% linkable_title Time %}
- `now()` will be rendered as the current time in your time zone.
- For specific values: `now().second`, `now().minute`, `now().hour`, `now().day`, `now().month`, `now().year`, `now().weekday()` and `now().isoweekday()`
- `utcnow()` will be rendered as UTC time.
@ -156,10 +179,12 @@ With strings:
- Filter `timestamp_custom(format_string, local_boolean)` will convert a UNIX timestamp to a custom format, the use of a local timestamp is default. Supports the standard [Python time formatting options](https://docs.python.org/3/library/time.html#time.strftime).
### {% linkable_title Distance %}
- `distance()` will measure the distance in kilometers between home, entity, coordinates.
- `closest()` will find the closest entity.
#### {% linkable_title Distance examples %}
If only one location is passed in, Home Assistant will measure the distance from home.
{% raw %}
@ -174,12 +199,14 @@ These can also be combined in any combination:
```
{% endraw %}
Find entities closest to the Home Assistant location:
#### {% linkable_title Closest examples %}
The closest function and filter will find the closest entity to the Home Assisant location:
{% raw %}
```text
Query all entities: {{ closest(states) }}
Query all entities of a specific domain: {{ closest('states.device_tracker') }}
Query all entities of a specific domain: {{ closest(states.device_tracker) }}
Query all entities in group.children: {{ closest('group.children') }}
Query all entities in group.children: {{ closest(states.group.children) }}
```
@ -203,11 +230,37 @@ Since closest returns a state, we can combine it with distance too.
```
{% endraw %}
The last argument of the closest function has an implicit `expand`, and can take any iterable sequence of states or entity IDs, and will expand groups:
{% raw %}
```text
Closest out of given entities:
{{ closest(['group.children', states.device_tracker]) }}
Closest to a coordinate:
{{ closest(23.456, 23.456, ['group.children', states.device_tracker]) }}
Closest to some entity:
{{ closest(states.zone.school, ['group.children', states.device_tracker]) }}
```
It will also work as a filter over a iterable group of entities or groups:
```text
Closest out of given entities:
{{ ['group.children', states.device_tracker] | closest }}
Closest to a coordinate:
{{ ['group.children', states.device_tracker] | closest(23.456, 23.456) }}
Closest to some entity:
{{ ['group.children', states.device_tracker] | closest(states.zone.school) }}
```
{% endraw %}
### {% linkable_title Formatting %}
- `float` will format the output as float.
### {% linkable_title Numeric functions and filters %}
Some of these functions can also be used in a [filter](http://jinja.pocoo.org/docs/dev/templates/#id11). This means they can act as a normal function like this `sqrt(2)`, or as part of a filter like this `2|sqrt`.
- `log(value, base)` will take the logarithm of the input. When the base is omitted, it defaults to `e` - the natural logarithm. Can also be used as a filter.
@ -225,6 +278,7 @@ Some of these functions can also be used in a [filter](http://jinja.pocoo.org/do
- Filter `value_one|bitwise_or(value_two)` perform a bitwise or(\|) operation with two values.
### {% linkable_title Regular expressions %}
- Filter `string|regex_match(find, ignorecase=FALSE)` will match the find expression at the beginning of the string using regex.
- Filter `string|regex_search(find, ignorecase=FALSE)` will match the find expression anywhere in the string using regex.
- Filter `string|regex_replace(find='', replace='', ignorecase=False)` will replace the find expression with the replace string using regex.
@ -328,13 +382,13 @@ To evaluate a response, go to the <img src='/images/screenshots/developer-tool-t
## {% linkable_title Some more things to keep in mind %}
### {% linkable_title `entity_id` that begins with a number %}
If your template uses an `entity_id` that begins with a number (example: `states.device_tracker.2008_gmc`) you must use a bracket syntax to avoid errors caused by rendering the `entity_id` improperly. In the example given, the correct syntax for the device tracker would be: `states.device_tracker['2008_gmc']`
### {% linkable_title Templates without entities using `now()` %}
Note that templates that depend on time (`now()`) and do not use any entities will not be updated as it only happens on entity state changes. For more information and examples refer to [`template` sensor documentation](/components/sensor.template/#working-without-entities)
### {% linkable_title Priority of operators %}
The default priority of operators is that the filter (`|`) has priority over everything except brackets. This means that:
@ -346,4 +400,3 @@ The default priority of operators is that the filter (`|`) has priority over eve
{% endraw %}
Would round `10` to 2 decimal places, then divide `states('sensor.temperature')` by that.