# Sauvegarder ou pas l'historique d'une fonctionnalités précise

**URL:** <https://community.gladysassistant.com/t/sauvegarder-ou-pas-lhistorique-dune-fonctionnalites-precise/7241>\
**Category:** Développement\
**Created:** [Mai 3, 2022, 4:51 UTC](https://community.gladysassistant.com/t/sauvegarder-ou-pas-lhistorique-dune-fonctionnalites-precise/7241 "2022-05-03T16:51:33Z")\
**Posts on this page:** 19\
**Page:** 1

<div class="post-metadata">

**Author:** ![Terdious](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/terdious/32/6316_2.png) [@Terdious](https://community.gladysassistant.com/u/Terdious)\
**Post date:** [Mai 3, 2022, 4:51 UTC](https://community.gladysassistant.com/t/sauvegarder-ou-pas-lhistorique-dune-fonctionnalites-precise/7241/1 "2022-05-03T16:51:33Z")

</div>

Ok pour le faire en 2 PR, c’est mieux, sauf que pour ma part ca ne resout que 1% de mon problèmes et je me trompe peut-être mais j’ai compris les arguments des autres personnes dans le meme sens.  
Je souhaite garder la quasi totalité des historiques. Ce qui fait que la base grossie a vue d’oeil c’est le fait de conserver des doublons tres souvent inutiles…  
Donc le seul keep\_history ne resout pas 99% du probleme dans mon cas. Est-ce qu’il en va de meme pour vous @lmilcent et @VonOx ? Ou j’ai mal compris pour votre cas d’usage ?

Exemple tout bête :  
J’ai une prise sonoff POWR2 sous Tasmota avec alimentation d’une pompe + puissance consommée + 1 contact soudé sur le pin IO4 pour un niveau qui coupe la pompe et ouvre et ferme des vannes via une scene.

- L’historique de la puissance m’interesse quasi tout le temps,
- L’historique de la pompe ne m’interesse pas,
- L’historique du niveau bas m’interesse mais seulement lorsqu’il change d’etat (1 fois par semaine des fois / 1 fois par mois d’autre fois) or pour le moment il conserve toutes les minutes…

---

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [Mai 3, 2022, 4:55 UTC](https://community.gladysassistant.com/t/sauvegarder-ou-pas-lhistorique-dune-fonctionnalites-precise/7241/2 "2022-05-03T16:55:10Z")

</div>

(J’ai déplacé ce message dans un topic spécifique pour ne pas polluer le feed du retour de @lmilcent )

---

<div class="post-metadata">

**Author:** ![Terdious](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/terdious/32/6316_2.png) [@Terdious](https://community.gladysassistant.com/u/Terdious)\
**Post date:** [Mai 3, 2022, 5:00 UTC](https://community.gladysassistant.com/t/sauvegarder-ou-pas-lhistorique-dune-fonctionnalites-precise/7241/3 "2022-05-03T17:00:26Z")

</div>

Je m’occupe de la 1ere PR au plus vite !!

---

<div class="post-metadata">

**Author:** ![VonOx](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/vonox/32/10128_2.png) [@VonOx](https://community.gladysassistant.com/u/VonOx)\
**Post date:** [Mai 3, 2022, 5:09 UTC](https://community.gladysassistant.com/t/sauvegarder-ou-pas-lhistorique-dune-fonctionnalites-precise/7241/4 "2022-05-03T17:09:12Z")

</div>

Oui le besoin est similaire de mon côté on s’est bien compris.

D’un point de vue design/logique c’est ultra compliqué pour l’agrégation car elle va considérer qu’il n’y a pas eu de valeurs sur un laps de temps.

Donc si changement d’état/valeur il faut d’abord insérer le state précédent juste avant(pour avoir une chronologie correcte. C’est un peut tricky mais ça peut le faire.

Ça se test assez facilement ( pour voir le comportement de l’agrégation et le résultat sur des graphes)

Exemple : temperature d’une pièce  
A 8h =\> 19deg  
A 9h =\> 19deg (je ne fais rien en db)  
A 9h30 =\> 19.5 ( la j’ecrit en db l’ancienne valeur puis la nouvelle)

C’est ultra simpliste mais c’était pour illustrer.

Edit: je parle de la 2ème PR du coup 😅

---

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [Mai 3, 2022, 5:14 UTC](https://community.gladysassistant.com/t/sauvegarder-ou-pas-lhistorique-dune-fonctionnalites-precise/7241/5 "2022-05-03T17:14:54Z")

</div>

Je suis pas sûr qu’on parle de la même chose ou alors j’ai rien compris ?

Je pensais qu’on parlait d’avoir un paramètres «&nbsp;par device&nbsp;» de durée de rétention des données

---

<div class="post-metadata">

**Author:** ![Terdious](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/terdious/32/6316_2.png) [@Terdious](https://community.gladysassistant.com/u/Terdious)\
**Post date:** [Mai 3, 2022, 5:15 UTC](https://community.gladysassistant.com/t/sauvegarder-ou-pas-lhistorique-dune-fonctionnalites-precise/7241/6 "2022-05-03T17:15:43Z")

</div>

> [@VonOx](#):
>
> Donc si changement d’état/valeur il faut d’abord insérer le state précédent juste avant(pour avoir une chronologie correcte. C’est un peut tricky mais ça peut le faire.

Oui c est ce que je proposais dans mon autre post. Et c est ce que j’ai fait sur Netatmo pour le coup  
Je pourrais meme vous montrer ce que ca donne sur l agrega pour le coup

---

<div class="post-metadata">

**Author:** ![VonOx](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/vonox/32/10128_2.png) [@VonOx](https://community.gladysassistant.com/u/VonOx)\
**Post date:** [Mai 3, 2022, 5:16 UTC](https://community.gladysassistant.com/t/sauvegarder-ou-pas-lhistorique-dune-fonctionnalites-precise/7241/7 "2022-05-03T17:16:40Z")

</div>

Par features, et aussi de stocker des valeurs identiques quand tu as des devices verbeux.

---

<div class="post-metadata">

**Author:** ![Terdious](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/terdious/32/6316_2.png) [@Terdious](https://community.gladysassistant.com/u/Terdious)\
**Post date:** [Mai 3, 2022, 5:18 UTC](https://community.gladysassistant.com/t/sauvegarder-ou-pas-lhistorique-dune-fonctionnalites-precise/7241/8 "2022-05-03T17:18:10Z")

</div>

Bah les states c’est bien par feature, donc c’est dans la meme logique que çadu coup.  
Pour une lampe philips hue par exemple, ca peut etre interessant de garder le ON/OFF, mais pour le coup les couleurs … pour ma part je m en fiche … non ?

---

<div class="post-metadata">

**Author:** ![Terdious](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/terdious/32/6316_2.png) [@Terdious](https://community.gladysassistant.com/u/Terdious)\
**Post date:** [Mai 5, 2022, 7:33 UTC](https://community.gladysassistant.com/t/sauvegarder-ou-pas-lhistorique-dune-fonctionnalites-precise/7241/9 "2022-05-05T07:33:26Z")

</div>

@pierre-gilles, @AlexTrovato, @VonOx,  
Je me permet de relancer le sujet le considérant comme possiblement critique sur certaines instance un peu lourdes.  
Pour rappel les sujets du débat :

> [@Rétention uniquement des valeurs aggrégées](https://community.gladysassistant.com/t/retention-uniquement-des-valeurs-aggregees/7064):
>
> Je propose d’ajouter une option pour ne garder qu’uniquement les valeurs aggrégées par période et supprimer les valeurs brut passé 24h (seuil configurable). Actuellement mes prises connectées renvoient une valeur / minute, 24h / 24h depuis plus d’un an. Ma base de données atteint 3Gb, alors qu’elle pourrait être de quelques centaines de Mio.

> [@\[DB de 5Go\] Lenteurs au premier démarrage](https://community.gladysassistant.com/t/db-de-5go-lenteurs-au-premier-demarrage/7211):
>
> Salut à tous, salut @pierre-gilles, J’en parle sur le forum avant de définir ensemble ce que tu veux voir sur GitHub wink Ca fait un moment que je le ressent, mais j’ai pu le confirmer maintenant en enregistrant mon écran. Démarrage de Gladys Si le conteneur de Gladys est arrêté puis démarré à nouveau (après une MAJ par exemple), le premier chargement des graphiques prend énormément de temps. Cela est certainement dû en partie à la taille de la DB 4.5Go ! Mais pas que, puisque tu as expli…

> [@Case à cochée "Ne pas enregistrer les nouvelles valeurs identiques" + Choix de durée de backup indépendant pour chaque Device Features](https://community.gladysassistant.com/t/case-a-cochee-ne-pas-enregistrer-les-nouvelles-valeurs-identiques-choix-de-duree-de-backup-independant-pour-chaque-device-features/5963):
>
> Bonjour, Suite à un gros retour d’expérience concernant l’usage et la taille de DB, je propose cette nouvelle Feature Request et je pense qu’elle rapidement devenir urgente. Je m’explique : J’ai 92 Devices et 143 Devices Features composés de : 4 caméras (avec un poll compris entre 10s et 1 minutes - pour certaines il serait nécessaire d’avoir un temps réel voir toutes les 2 secondes de temps en temps, mais ce n’est pas possible : rend l’interface trop lente), 2 devices / 9 devices features…

Si on peut définir la feuille de route au complet ainsi que valider un cahier des charges, je veux bien m’en occuper autant que possible et sortir un premier jet rapidement.

Pour rappel également, la proposition que je faisais (modifié selon la proposition de Pierre-Gilles dans l’ordre) pour entamer la discussion :

- _ **1ère PR** _ :

- _ **2ème PR** _ :

> **Proposition de Code**
>
> ```auto
> const db = require('../../models');
> const logger = require('../../utils/logger');
> const { EVENTS, WEBSOCKET_MESSAGE_TYPES } = require('../../utils/constants');
> 
> /**
> * @description Save new device feature state in DB.
> * @param {Object} deviceFeature - A DeviceFeature object.
> * @example
> * saveLastValueChanged({
> * id: 'fc235c88-b10d-4706-8b59-fef92a7119b2',
> * selector: 'my-light'
> * });
> */
> async function saveLastStateChanged(deviceFeature) {
> // logger.debug(`device.saveLastStateChanged of deviceFeature ${deviceFeature.selector}`);
> const now = new Date();
> // save local state in RAM
> this.stateManager.setState('deviceFeature', deviceFeature.selector, {
> last_value_changed: now,
> });
> await db.sequelize.transaction(async (t) => {
> // update deviceFeature lastValue in DB
> await db.DeviceFeature.update(
> {
> last_value_changed: now,
> },
> {
> where: {
> id: deviceFeature.id,
> },
> },
> {
> transaction: t,
> },
> );
> });
> 
> // send websocket event
> this.eventManager.emit(EVENTS.WEBSOCKET.SEND_ALL, {
> type: WEBSOCKET_MESSAGE_TYPES.DEVICE.NEW_STATE_NO_CHANGED,
> payload: {
> device_feature_selector: deviceFeature.selector,
> last_value_changed: now,
> },
> });
> }
> 
> module.exports = {
> saveLastStateChanged,
> };
> 
> ```

- Lorsque la valeur change de nouveau, on repasse par la fonction du fichier server/lib/device/device.saveState.js qu’on doit modifier pour réenregistrer, avant la nouvelle valeur, l’ancienne valeur déjà en base, pour avoir une courbe ajustée :

> **Proposition de Code**
>
> ```auto
> const db = require('../../models');
> const logger = require('../../utils/logger');
> const { EVENTS, WEBSOCKET_MESSAGE_TYPES } = require('../../utils/constants');
> const { BadParameters } = require('../../utils/coreErrors');
> 
> const DEFAULT_OPTIONS = {
> skip: 0,
> order_dir: 'DESC',
> order_by: 'created_at',
> };
> 
> /**
> * @description Save new device feature state in DB.
> * @param {Object} deviceFeature - A DeviceFeature object.
> * @param {number} newValue - The new value of the deviceFeature to save.
> * @example
> * saveState({
> * id: 'fc235c88-b10d-4706-8b59-fef92a7119b2',
> * selector: 'my-light'
> * }, 12);
> */
> async function saveState(deviceFeature, newValue) {
> if (Number.isNaN(newValue)) {
> throw new BadParameters(`device.saveState of NaN value on ${deviceFeature.selector}`);
> }
> const optionsWithDefault = Object.assign({}, DEFAULT_OPTIONS);
> 
> // logger.debug(`device.saveState of deviceFeature ${deviceFeature.selector}`);
> const now = new Date();
> const previousDeviceFeature = this.stateManager.get('deviceFeature', deviceFeature.selector);
> const previousDeviceFeatureValue = previousDeviceFeature ? previousDeviceFeature.last_value : null;
> 
> const previousDeviceFeatureLastValueChanged = previousDeviceFeature ? previousDeviceFeature.last_value_changed : null;
> 
> const deviceFeaturesState = await db.DeviceFeatureState.findOne({
> attributes: ['device_feature_id', 'value', 'created_at'],
> order: [[optionsWithDefault.order_by, optionsWithDefault.order_dir]],
> where: {
> device_feature_id: deviceFeature.id,
> },
> });
> const previousDeviceFeatureStateLastValueChanged = deviceFeaturesState ? deviceFeaturesState.created_at : 0;
> 
> // save local state in RAM
> this.stateManager.setState('deviceFeature', deviceFeature.selector, {
> last_value: newValue,
> last_value_changed: now,
> });
> // update deviceFeature lastValue in DB
> await db.DeviceFeature.update(
> {
> last_value: newValue,
> last_value_changed: now,
> },
> {
> where: {
> id: deviceFeature.id,
> },
> },
> );
> // if the deviceFeature should keep history, we save a new deviceFeatureState
> if (deviceFeature.keep_history) {
> // if the previous created deviceFeatureState is different of deviceFeature
> // last value changed, we save a new deviceFeatureState of old state
> if (previousDeviceFeatureLastValueChanged - previousDeviceFeatureStateLastValueChanged > 0) {
> await db.DeviceFeatureState.create({
> device_feature_id: deviceFeature.id,
> value: previousDeviceFeatureValue,
> created_at: previousDeviceFeatureLastValueChanged,
> });
> }
> await db.DeviceFeatureState.create({
> device_feature_id: deviceFeature.id,
> value: newValue,
> });
> }
> // });
> 
> // send websocket event
> this.eventManager.emit(EVENTS.WEBSOCKET.SEND_ALL, {
> type: WEBSOCKET_MESSAGE_TYPES.DEVICE.NEW_STATE,
> payload: {
> device_feature_selector: deviceFeature.selector,
> last_value: newValue,
> last_value_changed: now,
> },
> });
> 
> // check if there is a trigger matching
> this.eventManager.emit(EVENTS.TRIGGERS.CHECK, {
> type: EVENTS.DEVICE.NEW_STATE,
> device_feature: deviceFeature.selector,
> previous_value: previousDeviceFeatureValue,
> last_value: newValue,
> last_value_changed: now,
> });
> }
> 
> module.exports = {
> saveState,
> };
> 
> ```

Exemple :

> **si on reçoit pour une puissance consommée**
>
> ```auto
> {
> value: 1014.7,
> created_at: 2022-04-19 04:20:13.277 +00:00
> },
> {
> value: 1014.9,
> created_at: 2022-04-19 04:30:13.277 +00:00
> },
> {
> value: 1014.9,
> created_at: 2022-04-19 04:40:13.277 +00:00
> },
> {
> value: 1014.9,
> created_at: 2022-04-19 04:50:13.277 +00:00
> },
> {
> value: 1014.9,
> created_at: 2022-04-19 05:00:13.277 +00:00
> },
> {
> value: 1014.9,
> created_at: 2022-04-19 05:10:13.277 +00:00
> },
> {
> value: 78.0,
> created_at: 2022-04-19 05:20:13.277 +00:00
> }
> 
> ```
> 
> On retrouvera en DB seulement
> 
> ```auto
> {
> value: 1014.7,
> created_at: 2022-04-19 04:20:13.277 +00:00
> },
> {
> value: 1014.9,
> created_at: 2022-04-19 04:30:13.277 +00:00
> },
> // ici on a pas sauvegardé les valeurs identiques
> {
> value: 1014.9,
> created_at: 2022-04-19 05:10:13.277 +00:00
> },
> // Après avoir écrit la valeur ci-dessous, on a renvoyé
> {
> value: 78.0,
> created_at: 2022-04-19 05:20:13.277 +00:00
> }
> 
> ```

_Question_ : Est-ce utile ou indispensable de voir quelque chose pour les données agrégées ? Je m’explique : suite à lecture du post de lmilcent (cité précédemment concernant la rétention), lors de la 1ère PR il faut tenir compte de cela pour ne pas casser l’agrégation des données si le keep\_history de la feature est réglé sur 1 jour. L’agrégation des 1 an devra tout de même conserver toutes ses données sauf si le keep\_history est réglé à «&nbsp;OFF&nbsp;», n’est ce pas ??

---

<div class="post-metadata">

**Author:** ![lmilcent](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/lmilcent/32/7023_2.png) [@lmilcent](https://community.gladysassistant.com/u/lmilcent)\
**Post date:** [Mai 11, 2022, 9:28 UTC](https://community.gladysassistant.com/t/sauvegarder-ou-pas-lhistorique-dune-fonctionnalites-precise/7241/10 "2022-05-11T09:28:36Z")

</div>

En complément, est-il possible de proposer une alternative à «&nbsp;keep\_history&nbsp;» qui correspond à l’historique complet des capteurs depuis le lancement de l’instance Gladys avec par exemple «&nbsp;keep aggregated history&nbsp;», qui correspond aux données aggrégées tous les jours, donc max 100 valeurs / jour.

Dans mon installation, avec une prise qui m’envoie les infos toutes les 3 secondes, ça permet de passer de ~~480~~ 28800 messages par jour à 100, soit une sacré diminution des données !

---

<div class="post-metadata">

**Author:** ![Terdious](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/terdious/32/6316_2.png) [@Terdious](https://community.gladysassistant.com/u/Terdious)\
**Post date:** [Mai 11, 2022, 10:20 UTC](https://community.gladysassistant.com/t/sauvegarder-ou-pas-lhistorique-dune-fonctionnalites-precise/7241/11 "2022-05-11T10:20:02Z")

</div>

A voir si la multitude d’option est vraiment une solution. Mais @lmilcent, on est d’accord que pouvoir choisir sur ces devices de n’enregistrer que les changements d’état résoudrait ce problème bien au-delà de cette diminution non ?

Pourquoi 480 ? ^^

---

<div class="post-metadata">

**Author:** ![lmilcent](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/lmilcent/32/7023_2.png) [@lmilcent](https://community.gladysassistant.com/u/lmilcent)\
**Post date:** [Mai 11, 2022, 11:39 UTC](https://community.gladysassistant.com/t/sauvegarder-ou-pas-lhistorique-dune-fonctionnalites-precise/7241/12 "2022-05-11T11:39:29Z")

</div>

> [@Terdious](#):
>
> Pourquoi 480 ? ^^

Hum, je crois que travailler et répondre à un message sur le forum c’est pas la meilleur idée 😂  
Donc un message toute les 3 secondes, ça fait 20 message / minutes, soit 1200 messages / heures, soit 28 800 / jour.

Donc clairement, si je veux **garder l’historique des valeurs** , sans exploser le stockage, l’agrégation me semble plus qu’une bonne alternative.

> [@Terdious](#):
>
> Mais @lmilcent, on est d’accord que pouvoir choisir sur ces devices de n’enregistrer que les changements d’état résoudrait ce problème bien au-delà de cette diminution non ?

Oui tout à fait, pour **certains** device, je me fout des valeurs identiques (pression atmosphérique, température, etc.) et c’est un vrai levier aussi ici pour économiser du stockage.  
Attention cependant, c’est important de savoir que ma prise détecte toujours 200W d’utilisation instantanné, et je souhaite garder en mémoire les valeurs identiques dans certains cas. Il faut donc prévoir de pouvoir activer l’option «&nbsp;ne pas enregistrer les valeurs identiques&nbsp;» pour chaque device (voire feature).

---

<div class="post-metadata">

**Author:** ![VonOx](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/vonox/32/10128_2.png) [@VonOx](https://community.gladysassistant.com/u/VonOx)\
**Post date:** [Mai 11, 2022, 11:43 UTC](https://community.gladysassistant.com/t/sauvegarder-ou-pas-lhistorique-dune-fonctionnalites-precise/7241/13 "2022-05-11T11:43:29Z")

</div>

> [@lmilcent](#):
>
> Attention cependant, c’est important de savoir que ma prise détecte toujours 200W d’utilisation instantanné, et je souhaite garder en mémoire les valeurs identiques dans certains cas. Il faut donc prévoir de pouvoir activer l’option « ne pas enregistrer les valeurs identiques » pour chaque device (voire feature).

J’ai du mal à suivre

Quel cas ?

Si la valeur change c’est que juste avant tu étais à 200W donc on a la valeur

---

<div class="post-metadata">

**Author:** ![lmilcent](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/lmilcent/32/7023_2.png) [@lmilcent](https://community.gladysassistant.com/u/lmilcent)\
**Post date:** [Mai 11, 2022, 12:07 UTC](https://community.gladysassistant.com/t/sauvegarder-ou-pas-lhistorique-dune-fonctionnalites-precise/7241/14 "2022-05-11T12:07:44Z")

</div>

> [@VonOx](#):
>
> Si la valeur change c’est que juste avant tu étais à 200W donc on a la valeur

Je pense que je n’avais pas bien compris l’idée, maintenant c’est plus clair merci 🙂  
Donc je confirme, ça fera déjà économiser un peu de stockage.

Dans le cas de ma prise connectée, elle peut renvoyer 201W puis 200W, puis 202W, donc l’aggrégation est aussi une solution viable et intéressante pour gagner en stockage, et donc en rapidité pour tout (gladys, I/O carte SD, etc).

---

<div class="post-metadata">

**Author:** ![Terdious](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/terdious/32/6316_2.png) [@Terdious](https://community.gladysassistant.com/u/Terdious)\
**Post date:** [Mai 14, 2022, 8:41 UTC](https://community.gladysassistant.com/t/sauvegarder-ou-pas-lhistorique-dune-fonctionnalites-precise/7241/15 "2022-05-14T08:41:48Z")

</div>

Hello !!

Bon la 1ère PR pour le Keep History est presque prête selon ce que nous avons dit hier. Simple… ou presque ^^  
1 point à voir tout de même, j’ai fait la modif pour les intégrations dans lesquelles l’édition des devices est modifiable ainsi que pour mqtt qui est indépendante. Toutefois certaines intégrations (comme Philips Hue) ne sont pas modifiables. Est-ce que j’en profite pour ajouter cette page d’édition pour les intégration manquantes ?

Sinon ça donne ça pour mqtt :

 ![image](https://gladys-assistant-community.b-cdn.net/uploads/default/original/2X/9/9ecea8cc066c4e03d221088057a4f659c399d53c.png)

---

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [Mai 14, 2022, 8:54 UTC](https://community.gladysassistant.com/t/sauvegarder-ou-pas-lhistorique-dune-fonctionnalites-precise/7241/16 "2022-05-14T08:54:27Z")

</div>

> [@Terdious](#):
>
> Bon la 1ère PR pour le Keep History est presque prête selon ce que nous avons dit hier. Simple… ou presque ^^

Nickel !

Juste le label est pas super explicite je trouve, je mettrais plutôt un «&nbsp;Garder l’historique des états&nbsp;», et rajouter en dessous un petite description comme dans la catégorie «&nbsp;Topic MQTT pour publier&nbsp;», pour expliquer ce que cette case fait.

**Description:**

> Si vous activez cette option, Gladys gardera l’historique de tous les états que prend cette fonctionnalité, ce qui permet ensuite d’afficher des graphiques sur le tableau de bord.

Aussi, j’y pense maintenant mais c’est un truc qu’il va falloir faire, dans la tâche de clean qui passer pour nettoyer la DB, il faudra rajouter une tâche pour clean les device\_feature\_state + aggregate des feature dont le `keep_history` est passé à false (car tu peux activer le keep\_history = false à posteriori, et donc il faut passer pour nettoyer)

---

<div class="post-metadata">

**Author:** ![Terdious](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/terdious/32/6316_2.png) [@Terdious](https://community.gladysassistant.com/u/Terdious)\
**Post date:** [Mai 14, 2022, 9:23 UTC](https://community.gladysassistant.com/t/sauvegarder-ou-pas-lhistorique-dune-fonctionnalites-precise/7241/17 "2022-05-14T09:23:16Z")

</div>

Merci pour cette réponse … instantanée ^^

> [@pierre-gilles](#):
>
> Juste le label est pas super explicite je trouve, je mettrais plutôt un « Garder l’historique des états », et rajouter en dessous un petite description comme dans la catégorie « Topic MQTT pour publier », pour expliquer ce que cette case fait.

Très bien. C’est fait, juste à voir si la description te convient ? J’ai mis la même phrase que dans les réglages système (Conserver plutôt que Garder et fonctionnalité à la place d’appareil du coup.)  
 ![image](https://gladys-assistant-community.b-cdn.net/uploads/default/original/2X/5/5a21ac276b26c24263acb81419f1808c16941ec5.png)

> [@pierre-gilles](#):
>
> Aussi, j’y pense maintenant mais c’est un truc qu’il va falloir faire, dans la tâche de clean qui passer pour nettoyer la DB, il faudra rajouter une tâche pour clean les device\_feature\_state + aggregate des feature dont le `keep_history` est passé à false (car tu peux activer le keep\_history = false à posteriori, et donc il faut passer pour nettoyer)

Justement j’étais en train en attendant une réponse à la question … dont tu n’as pas répondu 🙂 :

> [@Terdious](#):
>
> Toutefois certaines intégrations (comme Philips Hue) ne sont pas modifiables. Est-ce que j’en profite pour ajouter cette page d’édition pour les intégration manquantes ?

---

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [Mai 14, 2022, 9:58 UTC](https://community.gladysassistant.com/t/sauvegarder-ou-pas-lhistorique-dune-fonctionnalites-precise/7241/18 "2022-05-14T09:58:05Z")

</div>

> [@Terdious](#):
>
> Toutefois certaines intégrations (comme Philips Hue) ne sont pas modifiables. Est-ce que j’en profite pour ajouter cette page d’édition pour les intégration manquantes ?

Ah pardon ! Je pense pas que ce soit nécessaire pour ces intégrations pour l’instant, je pense que ces intégrations on pourrait juste mettre des valeurs par défaut qui font sens. Le Philips Hue n’est pas très verbose de toute façon…

---

<div class="post-metadata">

**Author:** ![Terdious](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/terdious/32/6316_2.png) [@Terdious](https://community.gladysassistant.com/u/Terdious)\
**Post date:** [Mai 14, 2022, 6:05 UTC](https://community.gladysassistant.com/t/sauvegarder-ou-pas-lhistorique-dune-fonctionnalites-precise/7241/19 "2022-05-14T18:05:02Z")

</div>

> [@pierre-gilles](#):
>
> Ah pardon ! Je pense pas que ce soit nécessaire pour ces intégrations pour l’instant, je pense que ces intégrations on pourrait juste mettre des valeurs par défaut qui font sens. Le Philips Hue n’est pas très verbose de toute façon…

En effet je n’avais pas bien regardé, c’est déjà le cas sur Philips Hue notamment, les températures, couleur, brightness et autres ne sont pas en keep\_history ^^

> [@pierre-gilles](#):
>
> Aussi, j’y pense maintenant mais c’est un truc qu’il va falloir faire, dans la tâche de clean qui passer pour nettoyer la DB, il faudra rajouter une tâche pour clean les device\_feature\_state + aggregate des feature dont le `keep_history` est passé à false (car tu peux activer le keep\_history = false à posteriori, et donc il faut passer pour nettoyer)

Bon j’ai fait un truc pour ça, tu me rediras !! Ca fonctionne très bien, mais pas sûr de la propreté du code …

- PR : [Features keep history by Terdious · Pull Request #1522 · GladysAssistant/Gladys · GitHub](https://github.com/GladysAssistant/Gladys/pull/1522)
- Image docker également disponible si il y a des testeurs notamment pour Zigbee (je n’ai pas pu tester) : `docker push terdious/gladys:featureKeepHistory`
