Log perso HA

:bell: Tuto : Créer un Journal de Notifications Personnalisé dans Home Assistant

Vous souhaitez garder un historique de vos notifications (alarme, domotique, alertes) directement sur votre tableau de bord, sans encombrer votre base de données ? Ce tuto est pour vous !

:clipboard: Ce que nous allons faire

  1. Créer un sensor virtuel pour stocker les logs.
  2. Configurer le Recorder pour protéger les performances de HA.
  3. Créer une automatisation pour ajouter des messages au journal.
  4. Designer une carte élégante pour afficher l’historique.

:hammer_and_wrench: Étape 1 : Création du Sensor de Log

Ajoutez ce code dans votre fichier configuration.yaml (sous la section template:) ou dans votre fichier templates.yaml.

  - trigger:
      - platform: event
        event_type: "update_notification_log"
    sensor:
      - name: "Notification Log"
        unique_id: notification_log_nr
        state: "{{ trigger.event.data.last_message }}"
        attributes:
          history: "{{ trigger.event.data.history }}"`

:floppy_disk: Étape 2 : Optimisation de la Base de Données

Comme ce sensor peut contenir beaucoup de texte, nous allons demander à Home Assistant de ne pas l’enregistrer dans l’historique standard (SQL), car nous gérons notre propre historique dans les attributs.

Dans votre configuration.yaml :

recorder:
  exclude:
    entities:
      - sensor.notification_log

:high_voltage: Étape 3 : L’Automatisation (Le « Moteur »)

Pour que cela fonctionne, nous avons besoin d’une automatisation qui réceptionne vos messages et les ajoute à la liste.

`YAML

alias: "Système de Log - Gestionnaire"
description: "Ajoute un message au journal et garde les 10 derniers"
trigger:
  - platform: event
    event_type: "send_log" # C'est l'événement que vous appellerez ailleurs
action:
  - event: update_notification_log
    event_data:
      last_message: "{{ trigger.event.data.message }}"
      history: >
        {% set current = state_attr('sensor.notification_log', 'history') or [] %}
        {% set new_log = {
          "t": now().strftime('%H:%M'),
          "titre": trigger.event.data.title | default('INFO'),
          "m": trigger.event.data.message
        } %}
        {{ ([new_log] + current)[:10] }} 
        {# Changez 10 par le nombre de messages à conserver #}
mode: queued`

Comment l’utiliser ? Dans n’importe quelle autre automatisation, pour « logger » quelque chose, utilisez simplement l’action event avec le type send_log.


:artist_palette: Étape 4 : Affichage sur le Dashboard

Nous allons utiliser la carte custom:button-card (disponible sur HACS) pour un rendu professionnel sous forme de tableau.

Code de la carte :

`YAML

type: vertical-stack
cards:
  - type: custom:button-card
    name: " "
    styles:
      card:
        - padding: 0px
        - background-color: var(--card-background-color)
        - border-radius: 12px
      grid:
        - grid-template-areas: "\"header\" \"log_table\""
        - grid-template-rows: auto 1fr
    custom_fields:
      header: |
        [[[
          return `<div style="text-align: center; padding: 15px 0; font-size: 1.2rem; font-weight: bold; color: var(--primary-color);">🔔 Journal des Notifications</div>`
        ]]]
      log_table: |
        [[[
            const history = states['sensor.notification_log'].attributes.history;
            if (!history || history.length === 0) {
              return '<div style="padding: 20px; text-align: center; color: gray;">Aucune notification</div>';
            }
            let table = '<table style="width: 100%; border-collapse: collapse; font-size: 0.85rem; table-layout: fixed;">';
            table += `
              <tr style="background-color: rgba(255, 255, 255, 0.1); color: var(--primary-color); font-weight: bold; text-transform: uppercase; font-size: 0.7rem;">
                <th style="padding: 10px; text-align: center; width: 70px;">Heure</th>
                <th style="padding: 10px; text-align: center; width: 85px;">Titre</th>
                <th style="padding: 10px; text-align: center;">Message</th>
              </tr>
            `;
            history.forEach((log, index) => {
              const bgColor = index % 2 === 0 ? 'rgba(255, 255, 255, 0.05)' : 'transparent';
              const formattedMessage = log.m ? log.m.replace(/\\n/g, '<br>').replace(/\n/g, '<br>') : "-";
              table += `
                <tr style="background-color: ${bgColor}; border-bottom: 1px solid rgba(127, 127, 127, 0.1);">
                  <td style="padding: 10px 5px; font-weight: bold; color: var(--primary-color); text-align: center; vertical-align: middle; font-size: 0.75rem;">${log.t || "-"}</td>
                  <td style="padding: 10px 5px; font-weight: bold; color: var(--secondary-text-color); text-align: center; vertical-align: middle; font-style: italic; opacity: 0.9; font-size: 0.75rem; word-break: break-word;">${log.titre || "INFO"}</td>
                  <td style="padding: 10px; color: var(--primary-text-color); text-align: left; vertical-align: middle; line-height: 1.3; word-break: break-word;">${formattedMessage}</td>
                </tr>`;
            });
            table += '</table>';
            return table;
        ]]]
  - type: button
    name: Vider le journal
    icon: mdi:trash-can-outline
    tap_action:
      action: call-service
      service: event.fire
      service_data:
        event_type: update_notification_log
        event_data:
          last_message: "Journal vidé"
          history: []
    confirmation:
      text: Voulez-vous vraiment effacer tout l'historique ?`

:rocket: Conclusion

Vous avez maintenant un système robuste de logs. Pour ajouter une ligne depuis une automatisation, il vous suffit de faire :

`YAMLaction:

  - event: send_log
    event_data:
      title: "Lave-linge"
      message: "Le cycle est terminé, pensez à sortir le linge !"`

:broom: Étape 5 : Création du bouton de réinitialisation

Pour avoir un bouton « propre » sur lequel appuyer, nous allons utiliser une entité de type input_button.

1. Créer l’entité de réinitialisation

Allez dans Paramètres > Appareils et services > Entrées > Créer une entrée > Bouton.

  • Nom : Reset Notification Log
  • ID : input_button.reset_notification_log (vérifiez bien l’ID après création).

2. L’automatisation pour vider le journal

Ajoutez cette automatisation qui va « écouter » le bouton et envoyer une commande d’effacement au sensor :

`YAML

alias: "Système de Log - Reset"
description: "Vide l'historique du journal quand on appuie sur le bouton"
trigger:
  - platform: state
    entity_id: input_button.reset_notification_log
action:
  - event: update_notification_log
    event_data:
      last_message: "Journal vidé"
      history: [] # On envoie une liste vide pour effacer l'historique
mode: single`

3. Le code du bouton pour votre Dashboard (YAML)

Voici le code à ajouter à la fin de votre vertical-stack pour afficher le bouton avec la confirmation de sécurité :

`YAML

- type: button
  name: Vider le journal
  icon: mdi:trash-can-outline
  entity: input_button.reset_notification_log
  icon_height: 20px
  color: blue
  show_name: true
  show_state: false
  tap_action:
    action: toggle # Déclenche l'appui sur le bouton virtuel
    confirmation:
      text: "Voulez-vous vraiment effacer tout l'historique du journal ?"`
---

:light_bulb: Pourquoi faire comme ça ?

  • Sécurité : La fenêtre de confirmation évite d’effacer ses logs par erreur.
  • Propreté : L’utilisation d’un input_button permet de garder une trace du dernier moment où le journal a été vidé.
  • Simplicité : Vous n’avez qu’à cliquer, l’automatisation s’occupe de remettre la liste history à zéro dans le sensor.

Tuto éditer par IA Gemini qui m’a aidé à le mettre en place,
Je passe pas NR pour mes automatisations, du coup je peux récupérer toutes les données que je veux envoyer dans le debug, log, je pense qu’on doit pouvoir aussi dans les automatisme std de HA…
Si ça peux en inspirer certain et qu’ils veulent compléter le tuto :wink:

3 « J'aime »