From f557b4bc2c0fecaa3b568b77787cad8657ecc26f Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Thu, 14 Nov 2024 20:26:13 +0100 Subject: [PATCH] Fix last hour not being considered for best price Backport of #17731 Signed-off-by: Jacob Laursen --- .../handler/AwattarBestpriceHandler.java | 2 +- .../internal/handler/AwattarBridgeHandler.java | 16 ++++++++++++++-- .../awattar/internal/handler/TimeRange.java | 1 + .../handler/AwattarBridgeHandlerTest.java | 10 +++++++++- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/bundles/org.openhab.binding.awattar/src/main/java/org/openhab/binding/awattar/internal/handler/AwattarBestpriceHandler.java b/bundles/org.openhab.binding.awattar/src/main/java/org/openhab/binding/awattar/internal/handler/AwattarBestpriceHandler.java index 4c92b523411ee..8508c51229aa0 100644 --- a/bundles/org.openhab.binding.awattar/src/main/java/org/openhab/binding/awattar/internal/handler/AwattarBestpriceHandler.java +++ b/bundles/org.openhab.binding.awattar/src/main/java/org/openhab/binding/awattar/internal/handler/AwattarBestpriceHandler.java @@ -139,7 +139,7 @@ public void refreshChannel(ChannelUID channelUID) { } AwattarBestpriceConfiguration config = getConfigAs(AwattarBestpriceConfiguration.class); TimeRange timerange = getRange(config.rangeStart, config.rangeDuration, bridgeHandler.getTimeZone()); - if (!(bridgeHandler.containsPriceFor(timerange.start()) && bridgeHandler.containsPriceFor(timerange.end()))) { + if (!(bridgeHandler.containsPriceFor(timerange))) { updateState(channelUID, state); return; } diff --git a/bundles/org.openhab.binding.awattar/src/main/java/org/openhab/binding/awattar/internal/handler/AwattarBridgeHandler.java b/bundles/org.openhab.binding.awattar/src/main/java/org/openhab/binding/awattar/internal/handler/AwattarBridgeHandler.java index 8bd65306efb92..bbcb95cad9e68 100644 --- a/bundles/org.openhab.binding.awattar/src/main/java/org/openhab/binding/awattar/internal/handler/AwattarBridgeHandler.java +++ b/bundles/org.openhab.binding.awattar/src/main/java/org/openhab/binding/awattar/internal/handler/AwattarBridgeHandler.java @@ -210,8 +210,20 @@ public synchronized SortedSet getPrices() { public boolean containsPriceFor(long timestamp) { SortedSet localPrices = getPrices(); - return localPrices != null && localPrices.first().timerange().start() <= timestamp - && localPrices.last().timerange().end() > timestamp; + if (localPrices == null) { + return false; + } + return new TimeRange(localPrices.first().timerange().start(), localPrices.last().timerange().end()) + .contains(timestamp); + } + + public boolean containsPriceFor(TimeRange timeRange) { + SortedSet localPrices = getPrices(); + if (localPrices == null) { + return false; + } + return new TimeRange(localPrices.first().timerange().start(), localPrices.last().timerange().end()) + .contains(timeRange); } @Override diff --git a/bundles/org.openhab.binding.awattar/src/main/java/org/openhab/binding/awattar/internal/handler/TimeRange.java b/bundles/org.openhab.binding.awattar/src/main/java/org/openhab/binding/awattar/internal/handler/TimeRange.java index 7e3bf8815c164..2ff339f809700 100644 --- a/bundles/org.openhab.binding.awattar/src/main/java/org/openhab/binding/awattar/internal/handler/TimeRange.java +++ b/bundles/org.openhab.binding.awattar/src/main/java/org/openhab/binding/awattar/internal/handler/TimeRange.java @@ -48,6 +48,7 @@ public boolean contains(TimeRange other) { * @param o the object to be compared * @return the result of {@link Long#compare(long, long)} for the {@link #start} timestamps */ + @Override public int compareTo(TimeRange o) { return Long.compare(start, o.start); } diff --git a/bundles/org.openhab.binding.awattar/src/test/java/org/openhab/binding/awattar/internal/handler/AwattarBridgeHandlerTest.java b/bundles/org.openhab.binding.awattar/src/test/java/org/openhab/binding/awattar/internal/handler/AwattarBridgeHandlerTest.java index a0e8d079c0897..ff526baf28e83 100644 --- a/bundles/org.openhab.binding.awattar/src/test/java/org/openhab/binding/awattar/internal/handler/AwattarBridgeHandlerTest.java +++ b/bundles/org.openhab.binding.awattar/src/test/java/org/openhab/binding/awattar/internal/handler/AwattarBridgeHandlerTest.java @@ -148,9 +148,17 @@ public void testGetPriceForFail() { } @Test - public void testContainsPrizeFor() { + void testContainsPriceForTimestamp() { + assertThat(bridgeHandler.containsPriceFor(new TimeRange(1618503200000L, 1718316000000L)), is(false)); + assertThat(bridgeHandler.containsPriceFor(new TimeRange(1618503200000L, 1718503200000L)), is(false)); + assertThat(bridgeHandler.containsPriceFor(new TimeRange(1718503200000L, 1718575200000L)), is(true)); + } + + @Test + void testContainsPriceForRange() { assertThat(bridgeHandler.containsPriceFor(1618503200000L), is(false)); assertThat(bridgeHandler.containsPriceFor(1718503200000L), is(true)); + assertThat(bridgeHandler.containsPriceFor(1718575200000L), is(false)); assertThat(bridgeHandler.containsPriceFor(1818503200000L), is(false)); }