Wemos D1 Mini Frimware zur Steuerung einer RGBW-LED-Lampe
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

TimerManager.cpp 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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+2 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", 3600) {
  15. ntpClient.begin();
  16. }
  17. TimerManager::~TimerManager() {
  18. }
  19. void TimerManager::onTimerIntervalChange(String timerIntervalName, const char *timerInterval) {
  20. TimeInterval interval;
  21. parseTimeInterval(timerInterval, interval);
  22. saveTimerInterval(timerIntervalName, interval.start, interval.end);
  23. }
  24. void TimerManager::saveTimerInterval(String timerIntervalName, uint32_t start, uint32_t end) {
  25. Config cfg = configManager.getConfig();
  26. if (timerIntervalName.equals("timeInterval1")) {
  27. cfg.timeInterval1.start = start;
  28. cfg.timeInterval1.end = end;
  29. } else if (timerIntervalName.equals("timeInterval2")) {
  30. cfg.timeInterval2.start = start;
  31. cfg.timeInterval2.end = end;
  32. }
  33. configManager.saveConfig(cfg);
  34. }
  35. uint32_t TimerManager::timeToSeconds(uint8_t hour, uint8_t minute, uint8_t second) {
  36. return (uint32_t) hour * 3600UL +
  37. (uint32_t) minute * 60UL +
  38. second;
  39. }
  40. bool TimerManager::parseTimeInterval(const char *str, TimeInterval &interval) {
  41. unsigned int sh, sm, ss;
  42. unsigned int eh, em, es;
  43. if (sscanf(str,
  44. "%u:%u:%u - %u:%u:%u",
  45. &sh, &sm, &ss,
  46. &eh, &em, &es) != 6) {
  47. return false;
  48. }
  49. // Bereich prüfen
  50. if (sh > 23 || eh > 23 ||
  51. sm > 59 || em > 59 ||
  52. ss > 59 || es > 59) {
  53. return false;
  54. }
  55. interval.start = timeToSeconds(sh, sm, ss);
  56. interval.end = timeToSeconds(eh, em, es);
  57. return true;
  58. }
  59. bool TimerManager::isNowInTimeInterval() {
  60. Config cfg = configManager.getConfig();
  61. ntpClient.update();
  62. uint32_t epochTime = ntpClient.getEpochTime();
  63. time_t localTime = epochTime + gmtOffset_sec;
  64. if (isDST(month(localTime), day(localTime), weekday(localTime))) {
  65. localTime += daylightOffset_sec;
  66. }
  67. Serial.print("localTime: ");
  68. Serial.println(secondsToFormatedTime(localTime));
  69. return (isInInterval(localTime, cfg.timeInterval1) || isInInterval(localTime, cfg.timeInterval2));
  70. }
  71. bool TimerManager::isDST(int month, int day, int weekday) {
  72. // DST is between last Sunday of March (month 3) and last Sunday of October (month 10)
  73. if (month > 3 && month < 10)
  74. return true;
  75. if (month == 3) {
  76. int lastSunday = 31 - (weekday - 1); // math to find the last Sunday
  77. if (day >= lastSunday)
  78. return true;
  79. }
  80. if (month == 10) {
  81. int lastSunday = 31 - (weekday - 1);
  82. if (day < lastSunday)
  83. return true;
  84. }
  85. return false;
  86. }
  87. bool TimerManager::isInInterval(uint32_t now, const TimeInterval &interval) {
  88. if (interval.start <= interval.end) {
  89. // normales Intervall
  90. return now >= interval.start && now < interval.end;
  91. }
  92. // Intervall geht über Mitternacht
  93. return now >= interval.start || now < interval.end;
  94. }
  95. String TimerManager::secondsToFormatedTime(uint32_t seconds) {
  96. uint8_t hour = seconds / 3600;
  97. uint8_t _seconds = seconds % 3600;
  98. uint8_t minute = _seconds / 60;
  99. uint8_t second = _seconds % 60;
  100. char buffer[9]; // "HH:mm:ss" + '\0'
  101. snprintf(buffer, sizeof(buffer), "%02u:%02u:%02u",
  102. hour, minute, second);
  103. return String(buffer);
  104. }