review timezone handling

Signed-off-by: Laurent ARNAL <laurent@clae.net>
This commit is contained in:
Laurent ARNAL 2025-01-08 11:36:43 +01:00
parent 1670c52981
commit 7931a14bf2
4 changed files with 42 additions and 11 deletions

View File

@ -13,6 +13,7 @@
package org.openhab.binding.linky.internal; package org.openhab.binding.linky.internal;
import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.config.core.Configuration;
/** /**
* The {@link LinkyConfiguration} is the class used to match the * 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 * @author Laurent Arnal - Rewrite addon to use official dataconect API
*/ */
@NonNullByDefault @NonNullByDefault
public class LinkyConfiguration { public class LinkyConfiguration extends Configuration {
public static final String INTERNAL_AUTH_ID = "internalAuthId"; public static final String INTERNAL_AUTH_ID = "internalAuthId";
public String token = ""; public String token = "";
public String timezone = "";
public String prmId = ""; public String prmId = "";
public String clientId = ""; public String clientId = "";
public String clientSecret = ""; public String clientSecret = "";

View File

@ -29,6 +29,7 @@ import org.openhab.binding.linky.internal.handler.LinkyHandler;
import org.openhab.binding.linky.internal.handler.MyElectricalDataBridgeHandler; import org.openhab.binding.linky.internal.handler.MyElectricalDataBridgeHandler;
import org.openhab.core.auth.client.oauth2.OAuthFactory; import org.openhab.core.auth.client.oauth2.OAuthFactory;
import org.openhab.core.i18n.LocaleProvider; import org.openhab.core.i18n.LocaleProvider;
import org.openhab.core.i18n.TimeZoneProvider;
import org.openhab.core.io.net.http.HttpClientFactory; import org.openhab.core.io.net.http.HttpClientFactory;
import org.openhab.core.thing.Bridge; import org.openhab.core.thing.Bridge;
import org.openhab.core.thing.Thing; import org.openhab.core.thing.Thing;
@ -80,6 +81,7 @@ public class LinkyHandlerFactory extends BaseThingHandlerFactory {
private final HttpService httpService; private final HttpService httpService;
private final ThingRegistry thingRegistry; private final ThingRegistry thingRegistry;
private final ComponentContext componentContext; private final ComponentContext componentContext;
private final TimeZoneProvider timeZoneProvider;
private final Gson gson = new GsonBuilder() private final Gson gson = new GsonBuilder()
.registerTypeAdapter(ZonedDateTime.class, .registerTypeAdapter(ZonedDateTime.class,
@ -106,9 +108,9 @@ public class LinkyHandlerFactory extends BaseThingHandlerFactory {
public LinkyHandlerFactory(final @Reference LocaleProvider localeProvider, public LinkyHandlerFactory(final @Reference LocaleProvider localeProvider,
final @Reference HttpClientFactory httpClientFactory, final @Reference OAuthFactory oAuthFactory, final @Reference HttpClientFactory httpClientFactory, final @Reference OAuthFactory oAuthFactory,
final @Reference HttpService httpService, final @Reference ThingRegistry thingRegistry, final @Reference HttpService httpService, final @Reference ThingRegistry thingRegistry,
ComponentContext componentContext) { ComponentContext componentContext, final @Reference TimeZoneProvider timeZoneProvider) {
this.localeProvider = localeProvider; this.localeProvider = localeProvider;
this.timeZoneProvider = timeZoneProvider;
this.httpClientFactory = httpClientFactory; this.httpClientFactory = httpClientFactory;
this.oAuthFactory = oAuthFactory; this.oAuthFactory = oAuthFactory;
this.httpService = httpService; this.httpService = httpService;
@ -141,7 +143,7 @@ public class LinkyHandlerFactory extends BaseThingHandlerFactory {
this.httpClientFactory, this.oAuthFactory, this.httpService, thingRegistry, componentContext, gson); this.httpClientFactory, this.oAuthFactory, this.httpService, thingRegistry, componentContext, gson);
return handler; return handler;
} else if (THING_TYPE_LINKY.equals(thing.getThingTypeUID())) { } else if (THING_TYPE_LINKY.equals(thing.getThingTypeUID())) {
LinkyHandler handler = new LinkyHandler(thing, localeProvider); LinkyHandler handler = new LinkyHandler(thing, localeProvider, timeZoneProvider);
return handler; return handler;
} }

View File

@ -20,7 +20,6 @@ import java.time.Instant;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.ZoneId; import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.time.temporal.WeekFields; 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.binding.linky.internal.dto.UserInfo;
import org.openhab.core.config.core.Configuration; import org.openhab.core.config.core.Configuration;
import org.openhab.core.i18n.LocaleProvider; 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.DateTimeType;
import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.DecimalType;
import org.openhab.core.library.types.QuantityType; import org.openhab.core.library.types.QuantityType;
@ -84,6 +84,9 @@ import org.threeten.extra.Years;
@NonNullByDefault @NonNullByDefault
public class LinkyHandler extends BaseThingHandler { 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_FIRST_HOUR_OF_DAY = 1;
private static final int REFRESH_INTERVAL_IN_MIN = 120; private static final int REFRESH_INTERVAL_IN_MIN = 120;
@ -109,10 +112,11 @@ public class LinkyHandler extends BaseThingHandler {
ALL ALL
} }
public LinkyHandler(Thing thing, LocaleProvider localeProvider) { public LinkyHandler(Thing thing, LocaleProvider localeProvider, TimeZoneProvider timeZoneProvider) {
super(thing); super(thing);
config = getConfigAs(LinkyConfiguration.class); config = getConfigAs(LinkyConfiguration.class);
this.timeZoneProvider = timeZoneProvider;
this.dailyConsumption = new ExpiringDayCache<>("dailyConsumption", REFRESH_FIRST_HOUR_OF_DAY, () -> { this.dailyConsumption = new ExpiringDayCache<>("dailyConsumption", REFRESH_FIRST_HOUR_OF_DAY, () -> {
LocalDate today = LocalDate.now(); LocalDate today = LocalDate.now();
@ -166,6 +170,22 @@ public class LinkyHandler extends BaseThingHandler {
public synchronized void initialize() { public synchronized void initialize() {
logger.debug("Initializing Linky handler."); 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(); Bridge bridge = getBridge();
if (bridge == null) { if (bridge == null) {
return; return;
@ -386,15 +406,15 @@ public class LinkyHandler extends BaseThingHandler {
updatekVAChannel(DAILY_GROUP, PEAK_POWER_DAY_MINUS_1, values.baseValue[dSize - 1].value); updatekVAChannel(DAILY_GROUP, PEAK_POWER_DAY_MINUS_1, values.baseValue[dSize - 1].value);
updateState(DAILY_GROUP, PEAK_POWER_TS_DAY_MINUS_1, 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); updatekVAChannel(DAILY_GROUP, PEAK_POWER_DAY_MINUS_2, values.baseValue[dSize - 2].value);
updateState(DAILY_GROUP, PEAK_POWER_TS_DAY_MINUS_2, 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); updatekVAChannel(DAILY_GROUP, PEAK_POWER_DAY_MINUS_3, values.baseValue[dSize - 3].value);
updateState(DAILY_GROUP, PEAK_POWER_TS_DAY_MINUS_3, 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(DAILY_GROUP, MAX_POWER_CHANNEL, values.baseValue);
updatePowerTimeSeries(WEEKLY_GROUP, MAX_POWER_CHANNEL, values.weekValue); updatePowerTimeSeries(WEEKLY_GROUP, MAX_POWER_CHANNEL, values.weekValue);
@ -482,7 +502,7 @@ public class LinkyHandler extends BaseThingHandler {
continue; continue;
} }
Instant timestamp = iv[i].date.toInstant(ZoneOffset.UTC); Instant timestamp = iv[i].date.atZone(zoneId).toInstant();
if (Double.isNaN(iv[i].value)) { if (Double.isNaN(iv[i].value)) {
continue; continue;
@ -504,7 +524,7 @@ public class LinkyHandler extends BaseThingHandler {
continue; continue;
} }
Instant timestamp = iv[i].date.toInstant(ZoneOffset.UTC); Instant timestamp = iv[i].date.atZone(zoneId).toInstant();
if (Double.isNaN(iv[i].value)) { if (Double.isNaN(iv[i].value)) {
continue; continue;

View File

@ -96,6 +96,13 @@
<parameter name="prmId" type="text" required="true"> <parameter name="prmId" type="text" required="true">
<label>prmId</label> <label>prmId</label>
<description>Your prmId</description> <description>Your prmId</description>
</parameter>
<parameter name="timezone" type="text" required="false">
<label>timezone</label>
<description>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</description>
</parameter> </parameter>
<parameter name="token" type="text" required="false"> <parameter name="token" type="text" required="false">
<label>Token</label> <label>Token</label>