TvheadendService now recognizes external (manual) change of receiver state

This commit is contained in:
Patrick Haßel 2024-11-20 12:52:47 +01:00
parent db9db83eca
commit b99fb7d229

View File

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