15 KiB
Executable File
layout | title | description |
---|---|---|
page | Jinja Scripts for Curious Minds | Bunch of Jinja2 scripts to help you understand your way around Home Assistant |
Jinja code for Ninjas
1. To see which entities are exposed to your alexa platform, run the following script
The following entities are exposed to Alexa platform via emulated_hue_hidden
:
{% raw %}
{{ "-".ljust(50, '-') }} {{ "-".ljust(30, '-') }}
{{ "Entity ID".ljust(50, ' ') }} {{ "Name".ljust(30, ' ') }}
{{ "-".ljust(50, '-') }} {{ "-".ljust(30, '-') }}
{%- for item in states-%}
{%- if item.attributes.emulated_hue_hidden %}
{{ item.entity_id.ljust(50, ' ') }} {{ item.name }}
{%- endif -%}
{%- endfor %}
{{ "-".ljust(50, '-') }} {{ "-".ljust(30, '-') }}
{% endraw %}
Here is the sample output of the above script:
-------------------------------------------------- ------------------------------
Entity ID Name
-------------------------------------------------- ------------------------------
input_boolean.do_not_disturb Do Not Disturb
input_boolean.home_assistant_restart Home Assistant
light.dinette Kitchen Light
light.family_room Family Room Lights
light.master_bedroom Master Bedroom Lights
light.office_room_light Office Room Light
switch.wemobackyardlightswitch Backyard Lights
switch.wemofrontporchlightswitch Front Porch Lights
switch.wemoswitch1 Front Room Light
-------------------------------------------------- ------------------------------
2. To generate template sensors based on the device_trackers, run the following script and copy the output and use it in your code
Copy the output of the code in your dev-templates, and use it in your code directly
{% raw %}
- platform: template
sensors:
{% for state in states.device_tracker -%}
{% if loop.first %}{% elif loop.last %}
{% else %}
{% endif %} {{state.entity_id|replace("device_tracker.","") -}}_template:
value_template: {{ '"{% if is_state' }}('{{-state.entity_id -}}', 'home') {{'%}online{% else %}offline{% endif %}"'}}
friendly_name: "{{ state.attributes.friendly_name|title|replace("_"," ",) if state.attributes.friendly_name is defined else state.name|title|replace("_"," ",) }}"
icon_template: {{ '"{% if is_state' }}('{{-state.entity_id -}}', 'home') {{'%}mdi:check-circle{% else %}mdi:alert-circle{% endif %}"'}}
{% endfor %}
{% endraw %}
Here is the sample output of the above script:
{% raw %}
suresh_suresh_template:
value_template: "{% if is_state('device_tracker.suresh_suresh', 'home') %}online{% else %}offline{% endif %}"
friendly_name: "Suresh"
icon_template: "{% if is_state('device_tracker.suresh_suresh', 'home') %}mdi:check-circle{% else %}mdi:alert-circle{% endif %}"
srinika_srinika_template:
value_template: "{% if is_state('device_tracker.srinika_srinika', 'home') %}online{% else %}offline{% endif %}"
friendly_name: "Srinika"
icon_template: "{% if is_state('device_tracker.srinika_srinika', 'home') %}mdi:check-circle{% else %}mdi:alert-circle{% endif %}"
{% endraw %}
...more entries!
3. Group & Entities:
To see the list of groups
, and the entities that belong to the group, run this script
{% raw %}
{% for group in states.group%}
Group Name: {{ group.name }}, Entity ID: {{ group.entity_id }}
{{ "-".ljust(50, '-') }} {{ "-".ljust(30, '-') }}
{% for entity in group.attributes.entity_id|list() %}
{{- entity }}
{% endfor %}
{% endfor %}
{% endraw %}
Here is the sample output of the above script:
Group Name: Date Time, Entity ID: group.date_time
-------------------------------------------------- ------------------------------
sensor.time
sensor.date
binary_sensor.workday_sensor
sensor.ha_installed_version
sensor.ha_current_version
sensor.ha_last_restart
Group Name: Door Sensors, Entity ID: group.door_sensors
-------------------------------------------------- ------------------------------
binary_sensor.ecolink_door_sensor_sensor
binary_sensor.ecolink_door_sensor_sensor_2
...more entries!
4. To see all the Entities and corresponding attributes all in one place, run this script:
{% raw %}
{{ "_".ljust(90, "_") }}
{{ "Entity ID".ljust(50) }}{{ "Entity Name" }}
{{ "Attribute Name".ljust(50) }}{{ "Attribute Value" }}
{% for item in states %}
{{ "_".ljust(90, "_") }}
{{ item.entity_id.ljust(50) }}
{{ "State".ljust(50) }}: {{ item.state}}
{{ "Domain".ljust(50) }}: {{ item.domain}}
{{ "Object ID".ljust(50) }}: {{ item.object_id}}
{{ "Last Updated".ljust(50) }}: {{ item.last_updated}}
{{ "Last Changed".ljust(50) }}: {{ item.last_changed}}
{%- for attrib in item.attributes|sort() %}
{%- if attrib is defined %}
{{attrib.ljust(50)}}: {{ item.attributes[attrib] }}
{%- endif %}
{%- endfor %}
{%- endfor %}
{% endraw %}
The following is the sample output of the above script:
__________________________________________________________________________________________
automation.alert_low_battery_level_of_sensors
State : on
Domain : automation
Object ID : alert_low_battery_level_of_sensors
Last Updated : 2017-09-14 00:19:00.697024+00:00
Last Changed : 2017-09-14 00:19:00.697024+00:00
friendly_name : Alert Low Battery Level of Sensors
icon : mdi:arrow-right-drop-circle
last_triggered : None
__________________________________________________________________________________________
automation.alert_super_heavy_winds
State : on
Domain : automation
Object ID : alert_super_heavy_winds
Last Updated : 2017-09-14 00:19:00.739659+00:00
Last Changed : 2017-09-14 00:19:00.739659+00:00
friendly_name : Alert Super Heavy Winds
hidden : True
icon : mdi:arrow-right-drop-circle
last_triggered : None
...more entries!
5. Temperature Conversion
Sample code that uses macros to convert temperature from Fahrenheit to Centigrade and vice versa
{% raw %}
{%- macro F2C(temperature) -%}
{% set tmp = (((temperature - 32) *5)/9) %}
{{- " %0.2f" % tmp }}
{%- endmacro -%}
{%- macro C2F(temperature) -%}
{% set tmp = (((temperature *9) /5) + 32) %}
{{- " %0.2f" % tmp -}}
{%- endmacro -%}
75.00 degrees of Fahrenheit is equal to: {{- F2C(75.00) }} Centigrade
23.89 degrees of Centigrade is equal to: {{- C2F(23.89) }} Fahrenheit
{% endraw %}
5.a Humidex Calculation
You can calculate the humidex based on Temperature and Relative Humidity using the following jinja macro
{% raw %}
{% macro humidex(T, H) %}
{% set t = 7.5*T/(237.7+T) %}
{% set et = 10**t %}
{% set e= 6.112 * et * (H/100) %}
{% set humidex = T+(5/9)*(e-10) %}
{% if humidex < T %}
{% set humidex = T %}
{% endif %}
{{humidex}}
{% endmacro %}
{{ humidex(23,45) }}
{% endraw %}
Here is the output of the above script:
75.00 degrees of Fahrenheit is equal to: 23.89 Centigrade
23.89 degrees of Centigrade is equal to: 75.00 Fahrenheit
6. Trigger Data in Automations
Ever wondered what trigger data is available for you when writing automations? Just copy the mqtt.publish service below and put it in any of your automation action section, and it will dump all the attributes and information related to trigger, and state into your mqtt with a topic name "/dump/platform" .
Pre-requisite is to have MQTT configured in your Home Assistant. Use tools like mqttfx
to browse mqtt data.
Hope you find it useful!
{% raw %}
- alias: Light Bulb State Change
trigger:
platform: state
entity_id: light.dinette
action:
- service: mqtt.publish
data_template:
topic: '/dump/{{ trigger.platform }}'
retain: false
payload: >-
{%- macro dumpState(statePrefix, stateObj) -%}
{{statePrefix ~ ": "}} {{- stateObj.state }}{{- "\n" -}}
{{statePrefix ~ ".entity_id: "}} {{- stateObj.entity_id }}{{- "\n" -}}
{{statePrefix ~ ".domain: "}} {{- stateObj.domain }}{{- "\n" -}}
{{statePrefix ~ ".object_id: "}} {{- stateObj.object_id }}{{- "\n" -}}
{{statePrefix ~ ".name: "}} {{- stateObj.name }}{{- "\n" -}}
{{statePrefix ~ ".last_updated: "}} {{- stateObj.last_updated }}{{- "\n" -}}
{{statePrefix ~ ".last_changed: "}} {{- stateObj.last_changed }}{{- "\n" -}}
{%- for attrib in stateObj.attributes | sort() %}
{%- if attrib is defined -%}
{{- statePrefix ~ ".attributes." ~ attrib ~ ": " -}} {{- stateObj.attributes[attrib] -}}
{{- "\n" -}}
{%- endif -%}
{%- endfor -%}
{%- endmacro -%}
{% set p = trigger.platform %}
{{"trigger.platform: "}} {{ p }}{{- "\n" -}}
{%- if p == "mqtt" -%}
{{"trigger.topic: "}} {{ trigger.topic }}{{- "\n" -}}
{{"trigger.payload: "}} {{ trigger.payload }}{{- "\n" -}}
{{"trigger.payload_json: "}} {{ trigger.payload_json }}{{- "\n" -}}
{{"trigger.qos: "}} {{ trigger.qos }}{{- "\n" -}}
{%- endif -%}
{%- if p == "event" or p == "sun" or p == "zone" -%}
{{"trigger.event: "}} {{ trigger.event }}{{- "\n" -}}
{%- endif -%}
{%- if p == "numeric_state" -%}
{{"trigger.above: "}} {{ trigger.above }}{{- "\n" -}}
{{"trigger.below: "}} {{trigger.below }}{{- "\n" -}}
{%- endif -%}
{%- if p == "state" -%}
{{"trigger.for: "}} {{ trigger.for }}{{- "\n" -}}
{%- endif -%}
{%- if p == "time" -%}
{{"trigger.now: "}} {{ trigger.now }}{{- "\n" -}}
{%- endif -%}
{%- if p == "zone" -%}
{{"trigger.zone: "}} {{ trigger.zone }}{{- "\n" -}}
{%- endif -%}
{%- if p == "state" or p == "numeric_state" or p == "template" or p == "zone" -%}
{{"trigger.entity_id: "}} {{ trigger.entity_id }}{{- "\n" -}}{{- "\n" -}}
{{"trigger.from_state: "}} {{- "\n" -}}
-------------------{{- "\n" -}}
{{ dumpState("trigger.from_state", trigger.from_state) }} {{- "\n" -}}
trigger.to_state:{{- "\n" -}}
-----------------{{- "\n" -}}
{{ dumpState("trigger.to_state", trigger.to_state) }}
{%- endif -%}
{% endraw %}
7. List every possible entity and corresponding attributes
You can pick and choose which entity you want to get attributes by changing the domains list. For ex, to see camera related entries, just add states.camera
to the list.
{% raw %}
{{ "_".ljust(90, "_") }}
{%- set domains = [states.light, states.switch, states.automation, states.device_tracker, states.group, states.media_player, states.proximity, states.script, states.zone, states.zwave, states.sensor, states.calendar ] %}
{{ "Entity ID".ljust(50) }}{{ "Entity Name" }}
{%- for domain in domains -%}
{% for item in domain %}
{{ "_".ljust(90, "_") }}
{{ item.entity_id.ljust(50) }}{{ item.name }}
{% for attrib in item.attributes %}
{%- if attrib is defined %}
{{attrib.ljust(50)}}: {{ item.attributes[attrib] }}
{%- endif %}
{%- endfor %}
{%- endfor %}
{%- endfor %}
{% endraw %}
8. Find out which zwave device checked in at when
To find out when was the last time a zwave device has communicated with the controller, run the script below
{% raw %}
{%- macro zwave_check() -%}
{% for item in states.zwave %}
{%- set seconds = (((as_timestamp(now()) | int) - as_timestamp(strptime(item.attributes.receivedTS | string | truncate(19,True,'',0),'%Y-%m-%d %H:%M:%S:%f')) | int)) %}
{%- set minutes = (seconds /60) -%}
{%- set hours = (seconds /3600) -%}
{%- if seconds < 60 %}
{{ item.name.ljust(40) }} - {{ seconds }} seconds ago
{%- elif seconds > 60 and seconds <= 3600 %}
{{ item.name.ljust(40) }} - {{ '%0.2f' % minutes }} minutes ago
{%- elif seconds > 3600 %}
{{ item.name.ljust(40) }} - {{ '%0.2f' % (hours) }} hours ago
{%- endif %}
{%- endfor %}
{%- endmacro -%}
{% set output = zwave_check() %}
{% if output | trim == "" %}
No device has checked in the last 10 minutes.
{% else %}
Here are the devices that have checked in the last 10 minutes:
{{ output }}
{% endif %}
{% endraw %}
9. Word Wrapping long text into multiple lines:
To wrap text to a certain number of characters, use the following script:
{% raw %}
{% set long_text = "this is a long text. I mean it is a really really really long text. The code below should create multiple lines with each line length is limited to 32 characters." %}
{%- for item in (long_text | wordwrap(32, true, "|")).split("|") %}
{{item}}
{%- endfor %}
{% endraw %}
10. To get attrbutes of a given entity_id
Fun stuff...
{% raw %}
{% set entity_id = "automation.alarm_clock" %}
{{ entity_id }}
{{ states[entity_id.split('.')[0]] }}
{{ states[entity_id.split('.')[0]] | list }}
{{ states[entity_id.split('.')[0]][entity_id.split('.')[1]] }}
{{ (states[entity_id.split('.')[0]][entity_id.split('.')[1]]).attributes.friendly_name }}
{{ (states[entity_id.split('.')[0]][entity_id.split('.')[1]]).attributes["friendly_name"] }}
{% endraw %}
11. To get the current list of domains you use in your Home Assistant Setup, run the script below:
{% raw %}
{{ states | map(attribute='domain') |list | unique | list}}
{% endraw %}
The way the above script works is it iterates through all the entities, and retrieves the domain
attribute of each of the entity, and makes it a list by removing duplicate items - by doing so, you will get unique list of domains that your Home Assistant uses 😄
12. Automatic Group
creator
Run the following script to automatically create groups sorted by the domain
{% raw %}
{%- macro plural(name) -%}
{%- if name[(name|length|int -1):] == "y" -%}
{{- name[:-1] -}}ies
{%- else -%}
{{- name -}}s
{%- endif -%}
{%- endmacro -%}
group:
{% for item in states | map(attribute='domain') |list | unique | list %}
{{ plural(item) }}:
entities:
{%- for x in states if x.domain == item %}
{{ x.entity_id }}
{%- endfor %}
{% endfor %}
{% endraw %}
12. To sum up list of attribute values in a list
something like this will work: ```
{% raw %}
{% set people = [{'name':'john', 'experience':15}, {'name':'steve', 'experience':10}, {'name':'will', 'experience':12}, {'name':'tinkerer', 'experience':25}] %}
Combined experience: {{ people | sum(attribute='experience') }} years
{% endraw %}
It returns Combined experience: 62 years
Got any questions or found issues, let me know! Thanks!