Homeautomation/src/main/java/de/ph87/homeautomation/schedule/ScheduleExecutor.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);
}
}