diff --git a/src/main/java/de/ph87/home/tvheadend/TvheadendService.java b/src/main/java/de/ph87/home/tvheadend/TvheadendService.java index 387460b..90533db 100644 --- a/src/main/java/de/ph87/home/tvheadend/TvheadendService.java +++ b/src/main/java/de/ph87/home/tvheadend/TvheadendService.java @@ -35,6 +35,8 @@ public class TvheadendService { @Nullable private ZonedDateTime lastNeededChanged = null; + private boolean receiverLastState = false; + @Scheduled(initialDelay = 0, fixedDelay = 5, timeUnit = TimeUnit.SECONDS) public void update() { final TvheadendStatus status; @@ -67,10 +69,17 @@ public class TvheadendService { shouldBeMessage = "Receiver is needed."; } else if (status.recordingNext != null) { shouldBeMessage = "Receiver is needed in %s".formatted(durationToString(Duration.between(now, status.recordingNext.getStart_real().minus(tvheadendConfig.getBEFORE_RECORDING())))); - }else{ + } else { shouldBeMessage = "Receiver is NOT needed."; } - final boolean justChanged = lastNeededChanged == null || !Objects.equals(lastNeeded, status.receiverNeeded); + + final boolean receiverState = receiver.getStateValueAs(Boolean.class, false); + final boolean receiverStateChanged = receiverLastState != receiverState; + receiverLastState = receiverState; + + final boolean initial = lastNeededChanged == null; + final boolean needChanged = !Objects.equals(lastNeeded, status.receiverNeeded); + final boolean justChanged = initial || needChanged || receiverStateChanged; if (justChanged) { log.info(shouldBeMessage); lastNeeded = status.receiverNeeded; @@ -79,14 +88,13 @@ public class TvheadendService { log.debug(shouldBeMessage); } - final boolean isOn = receiver.getStateValueAs(Boolean.class, false); if (status.receiverNeeded) { - if (!isOn) { + if (!receiverState) { doSwitch(receiver, true); } else if (justChanged) { log.info("Receiver is already ON"); } - } else if (isOn) { + } else if (receiverState) { final Duration neededOffFor = Duration.between(lastNeededChanged, now); final Duration rest = tvheadendConfig.getAFTER_NEED().minus(neededOffFor); if (rest.toNanos() <= 0) { @@ -108,20 +116,21 @@ public class TvheadendService { @NonNull private String durationToString(@NonNull final Duration duration) { if (duration.toDays() > 1) { - return "%dd".formatted(duration.toDays()); - } else if (duration.toHours() > 1) { - return "%dh".formatted(duration.toHours()); - } else if (duration.toMinutes() > 1) { - return "%dm".formatted(duration.toMinutes()); - } else if (duration.toSeconds() > 1) { - return "%ds".formatted(duration.toSeconds()); - } else if (duration.toMillis() > 1) { - return "%dms".formatted(duration.toMillis()); + return "%dd %dh".formatted(duration.toDaysPart(), duration.toHoursPart()); + } else if (duration.toHours() > 0) { + return "%dh %dm".formatted(duration.toHoursPart(), duration.toMinutesPart()); + } else if (duration.toMinutes() > 0) { + return "%dm %ds".formatted(duration.toMinutesPart(), duration.toSecondsPart()); + } else if (duration.toSeconds() > 0) { + return "%ds %dms".formatted(duration.toSecondsPart(), duration.toMillisPart()); + } else if (duration.toMillis() > 0) { + return "%dms".formatted(duration.toMillisPart()); } return "now"; } - private static void doSwitch(@NonNull final Property receiver, final boolean state) throws PropertyNotWritable { + private void doSwitch(@NonNull final Property receiver, final boolean state) throws PropertyNotWritable { + receiverLastState = state; log.info("Switching receiver {}", state ? "ON" : "OFF"); receiver.write(state); if (!state) {