Voici un petit exemple de conversion utilisant des fonctions jinja2 que je souhaitais vous partager.
La demande initiale est sur le Discord :
@landaisbenj demande :
Salut a tous !
Vous sauriez comment renvoyer le jour en Français ?(modifié
{{as_timestamp((states.binary_sensor.door_window_sensor_158dXXXXXXXXXX.last_changed)) | int | timestamp_custom('%A %d/%m/%Y %H:%M', true)}}
Le problème est que le résultat retourné est : Monday 21:01:34.
Et comme on est sur HACF, on voudrait avoir : Lundi 21:01:34.
Voici donc ma méthode (n’hésitez pas à partager la votre), elle n’est pas forcément la plus simple, mais je la trouve assez compréhensible…
Récupération du dernier évènement
Le code suivant vient récupérer l’horodatage (timestamp en anglais), le plus récent parmi les 5 portes observées.
Ensuite, l’horodatage est mis en forme (format
en anglais), sous la forme « Jour_de_la_semaine HH:MM:SS ».
set last_changed = ( [
as_timestamp(states.binary_sensor.porte_001.last_changed),
as_timestamp(states.binary_sensor.porte_002.last_changed),
as_timestamp(states.binary_sensor.porte_003.last_changed),
as_timestamp(states.binary_sensor.porte_004.last_changed),
as_timestamp(states.binary_sensor.porte_005.last_changed)
]|max)| int | timestamp_custom("%A %X", true)
On obtient donc une variable last_changed
qui contient « Jour_de_la_semaine HH:MM:SS » .
Mais comme Jour_de_la_semaine
est présenté en anglais, il y a plusieurs étapes pour le convertir en français.
Récupération du jour et de l’heure séparément
Le résultat renvoyé est sous la formeJOUR HEURE
avec un espace
entre les deux.
On va dans un premier temps, séparer ce résultat en 2 variables distinctes : get_day_en
contiendra JOUR
et get_hour
contiendra HEURE
.
Pour réussir à créer ces variables, on va utiliser la fonction Split
.
Cette fonction permet à l’aide d’un séparateur de renvoyer un tableau (array en anglais).
Dans notre cas, le séparateur est l'espace
, donc :
set get_day_en = last_changed.split(' ')[0] contiendra `JOUR`
set get_hour = last_changed.split(' ')[1] contiendra `HEURE`
Conversion du jour de la semaine
Maintenant que nous avons récupéré le jour de la semaine en anglais, il faut le convertir.
Pour cela, nous allons dans un premier temps définir 2 tableaux de correspondance Anglais/Français :
set jour_en = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
set jour_fr = ["Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"]
Ensuite, nous allons parcourir le tableau jour_en
afin de trouver la position de JOUR
dans ce tableau.
Une fois que nous aurons récupéré, la position de JOUR
dans le tableau jour_en
, grâce à la correspondance des 2 tableaux, nous récupèrerons le JOUR
en français depuis le tableau jour_fr
:
{# Définition du `namespace` afin de pouvoir récupérer la valeur définie dans la boucle #}
set set_fr = namespace(day="")
for find_jour in jour_en
{# Si l'élément du tableau `jour_en` est égal à `get_day_en` (jour de la semaine en anglais) #}
if find_jour == get_day_en
{# Récupération de la position dans le tableau de `find_jour` afin de récupérer le jour de la semaine en français #}
set set_fr.day = jour_fr[jour_en.index(find_jour|string)]
endif
endfor
Explication de l’utilisation du namespace
La définition du namespace permet d’affecter une variable dans une boucle et de la récupérer en dehors de celle-ci :set set_fr = namespace(day="")
Explication de la ligne
set set_fr.day = jour_fr[jour_en.index(find_jour|string)]
La fonction
[ARRAY].index(VAR) permet de récupérer la position de l'élément VAR dans le tableau ARRAY
Donc dans notre cas, on cherche JOUR dans le tableau en anglais et on récupère sa position, pour ensuite récupérer JOUR dans le tableau français à la même position.
Donc la variable set_fr.day contient le JOUR en français.
Affichade du JOUR et de l’HEURE
Il ne reste plus qu’à afficher le JOUR
en français et l'HEURE
:
set_fr.day + " à " + get_hour
ce qui donne sur Lovelace, dans une carte Entité
:
Pour résumer
Voici donc le code complet à incorporer dans votre configuration :
sensor:
#Création d'un sensor remontant le dernier évènement des entités définies
- platform: template
sensors:
derniere_porte:
friendly_name: 'Dernière ouverture le :'
device_class: timestamp
unique_id: derniere_porte #Permet la modification depuis l'interface graphique
value_template: >-
{# Récupération de la date/heure au format `timestamp` du dernier évènement parmis toutes ces entités à l'aide de la fonction `max` #}
{# a qui est convertie au format `Jour_de_la_semaine HH:MM:SS` #}
{% set last_changed = ( [
as_timestamp(states.binary_sensor.porte_001.last_changed),
as_timestamp(states.binary_sensor.porte_002.last_changed),
as_timestamp(states.binary_sensor.porte_003.last_changed),
as_timestamp(states.binary_sensor.porte_004.last_changed),
as_timestamp(states.binary_sensor.porte_005.last_changed)
]|max)| int | timestamp_custom("%A %X", true) %}
{# Récupération du jour de la semaine en anglais` #}
{% set get_day_en = last_changed.split(' ')[0] %}
{# Récupération de l'heure (HH:MM:SS)` #}
{% set get_hour = last_changed.split(' ')[1] %}
{# Définition du `namespace` afin de pouvoir récupérer la valeur définie dans la boucle #}
{%set set_fr = namespace(day="") %}
{# Définition des tableaux pour conversion #}
{% set jour_en = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] %}
{% set jour_fr = ["Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"] %}
{# Boucle parcourant tous les éléments du tableau `jour_en` (tous les jours de la semaine en anglais) #}
{% for find_jour in jour_en %}
{# Si l'élément du tableau `jour_en` est égal à `get_day_en` (jour de la semaine en anglais) #}
{% if find_jour == get_day_en %}
{# Récupération de la position dans le tableau de `find_jour` afin de récupérer le jour de la semaine en français #}
{% set set_fr.day = jour_fr[jour_en.index(find_jour|string)] %}
{% endif %}
{% endfor %}
{# Définition de la valeur de l'entité au format Jour_de_la_semaine(FR) HH:MM:SS #}
{{set_fr.day + " à " + get_hour}}
Je le répète, je ne suis pas sûr que ce soit la méthode la plus simple, mais je trouvais utile de vous la présenter car elle introduit quelque fonction sympa