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
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<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");
receiver.write(state);
if (!state) {