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 ?
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.
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
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)
Je ne comprends pas… Tu dis que le cumul est absolu
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.
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
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
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.
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?
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
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
A adapter avec la diff des maxbetween, car moi, je somme des consos quotidiennes.
Merci pour ton code, je l’ai finalement apprivoisé il faut y passer un peu de temps
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.