diff --git a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/SecurityApi.java b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/SecurityApi.java index 7b0e49b9b..3e839b120 100644 --- a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/SecurityApi.java +++ b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/SecurityApi.java @@ -15,7 +15,10 @@ package org.openhab.binding.netatmo.internal.api; import static org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.*; import java.net.URI; -import java.util.Collection; +import java.time.ZonedDateTime; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; import javax.ws.rs.core.UriBuilder; @@ -66,7 +69,7 @@ public class SecurityApi extends RestManager { return true; } - private Collection getEvents(@Nullable Object... params) throws NetatmoException { + private List getEvents(@Nullable Object... params) throws NetatmoException { UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_GET_EVENTS, params); BodyResponse body = get(uriBuilder, NAEventsDataResponse.class).getBody(); if (body != null) { @@ -78,16 +81,27 @@ public class SecurityApi extends RestManager { throw new NetatmoException("home should not be null"); } - public Collection getHomeEvents(String homeId) throws NetatmoException { - return getEvents(PARAM_HOME_ID, homeId); + public List getHomeEvents(String homeId, @Nullable ZonedDateTime freshestEventTime) + throws NetatmoException { + List events = getEvents(PARAM_HOME_ID, homeId); + + // we have to rewind to the latest event just after oldestKnown + HomeEvent oldestRetrieved = events.get(events.size() - 1); + while (freshestEventTime != null && oldestRetrieved.getTime().isAfter(freshestEventTime)) { + events.addAll(getEvents(PARAM_HOME_ID, homeId, PARAM_EVENT_ID, oldestRetrieved.getId())); + oldestRetrieved = events.get(events.size() - 1); + } + + // Remove unneeded events being before oldestKnown + return events.stream().filter(event -> freshestEventTime == null || event.getTime().isAfter(freshestEventTime)) + .sorted(Comparator.comparing(HomeEvent::getTime).reversed()).collect(Collectors.toList()); } - public Collection getPersonEvents(String homeId, String personId) throws NetatmoException { + public List getPersonEvents(String homeId, String personId) throws NetatmoException { return getEvents(PARAM_HOME_ID, homeId, PARAM_PERSON_ID, personId, PARAM_OFFSET, 1); } - public Collection getDeviceEvents(String homeId, String deviceId, String deviceType) - throws NetatmoException { + public List getDeviceEvents(String homeId, String deviceId, String deviceType) throws NetatmoException { return getEvents(PARAM_HOME_ID, homeId, PARAM_DEVICE_ID, deviceId, PARAM_DEVICES_TYPE, deviceType); } diff --git a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/data/NetatmoConstants.java b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/data/NetatmoConstants.java index f864790c4..6d1036696 100644 --- a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/data/NetatmoConstants.java +++ b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/data/NetatmoConstants.java @@ -147,6 +147,7 @@ public class NetatmoConstants { public static final String PARAM_HOME_ID = "home_id"; public static final String PARAM_ROOM_ID = "room_id"; public static final String PARAM_PERSON_ID = "person_id"; + public static final String PARAM_EVENT_ID = "event_id"; public static final String PARAM_SCHEDULE_ID = "schedule_id"; public static final String PARAM_OFFSET = "offset"; public static final String PARAM_GATEWAY_TYPE = "gateway_types"; diff --git a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/capability/SecurityCapability.java b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/capability/SecurityCapability.java index 380eaa2d1..d7c3a2469 100644 --- a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/capability/SecurityCapability.java +++ b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/capability/SecurityCapability.java @@ -12,6 +12,7 @@ */ package org.openhab.binding.netatmo.internal.handler.capability; +import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -47,11 +48,18 @@ class SecurityCapability extends RestCapability { private final Logger logger = LoggerFactory.getLogger(SecurityCapability.class); private static final Map eventBuffer = new HashMap<>(); + private @Nullable ZonedDateTime freshestEventTime; SecurityCapability(CommonInterface handler) { super(handler, SecurityApi.class); } + @Override + public void initialize() { + super.initialize(); + freshestEventTime = null; + } + @Override protected void updateHomeData(HomeData homeData) { NAObjectMap persons = homeData.getPersons(); @@ -120,8 +128,7 @@ class SecurityCapability extends RestCapability { protected List updateReadings(SecurityApi api) { List result = new ArrayList<>(); try { - Collection lastEvents = api.getHomeEvents(handler.getId()); - lastEvents.stream().forEach(event -> { + for (HomeEvent event : api.getHomeEvents(handler.getId(), freshestEventTime)) { HomeEvent previousEvent = eventBuffer.get(event.getCameraId()); if (previousEvent == null || previousEvent.getTime().isBefore(event.getTime())) { eventBuffer.put(event.getCameraId(), event); @@ -133,7 +140,10 @@ class SecurityCapability extends RestCapability { eventBuffer.put(personId, event); } } - }); + if (freshestEventTime == null || event.getTime().isAfter(freshestEventTime)) { + freshestEventTime = event.getTime(); + } + } } catch (NetatmoException e) { logger.warn("Error retrieving last events for home '{}' : {}", handler.getId(), e.getMessage()); }