(06/09/2024, 08:16:28)Ives a écrit : C'est bien complet. Poster le code serait un plus !
Pas de soucis, demandé si gentiment
Alors on va déjà expliquer ; ce qui a été compliqué (d'où ma question initiale sur le type de capteur utilisé) c'est de savoir quand a eu lieu la dernière action. En fait c'est pas si simple à récupérer en fonction du type d'entité.
J'ai donc fait autrement en utilisant des entités "fantômes" qui me servent à stocker des choses et récupérer des états.
1re étape :
Creer un calendrier HA, soit local, soit Google, soit ce que vous voulez.
2ème étape :
Creer 2 entités pour chaque filtre/réseau de filtre souhaité, un input_number (pour stocker une valeur), un input_datetime (pour stocker la date)
3ème étape :
Réaliser un script qui sera actionné quand on cliquera sur la tuile, il est en 3 étapes :
1/ stocker la date du jour au moment du clic dans input_datetime
2/ stocker le cubage total au moment du clic dans input_number
3/ Creer un event agenda qui a comme nom, le type de changement de filtre (moi cuve ou ville), et en description les informations précédentes (durée de vie, cubage)
Attention, il faudra autant de scripts que de bouton lovelace souhaité (que de filtre à changer en somme)
4ème étape :
Jouer avec les formules pour trouver le calcul adapté.
En gros c'est simple :
le cubage total - le cubage stocké donne le cubage de vie du filtre
la date actuelle - la date stockée donne la durée de vie du filtre
5ème étape, designer le tout sur lovelace pour que ce soit pratique, utile et si possible "joli"
ATTENTION, il faut, pour utiliser mon code, card-mod + mushroom. J'utilise l'entité mushroom-template-card
1/Donc le calendrier local (C'est une intégration HA, donc paramètres/appareils et services/intégration)
2/Les 2 (4 pour moi) entités fantômes (Paramètres/Automatisations et scènes/scripts)
3/Le code du script qui sera lancé par le bouton (à multiplier fonction de vos besoins) :
Code :
alias: Set Change Filtre Cuve
sequence:
- action: calendar.create_event
target:
entity_id: calendar.filtres_eau
data:
summary: Changement filtres Cuve
description: " Changés à {{ (now() - states('input_button.sensor_date_filtre_eau_cuve')|as_datetime).days }} jour(s) / {{ (states('sensor.volume_cuve_litre') | int) - (states('input_number.volume_changement_filtre_cuve_litre') | int) }} Litres"
start_date: |
{{ now().date() }}
end_date: |
{{ now().date() + timedelta(days=1) }}
- action: input_button.press
target:
entity_id: input_button.sensor_date_filtre_eau_cuve
data: {}
- action: input_number.set_value
target:
entity_id: input_number.volume_changement_filtre_cuve_litre
data:
value: "{{ states('sensor.volume_cuve_litre') }}"
description: Creer une entrée agenda pour le changement du filtre eau de Cuve
icon: mdi:calendar-check-outline
4 et 5/ Et enfin, le code de la carte associée, attention c'est chargé parce qu'il y a pas mal de mise en forme conditionnelle pour les statuts d'alertes.
J'ai conditionné, pour l'instant et de manière arbitraire le cubage à 10m3, il sera certainement plus haut par la suite. Par contre j'ai également mis une condition de temps, j'estime qu'à 6 mois, le filtre doit être changé pour des raisons d'hygiène évidente.
J'ai donc 2 types d'alertes :
L'alerte mineure, en jaune, qui dit "Changement filtre à prévoir", avec un badge de type "information"
L'alerte sévère, en rouge, qui dit " Filtre à changer !", avec un badge de type "attention, avec un effet de halo rouge sur le badge et la tuile qui clignote pour attirer l'attention
Code :
- type: custom:mushroom-template-card
icon: mdi:air-filter
icon_color: blue
name: Filtre changé ?
layout: vertical
primary: Changer filtres eau de cuve ?
tap_action:
action: call-service
confirmation:
text: Valider le changement des filtres d'eau de cuve ?
service: script.set_change_filtre_cuve
secondary: >
{% if ((states('sensor.volume_cuve_litre') | int) -
(states('input_number.volume_changement_filtre_cuve_litre') | int)
> 10000 ) or ((now() -
states('input_button.sensor_date_filtre_eau_cuve')|as_datetime).days
> 180) %}
Vie : {{ (now() - states('input_button.sensor_date_filtre_eau_cuve')|as_datetime).days }} jour(s) / {{ '%0.2f' | format(((states('sensor.volume_cuve_litre') | int) - (states('input_number.volume_changement_filtre_cuve_litre') | int)) / 1000) }} m³
Filtre à changer !
{% elif (((states('sensor.volume_cuve_litre') | int) -
(states('input_number.volume_changement_filtre_cuve_litre') | int)
< 10000) and ((states('sensor.volume_cuve_litre') | int) -
(states('input_number.volume_changement_filtre_cuve_litre') | int)
> 8000)) or (((now() -
states('input_button.sensor_date_filtre_eau_cuve')|as_datetime).days
< 180) and ((now() -
states('input_button.sensor_date_filtre_eau_cuve')|as_datetime).days
> 150)) %}
Vie : {{ (now() - states('input_button.sensor_date_filtre_eau_cuve')|as_datetime).days }} jour(s) / {{ '%0.2f' | format(((states('sensor.volume_cuve_litre') | int) - (states('input_number.volume_changement_filtre_cuve_litre') | int)) / 1000) }} m³
Changement filtre à prévoir
{% else %}
Vie : {{ (now() - states('input_button.sensor_date_filtre_eau_cuve')|as_datetime).days }} jour(s) / {{ '%0.2f' | format(((states('sensor.volume_cuve_litre') | int) - (states('input_number.volume_changement_filtre_cuve_litre') | int)) / 1000) }} m³
{% endif %}
badge_icon: >
{% if ((states('sensor.volume_cuve_litre') | int) -
(states('input_number.volume_changement_filtre_cuve_litre') | int)
> 10000 ) or ((now() -
states('input_button.sensor_date_filtre_eau_cuve')|as_datetime).days
> 180) %}
mdi:alert
{% elif (((states('sensor.volume_cuve_litre') | int) -
(states('input_number.volume_changement_filtre_cuve_litre') | int)
< 10000) and ((states('sensor.volume_cuve_litre') | int) -
(states('input_number.volume_changement_filtre_cuve_litre') | int)
> 8000))
or (((now() -
states('input_button.sensor_date_filtre_eau_cuve')|as_datetime).days
< 180) and ((now() -
states('input_button.sensor_date_filtre_eau_cuve')|as_datetime).days
> 150)) %}
mdi:information-symbol
{% endif %}
badge_color: >
{% if ((states('sensor.volume_cuve_litre') | int) -
(states('input_number.volume_changement_filtre_cuve_litre') | int)
> 10000 ) or ((now() -
states('input_button.sensor_date_filtre_eau_cuve')|as_datetime).days
> 180) %}
red
{% elif (((states('sensor.volume_cuve_litre') | int) -
(states('input_number.volume_changement_filtre_cuve_litre') | int)
< 10000) and ((states('sensor.volume_cuve_litre') | int) -
(states('input_number.volume_changement_filtre_cuve_litre') | int)
> 8000))
or (((now() -
states('input_button.sensor_date_filtre_eau_cuve')|as_datetime).days
< 180) and ((now() -
states('input_button.sensor_date_filtre_eau_cuve')|as_datetime).days
> 150)) %}
amber
{% endif %}
multiline_secondary: true
card_mod:
style:
.: >
{% if ((states('sensor.volume_cuve_litre') | int) -
(states('input_number.volume_changement_filtre_cuve_litre') |
int) > 10000 ) or ((now() -
states('input_button.sensor_date_filtre_eau_cuve')|as_datetime).days
> 180) %}
ha-card {
animation: ping 1s infinite;
}
@keyframes ping {
0% {box-shadow: 0 0 0 0 rgba(var(--rgb-red), 0.7);}
70% {box-shadow: 0 0 0 10px transparent;}
100% {box-shadow: 0 0 0 0 transparent;}
}
{% elif (((states('sensor.volume_reseau_litre') | int) -
(states('input_number.volume_changement_filtre_ville_litre') |
int) < 10000) and ((states('sensor.volume_reseau_litre') |
int) -
(states('input_number.volume_changement_filtre_ville_litre') |
int) > 8000)) or (((now() -
states('input_button.sensor_date_filtre_eau_ville')|as_datetime).days
< 180) and ((now() -
states('input_button.sensor_date_filtre_eau_ville')|as_datetime).days
> 150)) %}
{% else %}
ha-card {
padding-bottom: 15px !important;
}
{% endif %}
mushroom-badge-icon$: >
{% if ((states('sensor.volume_cuve_litre') | int) -
(states('input_number.volume_changement_filtre_cuve_litre') |
int) > 10000 ) or ((now() -
states('input_button.sensor_date_filtre_eau_cuve')|as_datetime).days
> 180) %}
.badge {
animation: ping 1s infinite;
--badge-icon-size: 22px;
--badge-size: 30px;
}
@keyframes ping {
0% {box-shadow: 0 0 0 0 rgba(var(--rgb-red), 0.7);}
50% {box-shadow: 0 0 0 10px transparent;}
100% {box-shadow: 0 0 0 0 transparent;}
}
{% elif (((states('sensor.volume_cuve_litre') | int) -
(states('input_number.volume_changement_filtre_cuve_litre') |
int) < 10000) and ((states('sensor.volume_cuve_litre') | int)
- (states('input_number.volume_changement_filtre_cuve_litre')
| int) > 8000)) or (((now() -
states('input_button.sensor_date_filtre_eau_cuve')|as_datetime).days
< 180) and ((now() -
states('input_button.sensor_date_filtre_eau_cuve')|as_datetime).days
> 150)) %}
.badge {
--badge-icon-size: 40px;
--badge-size: 30px;
}
{% endif %}
mushroom-shape-icon$: |
.shape {
--icon-symbol-size: 40px;
--icon-size: 60px;
}
mushroom-state-info$: >
{% if ((states('sensor.volume_cuve_litre') | int) -
(states('input_number.volume_changement_filtre_cuve_litre') |
int) > 10000 ) or ((now() -
states('input_button.sensor_date_filtre_eau_cuve')|as_datetime).days
> 180) %}
.container {
--card-secondary-color: red;
}
{% elif (((states('sensor.volume_reseau_litre') | int) -
(states('input_number.volume_changement_filtre_ville_litre') |
int) < 10000) and ((states('sensor.volume_reseau_litre') |
int) -
(states('input_number.volume_changement_filtre_ville_litre') |
int) > 8000)) or (((now() -
states('input_button.sensor_date_filtre_eau_ville')|as_datetime).days
< 180) and ((now() -
states('input_button.sensor_date_filtre_eau_ville')|as_datetime).days
> 150)) %}
.container {
--card-secondary-color: orange;
}
{% endif %}
Voilà ! Amusez-vous bien