// 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