c’est effectivement ce que je cherche à obtenir en créant de nouvelles commandes info je pense
Les compteurs des shellys sont depuis le debut du comptage, ils ne font pas de journalier (ou je n’ai pas trouvé…)
c’est effectivement ce que je cherche à obtenir en créant de nouvelles commandes info je pense
Les compteurs des shellys sont depuis le debut du comptage, ils ne font pas de journalier (ou je n’ai pas trouvé…)
Bonjour,
J’ai un shelly PRO EM 50 (donc le même que le PRO 3EM mais en monophasé), et voici ATFU comment j’ai résolu le problème du cumul journalier (sur le principe, je simplifie volontairement un peu…).
1.- J’ai crée un virtuel qui me calcule les cumuls journaliers à partir de la production solaire instantanée.
Ma production solaire instantanée totale, qui est la somme des puissances instantanées fournies par l’ensemble de mes panneaux à un instant t : Production solaire_inst
(historisée bien sûr)
A partir de cette donnée, je calcule ma production solaire de la veille :
Avec la formule : statisticsBetween(#[Equipements][Panneaux Solaires][Production solaire_inst]#,sum,yesterday 00:00:00,yesterday 23:59:59)
Ce qui me donne un résultat en Wh. Pour l’avoir en kWh, il suffit de la diviser par 1000.
2.- Le problème maintenant, c’est d’historiser cette valeur dans la BDD. Parce que là, comme elle est calculée le lendemain avec les valeurs de la veille, j’ai donc un décalage d’un jour.
C’est un scénario qui va m’aider pour recaler tous les historiques qui m’intéressent au jour J-1.
Ce scénario est appelé tous les jours à 23h55. A ce moment, il ne fait que mémoriser le mois en cours (pour détecter la bascule d’un mois à l’autre), mais c’est anecdotique…
Plus important, à 06h00 le lendemain (ou en tout cas avant que les panneaux ne recommencent à produire…) il va mémoriser toutes les valeurs d’intérêts, et accessoirement forcer la mise à jour de certaines autres informations de mon virtuel (en principe elles le sont déjà, mais par sécurité…).
Enfin, comme il est compliqué (et même impossible…) avec juste un scénario classique de manipuler directement la BDD, je fait appel à un bloc code pour :
Voici le code :
// ID de la commande Jeedom dont l'historique doit être décalé à J-1 à 23h59 (#[Equipements][Panneaux Solaires][Widget_Production_jour-1]#)
$cmdId = 10310;
// Charge la commande et vérifie si elle existe toujours
$cmd = cmd::byId($cmdId);
if (!is_object($cmd)) {
$scenario->setLog("ID de la commande inexistante - [ ERROR ]");
exit;
}
// Requête SQL pour récupérer le datetime de l'historique qui sera à supprimer
$sql1 = 'SELECT datetime FROM history WHERE cmd_id = :cmd_id ORDER BY datetime DESC LIMIT 1';
$result = DB::Prepare(
$sql1,
array('cmd_id' => $cmdId),
DB::FETCH_TYPE_ROW
);
if (!empty($result)) {
$datetime = $result['datetime']; // Récupération du champ 'datetime'
}
else {
$scenario->setLog("Pas de champ date-heure identifié - [ ERROR ]");
exit;
}
// Création d'une ligne d'historique avec la valeur récupérée datée au jour J-1 à 23h59
$value = $cmd->execCmd();
$yesterday = date('Y-m-d 23:59:00', strtotime('-1 day'));
$cmd->addHistoryValue($value, $_datetime=($yesterday));
$cmd->save();
$scenario->setLog("Enregistrement de l'historique [Production] décalé à J-1 - [ OK ]");
// Effacement de l'historique daté du jour J
$values = array('cmd_id' => $cmd->getId(),'datetime' => $datetime,);
$sql2 = 'DELETE FROM history WHERE cmd_id=:cmd_id AND `datetime`=:datetime';
DB::Prepare($sql2, $values, DB::FETCH_TYPE_ROW);
$scenario->setLog("Effacement de l'historique [Production] du jour J - [ OK ]");
Il suffit de multiplier ce bloc code par le nombre de valeurs (repérés par son N° d’ID) qui devront fait l’objet d’un tel traitement dans le même scénario. Exemples : la production solaire journalière, le total injecté journalier, le total auto-consommé journalier.
Et je retrouve donc un historique cohérent avec les dates réelles :
Et enfin, au final je mets à jour mes variables qui mémorisent mes compteurs quotidiens/mensuels/annuels et à la date anniversaire de mon contrat de producteur.
Cela me permet de les présenter dans un design comme ceci :
Merci @DanielJ, c’est très inspirant !
Mais du coup le journalier est tjrs sur N-1 ?
Pas possible d’avoir en live le comptage en kWh qui s´incrémente le jour même ?
Pour savoir à 16h par exemple ce qu’on a déjà produit depuis le matin même ?
Autre sujet je regarde aussi le plugin compteur virtuel du market, il permet de faire du comptage en kWh à partir de données brutes instantanées en W, peut être utile pour arriver à mes fins ensuite…
→ Peut-être créé un compteur virtuel via ce plugin, dédié uniquement au comptage journalier, et le RAZ à 00h00 chaque jour ?!
Et ne garder que la plus grande valeur du jour dans la BDD ? (Via un scénario j’imagine…)
Oui, le calcul se fait toujours sur les données de la veille (de 00h00 à 23h59), c’est à dire lorsque la journée est terminée en somme.
Si, c’est tout à fait possible, je le fait d’ailleurs moi-même.
Mais je triche un peu…
J’utilise en fait une des informations fournies par le plugin Solcast (excellent plugin au demeurant fait et maintenu par @Bison, et que je conseille fortement …) : le paramètre
Production de la journée
Je ne connais pas ce plugin, mais peut-être qu’il permet en effet de simplifier un peu le process, je ne sais pas…
Sinon il y a toujours le plugin Suivi Conso
qui automatise tout ça… Perso, j’ai fait le choix dès le départ de ne pas faire appel à ce type de plugin. Là au moins je maîtrise tout de A à Z et ça m’a permis d’avoir à résoudre quelques problèmes pas si simples…
Maintenant que tu as l’index, il faut historiser la commande info et dans un virtuel faire le calcul.
D’après la documentation, l’historique peut être directement récupéré depuis le module avec la méthode EMData.GetData
.
{"id":1,"method":"EMData.GetData","params":{"id":0,"ts":1656356400,"end_ts":1656356800}}
La méthode retourne :
{
"id": 1,
"src": "shellypro3em-84cca87bf250",
"params": {
"keys": [
"a_total_act_energy",
"a_fund_act_energy",
"a_total_act_ret_energy",
"a_fund_act_ret_energy",
"a_lag_react_energy",
"a_lead_react_energy",
"a_max_act_power",
"a_min_act_power",
"a_max_aprt_power",
"a_min_aprt_power",
"a_max_voltage",
"a_min_voltage",
"a_avg_voltage",
"a_max_current",
"a_min_current",
"a_avg_current",
"b_total_act_energy",
"b_fund_act_energy",
"b_total_act_ret_energy",
"b_fund_act_ret_energy",
"b_lag_react_energy",
"b_lead_react_energy",
"b_max_act_power",
"b_min_act_power",
"b_max_aprt_power",
"b_min_aprt_power",
"b_max_voltage",
"b_min_voltage",
"b_avg_voltage",
"b_max_current",
"b_min_current",
"b_avg_current",
"c_total_act_energy",
"c_fund_act_energy",
"c_total_act_ret_energy",
"c_fund_act_ret_energy",
"c_lag_react_energy",
"c_lead_react_energy",
"c_max_act_power",
"c_min_act_power",
"c_max_aprt_power",
"c_min_aprt_power",
"c_max_voltage",
"c_min_voltage",
"c_avg_voltage",
"c_max_current",
"c_min_current",
"c_avg_current",
"n_max_current",
"n_min_current",
"n_avg_current"
],
"data": [
{
"ts": 0,
"period": 60,
"values": [
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
]
]
}
],
"next_record_ts": 1656357000
}
}
Tu veux dire l’historique « journalier » ?
Parce que les a/b/c_total_act_energy
je les récupère déjà, ce sont des totaux en Wh depuis le branchement du Shelly…
Je n’ai pas ce module pour faire des tests.
A toi de tester cette méthode.
Avec l’aide de @Jeandhom pour l’idée et @chatGPT pour formuler les bonnes syntaxes de code Jeedom (y compris astuce pour ne pas avoir de valeur parasite à minuit en forçant le résultat à ne jamais être inférieur à 0
avec la fonction max()
…)
Proposition de calcul de production solaire du jour à instant T (à confirmer) :
max(0, #[Atelier][SH2_PV_VE_X][Phase B : Total Energy]# - min(#[Atelier][SH2_PV_VE_X][Phase B : Total Energy]#, "today 00:00", now))
→ je vais tester cet expressiont dans mon virtuel
Eh bien c’est un échec…
Y compris sans le max(0,
du début (apparemment le « now » n’est pas reconnu ?) :
En fait c’est le calcul de la valeur minimale qui ne fonctionne pas (pourtant la commande est bien historisée, les infos sont bien numériques à chaque fois, etc…) :
Il faut que je travaille sur cette fonction qui ne marche pas encore :
min(#[Atelier][SH2_PV_VE_X][Phase B : Total Energy]#, "today 00:00", now)
C’est un minBetween que tu essaye de faire pas un min donc normal que ça ne marche pas
Effectivement ! Merci beaucoup
minbetween(#[Atelier][SH2_PV_VE_X][Phase B : Total Energy]#, "today 00:00", now)
→ Fonctionne !
je reprends mes investigations sur la suite.
Du coup l’expression ci-dessous fonctionne aussi, et n’aura pas de soucis de valeur negative avant la production des panneaux du matin (fausse piste chatGPT…) :
#[Atelier][SH2_PV_VE_X][Phase B : Total Energy]# - minbetween(#[Atelier][SH2_PV_VE_X][Phase B : Total Energy]#, today 00:00, now)
Merci à tous pour votre aide, j’ai réussi à faire ce que je voulais !
Je confirme donc qu’on peut tout faire avec juste le shelly PRO 3 EM et des formules dans un virtuel
Ci-dessous les formules finales pour la partie production (les autres sont à extrapoler) qui marchent chez moi, à toute fin utile pour ceux(celles) que cela intéresserait :
1. jour :
#[Atelier][SH2_PV_VE_X][Phase B : Total Energy]# - minbetween(#[Atelier][SH2_PV_VE_X][Phase B : Total Energy]#, today 00:00, now)
2. Semaine :
#[Atelier][SH2_PV_VE_X][Phase B : Total Energy]# - minbetween(#[Atelier][SH2_PV_VE_X][Phase B : Total Energy]#, monday this week 00:00, now)
3. Mois:
#[Atelier][SH2_PV_VE_X][Phase B : Total Energy]# - minbetween(#[Atelier][SH2_PV_VE_X][Phase B : Total Energy]#, first day of this month 00:00, now)
Prochaine étape du projet : ajouter les ratio % d’autoconsommation et autosufisance…
en vue d’étudier l’intérêt de l’ajout d’une éventuelle batterie de stockage.
→ mais c’est une autre histoire
A très bientôt !
J’avais un soucis de remise à zéro des info du virtuel a minuit, du coup j’ai opté pour une solution avec un scenario a 00:01min qui enregistre une variable avec l’index de prod :
et j’ai remplacé dans le virtuel la prod du jour avec la formule suivante :
#[Atelier][SH2_PV_VE_X][Phase B : Total Energy]# - variable(Prod_PV_J)
A extrapoler pour les autres formules
(J’ai 2 autres scenarios, qui enregistrent une variable le 1er jour de la semaine et le 1er jour du mois…)
Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.