TvheadendService now recognizes external (manual) change of receiver state
This commit is contained in:
parent
db9db83eca
commit
b99fb7d229
@ -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;
|
||||
@ -70,7 +72,14 @@ public class TvheadendService {
|
||||
} 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) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user