Suppression de l'historique

Bonjour,

J’ai des virtuels qui historisent la conso jour, conso semaine et conso mois (statisticBetween avec sum). Donc a chaque nouvelle valeur de l’intervalle court, les virtuels additionne pour donner la conso totale jour, semaine, mois.

Donc je me retrouve avec énormément de valeurs, inutiles. 48 par jour, 48x7 pour la semaine, 48x31 pour le mois.

Donc l’idée est :
Pour le jour; j’aimerais supprimer l’historique depuis 00:00 à now. Au passage de minuit pour J+1, je devrais avoir garder la valeur de la veille.

Pour la semaine; supprimer l’historique depuis first day of this week à now. Au passage de minuit dimanche, je devrais avoir sauvegarder la dernière valeur.

Pour le mois; First day of this month, now. Au passage au 1er du mois, la dernière valeur devrais être sauvée.

Voici ce que j’ai essayé :

// Récupération de l'ID de la commande historisée
$_cmd_id = 2237;

// Récupération du timestamp de début de la journée en cours (à partir de minuit)
$_startTime = strtotime('today midnight');

// Récupération du timestamp de fin (jusqu'à maintenant)
$_endTime = time();

history::removeHistory($_cmd_id, $_startTime, $_endTime);

Sans résultat

J’ai aussi essayé des $cmd->cleanHistoryBetween
Rien.

J’ai aussi essayé une requête DB

DELETE FROM `historyArch` WHERE `cmd_id` = 2237 AND `datetime` BETWEEN '2023-11-03 00:00:00' AND '2023-11-03 23:00:00'

(J’ai essayé en absolue même si je souhaite le faire en relatif).

Ceci aussi :

// Récupération de l'ID de la commande historisée
$cmdId = 2237;

// Récupération du timestamp de début de la journée en cours (à partir de minuit)
$startOfDayTimestamp = strtotime('today midnight');

// Récupération du timestamp de fin (jusqu'à maintenant)
$endTimestamp = time();

// Suppression des valeurs de l'historique entre les timestamps spécifiés
$sql = "DELETE FROM `history` WHERE `cmd_id` = $cmdId AND `datetime` >= $startOfDayTimestamp AND `datetime` <= $endTimestamp";
$db = DB::Prepare($sql, array(), DB::FETCH_TYPE_ROW);
$db->execute();

J’ai pu lire ici que c’était pas bien :

Mais ça n’a de toute façon pas marché.

Et d’autres choses également, sans succès sinon je ne serais pas là à vous demander :slight_smile:

Merci d’avance pour vos réponses

Edit :
Dans mon scenario, l’objectif est de supprimer l’histo sur la période concernée puis de réeffectuer un calcul pour la période concernée (pour ne pas se retrouver avec toute ces valeurs inutile qui prennent de la place.
Au changement de période, la dernière valeur pour la période précédente devrait être épargnée en repartant sur le nouveau cycle.

Bonsoir.

Pourquoi ne pas directement définir une période de rétention avant la purge sur la commande historiée ?
Cela peut se faire commande par commande.

Bonsoir Fabrice, merci de porter attention à mon sujet.

Parce qu’on différencie la rétention de la purge?


Moi je ne vois que cette partie en ce qui concerne la purge ou la rétention.

Si je défini une durée ici je perdrais les données. Alors qu’au contraire je veux garder les données.

Ce qui m’intéresse dans mes données de conso jour/semaine/mois c’est de pouvoir calculer la somme des conso sur la période donnée en temps réel.

Par exemple, voici un histo :

A chaque fois, il s’agit de l’addition sur les conso d’intervalle rapprochée.

En réalité, la dernière valeur qui m’intéresse c’est la plus haute (ou la dernière).

Donc toute celle qui sont avant, ne m’intéressent pas.

Lorsque je ferais mon regroupement en max par jour/semaine/mois, je ne verrais que la dernière valeur (ou valeur max).

Donc toute les données qui sont derrière ne font qu’alourdir ma DB pour rien

Ok, je n’avais pas saisi.

Je n’ai pas la réponse.

@Fabrice Merci quand même :slight_smile:

$_cmd_id = 2237;

// Définissez la date et l'heure de début à aujourd'hui à 00:00
$_startTime = strtotime('midnight');

// Définissez la date et l'heure de fin à maintenant
$_endTime = time();

// Appelez la fonction removes avec les paramètres appropriés
history::removes($_cmd_id, $_startTime, $_endTime);

est le seul script qui ne renvoie pas d’erreur mais ne supprime pas l’historique sur la période demandée

Bonsoir,

C’est tes dates qui ne sont pas dans le format.

Essai voir date('Y-m-d H:i:s', strtotime("midnight")) et date('Y-m-d H:i:s', strtotime("now"))

super ça fonctionne ! Merci

Est ce qu’il est possible et plus rationnel de faire un remove last value? Si oui, comment le fait-on?

Ça ne me semble pas utile/malin de chercher à le faire sur lastvalue parce que de toute façon il faudra récupérer la date et faire le remove avec cette date.
Autant éviter ce passage intermédiaire.

Parce last value ne peut pas fonctionner pour une plage (midnight, now)?

Salut,

Je pense que tu t’embêtes pour rien.

Je fais la même chose pour historiser ma consommation élec ou je ne garde qu’une seule mesure d’historisation par jour. J’ai crée un virtuel et j’alimente le virtuel à partir de la commande principale. Et la commande principale est purgée automatiquement au bout de quelques jours.

Je te conseille donc de séparer en deux commandes ça sera clairement plus simple.

Ce virtuel est alimenté combien de fois par jour?

Est-il possible de montrer des histo?

La une fois par jour mais c’est un choix de ma part.

En gros j’ai une commande alimentée par un module zigbee qui relève l’index de mon compteur électrique.
Donc au fil de la journée j’ai les valeurs affichées sur mon compteur qui augmentent au fil du temps : 2500, 2502, 2510, 2511 …

J’ai un scénario qui se lance toutes les nuits et qui :

  • Récupère la valeur min de la veille
  • Récupère la valeur max de la veille
  • Fait la soustraction des deux et me donne ma conso du jour
  • J’historise cette valeur dans un virtuel à J 23:59:59

Et la valeur de ma commande « de base » est purgée automatiquement 7 jours plus tard vu que je n’ai pas besoin et envie de conserver le détail.

Et je m’en sers à la fin pour afficher un graph de ce type :

C’est une façon de faire aussi.

J’ai également pensé à faire ceci. Mais je préfère ma méthode.

Ca te fais avoir deux virtuels. Dont un qui n’est pas en live. Pour le mois, tu dois attendre la fin du mois pour connaître ta conso total du mois en cours. Ou bien te référer à ton premier virtuel.

Dans ce que je souhaitais faire, je n’ai qu’un seul virtuel et il en est « live ».

Bon, pour l’instant ce ne sont que des virtuels de test et j’attends de voir le comportement au changement de période. Il n y a pas de raison, mais j’attends d’être certain.

Néanmoins, je te remercie pour ta contribution :slight_smile:

Ben après mon scénario je pourrais le faire tourner n’importe quand dans l’absolu, à chaque actualisation de la commande principale c’est possible.

C’est juste que la je fais le total de ma conso sur la journée donc j’ai choisi de pas le mettre à jour tant que la journée n’est pas finie.

Pour le mois j’ai pas de second virtuel, je fais juste l’addition des consos par jour. Vu que ça fait peu de mesures à additionner vu que j’en ait qu’une par jour j’ai pas jugé nécessaire de faire un histo mois donc je fais que faire le cumul des jours

Je veux dire que tu pourrais utiliser getValueDate() sur la commande pour récupérer la date de la dernière valeur.

Et ensuite il faudra faire le « removes » en indiquant cette date en start et end.

Autant utiliser tout de suite un bornage pour faire la suppression afin d’éviter d’aller chercher cette date de dernière valeur.

$_cmd_id = 2238;

$_startTime = date('Y-m-d', strtotime('first day of this week')) . ' 00:00:01';

date('Y-m-d H:i:s', strtotime("now"));

history::removes($_cmd_id, $_startTime, $_endTime);

Ceci ne fonctionne visiblement pas.

Celui du jour « midnight, now » fonctionne.

Le passage de dimanche à lundi n’est pas marqué, il a continué à supprimé la dernière valeur de dimanche soir malgré qu’on soit lundi.
malgré la mention (first day of this week, now)

Test dans le testeur d’expression, tu verras que le « first day of this week » ne renvoi pas le bon jour

date('Y-m-d', strtotime('this week'))

D’accord. mais paradoxalement, first day of this month c’est correct

Merci

garder l’heure pour "this week 00:00, now) et « first day of this month 00:00, now » a t-il du sens?

Je ne pense pas, la référence étant 00:00:00

Bonsoir Mr,

Oui la preuve :

image

L’heure n’étant pas indiqué, c’est l’heure actuelle qui sera initié.