Merge branch 'pr1408' into dev

This commit is contained in:
Thomas Basler 2023-10-11 14:16:23 +02:00
commit 97d481fa65
5 changed files with 63 additions and 16 deletions

View File

@ -3,6 +3,8 @@
#include <cstdint> #include <cstdint>
#define INVERTER_UPDATE_SETTINGS_INTERVAL 60000l
class InverterSettingsClass { class InverterSettingsClass {
public: public:
void init(); void init();
@ -12,4 +14,4 @@ private:
uint32_t _lastUpdate = 0; uint32_t _lastUpdate = 0;
}; };
extern InverterSettingsClass InverterSettings; extern InverterSettingsClass InverterSettings;

View File

@ -1,10 +1,9 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#pragma once #pragma once
#include <mutex>
#include <sunset.h> #include <sunset.h>
#define SUNPOS_UPDATE_INTERVAL 60000l
class SunPositionClass { class SunPositionClass {
public: public:
SunPositionClass(); SunPositionClass();
@ -15,9 +14,12 @@ public:
bool isSunsetAvailable(); bool isSunsetAvailable();
bool sunsetTime(struct tm* info); bool sunsetTime(struct tm* info);
bool sunriseTime(struct tm* info); bool sunriseTime(struct tm* info);
void setDoRecalc(bool doRecalc);
private: private:
void updateSunData(); void updateSunData();
bool checkRecalcDayChanged();
bool getDoRecalc();
SunSet _sun; SunSet _sun;
bool _isDayPeriod = true; bool _isDayPeriod = true;
@ -25,8 +27,10 @@ private:
uint32_t _sunriseMinutes = 0; uint32_t _sunriseMinutes = 0;
uint32_t _sunsetMinutes = 0; uint32_t _sunsetMinutes = 0;
uint32_t _lastUpdate = 0;
bool _isValidInfo = false; bool _isValidInfo = false;
bool _doRecalc = true;
std::mutex _recalcLock;
uint32_t _lastSunPositionCalculatedYMD = 0;
}; };
extern SunPositionClass SunPosition; extern SunPositionClass SunPosition;

View File

@ -90,7 +90,7 @@ void InverterSettingsClass::init()
void InverterSettingsClass::loop() void InverterSettingsClass::loop()
{ {
if (millis() - _lastUpdate > SUNPOS_UPDATE_INTERVAL) { if (millis() - _lastUpdate > INVERTER_UPDATE_SETTINGS_INTERVAL) {
const CONFIG_T& config = Configuration.get(); const CONFIG_T& config = Configuration.get();
for (uint8_t i = 0; i < INV_MAX_COUNT; i++) { for (uint8_t i = 0; i < INV_MAX_COUNT; i++) {
@ -109,4 +109,4 @@ void InverterSettingsClass::loop()
} }
Hoymiles.loop(); Hoymiles.loop();
} }

View File

@ -19,9 +19,8 @@ void SunPositionClass::init()
void SunPositionClass::loop() void SunPositionClass::loop()
{ {
if (millis() - _lastUpdate > SUNPOS_UPDATE_INTERVAL) { if (getDoRecalc() || checkRecalcDayChanged()) {
updateSunData(); updateSunData();
_lastUpdate = millis();
} }
} }
@ -35,14 +34,50 @@ bool SunPositionClass::isSunsetAvailable()
return _isSunsetAvailable; return _isSunsetAvailable;
} }
void SunPositionClass::setDoRecalc(bool doRecalc)
{
std::lock_guard<std::mutex> lock(_recalcLock);
_doRecalc = doRecalc;
}
bool SunPositionClass::getDoRecalc()
{
std::lock_guard<std::mutex> lock(_recalcLock);
return _doRecalc;
}
bool SunPositionClass::checkRecalcDayChanged()
{
time_t now;
struct tm timeinfo;
time(&now);
localtime_r(&now, &timeinfo); // don't use getLocalTime() as there could be a delay of 10ms
uint32_t ymd;
ymd = (timeinfo.tm_year << 9) |
(timeinfo.tm_mon << 5) |
timeinfo.tm_mday;
if (_lastSunPositionCalculatedYMD != ymd) {
return true;
}
return false;
}
void SunPositionClass::updateSunData() void SunPositionClass::updateSunData()
{ {
CONFIG_T const& config = Configuration.get();
int offset = Utils::getTimezoneOffset() / 3600;
_sun.setPosition(config.Ntp_Latitude, config.Ntp_Longitude, offset);
struct tm timeinfo; struct tm timeinfo;
if (!getLocalTime(&timeinfo, 5)) { bool gotLocalTime;
gotLocalTime = getLocalTime(&timeinfo, 5);
_lastSunPositionCalculatedYMD = (timeinfo.tm_year << 9) |
(timeinfo.tm_mon << 5) |
timeinfo.tm_mday;
setDoRecalc(false);
if (!gotLocalTime) {
_isDayPeriod = true; _isDayPeriod = true;
_sunriseMinutes = 0; _sunriseMinutes = 0;
_sunsetMinutes = 0; _sunsetMinutes = 0;
@ -50,6 +85,10 @@ void SunPositionClass::updateSunData()
return; return;
} }
CONFIG_T const& config = Configuration.get();
int offset = Utils::getTimezoneOffset() / 3600;
_sun.setPosition(config.Ntp_Latitude, config.Ntp_Longitude, offset);
_sun.setCurrentDate(1900 + timeinfo.tm_year, timeinfo.tm_mon + 1, timeinfo.tm_mday); _sun.setCurrentDate(1900 + timeinfo.tm_year, timeinfo.tm_mon + 1, timeinfo.tm_mday);
double sunset_type; double sunset_type;
@ -125,4 +164,4 @@ bool SunPositionClass::sunriseTime(struct tm* info)
localtime_r(&midnight, info); localtime_r(&midnight, info);
return _isValidInfo; return _isValidInfo;
} }

View File

@ -190,6 +190,8 @@ void WebApiNtpClass::onNtpAdminPost(AsyncWebServerRequest* request)
NtpSettings.setServer(); NtpSettings.setServer();
NtpSettings.setTimezone(); NtpSettings.setTimezone();
SunPosition.setDoRecalc(true);
} }
void WebApiNtpClass::onNtpTimeGet(AsyncWebServerRequest* request) void WebApiNtpClass::onNtpTimeGet(AsyncWebServerRequest* request)
@ -350,4 +352,4 @@ void WebApiNtpClass::onNtpTimePost(AsyncWebServerRequest* request)
response->setLength(); response->setLength();
request->send(response); request->send(response);
} }