Wemos D1 Mini Frimware zur Steuerung einer RGBW-LED-Lampe
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

TimerManager.cpp 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /*
  2. * TimerManager.cpp
  3. *
  4. * Created on: 12.07.2026
  5. * Author: FSmilari
  6. */
  7. #include "TimerManager.h"
  8. WiFiUDP ntpUDP;
  9. // Set up your base timezone offset in seconds (e.g., UTC+1 for Baar, Switzerland is 3600)
  10. const long gmtOffset_sec = 3600;
  11. // Set up DST offset in seconds (1 hour = 3600 seconds)
  12. const long daylightOffset_sec = 3600;
  13. TimerManager::TimerManager(ConfigManager &configManager)
  14. : configManager(configManager), ntpClient(ntpUDP, "pool.ntp.org", gmtOffset_sec) {
  15. }
  16. TimerManager::~TimerManager() {
  17. }
  18. void TimerManager::begin() {
  19. ntpClient.begin();
  20. }
  21. void TimerManager::onTimerIntervalChange(String timerIntervalName, const char *timerInterval) {
  22. TimeInterval interval;
  23. parseTimeInterval(timerInterval, interval);
  24. saveTimerInterval(timerIntervalName, interval.start, interval.end);
  25. }
  26. void TimerManager::saveTimerInterval(String timerIntervalName, uint32_t start, uint32_t end) {
  27. Config cfg = configManager.getConfig();
  28. if (timerIntervalName.equals("timeInterval1")) {
  29. cfg.timeInterval1.start = start;
  30. cfg.timeInterval1.end = end;
  31. } else if (timerIntervalName.equals("timeInterval2")) {
  32. cfg.timeInterval2.start = start;
  33. cfg.timeInterval2.end = end;
  34. }
  35. configManager.saveConfig(cfg);
  36. }
  37. uint32_t TimerManager::timeToSeconds(uint8_t hour, uint8_t minute, uint8_t second) {
  38. return (uint32_t) hour * 3600UL +
  39. (uint32_t) minute * 60UL +
  40. second;
  41. }
  42. bool TimerManager::parseTimeInterval(const char *str, TimeInterval &interval) {
  43. unsigned int sh, sm, ss;
  44. unsigned int eh, em, es;
  45. if (sscanf(str,
  46. "%u:%u:%u - %u:%u:%u",
  47. &sh, &sm, &ss,
  48. &eh, &em, &es) != 6) {
  49. return false;
  50. }
  51. // Bereich prüfen
  52. if (sh > 23 || eh > 23 ||
  53. sm > 59 || em > 59 ||
  54. ss > 59 || es > 59) {
  55. return false;
  56. }
  57. interval.start = timeToSeconds(sh, sm, ss);
  58. interval.end = timeToSeconds(eh, em, es);
  59. return true;
  60. }
  61. bool TimerManager::isNowInTimeInterval() {
  62. Config cfg = configManager.getConfig();
  63. ntpClient.update();
  64. time_t localEpochTime = ntpClient.getEpochTime() + gmtOffset_sec;
  65. time_t localTime = ntpClient.getHours() * 3600 + ntpClient.getMinutes() * 60 + ntpClient.getSeconds();
  66. bool isDst = isDST(month(localEpochTime), day(localEpochTime), weekday(localEpochTime));
  67. if (isDst) {
  68. localTime += daylightOffset_sec;
  69. }
  70. Serial.print("isDST: ");
  71. Serial.println(isDst ? "true" : "false");
  72. Serial.println(ntpClient.getFormattedTime());
  73. Serial.print("localTime: ");
  74. Serial.println(secondsToFormatedTime(localTime));
  75. return (isInInterval(localTime, cfg.timeInterval1) || isInInterval(localTime, cfg.timeInterval2));
  76. }
  77. bool TimerManager::isDST(int month, int day, int weekday) {
  78. // DST is between last Sunday of March (month 3) and last Sunday of October (month 10)
  79. if (month > 3 && month < 10)
  80. return true;
  81. if (month == 3) {
  82. int lastSunday = 31 - (weekday - 1); // math to find the last Sunday
  83. if (day >= lastSunday)
  84. return true;
  85. }
  86. if (month == 10) {
  87. int lastSunday = 31 - (weekday - 1);
  88. if (day < lastSunday)
  89. return true;
  90. }
  91. return false;
  92. }
  93. bool TimerManager::isInInterval(uint32_t now, const TimeInterval &interval) {
  94. if (interval.start <= interval.end) {
  95. // normales Intervall
  96. return now >= interval.start && now < interval.end;
  97. }
  98. // Intervall geht über Mitternacht
  99. return now >= interval.start || now < interval.end;
  100. }
  101. String TimerManager::secondsToFormatedTime(uint32_t seconds) {
  102. uint8_t hour = seconds / 3600;
  103. seconds %= 3600;
  104. uint8_t minute = seconds / 60;
  105. uint8_t second = seconds % 60;
  106. char buffer[9]; // "HH:mm:ss" + '\0'
  107. snprintf(buffer, sizeof(buffer), "%02u:%02u:%02u",
  108. hour, minute, second);
  109. return String(buffer);
  110. }