public static final String ECOBEE_AUTHORIZE_URL = ECOBEE_BASE_URL + "authorize";
public static final String ECOBEE_TOKEN_URL = ECOBEE_BASE_URL + "token";
public static final String ECOBEE_SCOPE = "smartWrite";
+ public static final String ECOBEE_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
}
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
+import java.time.LocalDateTime;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import org.openhab.binding.ecobee.internal.dto.AbstractResponseDTO;
import org.openhab.binding.ecobee.internal.dto.SelectionDTO;
import org.openhab.binding.ecobee.internal.dto.SelectionType;
+import org.openhab.binding.ecobee.internal.dto.thermostat.InstantDeserializer;
+import org.openhab.binding.ecobee.internal.dto.thermostat.LocalDateTimeDeserializer;
import org.openhab.binding.ecobee.internal.dto.thermostat.ThermostatDTO;
import org.openhab.binding.ecobee.internal.dto.thermostat.ThermostatRequestDTO;
import org.openhab.binding.ecobee.internal.dto.thermostat.ThermostatResponseDTO;
@NonNullByDefault
public class EcobeeApi implements AccessTokenRefreshListener {
- private static final Gson GSON = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss")
+ private static final Gson GSON = new GsonBuilder().registerTypeAdapter(Instant.class, new InstantDeserializer())
+ .registerTypeAdapter(LocalDateTime.class, new LocalDateTimeDeserializer())
.registerTypeAdapter(RevisionDTO.class, new RevisionDTODeserializer())
.registerTypeAdapter(RunningDTO.class, new RunningDTODeserializer()).create();
--- /dev/null
+/**
+ * Copyright (c) 2010-2023 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.ecobee.internal.dto.thermostat;
+
+import static org.openhab.binding.ecobee.internal.EcobeeBindingConstants.ECOBEE_DATETIME_FORMAT;
+
+import java.lang.reflect.Type;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParseException;
+
+/**
+ * The {@link InstantDeserializer} is responsible for handling the UTC dates returned from
+ * the Ecobee API service.
+ *
+ * @author Mark Hilbush - Initial contribution
+ */
+@NonNullByDefault
+public class InstantDeserializer implements JsonDeserializer<Instant> {
+
+ @Override
+ public @Nullable Instant deserialize(JsonElement element, Type arg1, JsonDeserializationContext arg2)
+ throws JsonParseException {
+ try {
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(ECOBEE_DATETIME_FORMAT);
+ LocalDateTime localDateTime = formatter.parse(element.getAsString(), LocalDateTime::from);
+ return localDateTime.toInstant(ZoneOffset.UTC);
+ } catch (DateTimeParseException e) {
+ return null;
+ }
+ }
+}
--- /dev/null
+/**
+ * Copyright (c) 2010-2023 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.ecobee.internal.dto.thermostat;
+
+import static org.openhab.binding.ecobee.internal.EcobeeBindingConstants.ECOBEE_DATETIME_FORMAT;
+
+import java.lang.reflect.Type;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParseException;
+
+/**
+ * The {@link LocalDateTimeDeserializer} is responsible for handling the local dates returned from
+ * the Ecobee API service.
+ *
+ * @author Mark Hilbush - Initial contribution
+ */
+@NonNullByDefault
+public class LocalDateTimeDeserializer implements JsonDeserializer<LocalDateTime> {
+
+ @Override
+ public @Nullable LocalDateTime deserialize(JsonElement element, Type arg1, JsonDeserializationContext arg2)
+ throws JsonParseException {
+ try {
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(ECOBEE_DATETIME_FORMAT);
+ return formatter.parse(element.getAsString(), LocalDateTime::from);
+ } catch (DateTimeParseException e) {
+ return null;
+ }
+ }
+}
*/
package org.openhab.binding.ecobee.internal.dto.thermostat;
-import java.util.Date;
+import java.time.Instant;
import java.util.List;
/**
* The UTC date/time stamp of when the thermostat first connected
* to the ecobee server.
*/
- public Date firstConnected;
+ public Instant firstConnected;
/*
* The last recorded connection date and time.
*/
- public Date connectDateTime;
+ public Instant connectDateTime;
/*
* The last recorded disconnection date and time.
*/
- public Date disconnectDateTime;
+ public Instant disconnectDateTime;
/*
* The UTC date/time stamp of when the thermostat was updated.
* Format: YYYY-MM-DD HH:MM:SS
*/
- public Date lastModified;
+ public Instant lastModified;
/*
* The UTC date/time stamp of when the thermostat last posted its
* runtime information. Format: YYYY-MM-DD HH:MM:SS
*/
- public Date lastStatusModified;
+ public Instant lastStatusModified;
/*
* The UTC date of the last runtime reading. Format: YYYY-MM-DD
*/
package org.openhab.binding.ecobee.internal.dto.thermostat;
-import java.util.Date;
+import java.time.Instant;
+import java.time.LocalDateTime;
import java.util.List;
/**
/*
* The last modified date time for the thermostat configuration.
*/
- public Date lastModified;
+ public Instant lastModified;
/*
* The current time in the thermostat's time zone.
*/
- public Date thermostatTime;
+ public LocalDateTime thermostatTime;
/*
* The current time in UTC.
*/
package org.openhab.binding.ecobee.internal.dto.thermostat;
-import java.util.Date;
+import java.time.Instant;
import java.util.List;
/**
/*
* The time stamp in UTC of the weather forecast
*/
- public Date timestamp;
+ public Instant timestamp;
/*
* The weather station identifier
*/
package org.openhab.binding.ecobee.internal.dto.thermostat;
-import java.util.Date;
+import java.time.LocalDateTime;
/**
* The {@link WeatherForecastDTO} contains the weather forecast information for
public Integer weatherSymbol;
/*
- * The time stamp of the weather forecast.
+ * The time stamp of the weather forecast in the thermostat's time zone.
*/
- public Date dateTime;
+ public LocalDateTime dateTime;
/*
* A text value representing the current weather condition.
return;
}
final String weatherGrp = CHGRP_WEATHER + "#";
+
updateChannel(weatherGrp + CH_WEATHER_TIMESTAMP, EcobeeUtils.undefOrDate(weather.timestamp, timeZoneProvider));
updateChannel(weatherGrp + CH_WEATHER_WEATHER_STATION, EcobeeUtils.undefOrString(weather.weatherStation));
*/
package org.openhab.binding.ecobee.internal.handler;
+import java.time.Instant;
+import java.time.LocalDateTime;
import java.time.ZonedDateTime;
-import java.util.Date;
import javax.measure.Unit;
import javax.measure.quantity.Temperature;
return value == null ? UnDefType.UNDEF : new PointType(value);
}
- public static State undefOrDate(@Nullable Date date, TimeZoneProvider timeZoneProvider) {
- return date == null ? UnDefType.UNDEF
- : new DateTimeType(ZonedDateTime.ofInstant(date.toInstant(), timeZoneProvider.getTimeZone()));
+ public static State undefOrDate(@Nullable Instant instant, TimeZoneProvider timeZoneProvider) {
+ return instant == null ? UnDefType.UNDEF
+ : new DateTimeType(ZonedDateTime.ofInstant(instant, timeZoneProvider.getTimeZone()));
+ }
+
+ public static State undefOrDate(@Nullable LocalDateTime ldt, TimeZoneProvider timeZoneProvider) {
+ return ldt == null ? UnDefType.UNDEF : new DateTimeType(ldt.atZone(timeZoneProvider.getTimeZone()));
}
private static boolean isUnknown(Number value) {