Skip to content

Commit 554dd94

Browse files
committed
test restore item state on timeseries update
Signed-off-by: Mark Herwege <mark.herwege@telenet.be>
1 parent 3314d0a commit 554dd94

2 files changed

Lines changed: 18 additions & 4 deletions

File tree

bundles/org.openhab.core.persistence/src/main/java/org/openhab/core/persistence/internal/PersistenceManagerImpl.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -397,9 +397,9 @@ public void timeSeriesUpdated(Item item, TimeSeries timeSeries) {
397397
.sorted((e1, e2) -> e2.timestamp().compareTo(e1.timestamp())).findFirst()
398398
.ifPresent(s -> {
399399
ZonedDateTime lastStateUpdate = item.getLastStateUpdate();
400-
if (lastStateUpdate == null || s.timestamp().atZone(ZoneId.systemDefault())
401-
.isAfter(lastStateUpdate)) {
402-
container.restoreItemState(item, ZonedDateTime.now(), s.state());
400+
ZonedDateTime timestamp = s.timestamp().atZone(ZoneId.systemDefault());
401+
if (lastStateUpdate == null || timestamp.isAfter(lastStateUpdate)) {
402+
container.restoreItemState(item, timestamp, s.state());
403403
}
404404
});
405405
}));
@@ -682,7 +682,7 @@ private void restoreItemState(Item item, ZonedDateTime timestamp, State state) {
682682

683683
@Override
684684
public ZonedDateTime getTimestamp() {
685-
return ZonedDateTime.now();
685+
return timestamp;
686686
}
687687

688688
@Override

bundles/org.openhab.core.persistence/src/test/java/org/openhab/core/persistence/internal/PersistenceManagerTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
import org.openhab.core.service.ReadyService;
7979
import org.openhab.core.types.State;
8080
import org.openhab.core.types.TimeSeries;
81+
import org.openhab.core.types.TimeSeries.Entry;
8182
import org.openhab.core.types.UnDefType;
8283

8384
/**
@@ -414,6 +415,7 @@ public void storeTimeSeriesAndForecastsScheduled() {
414415
addConfiguration(TestModifiablePersistenceService.ID, List.of(new PersistenceAllConfig()),
415416
PersistenceStrategy.Globals.FORECAST, null);
416417

418+
ZonedDateTime time0 = ZonedDateTime.now().minusSeconds(5000);
417419
Instant time1 = Instant.now().minusSeconds(1000);
418420
Instant time2 = Instant.now().plusSeconds(1000);
419421
Instant time3 = Instant.now().plusSeconds(2000);
@@ -425,6 +427,7 @@ public void storeTimeSeriesAndForecastsScheduled() {
425427
timeSeries.add(time2, new StringType("two"));
426428
timeSeries.add(time3, new StringType("three"));
427429
timeSeries.add(time4, new StringType("four"));
430+
TEST_ITEM.setState(new StringType("zero"), null, time0, null, null);
428431

429432
manager.timeSeriesUpdated(TEST_ITEM, timeSeries);
430433
InOrder inOrder = inOrder(service, schedulerMock);
@@ -437,6 +440,17 @@ public void storeTimeSeriesAndForecastsScheduled() {
437440
inOrder.verify(schedulerMock).at(any(SchedulerRunnable.class), eq(time2));
438441
inOrder.verifyNoMoreInteractions();
439442

443+
// check if timeseries element in the past updated item state
444+
Entry firstEntry = timeSeries.getStates().findFirst().get();
445+
assertThat(TEST_ITEM.getState(), is(firstEntry.state()));
446+
assertThat(TEST_ITEM.getLastState(), is(new StringType("zero")));
447+
ZonedDateTime lastStateUpdate = TEST_ITEM.getLastStateUpdate();
448+
assertNotNull(lastStateUpdate);
449+
assertThat(lastStateUpdate.toInstant(), is(firstEntry.timestamp()));
450+
ZonedDateTime lastStateChange = TEST_ITEM.getLastStateChange();
451+
assertNotNull(lastStateChange);
452+
assertThat(lastStateChange.toInstant(), is(firstEntry.timestamp()));
453+
440454
// replace elements
441455
TimeSeries timeSeries2 = new TimeSeries(TimeSeries.Policy.REPLACE);
442456
timeSeries2.add(time3, new StringType("three2"));

0 commit comments

Comments
 (0)