bool Scheduler::updateSchedules(Pricing& pricing, NodeInfo& nodeInfo) { if (!isMaster()) { Master::schedule(&nodeInfo); return true; } unsigned long now = Clock::getUnixTime(); bool changed = false; for (auto &schedule : nodeInfo.schedules) { // we already have a designated time or interval expired, so we can get next time if (schedule.repeatEvery > 0 && ((schedule.designatedTime > schedule.startTime && schedule.designatedTime < schedule.startTime + schedule.interval) || schedule.startTime + schedule.interval < now)) { schedule.startTime += schedule.repeatEvery * ceil(float(now - schedule.interval - schedule.startTime) / float(schedule.repeatEvery)); changed = true; } #if DEBUG_SCHEDULER Serial.print("lastRun"); Serial.println(schedule.lastRun); Serial.print("designatedtime"); Serial.println(schedule.designatedTime); Serial.print("duration"); Serial.println(schedule.duration); Serial.print("startime"); Serial.println(schedule.startTime); Serial.print("now"); Serial.println(now); Serial.print("startime"); Serial.println(schedule.startTime); Serial.print("startime-now"); Serial.println(long(schedule.startTime - now)); #endif // It has already run or the designated time expiered if ((schedule.lastRun >= schedule.designatedTime || schedule.designatedTime + schedule.duration > now) // and we have a new plan to schedule && schedule.startTime > schedule.designatedTime // and there are only 30 minutes left to ensure we have data for the interval && long(schedule.startTime - now) < 1800) { if (isMaster()) schedule.designatedTime = pricing.getBestTime(schedule); else {} //ask master for best time changed = true; } } if (changed) nodeInfo.save(); return changed; }
void PricingTest::testBestTime() { // Lowest price of the day Schedule schedule; schedule.duration = 4*3600; // 1h schedule.startTime = Clock::getDayInSeconds() + 9*3600 + 60*30; schedule.interval = 6*3600 + 0*60*50; Pricing pricing; Serial.println(Clock::getHumanDateTime(pricing.getBestTime(schedule))); Serial.println("==========================="); }