Now many issues became more clear.
Thanks a lot for explanations.
As I can see, if a user is interested in a specific “entity_id
” he is supposed to change it via UI only ONCE right after creation of the sensor - or this “entity_id
” should be defined by the “name
” option ONCE and FOREVER (like with the old format - once and forever, otherwise the history will be lost).
If you care about history, yes
Keep in mind, if you change an entity_id, the history is not lost. Change the entity_id back and you get your history back.
Yes, but with a gap.
(Hopefully) not likely.
yup.
IMHO w/o using UI with the new format, in some cases specifying friendly names is not a big deal.
Assume we have 15 similar sensors, for them I need to specify friendly names.
Old format:
For these similar sensors I use a code-generator:
{% set OBJECTS = [
"object_1",
"object_2",
...
"object_15"
] %}
{% set code_sensor = '
test_{0}:
friendly_name: "Service: {0}"
value_template: >-
{{{{ ... }}}}
' %}
sensor:
- platform: template
sensors:
{%- for object in OBJECTS -%}
{{ code_sensor.format(object) }}
{%- endfor %}
The generated code is:
sensor:
- platform: template
sensors:
test_object_1:
friendly_name: "Service: object_1"
value_template: >-
{{ ... }}
test_object_2:
friendly_name: "Service: object_2"
value_template: >-
{{ ... }}
...
test_object_15:
friendly_name: "Service: object_15"
value_template: >-
{{ ... }}
New format:
The code-generator:
{% set OBJECTS = [
"object_1",
"object_2",
....
"object_15"
] %}
{% set code_sensor = '
- name: test_{0}:
state: >-
{{{{ ... }}}}
' %}
{% set code_customize = '
sensor.test_{0}:
friendly_name: "Service: {0}"
' %}
template:
- sensor:
{%- for object in OBJECTS -%}
{{ code_sensor.format(object) }}
{%- endfor %}
########################################################
homeassistant:
customize:
{%- for object in OBJECTS -%}
{{ code_customize.format(object) }}
{%- endfor %}
The generated code is:
template:
- sensor:
- name: test_object_1:
state: >-
{{ ... }}
- name: test_object_2:
state: >-
{{ ... }}
- name: test_object_15:
state: >-
{{ ... }}
########################################################
homeassistant:
customize:
sensor.test_object_1:
friendly_name: "Service: object_1"
sensor.test_object_2:
friendly_name: "Service: object_2"
...
sensor.test_object_15:
friendly_name: "Service: object_15"
Yes, I still do not like it - I have to keep a code for one sensor in different places.
Hope someone will convince the Dev team to add a new “friendly_name” option to the new format.
Why I do not like UI - because using YAML gives me a flexibility like:
- using global/package-wide constants/dicts (using “secrets” for this);
- using packages: disable a package, move packages to another HA setup;
- commenting some functionality;
- adding notes in the code;
- etc
For me preserving the original entity_id’s was crucial to keep my history and all cards working.
Migrating directly from the old to the new format results in new entity ids, being equal to the friendly name.
I found an easy way to migrate, without the need to change back all the entity_id’s. This is migration in two simple steps (instead of migrating directly), without UI editing afterwards!
The original legacy template definition, where:
-
entity_id
=original_sensor_name
-
friendly_name
= “Some friendly sensor name”
sensor:
- platform: template
sensors:
original_sensor_name:
friendly_name: "Some friendly sensor name"
value_template: >-
{{ ... }}
First step in migrating to the new definition, where the result will be:
-
entity_id
=original_sensor_name
-
friendly_name
=original_sensor_name
(this is just for the initial creation with an unique ID)
template:
- sensor:
- unique_id: original_sensor_name
name: original_sensor_name
state: >-
{{ ... }}
reload the template definitions.
Second step in migrating to the new definition, where we change the name
property to the desired friendly name:
-
entity_id
=original_sensor_name
-
friendly_name
= “Some friendly sensor name”
template:
- sensor:
- unique_id: original_sensor_name
name: "Some friendly sensor name"
state: >-
{{ ... }}
reload the templates again. Due the unique ID, this only changes the friendly name, and preserves the entity_id assigned in step one.
Hope this helps others facing the same migration headache.
Thank you so much. With your tips i was able to convert my template-sensors to the new format.
Adding this comment here as it’s the only way I’ve found to add friendly_name
to a template sensor. This is the top google search result when trying to troubleshoot.
Hopefully in the future, friendly_name
and friendly_name_template
will be supported again because allowing a template for friendly_name
would save me some headaches. Most of my template sensors are supplemental to it’s source sensor, so I usualy just want the original friendly_name
plus some suffix.
Anyway, here’s my solution:
What you put in name
becomes the friendly name of the template entity. It also accepts a template. So it covers all the use cases of friendly_name
and friendly_name_template
from the legacy syntax.
I create an entity with “sensor.bathroom_co2” name - and this becomes “entity_id”.
But I want to have another “friendly_name” - I want it to be “СО2: ванная”.
Now I have to use customization.
I do not want to specify “СО2: ванная” (even transliterated) as an “entity_id”.
Let me remind you that many users have SAME friendly names for DIFFERENT entities.
But I don’t want that…
I want to create a sensor whose entity_id
is contact_04_adj_temp
and friendly_name is Contact 04 - Temp (Adjusted)
.
If I set the name
to Contact 04 - Temp (Adjusted)
, the resulting entity_id
will be contact_04_temp_adjusted
, which is not what I want.
Check out the solution I linked to. I use it for all of my template sensors and it works great. The down side is you have to split your friendly names out to a separate file. But it 100% works.
Thank you, that is what I am already using - customization.
And you MAY NOT specify customizations in a separate file.
Described here.
So you’re missing an entity_id
field, not a friendly_name
field. Ok, different then what you said. You were asking for a replacement for friendly_name
and friendly_name_template
and that exists. But yes there is no way to set entity_id
to something other then the name slugified in YAML.
If you are determined to do it in YAML only then what you linked is the best way. Although that means it is impossible to use a template for friendly name. The way to do it which still supports using a template for friendly name is like this:
- Set name to the value you want to use for
friendly_name
or the template you want to dynamically setfriendly_name
- Add something unique in
unique_id
(you’ll never see this value anywhere in the UI it just makes it UI-editable) - Reload template entities
- Find your new entity anywhere in the UI. Open its more info panel and set its
entity_id
to whatever you want from there - Never change
unique_id
. As long asunique_id
stays the same in YAML, so willentity_id
.
I’m not sure what you mean when you say you can’t specify customizations in a separate file. I’m currently doing that now.
configuration.yaml
homeassistant:
customize: !include customize.yaml
template:
- sensor:
- name: contact_01_adj_temp
unit_of_measurement: °F
state: "{{ (states('sensor.contact_01_temp') | default(0, true) | float + 2.9) | round(1, default=0) }}"
device_class: temperature
customize.yaml
sensor.contact_01_adj_temp:
friendly_name: Contact 01 - Temp (Adjusted)
Not saying “cannot”. I mean - “you MAY specify it in a separate file, in the same file - as you like”.
Update: probably my English was not clear, sorry!
I see. So unique_id
is essentially the natural key used by HA when storing it in the database. And since it’s able to store it in the DB, it’s now able to let you customize it. So it allows you to change the entity_id
and it’s persistent.
I’ve always wondered what the difference between entity_id
and unique_id
is.
I’ll try that out, thanks!
This method requires changes in UI.
Earlier users may only use yaml config.
Right. That’s your requirement, not everyone’s.
I wasn’t trying to solve this post. I was simply trying to help the user who replied saying the only way to set friendly_name
is via customize. Wanted to make sure they knew that’s not true as long as you’re willing to use the UI. Seems like they were willing to do that.
Sure.
Since I started using HA (September 2020) I have always been against moving settings from yaml to UI w/o possibility to manage them in yaml.
Keeping settings in yaml for entities (sensors, automations, customization, …) gives a great opportunity to:
- disable whole modules - disable all entities, automations etc related to some functionality - by simple moving related yaml files (or renaming them to different file extensions);
- moving whole module to another HA instance.
But this is another story.