// 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 . * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include "energypluginnymea.h" #include "smartchargingmanager.h" #include "nymeaenergyjsonhandler.h" #include "energymanagerconfiguration.h" #include "spotmarket/spotmarketmanager.h" // [ETM] BEGIN — EnergyArbitrator flip. Remove block to revert to upstream SmartChargingManager. #ifdef ETM_ARBITRATOR #include "etm/energyarbitrator.h" #include "etm/config/loadconfigstore.h" #endif // [ETM] END #include "plugininfo.h" EnergyPluginNymea::EnergyPluginNymea(QObject *parent) : EnergyPlugin(parent) { qCDebug(dcNymeaEnergy()) << "Loading nymea.energy plugin"; } void EnergyPluginNymea::init() { qCDebug(dcNymeaEnergy()) << "Initializing nymea.energy plugin"; EnergyManagerConfiguration *configuration = new EnergyManagerConfiguration(this); QNetworkAccessManager *networkManager = new QNetworkAccessManager(this); SpotMarketManager *spotMarketManager = new SpotMarketManager(networkManager, this); LoadConfigStore *loadConfigStore = nullptr; #ifdef ETM_ARBITRATOR qCDebug(dcNymeaEnergy()) << "ETM_ARBITRATOR actif — EnergyArbitrator chargé."; EnergyArbitrator *chargingManager = new EnergyArbitrator(energyManager(), thingManager(), spotMarketManager, configuration, this); // T4 — charges pilotables etmvariableload (ECS/routeur) construites depuis la config // persistée (remplace le registre en dur « 3g »). SetLoadConfig pilote ce store. loadConfigStore = new LoadConfigStore(this); chargingManager->setLoadConfigStore(loadConfigStore); // AUCUN adaptateur codé en dur ici, et c'est un INVARIANT DE CONTRAT, pas une propreté. // // Une PAC SG-Ready de banc était enregistrée à cet endroit (ThingIds K1/K2, états // {3: 1500 W, 4: 3000 W}). Elle était pleinement arbitrée — budget, verrous, télémétrie — // et pourtant absente de GetLoadConfig : ni renommable, ni classable, ni désactivable. // GetLoadTelemetry publiait donc une charge que l'application ne pouvait pas configurer, // et rien dans le contrat ne le disait. // // Depuis LM-300 le mécanisme sg-ready se configure comme les autres : elle est devenue une // LoadConfig ordinaire. Toute charge arbitrée vient désormais de LoadConfigStore, donc // l'ensemble publié par GetLoadTelemetry est exactement celui de GetLoadConfig — par // construction, pas par discipline. Ne PAS rouvrir cette porte : un adaptateur enregistré // ici serait de nouveau invisible à la configuration. #else SmartChargingManager *chargingManager = new SmartChargingManager(energyManager(), thingManager(), spotMarketManager, configuration, this); #endif jsonRpcServer()->registerExperienceHandler(new NymeaEnergyJsonHandler(spotMarketManager, chargingManager, loadConfigStore, energyManager(), this), 0, 8); }