Compteur journalier et intégrale de Riemann

surtout si on utilise les rectangles, le choix des trapèzes me semble plus judicieux!

Un pas trop fin va surtout augmenter l’importance des valeurs crêtes et fausser le résultat

Ah oui mais là c’est un autre problème, si on met en doute la fiabilité des valeurs remontées aussi :stuck_out_tongue: !

C’est le contraire, une remontée toute les minutes te remontera une puissance de 200w à 18:21 et une puissance de 200w à 18:22.
Si entre les 2, tu utilises un sèche cheveux pendant 50s avec une puissance de 1000w, il ne remontera jamais dans le puissance consommée.
Si ton pas est de 10s, il remontera.

Plus le pas est fin, plus ça sera précis. De toute façon, c’est la prise ou la sonde qui définit le pas qui correspond forcément à la période de remontée de la puissance

je suis bien d’accord! mais du coup il faut que je trouve un équilibre entre précision et sollicitation…

Tu as le choix ? Ton matériel permet de planifier les fréquence de remontée ?

c’est un JSY, je peux régler les baud mais je suis au max et j’ai pas intérêt a diminuer sinon mon routage sera moins réactif ; je pensais plus d’avantage a inclure une expression php lorsque que je récupère les données puissances instantanées : quelque chose comme ce que proposait vedrine :$cmd->getHistory($startdate, $enddate);

POur ceux qui veulent tester … je me suis amusé à faire un bloc code pour calculer la conso avec la puissance suivant le modèle des rectangles ou des trapèzes :
(simpson non implémenté, c’est plus compliqué)

A mon avis, ca doit pouvoir faire l’objet d’un scenario à part entière !!

// Paramètres et récupération des données
$method = "trapèzes"; // Choix de la méthode : "rectangles", "trapèzes", "Simpson" (NON IMPLEMENTE)
$powerCmd = "#[Electricité][Teleinfo][Puissance app. Instantanée soutirée]#";
$consumptionCmd = "#[Aucun][test consommation][Consommation_trapezes]#";
$intervalMin = 10; // Intervalle de temps en secondes pour le calcul

$prefixeVariable = $scenario->getId() ; ;
$currentTime = time();
$lastCalcTime = $scenario->getData($prefixeVariable."_lastCalcTime", 0);

// Initialisation des variables (1er lancement)
if ( $lastCalcTime == 0 ) {
  $scenario->setData($prefixeVariable."_lastCalcTime",$currentTime) ;
  $scenario->setData($prefixeVariable."_lastTime",$currentTime) ;
  $scenario->setData($prefixeVariable."_lastPower", cmd::byString($powerCmd)->execCmd() ) ;
}

// Fonctions de calcul
function calculateRectangle($currentPower, $timeDiff) {
    return $currentPower * $timeDiff;
}

function calculateTrapeze($currentPower, $lastPower, $timeDiff) {
    return (($currentPower + $lastPower) / 2) * $timeDiff;
}

function calculateSimpson($currentPower, $lastPower, $timeDiff) {
    // La méthode de Simpson nécessite trois points, ici simplifiée en utilisant deux points
    // et en estimant un point intermédiaire comme la moyenne. Pour une application précise,
    // il faudrait adapter en fonction des données disponibles.
    $midPower = ($currentPower + $lastPower) / 2;
    return ($timeDiff / 6) * ($lastPower + 4 * $midPower + $currentPower);
}

if (($currentTime - $lastCalcTime) >= $intervalMin) {
    $lastPower = $scenario->getData($prefixeVariable."_lastPower", 0);
    $lastTime = $scenario->getData($prefixeVariable."_lastTime");
    $currentPower = cmd::byString($powerCmd)->execCmd();
    $timeDiff = ($currentTime - $lastTime) / 3600;
    $scenario->setlog("currentTime : ".$currentTime." - lastTime : ".$lastTime);
    $scenario->setlog("LastPower : ".$lastPower." - CurrentPower : ".$currentPower." - TimeDiff : ".$timeDiff);
    // Sélection de la méthode de calcul
    $consumption = 0;
    switch ($method) {
        case "rectangles":
            $consumption = calculateRectangle($currentPower, $timeDiff);
            break;
        case "trapèzes":
            $consumption = calculateTrapeze($currentPower, $lastPower, $timeDiff);
            break;
        case "Simpson":  // NON IMPLEMENTE
            $consumption = calculateSimpson($currentPower, $lastPower, $timeDiff);
            break;
        default:
            $scenario->setLog("Méthode de calcul non reconnue.");
            break;
    }

    // Mise à jour des variables et de la commande de consommation
    $scenario->setData($prefixeVariable."_lastPower", $currentPower);
    $scenario->setData($prefixeVariable."_lastTime", $currentTime);
    $scenario->setData($prefixeVariable."_lastCalcTime", $currentTime);
    $existingConsumption = cmd::byString($consumptionCmd)->execCmd();
    $newConsumption = round($existingConsumption + ( $consumption / 1000 ),6);
    cmd::byString($consumptionCmd)->event($newConsumption);
    $scenario->setLog("Consommation calculée (delta) avec méthode $method : " . round($consumption / 1000 ,3) . " kWh");
    $scenario->setLog("Consommation calculée avec méthode $method : " . $newConsumption . " kWh");
  
    
} else {
    $scenario->setLog("Intervalle de temps non écoulé, calcul non effectué");
}

Le déclencheur est la puissance


(j’ai 2 scenarios qui tournent pour voir la diff entre les 2 méthodes)

Norbert

2 « J'aime »

Super, merci de nous donner la comparaison dans quelques heures !

2h de calculs, 0,726kWh pour l’instant, et 0,1% d’erreur sur un pas de 10s minimum
Faudrait aussi que je compare avec ce que donne réellement le compteur (j’utilise la puissance apparente instantanée du linky) au niveau consommation.

Je vais faire le calcul en exportant l’historique d’une pince ampèremétrique et comparaison avec les données ENEDIS également en faisant varier le pas.
Je n’ai pas réussi à le faire par scénario car à priori, il n’est pas possible d’utiliser des variables de temps dans les fonctions statistiques

Tu arrives à voir si la dispersion de l’erreur est homegnee ou bien décentrée toujours dans le même sens (plus bas / haut) ?

Un coup c’est -, un coup c’est +
Dit autrement, on oscille autour des mêmes valeurs
Norbert

super! j’ai mis a tourner ton code mais pas trop de soleil aujourd’hui (ni les prochains jours d’ailleurs) donc difficile de pouvoir te faire un retour pour le moment… dès que le beau temps revient, je vais comparer avec une pince du shelly pour avoir une idée du pourcentage d’erreur!

Capture d’écran 2024-02-22 à 15.20.02

De mon coté, tests fait sur mon linky et sur une prise connectée (qui me remonte donc déjà la puissance et la consommation, j’ai à chaque fois un ecart de 1 à 2% sur le calcul par la méthode des rectangles ou des trapèzes, mais si je compare avec la conso réelle remontée par la prise ou les TIC du linky, j’ai une erreur qui se rapproche des 10%.
Je me demande si ce n’est pas en lien avec la notion de puissance active et reactive. la conso est calculée sur ces 2 puissances, mais la puissance remontée par la prise ne concernant que la puissance active

Je ne suis pas assez callé pour faire cette analyse

Norbert

c’est bien possible car lorsque mon routeur tourne, j’ai mon power factor qui chute a 0,5! la marge d’erreur est la même avec les trapèzes ou rectangles? si on réduit le pas même chose?

L’erreur est exactement la même trapèze == rectangle <> consommation réelle (~10% de plus)
D’où mon interrogation sur le fait qu’on ne doit calculer que la consommation « active »

justement, la pince du shelly tient compte du cos phi ou du moins elle indique le cos phi donc il est possible d’avoir que la console active

J’ai branché un JSY en entrée et sortie du dimmer pour mesurer la puissance active, le seul problème c’est que le courant est bourré d’harmoniques a cause de la tension « hachurée » donc je pense que ça rajoute a l’approximation du calcul de l’intégrale, ce qui expliquerait ces 10%. J’ai trouvé une formule pour calculer la tension rms en fonction de l’angle d’ouverture du dimmer mais pareil ça reste approximatif… donc pas moyen d’avoir une mesure fiable (ou du moins pas trouvé malgré mes recherches) je pense donc appliquer un offset sur ton code pour arriver a coller au mieux avec le linky

Bonjour,

J’ai calculé la consommation à partir de l’historique d’hier d’une pince OWON mise sur le câble de phase en sortie du compteur Linky ; j’ai 3684 valeurs sur les 24 heures.
ENEDIS m’indique pour cette journée 15 kWh et le plugin Linky donne une consommation journalière de 15,015 kWh.
Si je fais le calcul de conso sur toutes les valeurs j’obtiens 14,705 kWh
Si je prends une mesure sur 2 soit un peu plus d’une mesure par minute → 14,746 kWh
Si je prends une mesure sur 5 soit une mesure toutes les 2 minutes → 14,736 kWh
Si je prends une mesure sur 10 soit environ une mesure toutes les 4 minutes → 15,028 kWh
Si je prends une mesure sur 20 soit environ une mesure toutes les 8 minutes → 15,085 kWh
Si je prends une mesure sur 30 soit environ 5 mesures par heures → 14,264 kWh

On pourrait donc dire que le compte le plus juste serait avec une mesure toutes les 5 minutes environ et que trop de mesures génèrerait beaucoup d’erreurs d’arrondis ?
Je joins le tableau libreoffice correspondant si cela peut intéresser quelqu’un
Calcul conso électricité 24022024.ods.txt (394,9 Ko)