Au final, je ferais ainsi :
Ce que l’on cherche à faire :
On a une entité qui contient la date de fin de la validité du certificat SSL pour se connecter de manière sécurisée à un serveur, et on souhaite être prévenu 15 jours
avant (puis les suivants jusqu’à la date fatidique si pas renouvelé).
Pré-requis
On va utiliser la date du jour du serveur (documentation).
Dans notre fichier de configuration, il faut ajouter :
sensor:
- platform: time_date
display_options:
- 'date' # crée une entité représentant la date du jour
L’entité contenant l’information
Comme nous avons ajouter l’intégration Certificate Expiry , nous avons une entité représentant la date d’expiration du certificat dont nous voulons être averti de la péremption prochaine (à 15 jours).
Entité: sensor.cert_expiry_timestamp_NOM_DE_DOMAINE
Etat: 2021-03-17T18:47:39+00:00
Bien que ce format semble être de la classe datetime
, il n’en est rien.
Ce n’est pas grave, on va nous même convertir ce texte, de classe string
, vers la classe datetime
afin de pouvoir faire des calculs avec la notion de temps (+/- 15 jours, heures, minutes, etc.)
Conversion en datetime
Dans l’éditeur de modèle (présent dans l’onglet Modèle
de la vue Options de développement
), si on tape :
{{states('sensor.cert_expiry_timestamp_NOM_DE_DOMAINE')}}
On récupère l’état sous forme de texte (string)… il nous faut le convertir en classe datetime
(documentation):
{{ strptime(states('sensor.cert_expiry_timestamp_NOM_DE_DOMAINE'), '%Y-%m-%dT%H:%M:%S+00:00') }}
Avec ce code, on récupère bien un objet de la classe datetime
auquel on peux faire des calculs de temps.
Dans notre cas, nous avons dit que nous aimerions être averti 15 jours avant la date d’expiration, il nous faut donc calculer la date d’expiration moins 15 jours. C’est possible de façon très facile avec la fonction timedelta
(documentation) :
{{strptime(states('sensor.cert_expiry_timestamp_NOM_DE_DOMAINE'), '%Y-%m-%dT%H:%M:%S+00:00') - timedelta(days=15)}}
On vient donc de trouver la formule qui nous permet d’obtenir la date à partir de laquelle nous voulons être avertie de la future expiration.
Il nous reste donc à être averti.
L’automatisation
Pour être averti, cela va passer par une automatisation.
Pour l’action, je vous laisse choisir votre plateforme préférée et l’ajouter dans la partie action
de l’automatisation.
Je vais me consacrer ici aux déclencheurs et conditions de l’automatisation.
Déclencheur de l’automatisation
Pour rappel, nous voulons être averti 15 jours avant la date d’expiration du certificat, ce sera donc notre déclencheur.
En français cela donne donc :
Est-ce que la date d’aujourd’hui est égale ou supérieure à la date d’expiration du certificat - 15 jours ?
La version code donne donc :
{{ states('sensor.date') >= strptime(states('sensor.cert_expiry_timestamp_NOM_DE_DOMAINE'), '%Y-%m-%dT%H:%M:%S+00:00') - timedelta(days=15)}}
Pour qu’une automatisation se déclenche, il faut que l’un de ses déclencheurs (nous, nous n’en avons qu’un ici) renvoit l’état Vrai
.
Mais notre code renverra constamment Faux
. Pourquoi ? Car l’état de l’entité sensor.date
a le format ANNEE-MOIS-JOUR
, et on le compare à un objet ayant le format ANNEE-MOIS-DATE HH:MM:SS
.
Il faut donc raccourcir
notre objet afin d’avoir le même format que l’entité sensor.date
.
Pour cela, on va utiliser la fonction as_timestamp
(documentation) qui permet de convertir en timestamp afin de pourvoit appliquer le filtre
: timestamp_custom
(documentation).
Pour rappel, le code suivant renvoi la date à laquelle doivent commencer les notifications :
{{strptime(states('sensor.cert_expiry_timestamp_NOM_DE_DOMAINE'), '%Y-%m-%dT%H:%M:%S+00:00') - timedelta(days=15)}}
renvoi (par exemple avec mon certificat - 15jours) :
2021-03-02 18:47:39
On va donc raccourcir le retour d’état avec ce code :
{{as_timestamp(strptime(states('sensor.cert_expiry_timestamp_NOM_DE_DOMAINE'), '%Y-%m-%dT%H:%M:%S+00:00') - timedelta(days=15)) | timestamp_custom('%Y-%m-%d')}}
qui renvoi :
2021-03-02
Bingo ! On va pouvoir comparer ce résultat avec l’entité sensor.date
Nous pouvons donc maintenant écrire le déclencheur de l’automatisation ainsi :
{{ states('sensor.date') >= as_timestamp(strptime(states('sensor.cert_expiry_timestamp_NOM_DE_DOMAINE'), '%Y-%m-%dT%H:%M:%S+00:00') - timedelta(days=15)) | timestamp_custom('%Y-%m-%d')}}
Malheureusement, si on met ce code dans le déclencheur de l’automatisation, nous ne serons notifié qu’une seule fois.
Pourquoi ? Car une fois de que la date sera à 15 jours de l’expiration, le résultat du modèle va passer à Vrai
et ce, jusqu’à ce que la date d’expiration du certificat repasse au dessus du seuil des 15 jours.
Donc nous devons utiliser ce code comme condition
de l’automatisation et non pas comme déclencheur.
Et le déclencheur alors ? Et bien on va faire déclencher l’automatisation tous les jours avec le code suivant :
trigger:
- platform: state
entity_id: sensor.date
Condition de l’automatisation
L’automatisation va donc s’exécuter à chaque changement d’état de l’entité sensor.date
(donc tous les jours à minuit).
On va donc conditionner l’exécution des actions sur le fait d’être dans la période des 15 jours avant l’expiration :
condition: "{{ states('sensor.date') >= as_timestamp(strptime(states('sensor.cert_expiry_timestamp_NOM_DE_DOMAINE'), '%Y-%m-%dT%H:%M:%S+00:00') - timedelta(days=15)) | timestamp_custom('%Y-%m-%d')}}"
Et voila !
Pour résumer
Voici donc le code complet de l’automatisation :
automation:
- alias: 'alerte_expiration_certificat'
id: 'alerte_expiration_certificat'
trigger:
- platform: homeassistant
event: start
- platform: state
entity_id: sensor.date
condition: "{{ states('sensor.date') >= as_timestamp(strptime(states('sensor.cert_expiry_timestamp_<NOM_DE_DOMAINE>'), '%Y-%m-%dT%H:%M:%S+00:00') - timedelta(days=states('input_number.ssl_seuil')|int)) | timestamp_custom('%Y-%m-%d')}}"
action:
- service: persistent_notification.create
data:
message: "Le certificat pour NOM_DE_DOMAINE est bientôt expiré ! \n Merci de le renouveller !"
title: "Certificat SSL/TLS"
notification_id: "{{ (range(1, 9999)|random) }}"
Alors oui, j’ai ajouter un déclencheur :
- platform: homeassistant
event: start
qui correspond au démarrage du serveur afin de recevoir une notification en cas de démarrage sans attendre le jour d’après (imaginez un redémarrage à 23:59 et le serveur est opérationnel à 00:01, vous loupez une journée )
Alors re-oui, j’ai implémenté le fait de gérer le seuil d’alerte (les fameux 15 jours) par l’entité input_number.ssl_seuil
:
states('input_number.ssl_seuil')|int
afin de rendre l’édition du seuil possible par l’interface graphique. Si vous ne savez pas implémenter cette entité, demandez dans les commentaires .
Alors non, je n’ai pas voulu ajouter les lignes :
- platform: state
entity_id: input_number.ssl_seuil
afin de déclencher l’automatisation également sur le changement d’état de l’entité gérant le seuil .
Voilà, mes explications sont finies.
Si vous avez des questions…n’hésitez pas