56 lines
1.9 KiB
Java
56 lines
1.9 KiB
Java
package de.ph87.homeautomation.schedule;
|
|
|
|
import de.ph87.homeautomation.bulk.BulkExecutor;
|
|
import de.ph87.homeautomation.property.PropertyWriter;
|
|
import de.ph87.homeautomation.schedule.entry.ScheduleEntry;
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
import java.time.ZonedDateTime;
|
|
import java.util.Comparator;
|
|
|
|
@Slf4j
|
|
@Service
|
|
@Transactional
|
|
@RequiredArgsConstructor
|
|
public class ScheduleExecutor {
|
|
|
|
private final ScheduleReader scheduleReader;
|
|
|
|
private final PropertyWriter propertyWriter;
|
|
|
|
private final BulkExecutor bulkExecutor;
|
|
|
|
private final ScheduleWriter scheduleWriter;
|
|
|
|
public void executeAllLastDue() {
|
|
scheduleReader.findAll().forEach(this::executeLastDue);
|
|
}
|
|
|
|
private void executeLastDue(final Schedule schedule) {
|
|
final ZonedDateTime now = ZonedDateTime.now();
|
|
schedule.getEntries().stream()
|
|
.filter(entry -> entry.getNextFuzzyTimestamp() != null && !entry.getNextFuzzyTimestamp().isAfter(now))
|
|
.max(Comparator.comparing(ScheduleEntry::getNextFuzzyTimestamp))
|
|
.ifPresent(entry -> executeEntry(schedule, entry));
|
|
}
|
|
|
|
private void executeEntry(final Schedule schedule, final ScheduleEntry entry) {
|
|
log.info("Executing Schedule \"{}\" Entry {}", schedule.getTitle(), entry);
|
|
if (entry.getProperty() != null) {
|
|
log.debug("Schedule setting property: {} = {}", entry.getProperty().getTitle(), entry.getValue());
|
|
propertyWriter.writeToChannel(entry.getProperty(), entry.getValue());
|
|
}
|
|
if (entry.getBulk() != null) {
|
|
log.debug("Schedule executing Bulk: {}", entry.getBulk());
|
|
bulkExecutor.execute(entry.getBulk());
|
|
}
|
|
entry.setLastClearTimestamp(entry.getNextClearTimestamp());
|
|
entry.setLastFuzzyTimestamp(entry.getNextFuzzyTimestamp());
|
|
scheduleWriter.notifyChanged(schedule);
|
|
}
|
|
|
|
}
|