diff --git a/bundles/org.openhab.binding.linky/src/main/java/org/openhab/binding/linky/internal/LinkyConfiguration.java b/bundles/org.openhab.binding.linky/src/main/java/org/openhab/binding/linky/internal/LinkyConfiguration.java index 1523ec7d17c..fd6608864d9 100644 --- a/bundles/org.openhab.binding.linky/src/main/java/org/openhab/binding/linky/internal/LinkyConfiguration.java +++ b/bundles/org.openhab.binding.linky/src/main/java/org/openhab/binding/linky/internal/LinkyConfiguration.java @@ -13,6 +13,7 @@ package org.openhab.binding.linky.internal; import org.eclipse.jdt.annotation.NonNullByDefault; +import org.openhab.core.config.core.Configuration; /** * The {@link LinkyConfiguration} is the class used to match the @@ -22,10 +23,11 @@ import org.eclipse.jdt.annotation.NonNullByDefault; * @author Laurent Arnal - Rewrite addon to use official dataconect API */ @NonNullByDefault -public class LinkyConfiguration { +public class LinkyConfiguration extends Configuration { public static final String INTERNAL_AUTH_ID = "internalAuthId"; public String token = ""; + public String timezone = ""; public String prmId = ""; public String clientId = ""; public String clientSecret = ""; diff --git a/bundles/org.openhab.binding.linky/src/main/java/org/openhab/binding/linky/internal/LinkyHandlerFactory.java b/bundles/org.openhab.binding.linky/src/main/java/org/openhab/binding/linky/internal/LinkyHandlerFactory.java index a7b7a91a16e..ef1b2068640 100644 --- a/bundles/org.openhab.binding.linky/src/main/java/org/openhab/binding/linky/internal/LinkyHandlerFactory.java +++ b/bundles/org.openhab.binding.linky/src/main/java/org/openhab/binding/linky/internal/LinkyHandlerFactory.java @@ -29,6 +29,7 @@ import org.openhab.binding.linky.internal.handler.LinkyHandler; import org.openhab.binding.linky.internal.handler.MyElectricalDataBridgeHandler; import org.openhab.core.auth.client.oauth2.OAuthFactory; import org.openhab.core.i18n.LocaleProvider; +import org.openhab.core.i18n.TimeZoneProvider; import org.openhab.core.io.net.http.HttpClientFactory; import org.openhab.core.thing.Bridge; import org.openhab.core.thing.Thing; @@ -80,6 +81,7 @@ public class LinkyHandlerFactory extends BaseThingHandlerFactory { private final HttpService httpService; private final ThingRegistry thingRegistry; private final ComponentContext componentContext; + private final TimeZoneProvider timeZoneProvider; private final Gson gson = new GsonBuilder() .registerTypeAdapter(ZonedDateTime.class, @@ -106,9 +108,9 @@ public class LinkyHandlerFactory extends BaseThingHandlerFactory { public LinkyHandlerFactory(final @Reference LocaleProvider localeProvider, final @Reference HttpClientFactory httpClientFactory, final @Reference OAuthFactory oAuthFactory, final @Reference HttpService httpService, final @Reference ThingRegistry thingRegistry, - ComponentContext componentContext) { + ComponentContext componentContext, final @Reference TimeZoneProvider timeZoneProvider) { this.localeProvider = localeProvider; - + this.timeZoneProvider = timeZoneProvider; this.httpClientFactory = httpClientFactory; this.oAuthFactory = oAuthFactory; this.httpService = httpService; @@ -141,7 +143,7 @@ public class LinkyHandlerFactory extends BaseThingHandlerFactory { this.httpClientFactory, this.oAuthFactory, this.httpService, thingRegistry, componentContext, gson); return handler; } else if (THING_TYPE_LINKY.equals(thing.getThingTypeUID())) { - LinkyHandler handler = new LinkyHandler(thing, localeProvider); + LinkyHandler handler = new LinkyHandler(thing, localeProvider, timeZoneProvider); return handler; } diff --git a/bundles/org.openhab.binding.linky/src/main/java/org/openhab/binding/linky/internal/handler/LinkyHandler.java b/bundles/org.openhab.binding.linky/src/main/java/org/openhab/binding/linky/internal/handler/LinkyHandler.java index 032c290c93b..1342bb0f0d4 100644 --- a/bundles/org.openhab.binding.linky/src/main/java/org/openhab/binding/linky/internal/handler/LinkyHandler.java +++ b/bundles/org.openhab.binding.linky/src/main/java/org/openhab/binding/linky/internal/handler/LinkyHandler.java @@ -20,7 +20,6 @@ import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; -import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.time.temporal.WeekFields; @@ -50,6 +49,7 @@ import org.openhab.binding.linky.internal.dto.UsagePoint; import org.openhab.binding.linky.internal.dto.UserInfo; import org.openhab.core.config.core.Configuration; import org.openhab.core.i18n.LocaleProvider; +import org.openhab.core.i18n.TimeZoneProvider; import org.openhab.core.library.types.DateTimeType; import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.QuantityType; @@ -84,6 +84,9 @@ import org.threeten.extra.Years; @NonNullByDefault public class LinkyHandler extends BaseThingHandler { + private final TimeZoneProvider timeZoneProvider; + private ZoneId zoneId = ZoneId.systemDefault(); + private static final int REFRESH_FIRST_HOUR_OF_DAY = 1; private static final int REFRESH_INTERVAL_IN_MIN = 120; @@ -109,10 +112,11 @@ public class LinkyHandler extends BaseThingHandler { ALL } - public LinkyHandler(Thing thing, LocaleProvider localeProvider) { + public LinkyHandler(Thing thing, LocaleProvider localeProvider, TimeZoneProvider timeZoneProvider) { super(thing); config = getConfigAs(LinkyConfiguration.class); + this.timeZoneProvider = timeZoneProvider; this.dailyConsumption = new ExpiringDayCache<>("dailyConsumption", REFRESH_FIRST_HOUR_OF_DAY, () -> { LocalDate today = LocalDate.now(); @@ -166,6 +170,22 @@ public class LinkyHandler extends BaseThingHandler { public synchronized void initialize() { logger.debug("Initializing Linky handler."); + // update the timezone if not set to default to openhab default timezone + Configuration thingConfig = getConfig(); + + Object val = thingConfig.get("timezone"); + if (val == null || "".equals(val)) { + zoneId = this.timeZoneProvider.getTimeZone(); + thingConfig.put("timezone", zoneId.getId()); + } else { + zoneId = ZoneId.of((String) val); + } + + saveConfiguration(thingConfig); + + // reread config to update timezone field + config = getConfigAs(LinkyConfiguration.class); + Bridge bridge = getBridge(); if (bridge == null) { return; @@ -386,15 +406,15 @@ public class LinkyHandler extends BaseThingHandler { updatekVAChannel(DAILY_GROUP, PEAK_POWER_DAY_MINUS_1, values.baseValue[dSize - 1].value); updateState(DAILY_GROUP, PEAK_POWER_TS_DAY_MINUS_1, - new DateTimeType(values.baseValue[dSize - 1].date.atZone(ZoneId.systemDefault()))); + new DateTimeType(values.baseValue[dSize - 1].date.atZone(zoneId))); updatekVAChannel(DAILY_GROUP, PEAK_POWER_DAY_MINUS_2, values.baseValue[dSize - 2].value); updateState(DAILY_GROUP, PEAK_POWER_TS_DAY_MINUS_2, - new DateTimeType(values.baseValue[dSize - 2].date.atZone(ZoneId.systemDefault()))); + new DateTimeType(values.baseValue[dSize - 2].date.atZone(zoneId))); updatekVAChannel(DAILY_GROUP, PEAK_POWER_DAY_MINUS_3, values.baseValue[dSize - 3].value); updateState(DAILY_GROUP, PEAK_POWER_TS_DAY_MINUS_3, - new DateTimeType(values.baseValue[dSize - 3].date.atZone(ZoneId.systemDefault()))); + new DateTimeType(values.baseValue[dSize - 3].date.atZone(zoneId))); updatePowerTimeSeries(DAILY_GROUP, MAX_POWER_CHANNEL, values.baseValue); updatePowerTimeSeries(WEEKLY_GROUP, MAX_POWER_CHANNEL, values.weekValue); @@ -482,7 +502,7 @@ public class LinkyHandler extends BaseThingHandler { continue; } - Instant timestamp = iv[i].date.toInstant(ZoneOffset.UTC); + Instant timestamp = iv[i].date.atZone(zoneId).toInstant(); if (Double.isNaN(iv[i].value)) { continue; @@ -504,7 +524,7 @@ public class LinkyHandler extends BaseThingHandler { continue; } - Instant timestamp = iv[i].date.toInstant(ZoneOffset.UTC); + Instant timestamp = iv[i].date.atZone(zoneId).toInstant(); if (Double.isNaN(iv[i].value)) { continue; diff --git a/bundles/org.openhab.binding.linky/src/main/resources/OH-INF/thing/thing-types.xml b/bundles/org.openhab.binding.linky/src/main/resources/OH-INF/thing/thing-types.xml index b1534ee5e3b..0df3f46f919 100644 --- a/bundles/org.openhab.binding.linky/src/main/resources/OH-INF/thing/thing-types.xml +++ b/bundles/org.openhab.binding.linky/src/main/resources/OH-INF/thing/thing-types.xml @@ -97,6 +97,13 @@ Your prmId + + + The timezone associated with your Point of delivery. + Will default to openhab default timezone. + You will need to change this if your linky is located in a different timezone that your openhab location. + You can use an offset, or a label like Europe/Paris + Your Enedis token (can be left empty, use the connection page to automatically fill it