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;
return true;
}
- private Collection<HomeEvent> getEvents(@Nullable Object... params) throws NetatmoException {
+ private List<HomeEvent> getEvents(@Nullable Object... params) throws NetatmoException {
UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_GET_EVENTS, params);
BodyResponse<Home> body = get(uriBuilder, NAEventsDataResponse.class).getBody();
if (body != null) {
throw new NetatmoException("home should not be null");
}
- public Collection<HomeEvent> getHomeEvents(String homeId) throws NetatmoException {
- return getEvents(PARAM_HOME_ID, homeId);
+ public List<HomeEvent> getHomeEvents(String homeId, @Nullable ZonedDateTime freshestEventTime)
+ throws NetatmoException {
+ List<HomeEvent> 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<HomeEvent> getPersonEvents(String homeId, String personId) throws NetatmoException {
+ public List<HomeEvent> getPersonEvents(String homeId, String personId) throws NetatmoException {
return getEvents(PARAM_HOME_ID, homeId, PARAM_PERSON_ID, personId, PARAM_OFFSET, 1);
}
- public Collection<HomeEvent> getDeviceEvents(String homeId, String deviceId, String deviceType)
- throws NetatmoException {
+ public List<HomeEvent> getDeviceEvents(String homeId, String deviceId, String deviceType) throws NetatmoException {
return getEvents(PARAM_HOME_ID, homeId, PARAM_DEVICE_ID, deviceId, PARAM_DEVICES_TYPE, deviceType);
}
*/
package org.openhab.binding.netatmo.internal.handler.capability;
+import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
private final Logger logger = LoggerFactory.getLogger(SecurityCapability.class);
private static final Map<String, HomeEvent> 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<HomeDataPerson> persons = homeData.getPersons();
protected List<NAObject> updateReadings(SecurityApi api) {
List<NAObject> result = new ArrayList<>();
try {
- Collection<HomeEvent> 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);
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());
}