Habe versucht das Logikmodul mit der NZDT (+13h) Zeitzone zu verwenden. Habe dazu die Zeitzone +13 im Code fest vorgeben, da es in der ETS z.Z. nur wenige europäische Zeitzonen gibt. Musste dann leider feststellen, dass die Sunrise und Sunset Berechnungen falsch sind. Auch für die default Location Frankfurt weichen die Ergebnisse vom Modul um +/- 10 Minuten vom Google Ergebnis ab.
Zum Debuggen mal mit den Ergebnissen von https://github.com/troglobit/sun verglichen (selbe Astro Code Base). Dieser Code produziert die korrekten Zeiten, im Vergleich mit Google und anderen Online Rechnern.
diff --git a/src/Timer.h b/src/Timer.h
index 3017ad2..3cfac82 100644
--- a/src/Timer.h
+++ b/src/Timer.h
@@ -19,8 +19,9 @@
struct sTime
{
- uint8_t minute;
- uint8_t hour;
+ int8_t minute;
+ int8_t hour;
};
diff --git a/src/Timer.cpp b/src/Timer.cpp
index d2871b5..f8f2ab9 100644
--- a/src/Timer.cpp
+++ b/src/Timer.cpp
@@ -81,13 +81,14 @@ void Timer::calculateSunriseSunset()
double rise, set;
// sunrise/sunset calculation
sunRiseSet(getYear(), getMonth(), getDay(),
- mLongitude, mLatitude, 35.0 / 60.0, 1, &rise, &set);
- double lTmp;
- mSunrise.minute = round(modf(rise, &lTmp) * 60.0);
- mSunrise.hour = lTmp + mTimezone + ((mIsSummertime) ? 1 : 0);
- mSunset.minute = round(modf(set, &lTmp) * 60.0);
- mSunset.hour = lTmp + mTimezone + ((mIsSummertime) ? 1 : 0);
-}
+ mLongitude, mLatitude, -35.0 / 60.0, 1, &rise, &set);
+ mSunrise.hour = (int)floor(rise);
+ mSunrise.minute= (int)(60 * (rise - floor(rise)));
+ mSunrise.hour += mTimezone + ((mIsSummertime) ? 1 : 0);
+ mSunset.hour = (int)floor(set);
+ mSunset.minute= (int)(60 * (set - floor(set)));
+ mSunset.hour += mTimezone + ((mIsSummertime) ? 1 : 0);
+ }
diff --git a/src/Logic.cpp b/src/Logic.cpp
index 6d48366..2cbc1a3 100644
--- a/src/Logic.cpp
+++ b/src/Logic.cpp
@@ -466,7 +472,8 @@ void Logic::setup(bool iSaveSupported) {
float lLat = LogicChannel::getFloat(knx.paramData(LOG_Latitude));
float lLon = LogicChannel::getFloat(knx.paramData(LOG_Longitude));
// sTimer.setup(8.639751, 49.310209, 1, true, 0xFFFFFFFF);
- uint8_t lTimezone = (knx.paramByte(LOG_Timezone) & LOG_TimezoneMask) >> LOG_TimezoneShift;
+ // SXR timerzone must be unsigned (could be negative if all time zones are to be allowed)
+ int8_t lTimezone = (knx.paramByte(LOG_Timezone) & LOG_TimezoneMask) >> LOG_TimezoneShift;
bool lUseSummertime = (knx.paramByte(LOG_UseSummertime) & LOG_UseSummertimeMask);
sTimer.setup(lLon, lLat, lTimezone, lUseSummertime, knx.paramInt(LOG_Neujahr));
// for TimerRestore we prepare all Timer channels