Calcul Historique Jour Semaine Mois

Bonjour,

J’ai une donnée numérique de consommation électrique, c’est un compteur Smartmeter qui me fourni le cumul (kWh) et je voudrais avoir l’historique par jour / semaine / mois.

ça me parait simple mais je n’ai pas trouvé comment faire, il faut dire que la valeur n’est pas régulière, on a une maj quand elle change donc il peut y avoir plusieurs valeurs sur une journée (forte consommation) comme aucune valeur pendant plusieurs jours (si on est absent).

J’ai trouvé un scénario qui calcule un cumul par mois mais ça me semble bien compliqué par rapport au besoin. Et puis ça fait la somme de toutes les valeurs du mois.

Il n’y a pas plus simple pour faire ce genre de calcul ?

Il te fournit quel cumul ?
Cumul depuis le dernier relevé ? sur la journée ?

Mon script est « assez complexe » (pas tant que ça en fait !) Car il recalculé les cumuls antérieurs.

Norbert

C’est un cumul « absolu » depuis que je l’ai acheté. il y a bien une commande de remise à zéro du compteur mais je ne l’utilise pas.

Salut

J’ai faiz l’équivalent il y a quelques semaines. Il suffit d’utiliser un calcul type maxbetween - min between. Une recherche sur la communauté te donnera plusieurs exemples.

Antoine

Je commencerai par créer un virtuel qui fais le delta entre la précédente valeur et la valeur actuelle pour avoir la consommation entre deux remontées.
Ensuite, il te suffit de faire une somme de cette consommation sur la journée, la semaine ou le mois

Tu peux donner la référence ton Smart meter, je suis quand même surpris qu’il n’y ait pas plus de données que l’information de consommation globale

Norbert

1 « J'aime »

Bonjour @Tonio16,
J’avais pensé à ça, mais le problème c’est que ton min une période sera toujours supérieur au max de la période précédente parce que tu ne vas pas prendre en compte le delta entre les deux
Tu vas systématiquement perdre la consommation à cheval entre deux périodes
(Ou alors, il ne faut pas prendre le min de la période mais le max de la période précédente)

Norbert

Je ne comprends pas… Tu dis que le cumul est absolu :thinking:

Le calcul se fait sur la période que tu donnes, comme cumul absolu, je vois pas ce qui est gênant. Et tu calculs journalier. Hebdo et mensuel indépendamment des autres.

Antoine

Admettons que tu aies un index de 100 le 1er avril, 180 le 30 avril 190 le 1er mai et de 250 le 31 mai.
En prenant les Min et Max comme tu le dis, tu vas trouver une consommation de 80 au mois d’avril (180-100) et de 60 au mois de mai (250-190), somme des deux 140 alors que tu auras consommé dans les faits 150 (250-100).
Si tu as une remontée toutes les 30 secondes, l’alea est négligeable, par contre si tu as une remonter tous les x jours, ça l’ai moins, je pense

Norbert

Non car tu bases le calcul à la minute près et pas au jour. Donc tu fais le calcul du 1/4 à 00h00 au 30/4 24h00, et réciproquement pour mai.

Si c’est bien le comportement du compteur, cela devrait fonctionner, non?

Antoine

Ben non, justement, si tu as une remontée du smartmrter le 30/04 à 12h (max de la période précédente, 180 dans mon exemple) et une remontée le 01/05 à 12h (min de la période actuelle, 190) … La conso entre le 30/04 12h et le 01/05 12h, soit 10, n’est pas prise en compte.

Cette approximation est effectivement négligeable si tu as une remontée à 23h59 et une autre à 00h01, mais pas dans son cas je pense

Mais le fait de prendre le max de la période précédente plutôt que le min de la période actuelle règle le PB

Norbert

Hello,

Mais tu veux construire ça à partir de maintenant ou bien refabriquer un historique Jour / Semaine / Mois à partir de l’historique de la commande index ? Ca va pas forcement être la même façon de s’y prendre.

Ok mais cela n’est pas ce qu’écrit pifou:

Il ne dit pas que cela ce mettrait a jour aléatoirement si il y a une consommation, ou après x kWh de consommés.

Mais ton propos est de dire que la formule prendra 190 comme minimum le 1/5. Pourquoi devrait-elle le faire? Je ne connais que la formule pas la façon dont elle fonctionne. Je part du principe que le min à 00h00 le 1/5 c’est 180 et non 190. Est-ce que le min between prend 190 car ce serait le premier changement dans la base de donnée à cette date?

Antoine

Je vois ce que tu veux dire ! Et effectivement, je n’ai pas la réponse non plus

1 « J'aime »

Pris sur l’une de mes courbes :

Valeur de 35 le 29/05 à 19h45
image

Le minBeetween depuis le 29/05 à 19h00 sort bien 35
image

Valeur suivante enregistrée le 30/05 à 05h45 sort 311 … et pas 35
image

image

La valeur de 35 n’est donc pas du tout prise en compte dès lors que l’on regarde après son enregistrement dans la bdd

Mince, ce n’est pas ce que j’aurais voulu mais cela a sa logique.

Antoine

du coup, proposition pour la consommation du mois

maxBetween(<commande>,'first day of this month 00:00','last day of this month 23:59') - maxBetween(<commande>,'first day of last month 00:00','last day of last month 23:59')

Merci pour vos réponses, en fait c’est drôlement compliqué j’aurais pas vu ça comme ça… Mais après réflexion, oui cela a sa logique, fallait y penser :slight_smile:
C’est le smartmeter ZMNHTD (z-wave qubino) il donne la conso au mieux toutes les 5 minutes je pense, mais sinon pendant la nuit s’il ne se passe rien il n’envoie pas d’info pendant des heures.

Donc, effectivement à minuit pile je n’ai pas la valeur exacte, mais, de 2 choses l’une:

  • soit la valeur est vieille mais ça n’a pas trop changé depuis
  • soit la valeur est récente si ça change vite
    Dans les 2 cas je prends le max de la veille ça devrait faire l’affaire.

Les 2 c’est possible ? Je vais le faire à partir de maintenant avec la formule de @ngrataloup mais est-il possible d’enrichir la commande - le virtuel que je vais créer - avec l’historique passé ?

Ben, du coup, tu retombes sur mon bloc code initial que tu trouvais un peu complexe :sweat_smile:
A adapter avec la diff des maxbetween, car moi, je somme des consos quotidiennes.

Norbert

Merci pour ton code, je l’ai finalement apprivoisé il faut y passer un peu de temps :slight_smile:
Je le partage, on sait jamais, plus de ‹ maxbetween › mais je fais un ‹ max - min ›. Et j’utilise la classe php des dates. Parce que sinon il parait que ça ne marchera plus au dela de 2038 (d’ailleurs faudra revoir le code de jeedom avant cette date)

// source command is the cumulative value
$cmdSource = cmd::byString('#[monitor][SmartMeter][Consommation électrique]#');
// target command for monthly report
$cmdCible = cmd::byString('#[monitor][Consommation Electrique][ConsoElecMois]#');

// https://www.php.net/manual/fr/class.datetimeimmutable.php
$fin = new DateTimeImmutable('first day of this month 00:00:00');
$interval = new DateInterval('P1M');
$scenario->setLog('Start from now : ' . $fin->format('d/m/Y H:i:s'));

// clear history and recreate it
$cmdCible->emptyHistory();
do {
  $debut = $fin->sub($interval);
  // Jeedom functions use date formated with 'Y-m-d H:i:s'
  $conso = $cmdSource->getStatistique( $debut->format('Y-m-d H:i:s'), $fin->format('Y-m-d H:i:s'));

  // array with [avg] [min] [max] [sum] [count] [std] [variance] [last] 
  if ( is_array($conso) && $conso['count'] > 0 && $conso['min'] > 0 && $conso['max'] > 0 && $conso['variance'] < 10000 ) {
    $scenario->setLog($debut->format('m Y ---> d/m/Y H:i:s').' --> '.$fin->format('d/m/Y H:i:s').' --> '.round($conso['max'] - $conso['min'],0).'kWh');
    $cmdCible->event( round($conso['max'] - $conso['min'],0), $debut->format('Y-m-d H:i:s'));
  }
  
  // next period begins:
  $fin = $debut;
} while( is_array($conso) && $fin->format("Y") > 2010);

J’ai fait la même avec les cumuls par semaine au lieu du mois sur le même principe :


// ********************************
// idem for the weekly history
// ********************************

$cmdCible = cmd::byString('#[monitor][Consommation Electrique][ConsoElecSemaine]#');

$fin = new DateTimeImmutable('first day of this week 00:00:00');
$interval = new DateInterval('P7D');
$scenario->setLog('Start from now : ' . $fin->format('d/m/Y H:i:s'));

// clear history and recreate it
$cmdCible->emptyHistory();
do {
  $debut = $fin->sub($interval);
  // array with [avg] [min] [max] [sum] [count] [std] [variance] [last] 
  $conso = $cmdSource->getStatistique( $debut->format('Y-m-d H:i:s'), $fin->format('Y-m-d H:i:s'));

  if ( is_array($conso) && $conso['count'] > 0 && $conso['min'] > 0 && $conso['max'] > 0 && ($conso['max'] - $conso['min'] < 100000) ) {
    $scenario->setLog($debut->format('W m Y ---> d/m/Y H:i:s').' --> '.$fin->format('d/m/Y H:i:s').' --> '.round($conso['max'] - $conso['min'],0).'kWh');
    $cmdCible->event( round($conso['max'] - $conso['min'],0), $debut->format('Y-m-d H:i:s'));
  }
  
  // next period begins:
  $fin = $debut;
} while( is_array($conso) && $fin->format("Y") > 2010);

Maintenant je peux repeupler ma commande cumul conso mois ou cumul conso semaine, il me suffit de relancer le scénario 1 fois par mois / semaine en fonction.

2 « J'aime »