Conversion Anglais/Français Jour de la semaine

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…:wink:

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 HEUREavec 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

:information_source: 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="")

:information_source: 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. :+1:

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é :

image

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 :wink:

Source(EN)

3 J'aime

Merci du partage !
Ça peut toujours être utile :+1:

Ça le sera pour au moins une personne (@landaisbenj) :innocent:

Merci merci très intéressant

Ouha c’est fou!! Merci pour ma fonction.

1 J'aime

Super, mais j’ai du mal à comprendre pourquoi il n’y a pas un moyen natif dans HA de localiser une date. Ca mérite un « What The Heck » sur le forum officiel…

Je t’en prie :pray:


Ah mince la section est fermée. C’était réservé pour le mois de Septembre.

Elle rouvrira de toute façon l’année prochaine

J’ai réussi à améliorer la lecture et la contraction du code:

Pour expliquer:
Je créé toujours des variables contenant l’écriture française. J’ajoute cette fois-ci le mois pour etre plus polyvalent
(Vous noterez que j’ai commencé la table mois avec une valeur vide, car je ne sais pas gerer le mois 0…):

{% set mois = ["","Janvier","Fevrier","Mars","Avril","Mai","Juin","Juillet","Aout","Septembre","Octobre","Novembre","Decembre"] %}
{% set jours = ["Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche"] %}

Je réduis un peu mon code à une variable device pour la compréhension (mon but à moi est d’avoir le datetime du dernier changement d’état d’une liste de device, mais cela fonctionne avec un seul device):

{% set device = ([
states.binary_sensor.porte_001.last_changed,
states.binary_sensor.porte_002.last_changed,
states.binary_sensor.porte_003.last_changed,
states.binary_sensor.porte_004.last_changed,
states.binary_sensor.porte_005.last_changed
]|max) %}

Et je fais référence à mes deux tables à l’aide du chiffre du jour de la semaine, et du numéro du mois pour avoir une date complètement française et configurable comme on le veut:

{{ jours[device.weekday()] }}:
me donne le jour en Français en lieu est place de {{ device.strftime("%A") }}:

{{ device.day }} ou {{ device.strftime("%d") }}:
me donneront le chiffre du jour dans le mois.

{{ mois[device.month]}}:
me donnera le mois en Français en lieu est place de {{ device.strftime("%B") }}:

{{ as_local(device).strftime("%H:%M") }}:
me donne l’heure et les minutes, en forçant la localisation de l’heure (pour gérer le décalage été/hiver)

Pour résumer:

{% set mois = ["","Janvier", "Fevrier","Mars","Avril","Mai","Juin","Juillet","Aout","Septembre","Octobre","Novembre","Decembre"] %}
{% set jours = ["Lundi", "Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche"] %}
{% set device = ([
  states.binary_sensor.porte_001.last_changed,
  states.binary_sensor.porte_002.last_changed,
  states.binary_sensor.porte_003.last_changed,
  states.binary_sensor.porte_004.last_changed,
  states.binary_sensor.porte_005.last_changed
]|max) %}
Le {{ jours[device.weekday()] }} {{ device.day }} {{ mois[device.month]}} à {{ as_local(device).strftime("%Hh%M") }}

Me retourne dans mon sensor :

image
3 J'aime

Merci pour le partage !

Bien plus simple ! :smiley:

Faut dire que je voulais présenter les fonctions plus que la méthode la plus simple, comme j’avertis en début de topic… :roll_eyes: :wink: