// 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 .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#ifndef ENERGYRATIOSCALCULATOR_H
#define ENERGYRATIOSCALCULATOR_H
#include
// [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