// 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.
*
* nymea is 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 is 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. If not, see .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#ifndef SUNSPECSTORAGELOGIC_H
#define SUNSPECSTORAGELOGIC_H
#include
#include
/* Decision logic of the storage (model 124) handling, kept free of the
* integration framework so it can be exercised without a running nymea.
*
* readStates() maps a storage block update onto the state values the plugin
* publishes. Having it in one place is what makes it possible to check that a
* state is fed from the very register the matching action writes to.
*/
namespace SunSpecStorageLogic {
struct StorageStates {
/* Percent of WChaMax, from InWRte / OutWRte - the very registers the
* chargingRate / dischargingRate actions write to. */
double chargingRate = 0;
double dischargingRate = 0;
/* Percent of WChaMax per second, from WChaGra / WDisChaGra. A different
* quantity from the two above, and read only on several inverters. */
double chargeGradient = 0;
double dischargeGradient = 0;
/* Both flags are reconciled from StorCtl_Mod. Reconciling only one lets the
* other drift silently as soon as the inverter changes it on its own. */
bool enableCharging = false;
bool enableDischarging = false;
bool gridCharging = false;
int batteryLevel = 0;
bool batteryCritical = false;
};
/* Value range of the InWRte / OutWRte setpoints of model 124. */
const double MinimumRatePercent = -100.0;
const double MaximumRatePercent = 100.0;
StorageStates readStates(SunSpecStorageModel *storage);
}
#endif // SUNSPECSTORAGELOGIC_H