package de.ph87.homeautomation.schedule.entry; import com.luckycatlabs.sunrisesunset.Zenith; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import java.time.ZonedDateTime; import java.util.Random; @Getter @Setter @Entity public class ScheduleEntry { private static final Random RANDOM = new Random(System.currentTimeMillis()); @Id @GeneratedValue @Setter(AccessLevel.NONE) private Long id; private boolean enabled = false; private boolean monday = true; private boolean tuesday = true; private boolean wednesday = true; private boolean thursday = true; private boolean friday = true; private boolean saturday = true; private boolean sunday = true; @Column(nullable = false) private ScheduleEntryType type = ScheduleEntryType.TIME; private double zenith = Zenith.CIVIL.degrees().doubleValue(); private int hour = 0; private int minute = 0; private int second = 0; private int fuzzySeconds = 0; private double value = 0; private ZonedDateTime nextClearTimestamp; private ZonedDateTime lastClearTimestamp; @Setter(AccessLevel.NONE) private ZonedDateTime nextFuzzyTimestamp; public void setNextClearTimestamp(final ZonedDateTime next) { nextClearTimestamp = next; if (nextClearTimestamp == null) { nextFuzzyTimestamp = null; } else { final int rangeFull = 2 * fuzzySeconds; final int fuzzySeconds = rangeFull > 0 ? RANDOM.nextInt(rangeFull) - this.fuzzySeconds : 0; nextFuzzyTimestamp = nextClearTimestamp.plusSeconds(fuzzySeconds); } } public void setWorkday(final boolean enabled) { monday = enabled; tuesday = enabled; wednesday = enabled; thursday = enabled; friday = enabled; } public void setWeekend(final boolean enabled) { saturday = enabled; sunday = enabled; } public void setEveryday(final boolean enabled) { setWorkday(enabled); setWeekend(enabled); } @Override public String toString() { final StringBuilder builder = new StringBuilder(); builder.append(getClass().getSimpleName()); builder.append("(id="); builder.append(id); builder.append(", enabled="); builder.append(enabled); builder.append(", type="); builder.append(type); builder.append(", weekdays="); builder.append(monday ? 1 : 0); builder.append(tuesday ? 1 : 0); builder.append(wednesday ? 1 : 0); builder.append(thursday ? 1 : 0); builder.append(friday ? 1 : 0); builder.append(saturday ? 1 : 0); builder.append(sunday ? 1 : 0); if (type != null) { switch (type) { case TIME: builder.append(", hour="); builder.append(hour); builder.append(", minute="); builder.append(minute); builder.append(", second="); builder.append(second); break; case SUNRISE: case SUNSET: builder.append(", zenith="); builder.append(zenith); break; } } builder.append(")"); return builder.toString(); } }