Expose autoconsommation/autonomie comme source canonique de l'energymanager,
pour remplacer le seam interim app-side (EnergyRatiosInterim.compute).
Voie (c) : méthode + notification sur le handler NymeaEnergy de NOTRE plugin
(déjà forké/buildé), calculées depuis EnergyManager::totalX() — interface
abstraite stable. PAS de champs sur Energy.PowerBalance → aucun fork du coeur
nymea (nymea-experience-plugin-energy) à rebaser perpétuellement.
- EnergyRatiosCalculator (GPL pur mesure) : Δ de cumuls, baseline minuit local,
reseed (1er appel / nouveau jour / non-monotone Δ<0), den<=0 -> n/a, clamp
[0,100]. Porté 1:1 du seam interim app.
- NymeaEnergy.GetEnergyRatios -> {o:selfConsumptionRate, o:autonomyRate} Double,
champ OMIS si n/a (jamais null).
- NymeaEnergy.EnergyRatiosChanged : meme forme, branchee sur powerBalanceChanged(),
emise uniquement quand une valeur (ou sa disponibilite) change.
- testEnergyRatiosAlignment : vecteurs joues 1:1 contre l'interim (seed, normal,
clamp-bas, den<=0->n/a, non-monotone, nouveau jour local).
- docs/INTERFACE_energyratios.md : contrat pour l'agent app (RPC a consommer).
Build prod 0/0. Suite simulation 25/0 (testLoadConfigRpc traverse le handler
modifie -> pas de regression).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
79 lines
3.1 KiB
C++
79 lines
3.1 KiB
C++
// SPDX-License-Identifier: GPL-3.0-or-later
|
||
|
||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||
*
|
||
* Copyright (C) 2013 - 2024, nymea GmbH
|
||
* Copyright (C) 2024 - 2025, chargebyte austria GmbH
|
||
*
|
||
* This file is part of nymea-energy-plugin-nymea.
|
||
*
|
||
* nymea-energy-plugin-nymea.s free software: you can redistribute it and/or modify
|
||
* it under the terms of the GNU General Public License as published by
|
||
* the Free Software Foundation, either version 3 of the License, or
|
||
* (at your option) any later version.
|
||
*
|
||
* nymea-energy-plugin-nymea.s distributed in the hope that it will be useful,
|
||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
* GNU General Public License for more details.
|
||
*
|
||
* You should have received a copy of the GNU General Public License
|
||
* along with nymea-energy-plugin-nymea. If not, see <https://www.gnu.org/licenses/>.
|
||
*
|
||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||
|
||
#ifndef ENERGYRATIOSCALCULATOR_H
|
||
#define ENERGYRATIOSCALCULATOR_H
|
||
|
||
#include <QDateTime>
|
||
|
||
// [Phase 2] Ratios énergétiques canoniques (autoconsommation / autonomie), en %.
|
||
//
|
||
// Source canonique côté energymanager : remplace le seam interim app-side
|
||
// (EnergyRatiosInterim.compute). PUR MESURE (frontière GPL) : dérive par Δ de
|
||
// cumuls sur la période affichée (journée depuis minuit local), pas par
|
||
// intégration du signal live → déterministe, pas de drift de polling.
|
||
//
|
||
// autonomie = (Δ totalConsumption − Δ totalAcquisition) / Δ totalConsumption
|
||
// autoconsommation = (Δ totalProduction − Δ totalReturn) / Δ totalProduction
|
||
//
|
||
// Reseed de la baseline : 1er appel, nouveau jour local, OU compteur non
|
||
// monotone (Δ<0 : restart nymead / re-add thing / rollover). Dénominateur ≤ 0
|
||
// → n/a (valid=false), jamais de NaN. Porté 1:1 de l'interim app.
|
||
class EnergyRatiosCalculator
|
||
{
|
||
public:
|
||
struct Ratios {
|
||
bool autoconsommationValid = false; // false = n/a (dénominateur nul)
|
||
double autoconsommation = 0.0; // % dans [0, 100]
|
||
bool autonomieValid = false; // false = n/a
|
||
double autonomie = 0.0; // % dans [0, 100]
|
||
};
|
||
|
||
EnergyRatiosCalculator() = default;
|
||
|
||
// Réinitialise la baseline (ex. switch d'installation).
|
||
void reset();
|
||
|
||
// Calcule depuis les cumuls courants (mêmes unités en entrée — elles
|
||
// s'annulent dans le ratio). `now` (heure LOCALE) sert à détecter le jour.
|
||
Ratios compute(double totalProduction,
|
||
double totalReturn,
|
||
double totalConsumption,
|
||
double totalAcquisition,
|
||
const QDateTime &now);
|
||
|
||
private:
|
||
static bool ratio(double numerator, double denominator, double *outPercent);
|
||
static qint64 localDay(const QDateTime &now);
|
||
|
||
bool m_hasBaseline = false;
|
||
double m_baseProduction = 0.0;
|
||
double m_baseReturn = 0.0;
|
||
double m_baseConsumption = 0.0;
|
||
double m_baseAcquisition = 0.0;
|
||
qint64 m_baseDay = 0;
|
||
};
|
||
|
||
#endif // ENERGYRATIOSCALCULATOR_H
|