mirror of
https://github.com/openhab/openhab-addons.git
synced 2025-01-25 14:55:55 +01:00
[awattar] make use of clock object
Signed-off-by: Thomas Leber <thomas@tl-photography.at>
This commit is contained in:
parent
70a9c79e6e
commit
77d372f2c1
@ -32,9 +32,9 @@ import org.openhab.core.library.unit.Units;
|
|||||||
@NonNullByDefault
|
@NonNullByDefault
|
||||||
public class AwattarUtil {
|
public class AwattarUtil {
|
||||||
|
|
||||||
public static long getMillisToNextMinute(int mod, TimeZoneProvider timeZoneProvider) {
|
public static long getMillisToNextMinute(int mod, ZoneId zoneId) {
|
||||||
long now = Instant.now().toEpochMilli();
|
long now = Instant.now().toEpochMilli();
|
||||||
ZonedDateTime dt = ZonedDateTime.now(timeZoneProvider.getTimeZone()).truncatedTo(ChronoUnit.MINUTES);
|
ZonedDateTime dt = ZonedDateTime.now(zoneId).truncatedTo(ChronoUnit.MINUTES);
|
||||||
int min = dt.getMinute();
|
int min = dt.getMinute();
|
||||||
int offset = min % mod;
|
int offset = min % mod;
|
||||||
offset = offset == 0 ? mod : offset;
|
offset = offset == 0 ? mod : offset;
|
||||||
|
@ -23,6 +23,7 @@ import static org.openhab.binding.awattar.internal.AwattarUtil.getCalendarForHou
|
|||||||
import static org.openhab.binding.awattar.internal.AwattarUtil.getDuration;
|
import static org.openhab.binding.awattar.internal.AwattarUtil.getDuration;
|
||||||
import static org.openhab.binding.awattar.internal.AwattarUtil.getMillisToNextMinute;
|
import static org.openhab.binding.awattar.internal.AwattarUtil.getMillisToNextMinute;
|
||||||
|
|
||||||
|
import java.time.Clock;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
@ -67,17 +68,17 @@ import org.slf4j.LoggerFactory;
|
|||||||
*/
|
*/
|
||||||
@NonNullByDefault
|
@NonNullByDefault
|
||||||
public class AwattarBestPriceHandler extends BaseThingHandler {
|
public class AwattarBestPriceHandler extends BaseThingHandler {
|
||||||
|
private final Clock clock;
|
||||||
|
|
||||||
private static final int THING_REFRESH_INTERVAL = 60;
|
private static final int THING_REFRESH_INTERVAL = 60;
|
||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(AwattarBestPriceHandler.class);
|
private final Logger logger = LoggerFactory.getLogger(AwattarBestPriceHandler.class);
|
||||||
|
|
||||||
private @Nullable ScheduledFuture<?> thingRefresher;
|
private @Nullable ScheduledFuture<?> thingRefresher;
|
||||||
|
|
||||||
private final TimeZoneProvider timeZoneProvider;
|
public AwattarBestPriceHandler(Thing thing, Clock clock) {
|
||||||
|
|
||||||
public AwattarBestPriceHandler(Thing thing, TimeZoneProvider timeZoneProvider) {
|
|
||||||
super(thing);
|
super(thing);
|
||||||
this.timeZoneProvider = timeZoneProvider;
|
this.clock = clock;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -97,7 +98,7 @@ public class AwattarBestPriceHandler extends BaseThingHandler {
|
|||||||
* here
|
* here
|
||||||
*/
|
*/
|
||||||
thingRefresher = scheduler.scheduleAtFixedRate(this::refreshChannels,
|
thingRefresher = scheduler.scheduleAtFixedRate(this::refreshChannels,
|
||||||
getMillisToNextMinute(1, timeZoneProvider), THING_REFRESH_INTERVAL * 1000L,
|
getMillisToNextMinute(1, clock.getZone()), THING_REFRESH_INTERVAL * 1000L,
|
||||||
TimeUnit.MILLISECONDS);
|
TimeUnit.MILLISECONDS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -163,7 +164,7 @@ public class AwattarBestPriceHandler extends BaseThingHandler {
|
|||||||
long diff;
|
long diff;
|
||||||
switch (channelId) {
|
switch (channelId) {
|
||||||
case CHANNEL_ACTIVE:
|
case CHANNEL_ACTIVE:
|
||||||
state = OnOffType.from(result.isActive(getNow()));
|
state = OnOffType.from(result.isActive(clock.instant()));
|
||||||
break;
|
break;
|
||||||
case CHANNEL_START:
|
case CHANNEL_START:
|
||||||
state = new DateTimeType(Instant.ofEpochMilli(result.getStart()));
|
state = new DateTimeType(Instant.ofEpochMilli(result.getStart()));
|
||||||
@ -172,7 +173,7 @@ public class AwattarBestPriceHandler extends BaseThingHandler {
|
|||||||
state = new DateTimeType(Instant.ofEpochMilli(result.getEnd()));
|
state = new DateTimeType(Instant.ofEpochMilli(result.getEnd()));
|
||||||
break;
|
break;
|
||||||
case CHANNEL_COUNTDOWN:
|
case CHANNEL_COUNTDOWN:
|
||||||
diff = result.getStart() - getNow().toEpochMilli();
|
diff = result.getStart() - clock.instant().toEpochMilli();
|
||||||
if (diff >= 0) {
|
if (diff >= 0) {
|
||||||
state = getDuration(diff);
|
state = getDuration(diff);
|
||||||
} else {
|
} else {
|
||||||
@ -180,8 +181,8 @@ public class AwattarBestPriceHandler extends BaseThingHandler {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CHANNEL_REMAINING:
|
case CHANNEL_REMAINING:
|
||||||
if (result.isActive(getNow())) {
|
if (result.isActive(clock.instant())) {
|
||||||
diff = result.getEnd() - getNow().toEpochMilli();
|
diff = result.getEnd() - clock.instant().toEpochMilli();
|
||||||
state = getDuration(diff);
|
state = getDuration(diff);
|
||||||
} else {
|
} else {
|
||||||
state = QuantityType.valueOf(0, Units.MINUTE);
|
state = QuantityType.valueOf(0, Units.MINUTE);
|
||||||
@ -227,7 +228,7 @@ public class AwattarBestPriceHandler extends BaseThingHandler {
|
|||||||
protected TimeRange getRange(int start, int duration, ZoneId zoneId) {
|
protected TimeRange getRange(int start, int duration, ZoneId zoneId) {
|
||||||
ZonedDateTime startTime = getStartTime(start, zoneId);
|
ZonedDateTime startTime = getStartTime(start, zoneId);
|
||||||
ZonedDateTime endTime = startTime.plusHours(duration);
|
ZonedDateTime endTime = startTime.plusHours(duration);
|
||||||
ZonedDateTime now = getNow().atZone(zoneId);
|
ZonedDateTime now = clock.instant().atZone(zoneId);
|
||||||
if (now.getHour() < start) {
|
if (now.getHour() < start) {
|
||||||
// we are before the range, so we might be still within the last range
|
// we are before the range, so we might be still within the last range
|
||||||
startTime = startTime.minusDays(1);
|
startTime = startTime.minusDays(1);
|
||||||
@ -251,14 +252,4 @@ public class AwattarBestPriceHandler extends BaseThingHandler {
|
|||||||
protected ZonedDateTime getStartTime(int start, ZoneId zoneId) {
|
protected ZonedDateTime getStartTime(int start, ZoneId zoneId) {
|
||||||
return getCalendarForHour(start, zoneId);
|
return getCalendarForHour(start, zoneId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the current time.
|
|
||||||
*
|
|
||||||
* @param zoneId the time zone
|
|
||||||
* @return the current time
|
|
||||||
*/
|
|
||||||
protected Instant getNow() {
|
|
||||||
return Instant.now();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -15,13 +15,13 @@ package org.openhab.binding.awattar.internal.handler;
|
|||||||
import static org.openhab.binding.awattar.internal.AwattarBindingConstants.CHANNEL_MARKET_NET;
|
import static org.openhab.binding.awattar.internal.AwattarBindingConstants.CHANNEL_MARKET_NET;
|
||||||
import static org.openhab.binding.awattar.internal.AwattarBindingConstants.CHANNEL_TOTAL_NET;
|
import static org.openhab.binding.awattar.internal.AwattarBindingConstants.CHANNEL_TOTAL_NET;
|
||||||
|
|
||||||
|
import java.time.Clock;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
import java.time.ZonedDateTime;
|
|
||||||
import java.util.SortedSet;
|
import java.util.SortedSet;
|
||||||
import java.util.concurrent.ScheduledFuture;
|
import java.util.concurrent.ScheduledFuture;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.function.Function;
|
import java.util.function.ToDoubleFunction;
|
||||||
|
|
||||||
import javax.measure.Unit;
|
import javax.measure.Unit;
|
||||||
|
|
||||||
@ -32,7 +32,6 @@ import org.openhab.binding.awattar.internal.AwattarBridgeConfiguration;
|
|||||||
import org.openhab.binding.awattar.internal.AwattarPrice;
|
import org.openhab.binding.awattar.internal.AwattarPrice;
|
||||||
import org.openhab.binding.awattar.internal.api.AwattarApi;
|
import org.openhab.binding.awattar.internal.api.AwattarApi;
|
||||||
import org.openhab.binding.awattar.internal.api.AwattarApi.AwattarApiException;
|
import org.openhab.binding.awattar.internal.api.AwattarApi.AwattarApiException;
|
||||||
import org.openhab.core.i18n.TimeZoneProvider;
|
|
||||||
import org.openhab.core.library.types.QuantityType;
|
import org.openhab.core.library.types.QuantityType;
|
||||||
import org.openhab.core.library.unit.CurrencyUnits;
|
import org.openhab.core.library.unit.CurrencyUnits;
|
||||||
import org.openhab.core.thing.Bridge;
|
import org.openhab.core.thing.Bridge;
|
||||||
@ -65,20 +64,20 @@ public class AwattarBridgeHandler extends BaseBridgeHandler {
|
|||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(AwattarBridgeHandler.class);
|
private final Logger logger = LoggerFactory.getLogger(AwattarBridgeHandler.class);
|
||||||
private final HttpClient httpClient;
|
private final HttpClient httpClient;
|
||||||
|
private final Clock clock;
|
||||||
|
|
||||||
private @Nullable ScheduledFuture<?> dataRefresher;
|
private @Nullable ScheduledFuture<?> dataRefresher;
|
||||||
private Instant lastRefresh = Instant.EPOCH;
|
private Instant lastRefresh = Instant.EPOCH;
|
||||||
|
|
||||||
// This cache stores price data for up to two days
|
// This cache stores price data for up to two days
|
||||||
private @Nullable SortedSet<AwattarPrice> prices;
|
private @Nullable SortedSet<AwattarPrice> prices;
|
||||||
private ZoneId zone;
|
|
||||||
|
|
||||||
private @Nullable AwattarApi awattarApi;
|
private @Nullable AwattarApi awattarApi;
|
||||||
|
|
||||||
public AwattarBridgeHandler(Bridge thing, HttpClient httpClient, TimeZoneProvider timeZoneProvider) {
|
public AwattarBridgeHandler(Bridge thing, HttpClient httpClient, Clock clock) {
|
||||||
super(thing);
|
super(thing);
|
||||||
this.httpClient = httpClient;
|
this.httpClient = httpClient;
|
||||||
zone = timeZoneProvider.getTimeZone();
|
this.clock = clock;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -87,7 +86,7 @@ public class AwattarBridgeHandler extends BaseBridgeHandler {
|
|||||||
AwattarBridgeConfiguration config = getConfigAs(AwattarBridgeConfiguration.class);
|
AwattarBridgeConfiguration config = getConfigAs(AwattarBridgeConfiguration.class);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
awattarApi = new AwattarApi(httpClient, zone, config);
|
awattarApi = new AwattarApi(httpClient, clock.getZone(), config);
|
||||||
|
|
||||||
dataRefresher = scheduler.scheduleWithFixedDelay(this::refreshIfNeeded, 0, DATA_REFRESH_INTERVAL * 1000L,
|
dataRefresher = scheduler.scheduleWithFixedDelay(this::refreshIfNeeded, 0, DATA_REFRESH_INTERVAL * 1000L,
|
||||||
TimeUnit.MILLISECONDS);
|
TimeUnit.MILLISECONDS);
|
||||||
@ -154,17 +153,15 @@ public class AwattarBridgeHandler extends BaseBridgeHandler {
|
|||||||
return priceUnit;
|
return priceUnit;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createAndSendTimeSeries(String channelId, Function<AwattarPrice, Double> valueFunction) {
|
private void createAndSendTimeSeries(String channelId, ToDoubleFunction<AwattarPrice> valueFunction) {
|
||||||
SortedSet<AwattarPrice> locPrices = getPrices();
|
SortedSet<AwattarPrice> locPrices = getPrices();
|
||||||
Unit<?> priceUnit = getPriceUnit();
|
Unit<?> priceUnit = getPriceUnit();
|
||||||
if (locPrices == null) {
|
if (locPrices == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
TimeSeries timeSeries = new TimeSeries(TimeSeries.Policy.REPLACE);
|
TimeSeries timeSeries = new TimeSeries(TimeSeries.Policy.REPLACE);
|
||||||
locPrices.forEach(p -> {
|
locPrices.forEach(p -> timeSeries.add(Instant.ofEpochMilli(p.timerange().start()),
|
||||||
timeSeries.add(Instant.ofEpochMilli(p.timerange().start()),
|
new QuantityType<>(valueFunction.applyAsDouble(p) / 100.0, priceUnit)));
|
||||||
new QuantityType<>(valueFunction.apply(p) / 100.0, priceUnit));
|
|
||||||
});
|
|
||||||
sendTimeSeries(channelId, timeSeries);
|
sendTimeSeries(channelId, timeSeries);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -200,13 +197,14 @@ public class AwattarBridgeHandler extends BaseBridgeHandler {
|
|||||||
|
|
||||||
// do not refresh before 15:00, since the prices for the next day are available
|
// do not refresh before 15:00, since the prices for the next day are available
|
||||||
// only after 14:00
|
// only after 14:00
|
||||||
ZonedDateTime now = ZonedDateTime.now(zone);
|
Instant now = clock.instant();
|
||||||
if (now.getHour() < 15) {
|
if (now.isBefore(clock.instant().truncatedTo(java.time.temporal.ChronoUnit.DAYS).plus(15,
|
||||||
|
java.time.temporal.ChronoUnit.HOURS))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// refresh then every 3 hours, if the last refresh was more than an hour ago
|
// refresh then every 3 hours, if the last refresh was more than an hour ago
|
||||||
if (now.getHour() % 3 == 0 && lastRefresh.getEpochSecond() < now.minusHours(1).toEpochSecond()) {
|
if (lastRefresh.plus(3, java.time.temporal.ChronoUnit.HOURS).isBefore(now)) {
|
||||||
// update the last refresh time
|
// update the last refresh time
|
||||||
lastRefresh = Instant.now();
|
lastRefresh = Instant.now();
|
||||||
|
|
||||||
@ -218,7 +216,7 @@ public class AwattarBridgeHandler extends BaseBridgeHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public ZoneId getTimeZone() {
|
public ZoneId getTimeZone() {
|
||||||
return zone;
|
return clock.getZone();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@ -261,6 +259,7 @@ public class AwattarBridgeHandler extends BaseBridgeHandler {
|
|||||||
switch (channelUID.getId()) {
|
switch (channelUID.getId()) {
|
||||||
case CHANNEL_MARKET_NET -> createAndSendTimeSeries(CHANNEL_MARKET_NET, AwattarPrice::netPrice);
|
case CHANNEL_MARKET_NET -> createAndSendTimeSeries(CHANNEL_MARKET_NET, AwattarPrice::netPrice);
|
||||||
case CHANNEL_TOTAL_NET -> createAndSendTimeSeries(CHANNEL_TOTAL_NET, AwattarPrice::netTotal);
|
case CHANNEL_TOTAL_NET -> createAndSendTimeSeries(CHANNEL_TOTAL_NET, AwattarPrice::netTotal);
|
||||||
|
default -> logger.warn("Channel {} not supported", channelUID.getId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@ import static org.openhab.binding.awattar.internal.AwattarBindingConstants.THING
|
|||||||
import static org.openhab.binding.awattar.internal.AwattarBindingConstants.THING_TYPE_BRIDGE;
|
import static org.openhab.binding.awattar.internal.AwattarBindingConstants.THING_TYPE_BRIDGE;
|
||||||
import static org.openhab.binding.awattar.internal.AwattarBindingConstants.THING_TYPE_PRICE;
|
import static org.openhab.binding.awattar.internal.AwattarBindingConstants.THING_TYPE_PRICE;
|
||||||
|
|
||||||
|
import java.time.Clock;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
@ -50,13 +51,13 @@ public class AwattarHandlerFactory extends BaseThingHandlerFactory {
|
|||||||
private static final Set<ThingTypeUID> SUPPORTED_THING_TYPES_UIDS = Set.of(THING_TYPE_PRICE, THING_TYPE_BESTPRICE,
|
private static final Set<ThingTypeUID> SUPPORTED_THING_TYPES_UIDS = Set.of(THING_TYPE_PRICE, THING_TYPE_BESTPRICE,
|
||||||
THING_TYPE_BRIDGE);
|
THING_TYPE_BRIDGE);
|
||||||
private final HttpClient httpClient;
|
private final HttpClient httpClient;
|
||||||
private final TimeZoneProvider timeZoneProvider;
|
private final Clock systemClock;
|
||||||
|
|
||||||
@Activate
|
@Activate
|
||||||
public AwattarHandlerFactory(final @Reference HttpClientFactory httpClientFactory,
|
public AwattarHandlerFactory(final @Reference HttpClientFactory httpClientFactory,
|
||||||
final @Reference TimeZoneProvider timeZoneProvider) {
|
final @Reference TimeZoneProvider timeZoneProvider) {
|
||||||
this.httpClient = httpClientFactory.getCommonHttpClient();
|
this.httpClient = httpClientFactory.getCommonHttpClient();
|
||||||
this.timeZoneProvider = timeZoneProvider;
|
this.systemClock = Clock.system(timeZoneProvider.getTimeZone());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -69,11 +70,11 @@ public class AwattarHandlerFactory extends BaseThingHandlerFactory {
|
|||||||
ThingTypeUID thingTypeUID = thing.getThingTypeUID();
|
ThingTypeUID thingTypeUID = thing.getThingTypeUID();
|
||||||
|
|
||||||
if (THING_TYPE_BRIDGE.equals(thingTypeUID)) {
|
if (THING_TYPE_BRIDGE.equals(thingTypeUID)) {
|
||||||
return new AwattarBridgeHandler((Bridge) thing, httpClient, timeZoneProvider);
|
return new AwattarBridgeHandler((Bridge) thing, httpClient, systemClock);
|
||||||
} else if (THING_TYPE_PRICE.equals(thingTypeUID)) {
|
} else if (THING_TYPE_PRICE.equals(thingTypeUID)) {
|
||||||
return new AwattarPriceHandler(thing, timeZoneProvider);
|
return new AwattarPriceHandler(thing, systemClock);
|
||||||
} else if (THING_TYPE_BESTPRICE.equals(thingTypeUID)) {
|
} else if (THING_TYPE_BESTPRICE.equals(thingTypeUID)) {
|
||||||
return new AwattarBestPriceHandler(thing, timeZoneProvider);
|
return new AwattarBestPriceHandler(thing, systemClock);
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.warn("Unknown thing type {}, not creating handler!", thingTypeUID);
|
logger.warn("Unknown thing type {}, not creating handler!", thingTypeUID);
|
||||||
|
@ -23,6 +23,7 @@ import static org.openhab.binding.awattar.internal.AwattarUtil.getMillisToNextMi
|
|||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.math.RoundingMode;
|
import java.math.RoundingMode;
|
||||||
|
import java.time.Clock;
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
import java.util.concurrent.ScheduledFuture;
|
import java.util.concurrent.ScheduledFuture;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
@ -30,7 +31,6 @@ import java.util.concurrent.TimeUnit;
|
|||||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
import org.eclipse.jdt.annotation.Nullable;
|
import org.eclipse.jdt.annotation.Nullable;
|
||||||
import org.openhab.binding.awattar.internal.AwattarPrice;
|
import org.openhab.binding.awattar.internal.AwattarPrice;
|
||||||
import org.openhab.core.i18n.TimeZoneProvider;
|
|
||||||
import org.openhab.core.library.types.DecimalType;
|
import org.openhab.core.library.types.DecimalType;
|
||||||
import org.openhab.core.thing.Bridge;
|
import org.openhab.core.thing.Bridge;
|
||||||
import org.openhab.core.thing.Channel;
|
import org.openhab.core.thing.Channel;
|
||||||
@ -55,15 +55,16 @@ import org.slf4j.LoggerFactory;
|
|||||||
*/
|
*/
|
||||||
@NonNullByDefault
|
@NonNullByDefault
|
||||||
public class AwattarPriceHandler extends BaseThingHandler {
|
public class AwattarPriceHandler extends BaseThingHandler {
|
||||||
|
private final Clock clock;
|
||||||
|
|
||||||
private static final int THING_REFRESH_INTERVAL = 60;
|
private static final int THING_REFRESH_INTERVAL = 60;
|
||||||
private final Logger logger = LoggerFactory.getLogger(AwattarPriceHandler.class);
|
private final Logger logger = LoggerFactory.getLogger(AwattarPriceHandler.class);
|
||||||
|
|
||||||
private final TimeZoneProvider timeZoneProvider;
|
|
||||||
private @Nullable ScheduledFuture<?> thingRefresher;
|
private @Nullable ScheduledFuture<?> thingRefresher;
|
||||||
|
|
||||||
public AwattarPriceHandler(Thing thing, TimeZoneProvider timeZoneProvider) {
|
public AwattarPriceHandler(Thing thing, Clock clock) {
|
||||||
super(thing);
|
super(thing);
|
||||||
this.timeZoneProvider = timeZoneProvider;
|
this.clock = clock;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -90,7 +91,7 @@ public class AwattarPriceHandler extends BaseThingHandler {
|
|||||||
* here
|
* here
|
||||||
*/
|
*/
|
||||||
thingRefresher = scheduler.scheduleAtFixedRate(this::refreshChannels,
|
thingRefresher = scheduler.scheduleAtFixedRate(this::refreshChannels,
|
||||||
getMillisToNextMinute(1, timeZoneProvider), THING_REFRESH_INTERVAL * 1000,
|
getMillisToNextMinute(1, clock.getZone()), THING_REFRESH_INTERVAL * 1000L,
|
||||||
TimeUnit.MILLISECONDS);
|
TimeUnit.MILLISECONDS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -153,7 +154,7 @@ public class AwattarPriceHandler extends BaseThingHandler {
|
|||||||
AwattarPrice price = bridgeHandler.getPriceFor(target.toInstant().toEpochMilli());
|
AwattarPrice price = bridgeHandler.getPriceFor(target.toInstant().toEpochMilli());
|
||||||
|
|
||||||
if (price == null) {
|
if (price == null) {
|
||||||
logger.trace("No price found for hour {}", target.toString());
|
logger.trace("No price found for hour {}", target);
|
||||||
updateState(channelUID, state);
|
updateState(channelUID, state);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,6 @@ import org.mockito.quality.Strictness;
|
|||||||
import org.openhab.binding.awattar.internal.AwattarBridgeConfiguration;
|
import org.openhab.binding.awattar.internal.AwattarBridgeConfiguration;
|
||||||
import org.openhab.binding.awattar.internal.AwattarPrice;
|
import org.openhab.binding.awattar.internal.AwattarPrice;
|
||||||
import org.openhab.binding.awattar.internal.api.AwattarApi.AwattarApiException;
|
import org.openhab.binding.awattar.internal.api.AwattarApi.AwattarApiException;
|
||||||
import org.openhab.core.i18n.TimeZoneProvider;
|
|
||||||
import org.openhab.core.test.java.JavaTest;
|
import org.openhab.core.test.java.JavaTest;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -60,7 +59,6 @@ import org.openhab.core.test.java.JavaTest;
|
|||||||
class AwattarApiTest extends JavaTest {
|
class AwattarApiTest extends JavaTest {
|
||||||
// API Mocks
|
// API Mocks
|
||||||
private @Mock @NonNullByDefault({}) HttpClient httpClientMock;
|
private @Mock @NonNullByDefault({}) HttpClient httpClientMock;
|
||||||
private @Mock @NonNullByDefault({}) TimeZoneProvider timeZoneProviderMock;
|
|
||||||
private @Mock @NonNullByDefault({}) Request requestMock;
|
private @Mock @NonNullByDefault({}) Request requestMock;
|
||||||
private @Mock @NonNullByDefault({}) ContentResponse contentResponseMock;
|
private @Mock @NonNullByDefault({}) ContentResponse contentResponseMock;
|
||||||
private @Mock @NonNullByDefault({}) AwattarBridgeConfiguration config;
|
private @Mock @NonNullByDefault({}) AwattarBridgeConfiguration config;
|
||||||
@ -86,8 +84,6 @@ class AwattarApiTest extends JavaTest {
|
|||||||
when(requestMock.timeout(10, TimeUnit.SECONDS)).thenReturn(requestMock);
|
when(requestMock.timeout(10, TimeUnit.SECONDS)).thenReturn(requestMock);
|
||||||
when(requestMock.send()).thenReturn(contentResponseMock);
|
when(requestMock.send()).thenReturn(contentResponseMock);
|
||||||
|
|
||||||
when(timeZoneProviderMock.getTimeZone()).thenReturn(ZoneId.of("GMT+2"));
|
|
||||||
|
|
||||||
config.basePrice = 0.0;
|
config.basePrice = 0.0;
|
||||||
config.vatPercent = 0.0;
|
config.vatPercent = 0.0;
|
||||||
config.country = "DE";
|
config.country = "DE";
|
||||||
|
@ -19,7 +19,7 @@ import static org.mockito.Mockito.when;
|
|||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.time.ZoneId;
|
import java.time.Clock;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
@ -36,7 +36,6 @@ import org.mockito.quality.Strictness;
|
|||||||
import org.openhab.binding.awattar.internal.AwattarBindingConstants;
|
import org.openhab.binding.awattar.internal.AwattarBindingConstants;
|
||||||
import org.openhab.binding.awattar.internal.api.AwattarApi;
|
import org.openhab.binding.awattar.internal.api.AwattarApi;
|
||||||
import org.openhab.binding.awattar.internal.api.AwattarApi.AwattarApiException;
|
import org.openhab.binding.awattar.internal.api.AwattarApi.AwattarApiException;
|
||||||
import org.openhab.core.i18n.TimeZoneProvider;
|
|
||||||
import org.openhab.core.test.java.JavaTest;
|
import org.openhab.core.test.java.JavaTest;
|
||||||
import org.openhab.core.thing.Bridge;
|
import org.openhab.core.thing.Bridge;
|
||||||
import org.openhab.core.thing.Thing;
|
import org.openhab.core.thing.Thing;
|
||||||
@ -62,7 +61,7 @@ class AwattarBridgeHandlerRefreshTest extends JavaTest {
|
|||||||
private @Mock @NonNullByDefault({}) Bridge bridgeMock;
|
private @Mock @NonNullByDefault({}) Bridge bridgeMock;
|
||||||
private @Mock @NonNullByDefault({}) ThingHandlerCallback bridgeCallbackMock;
|
private @Mock @NonNullByDefault({}) ThingHandlerCallback bridgeCallbackMock;
|
||||||
private @Mock @NonNullByDefault({}) HttpClient httpClientMock;
|
private @Mock @NonNullByDefault({}) HttpClient httpClientMock;
|
||||||
private @Mock @NonNullByDefault({}) TimeZoneProvider timeZoneProviderMock;
|
private @Mock @NonNullByDefault({}) Clock clockMock;
|
||||||
private @Mock @NonNullByDefault({}) AwattarApi awattarApiMock;
|
private @Mock @NonNullByDefault({}) AwattarApi awattarApiMock;
|
||||||
|
|
||||||
// best price handler mocks
|
// best price handler mocks
|
||||||
@ -73,10 +72,8 @@ class AwattarBridgeHandlerRefreshTest extends JavaTest {
|
|||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
public void setUp() throws IllegalArgumentException, IllegalAccessException {
|
public void setUp() throws IllegalArgumentException, IllegalAccessException {
|
||||||
when(timeZoneProviderMock.getTimeZone()).thenReturn(ZoneId.of("GMT+2"));
|
|
||||||
|
|
||||||
when(bridgeMock.getUID()).thenReturn(BRIDGE_UID);
|
when(bridgeMock.getUID()).thenReturn(BRIDGE_UID);
|
||||||
bridgeHandler = new AwattarBridgeHandler(bridgeMock, httpClientMock, timeZoneProviderMock);
|
bridgeHandler = new AwattarBridgeHandler(bridgeMock, httpClientMock, clockMock);
|
||||||
bridgeHandler.setCallback(bridgeCallbackMock);
|
bridgeHandler.setCallback(bridgeCallbackMock);
|
||||||
|
|
||||||
List<Field> fields = ReflectionSupport.findFields(AwattarBridgeHandler.class,
|
List<Field> fields = ReflectionSupport.findFields(AwattarBridgeHandler.class,
|
||||||
|
@ -30,6 +30,7 @@ import static org.openhab.binding.awattar.internal.AwattarBindingConstants.CHANN
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
import java.time.Clock;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
@ -61,7 +62,6 @@ import org.openhab.binding.awattar.internal.api.AwattarApi;
|
|||||||
import org.openhab.binding.awattar.internal.api.AwattarApi.AwattarApiException;
|
import org.openhab.binding.awattar.internal.api.AwattarApi.AwattarApiException;
|
||||||
import org.openhab.binding.awattar.internal.dto.AwattarApiData;
|
import org.openhab.binding.awattar.internal.dto.AwattarApiData;
|
||||||
import org.openhab.core.config.core.Configuration;
|
import org.openhab.core.config.core.Configuration;
|
||||||
import org.openhab.core.i18n.TimeZoneProvider;
|
|
||||||
import org.openhab.core.library.types.DateTimeType;
|
import org.openhab.core.library.types.DateTimeType;
|
||||||
import org.openhab.core.library.types.OnOffType;
|
import org.openhab.core.library.types.OnOffType;
|
||||||
import org.openhab.core.library.types.QuantityType;
|
import org.openhab.core.library.types.QuantityType;
|
||||||
@ -91,7 +91,6 @@ public class AwattarBridgeHandlerTest extends JavaTest {
|
|||||||
private @Mock @NonNullByDefault({}) Bridge bridgeMock;
|
private @Mock @NonNullByDefault({}) Bridge bridgeMock;
|
||||||
private @Mock @NonNullByDefault({}) ThingHandlerCallback bridgeCallbackMock;
|
private @Mock @NonNullByDefault({}) ThingHandlerCallback bridgeCallbackMock;
|
||||||
private @Mock @NonNullByDefault({}) HttpClient httpClientMock;
|
private @Mock @NonNullByDefault({}) HttpClient httpClientMock;
|
||||||
private @Mock @NonNullByDefault({}) TimeZoneProvider timeZoneProviderMock;
|
|
||||||
private @Mock @NonNullByDefault({}) AwattarApi awattarApiMock;
|
private @Mock @NonNullByDefault({}) AwattarApi awattarApiMock;
|
||||||
|
|
||||||
// best price handler mocks
|
// best price handler mocks
|
||||||
@ -116,10 +115,10 @@ public class AwattarBridgeHandlerTest extends JavaTest {
|
|||||||
when(awattarApiMock.getData()).thenReturn(result);
|
when(awattarApiMock.getData()).thenReturn(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
when(timeZoneProviderMock.getTimeZone()).thenReturn(ZoneId.of("GMT+2"));
|
Clock clock = Clock.fixed(Instant.parse("2024-06-15T12:00:00Z"), ZoneId.of("GMT+2"));
|
||||||
|
|
||||||
when(bridgeMock.getUID()).thenReturn(BRIDGE_UID);
|
when(bridgeMock.getUID()).thenReturn(BRIDGE_UID);
|
||||||
bridgeHandler = new AwattarBridgeHandler(bridgeMock, httpClientMock, timeZoneProviderMock);
|
bridgeHandler = new AwattarBridgeHandler(bridgeMock, httpClientMock, clock);
|
||||||
bridgeHandler.setCallback(bridgeCallbackMock);
|
bridgeHandler.setCallback(bridgeCallbackMock);
|
||||||
|
|
||||||
// mock the private field awattarApi
|
// mock the private field awattarApi
|
||||||
@ -202,14 +201,11 @@ public class AwattarBridgeHandlerTest extends JavaTest {
|
|||||||
consecutive);
|
consecutive);
|
||||||
when(bestpriceMock.getConfiguration()).thenReturn(new Configuration(config));
|
when(bestpriceMock.getConfiguration()).thenReturn(new Configuration(config));
|
||||||
|
|
||||||
AwattarBestPriceHandler handler = new AwattarBestPriceHandler(bestpriceMock, timeZoneProviderMock) {
|
AwattarBestPriceHandler handler = new AwattarBestPriceHandler(bestpriceMock,
|
||||||
|
Clock.fixed(Instant.parse("2024-06-15T12:00:00Z"), ZoneId.of("GMT+2"))) {
|
||||||
protected ZonedDateTime getStartTime(int start, ZoneId zoneId) {
|
protected ZonedDateTime getStartTime(int start, ZoneId zoneId) {
|
||||||
return ZonedDateTime.of(2024, 6, 15, 12, 0, 0, 0, zoneId);
|
return ZonedDateTime.of(2024, 6, 15, 12, 0, 0, 0, zoneId);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Instant getNow() {
|
|
||||||
return ZonedDateTime.of(2024, 6, 15, 12, 0, 0, 0, ZoneId.of("GMT+2")).toInstant();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
handler.setCallback(bestPriceCallbackMock);
|
handler.setCallback(bestPriceCallbackMock);
|
||||||
@ -258,13 +254,13 @@ public class AwattarBridgeHandlerTest extends JavaTest {
|
|||||||
consecutive);
|
consecutive);
|
||||||
when(bestpriceMock.getConfiguration()).thenReturn(new Configuration(config));
|
when(bestpriceMock.getConfiguration()).thenReturn(new Configuration(config));
|
||||||
|
|
||||||
AwattarBestPriceHandler handler = new AwattarBestPriceHandler(bestpriceMock, timeZoneProviderMock) {
|
Clock clock = Clock.fixed(
|
||||||
protected ZonedDateTime getStartTime(int start, ZoneId zoneId) {
|
ZonedDateTime.of(2024, 6, 15, currentHour, currentMinute, 0, 0, ZoneId.of("GMT+2")).toInstant(),
|
||||||
return ZonedDateTime.of(2024, 6, 15, 0, 0, 0, 0, zoneId);
|
ZoneId.of("GMT+2"));
|
||||||
}
|
|
||||||
|
|
||||||
protected Instant getNow() {
|
AwattarBestPriceHandler handler = new AwattarBestPriceHandler(bestpriceMock, clock) {
|
||||||
return ZonedDateTime.of(2024, 6, 15, currentHour, currentMinute, 0, 0, ZoneId.of("GMT+2")).toInstant();
|
protected ZonedDateTime getStartTime(int start, ZoneId zoneId) {
|
||||||
|
return ZonedDateTime.of(2024, 6, 15, 0, 0, 0, 0, clock.getZone());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user