Quering historic item information from persistence service

Hi community

I have a Blink camera that is observing my home during night. I would like to be notified when the Camera detects an presence/movement.

As the triggering channel of the camera thing did not work for me, I set up an Alexa rule, that can handle the motion trigger and forwards the trigger to OH to this item:

Switch Blink_Camera_Movement “Camera Movement” {alexa=“PowerController.powerState”}

The item get an ON state once a movement is detected. I set it back to OFF after a second via a rule. Until here everything runs fine and as expected.

Unfortunately Blink is not capable to detect animal motion so that I always get notified by our neightbours cat :face_with_diagonal_mouth:.

My idea is to facilite persistence logic inside my rule to detect if 2 motion triggers are sent within the last minute.
Therefore I tried to use

Blink_Camera_Movement.countStateChangesBetween(now.minusMinutes(1), now)

in my rule but the result is always 0.
The next test was to print the

logInfo(“Camera”, Blink_Camera_Movement.getAllStatesBetween(now.minusMinutes(1), now).toString)

For that I triggered the camera twice. Both changes (and the setting back) works fine, but these changes are not reflected in the state’s history:

2024-07-21 20:32:51.607 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Blink_Camera_Movement' received command ON
2024-07-21 20:32:51.609 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Blink_Camera_Movement' changed from OFF to ON
2024-07-21 20:32:51.614 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Blink_Camera_Movement' changed from ON to OFF
2024-07-21 20:33:29.810 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Blink_Camera_Movement' received command ON
2024-07-21 20:33:29.814 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Blink_Camera_Movement' changed from OFF to ON
2024-07-21 20:33:29.819 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Blink_Camera_Movement' changed from ON to OFF
2024-07-21 20:33:54.502 [INFO ] [org.openhab.core.model.script.test  ] - [
	7/21/24, 8:32 PM: Blink_Camera_Movement-> OFF, 
	7/21/24, 8:32 PM: Blink_Camera_Movement-> OFF, 
	7/21/24, 8:32 PM: Blink_Camera_Movement-> OFF, 
	7/21/24, 8:32 PM: Blink_Camera_Movement-> OFF, 
	7/21/24, 8:32 PM: Blink_Camera_Movement-> OFF, 
	7/21/24, 8:33 PM: Blink_Camera_Movement-> OFF, 
	7/21/24, 8:33 PM: Blink_Camera_Movement-> OFF, 
	7/21/24, 8:33 PM: Blink_Camera_Movement-> OFF, 
	7/21/24, 8:33 PM: Blink_Camera_Movement-> OFF, 
	7/21/24, 8:33 PM: Blink_Camera_Movement-> OFF, 
	7/21/24, 8:33 PM: Blink_Camera_Movement-> OFF
	]

I tested this with default persistence setting as well as explicitly using “rrd4j”, but that brought the same result. Also changing the item type to ‘Dimmer’ to handle a number (0/100) instead on ON/OFF didn’t work.

Any ideas of what I’m doing wrong?

Thanks four you help!

  • Platform information:
    • Hardware: Raspberry Pi 4 Model B Rev 1.1, 4GB
    • OS: Debian GNU/Linux 11 (bullseye)
    • Java Runtime Environment: openjdk version “17.0.11” 2024-04-16
    • openHAB version: 4.2.0 (as docker)

If you are triggering the rule it’s likely that the current change to the Item has not yet been saved to persistence while the rule runs meaning that depending on timing, when your rule runs it won’t see that latest state change in persistence yet.

So assuming that there were no other ON states over the past minute except for the one shown in the logs, I’m not surprised it doesn’t show up in the query yet.

Make sure the ON change happens more than once over that minute and try again. Maybe widen your range to five minutes just for testing.

I would probably implement this using a Timer.

  • if no timer exists, create one for one minute
  • if the timer exists you know that movement has been seen at least twice in the past minute.

In my test I queried the getAllStatesBetween in a separate, manually executed script. So there is enough time for the persistence service to save the history. I also tried getting changes for the last 100 minutes with the same result: only logging the OFFs and not any ONs.

I am also wondering about the amount of OFFs. In the persistence setting I set the strategy to every change, not every update (even there shouldn’t be any updates without changes at all).

When analyzing this I found that every minute there is a repetitive linear decrease from 12 history items to 0 history items (every 5 seconds).

Script:

logInfo(“Camera”, "getAllStatesBetween: " + Blink_Camera_Movement.getAllStatesBetween(now.minusMinutes(1), now).toString)
logInfo(“Camera”, "countBetween: " + Blink_Camera_Movement.countBetween(now.minusMinutes(1), now).toString)

Log:

2024-07-22 08:16:01.377 [INFO ] [org.openhab.core.model.script.test  ] - getAllStatesBetween: []
2024-07-22 08:16:02.619 [INFO ] [org.openhab.core.model.script.test  ] - getAllStatesBetween: [
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF]
2024-07-22 08:16:03.189 [INFO ] [org.openhab.core.model.script.test  ] - countBetween: 12
2024-07-22 08:16:06.150 [INFO ] [org.openhab.core.model.script.test  ] - getAllStatesBetween: [
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF]
2024-07-22 08:16:06.153 [INFO ] [org.openhab.core.model.script.test  ] - countBetween: 11
2024-07-22 08:16:11.046 [INFO ] [org.openhab.core.model.script.test  ] - getAllStatesBetween: [
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF]
2024-07-22 08:16:11.052 [INFO ] [org.openhab.core.model.script.test  ] - countBetween: 10
2024-07-22 08:16:16.098 [INFO ] [org.openhab.core.model.script.test  ] - getAllStatesBetween: [
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF]
2024-07-22 08:16:16.101 [INFO ] [org.openhab.core.model.script.test  ] - countBetween: 9
2024-07-22 08:16:21.338 [INFO ] [org.openhab.core.model.script.test  ] - getAllStatesBetween: [
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF]
2024-07-22 08:16:21.343 [INFO ] [org.openhab.core.model.script.test  ] - countBetween: 8
2024-07-22 08:16:26.390 [INFO ] [org.openhab.core.model.script.test  ] - getAllStatesBetween: [
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF]
2024-07-22 08:16:26.393 [INFO ] [org.openhab.core.model.script.test  ] - countBetween: 7
2024-07-22 08:16:31.349 [INFO ] [org.openhab.core.model.script.test  ] - getAllStatesBetween: [
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF]
2024-07-22 08:16:31.351 [INFO ] [org.openhab.core.model.script.test  ] - countBetween: 6
2024-07-22 08:16:36.478 [INFO ] [org.openhab.core.model.script.test  ] - getAllStatesBetween: [
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF]
2024-07-22 08:16:36.483 [INFO ] [org.openhab.core.model.script.test  ] - countBetween: 5
2024-07-22 08:16:41.361 [INFO ] [org.openhab.core.model.script.test  ] - getAllStatesBetween: [
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF]
2024-07-22 08:16:41.364 [INFO ] [org.openhab.core.model.script.test  ] - countBetween: 4
2024-07-22 08:16:46.467 [INFO ] [org.openhab.core.model.script.test  ] - getAllStatesBetween: [
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF]
2024-07-22 08:16:46.472 [INFO ] [org.openhab.core.model.script.test  ] - countBetween: 3
2024-07-22 08:16:51.181 [INFO ] [org.openhab.core.model.script.test  ] - getAllStatesBetween: [
	7/22/24, 8:15 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF]
2024-07-22 08:16:51.184 [INFO ] [org.openhab.core.model.script.test  ] - countBetween: 2
2024-07-22 08:16:56.436 [INFO ] [org.openhab.core.model.script.test  ] - getAllStatesBetween: [
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF]
2024-07-22 08:16:56.444 [INFO ] [org.openhab.core.model.script.test  ] - countBetween: 1
2024-07-22 08:17:01.194 [INFO ] [org.openhab.core.model.script.test  ] - getAllStatesBetween: []
2024-07-22 08:17:01.198 [INFO ] [org.openhab.core.model.script.test  ] - countBetween: 0
2024-07-22 08:17:03.388 [INFO ] [org.openhab.core.model.script.test  ] - getAllStatesBetween: [
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:16 AM: Blink_Camera_Movement -> OFF, 
	7/22/24, 8:17 AM: Blink_Camera_Movement -> OFF]
2024-07-22 08:17:03.405 [INFO ] [org.openhab.core.model.script.test  ] - countBetween: 12

Things are getting stranger :thinking:

Not really, if you are using rrd4j, that’s just how rrd4j works. It’s how it manages to store data essentially forever without the storage space growing. It works in stages.

rrd4j has the concept of buckets. For the first hour (I’m going from memory so treat these durations as illustrative and not necessarily the times rrd4j acutally uses in practice) rrd4j has one bucket per minute. It will save a value up to every five seconds in each of those buckets.

Once the data gets older than an hour, it compresses those buckets into one value (the average of all the values in the bucket) and those get put into another bucket, lets say a five minute bucket. After a week, those five minute buckets are compressed and the results put into one hour buckets. And so on and so on until data that is over a year old might have only one value per day stored.

So in rrd4j, it doesn’t matter how often the Item updates, it needs to save a value periodically or else the whole compression scheme breaks down and rrd4j stops working. This is why one must have an everyMinute strategy with rrd4j configs.

But this also means that when you query rrd4j, you will be getting values that do not represent an update nor a change and which were put in there simply because rrd4j requires them.

That’s it! If I add a 6 sec wait before setting the state back, rrd4j does recognize the change :slight_smile:

When using influxdb it does also work without the wait command which feels better anyway.
The only thing is that getAllStatesBetween seems not to be supported properly (or might be buggy) with influxdb as this brings a

2024-07-22 17:13:01.506 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'f3dcf456e8' failed: Cannot format given Object as a Date

Thanks @rlkoshak for your help!

That looks like an issue you should file on the InfluxDB binding in the openhab-addons repo.