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 !
Ce que nous allons faire
- Créer un sensor virtuel pour stocker les logs.
- Configurer le Recorder pour protéger les performances de HA.
- Créer une automatisation pour ajouter des messages au journal.
- Designer une carte élégante pour afficher l’historique.
É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 }}"`
É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
É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
eventavec le typesend_log.
É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 ?`
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 !"`
É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 ?"`
---
Pourquoi faire comme ça ?
- Sécurité : La fenêtre de confirmation évite d’effacer ses logs par erreur.
- Propreté : L’utilisation d’un
input_buttonpermet 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 ![]()
