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
|
@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) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user