De la simple écriture de macros

bonjour,
voici un petit exemple d’écriture de macros dans du code jinja (code utilisé dans les templates).
le gros intérêt de l’utilisation des macros est d’éviter de réécrire plusieurs fois un code.
on évite ainsi la perte de temps (bien qu’il faut quand même mettre au point la macro).
on peut uniformiser aisément un affichage (par exemple de tableau).
en une seule opération on peut modifier tous les éléments utilisateurs de la macro (par exemple changer la couleur et la font de la ligne de titre de nos tableaux précédents).

définition de la macro :

  • cas 1 : en début d’un template
    la macro est appelée plusieurs fois dans le template
    la macro est définie dans le template, a priori en début
        {% macro localdatetime_Ecart( d ) %}
        {# code Jinja tel que vous l'auriez écrit sans macro (au remplacement des arguments près) #}
        {%- set d = d | as_local %}
        {%- set e = now().timestamp() - as_timestamp(d) -%}
        {% if e < 24*3600 %}{{ '%d'|format(e//3600) }}h {{ '%d'|format(e//60%60) }}mn{% else %}> 1j{% endif %}
        {% endmacro %}
  • cas 2 : dans un fichier Jinja (exemple /config/custom_templates/communs.jinja)
    ceci permet de regrouper plusieurs macros dans un même endroit et d’utiliser ces macros dans n’importe quel template
    dans le fichier vous écrivez votre macro exactement de la même façon que dans le cas 1

utilisation de la macro :
si définition dans le template en cours, il n’y a rien de plus à faire
si définition dans un fichier Jinja, il faut importer la macro par :

        {% from 'communs.jinja' import localdatetime_Ecart %}

puis dans tous les cas, vous l’utilisez ainsi :

        {% set x = states.sensor.macon1_donnees1h.last_updated %}
        {%- if x != None %}
          ancienneté du dernier msg : {{- localdatetime_Ecart(x) }}
        {% endif %}

après écriture ou modification d’une macro, il faut la compiler avec : Outils de développement / YAML / TOUTE LA CONFIGURATION YAML

4 « J'aime »

suite du précédent post avec un exemple concret :

affichage des fichiers de backup
chez moi, ces fichiers de trouvent dans /home/pi/homeassistant/backup
mais peu importe pour notre exemple, ils se trouvent dans l’attribut listefichiers de sensor.backup_liste_des_fichiers_tar
à vous d’adapter votre code

résultat :

macro :

{% macro FondTableHTML() %}
  table {
    border-spacing: 0;
    width: 100%;                /* utilisation de toute la carte */
    padding: 8px;
    border-radius: var(--ha-card-border-radius);
    border-collapse: collapse;
    border-top: 1px solid black;
    border-bottom: 1px solid black;
  }
  th, td {
    border-left: 1px solid var(--primary-text-color);
    border-right: 1px solid var(--primary-text-color);
    padding: 4px;
  }
  th {
    background-color: var(--state-icon-color);    /* header : fond en gris sombre */
    color: white;
    padding: 4px;
  }
  th:first-child {
    border-top-left-radius: min(var(--ha-card-border-radius)/2, 5px);
  }
  th:last-child {
    border-top-right-radius: min(var(--ha-card-border-radius)/2, 5px);
  }
  td {
    padding: 4px;
    text-align: center;
  }
  tr:nth-child(even) {
    background-color: #e8e8e8;  /* lignes paires en gris clair */
  }
{% endmacro %}

carte lovelace :

type: markdown
content: |-
  {% if states.sensor.backup_liste_des_fichiers_tar.state is not defined %}
    <vide>
  {% else %} 
  {% set k = state_attr('sensor.backup_liste_des_fichiers_tar','listefichiers') %} 
  {% if k is not none %}
    <table>
    {# ligne de titres #}
    <tr>
      <th>#</th>
      <th>fichier</th>
      <th>taille (Mo)</th>
      <th>datage</th>
      <th>âge (jours)</th>
    </tr>

  {% for x in k | reverse %}  
    {# écart de temps en jours entre maintenant et la date d'écriture du fichier #}
    {% set z2 = as_timestamp('20' + (x[2][:8].split('/') | reverse | list | join('-'))) %}
    {% set a = ((as_timestamp(now()) - z2)  // 86400) | int %}
    {# si le fichier a plus de 8 jours, le texte est rouge, sinon il est vert #}
    {% set c = iif( a <8, 'green', 'red') %}
    <tr>
      <td>{{ loop.index }}</td>
      <td><font color={{c}}>&nbsp;&nbsp;{{ '{:>s}'.format(x[0]) }}</td>
      <td><font color={{c}}><div style='text-align: right;'>&nbsp;&nbsp;{{ '{:>8s}'.format(((x[1] | int)/1024/1024) | round(1) | string).replace(' ','&nbsp') }}</div></td>
      <td><font color={{c}}>&nbsp;&nbsp;{{ '{:s}'.format(x[2]) }}</td>
      <td><font color={{c}}><center>{{ a }}</center></td>
    </font></tr>
   {% endfor %}
  </table> 
  {% endif %}
  {% endif %}
card_mod:
  style:
    ha-markdown:
      $:
        ha-markdown-element: |
          {% from 'communs.jinja' import FondTableHTML %}
          {{ FondTableHTML() }}

bon courage

4 « J'aime »