From 5a37948ca965f10041c097b5ad70b0b455be4653 Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Thu, 1 Jun 2023 18:39:50 +0200 Subject: [PATCH] Fix: If no sunset/sunrise calculation is possible a wrong value is shown This is catched now and a proper message is shown in the web UI. Also the mode is set to day. --- include/SunPosition.h | 2 ++ src/SunPosition.cpp | 26 +++++++++++++++++++++++--- src/WebApi_ntp.cpp | 15 +++++++++++---- webapp/src/locales/de.json | 1 + webapp/src/locales/en.json | 1 + webapp/src/locales/fr.json | 1 + webapp/src/types/NtpStatus.ts | 1 + webapp/src/views/NtpInfoView.vue | 6 ++++-- 8 files changed, 44 insertions(+), 9 deletions(-) diff --git a/include/SunPosition.h b/include/SunPosition.h index 49c5c71..691d42c 100644 --- a/include/SunPosition.h +++ b/include/SunPosition.h @@ -12,6 +12,7 @@ public: void loop(); bool isDayPeriod(); + bool isSunsetAvailable(); bool sunsetTime(struct tm* info); bool sunriseTime(struct tm* info); @@ -20,6 +21,7 @@ private: SunSet _sun; bool _isDayPeriod = true; + bool _isSunsetAvailable = true; uint _sunriseMinutes = 0; uint _sunsetMinutes = 0; diff --git a/src/SunPosition.cpp b/src/SunPosition.cpp index 1cfe1d0..7ab453f 100644 --- a/src/SunPosition.cpp +++ b/src/SunPosition.cpp @@ -29,6 +29,11 @@ bool SunPositionClass::isDayPeriod() return _isDayPeriod; } +bool SunPositionClass::isSunsetAvailable() +{ + return _isSunsetAvailable; +} + void SunPositionClass::updateSunData() { CONFIG_T const& config = Configuration.get(); @@ -37,7 +42,7 @@ void SunPositionClass::updateSunData() struct tm timeinfo; if (!getLocalTime(&timeinfo, 5)) { - _isDayPeriod = false; + _isDayPeriod = true; _sunriseMinutes = 0; _sunsetMinutes = 0; _isValidInfo = false; @@ -62,11 +67,26 @@ void SunPositionClass::updateSunData() break; } - _sunriseMinutes = static_cast(_sun.calcCustomSunrise(sunset_type)); - _sunsetMinutes = static_cast(_sun.calcCustomSunset(sunset_type)); + double sunriseRaw = _sun.calcCustomSunrise(sunset_type); + double sunsetRaw = _sun.calcCustomSunset(sunset_type); + + // If no sunset/sunrise exists (e.g. astronomical calculation in summer) + // assume it's day period + if (std::isnan(sunriseRaw) || std::isnan(sunsetRaw)) { + _isDayPeriod = true; + _isSunsetAvailable = false; + _sunriseMinutes = 0; + _sunsetMinutes = 0; + _isValidInfo = false; + return; + } + + _sunriseMinutes = static_cast(sunriseRaw); + _sunsetMinutes = static_cast(sunsetRaw); uint minutesPastMidnight = timeinfo.tm_hour * 60 + timeinfo.tm_min; _isDayPeriod = (minutesPastMidnight >= _sunriseMinutes) && (minutesPastMidnight < _sunsetMinutes); + _isSunsetAvailable = true; _isValidInfo = true; } diff --git a/src/WebApi_ntp.cpp b/src/WebApi_ntp.cpp index 4fa1d10..26524c2 100644 --- a/src/WebApi_ntp.cpp +++ b/src/WebApi_ntp.cpp @@ -52,14 +52,21 @@ void WebApiNtpClass::onNtpStatus(AsyncWebServerRequest* request) strftime(timeStringBuff, sizeof(timeStringBuff), "%A, %B %d %Y %H:%M:%S", &timeinfo); root["ntp_localtime"] = timeStringBuff; - SunPosition.sunriseTime(&timeinfo); - strftime(timeStringBuff, sizeof(timeStringBuff), "%A, %B %d %Y %H:%M:%S", &timeinfo); + if (SunPosition.sunriseTime(&timeinfo)) { + strftime(timeStringBuff, sizeof(timeStringBuff), "%A, %B %d %Y %H:%M:%S", &timeinfo); + } else { + strcpy(timeStringBuff, "--"); + } root["sun_risetime"] = timeStringBuff; - SunPosition.sunsetTime(&timeinfo); - strftime(timeStringBuff, sizeof(timeStringBuff), "%A, %B %d %Y %H:%M:%S", &timeinfo); + if (SunPosition.sunsetTime(&timeinfo)) { + strftime(timeStringBuff, sizeof(timeStringBuff), "%A, %B %d %Y %H:%M:%S", &timeinfo); + } else { + strcpy(timeStringBuff, "--"); + } root["sun_settime"] = timeStringBuff; + root["sun_isSunsetAvailable"] = SunPosition.isSunsetAvailable(); root["sun_isDayPeriod"] = SunPosition.isDayPeriod(); response->setLength(); diff --git a/webapp/src/locales/de.json b/webapp/src/locales/de.json index d392b86..0d454ba 100644 --- a/webapp/src/locales/de.json +++ b/webapp/src/locales/de.json @@ -246,6 +246,7 @@ "LocalTime": "Lokale Uhrzeit", "Sunrise": "Morgendämmerung", "Sunset": "Abenddämmerung", + "NotAvailable": "Nicht verfügbar", "Mode": "Modus", "Day": "Tag", "Night": "Nacht" diff --git a/webapp/src/locales/en.json b/webapp/src/locales/en.json index 407c2d3..7a05b4d 100644 --- a/webapp/src/locales/en.json +++ b/webapp/src/locales/en.json @@ -246,6 +246,7 @@ "LocalTime": "Local Time", "Sunrise": "Sunrise", "Sunset": "Sunset", + "NotAvailable": "Not Available", "Mode": "Mode", "Day": "Day", "Night": "Night" diff --git a/webapp/src/locales/fr.json b/webapp/src/locales/fr.json index 4a9b2a7..daafad7 100644 --- a/webapp/src/locales/fr.json +++ b/webapp/src/locales/fr.json @@ -246,6 +246,7 @@ "LocalTime": "Heure locale", "Sunrise": "Sunrise", "Sunset": "Sunset", + "NotAvailable": "Not Available", "Mode": "Mode", "Day": "Day", "Night": "Night" diff --git a/webapp/src/types/NtpStatus.ts b/webapp/src/types/NtpStatus.ts index 5597575..f0f48d8 100644 --- a/webapp/src/types/NtpStatus.ts +++ b/webapp/src/types/NtpStatus.ts @@ -7,4 +7,5 @@ export interface NtpStatus { sun_risetime: string; sun_settime: string; sun_isDayPeriod: boolean; + sun_isSunsetAvailable: boolean; } \ No newline at end of file diff --git a/webapp/src/views/NtpInfoView.vue b/webapp/src/views/NtpInfoView.vue index 66d1119..62da5be 100644 --- a/webapp/src/views/NtpInfoView.vue +++ b/webapp/src/views/NtpInfoView.vue @@ -38,11 +38,13 @@ {{ $t('ntpinfo.Sunrise') }} - {{ ntpDataList.sun_risetime }} + {{ ntpDataList.sun_risetime }} + {{ $t('ntpinfo.NotAvailable') }} {{ $t('ntpinfo.Sunset') }} - {{ ntpDataList.sun_settime }} + {{ ntpDataList.sun_settime }} + {{ $t('ntpinfo.NotAvailable') }} {{ $t('ntpinfo.Mode') }}