Problems with deltaSince in rule


( ) #1

Hi everybody,

I use openHABianPi with opeHAB 2.1.0 stable and I´d like to display the energy costs in the different time-periods (hourly, daily, weekly, monthly). I created some items and this rule to display the historic states:

energy.rules

rule "Kosten der letzten Stunde anzeigen"
when
  Item ArbZ_Strom_TV_Verbrauch changed
then
  var kostenH = ArbZ_Strom_TV_Summe.deltaSince(now.minusMinutes(60))
  postUpdate(ArbZ_Strom_TV_SummeH, kostenH)
  logInfo("xy.rules", "Stromkosten / Stunde (ArbZ TV): " + kostenH.toString.format("%.2f €"))
end

rule "Kosten des letzten Tages anzeigen"
when
  Item ArbZ_Strom_TV_Verbrauch changed
then
  var kostenD = ArbZ_Strom_TV_Summe.deltaSince(now.minusHours(24))
  postUpdate(ArbZ_Strom_TV_SummeD, kostenD)
  logInfo("xy.rules", "Stromkosten / Tag (ArbZ TV): " + kostenD)
end

but something seems to be faulty in the second rule (“Kosten des letzten Tages anzeigen”)…

*.log

2017-07-15 17:33:49.857 [ERROR] [.script.engine.ScriptExecutionThread] - Rule 'Kosten des letzten Tages anzeigen': The argument 'state' must not be null or empty.
2017-07-15 17:33:49.935 [INFO ] [smarthome.model.script.cloudia.rules] - Stromkosten / Stunde (ArbZ TV): 0.097029999999997573462314903736114501953125

Maybe someone of you could help!?

Thanks in advance!


(Angelos) #2

move the logInfo above the postUpdate and check if the kostenD variable is not coming up as null (or empty)

rule "Kosten des letzten Tages anzeigen"
when
  Item ArbZ_Strom_TV_Verbrauch changed
then
  var kostenD = ArbZ_Strom_TV_Summe.deltaSince(now.minusHours(24))
  logInfo("xy.rules", "Stromkosten / Tag (ArbZ TV): " + kostenD)
  ArbZ_Strom_TV_SummeD.postUpdate(kostenD)
end

( ) #3

Thanks for your quick answer! You´re right - variable is coming up as null. But don´t realy understand, why…

2017-07-15 17:46:53.796 [ERROR] [.script.engine.ScriptExecutionThread] - Rule 'Kosten des letzten Tages anzeigen': cannot invoke method public java.lang.String org.eclipse.smarthome.core.library.types.DecimalType.toString() on null
2017-07-15 17:46:53.802 [INFO ] [smarthome.model.script.cloudia.rules] - Stromkosten / Stunde (ArbZ TV): 0.0689129410999934315783320926129817962646484375

(Angelos) #4

which persistence service are you using to store historical data for this item (ArbZ_Strom_TV_Summe) ?


( ) #5

I use rrd4j with this configuration:

Strategies {
    everyMinute:"0 * * * * ?"
    everyHour : "0 0 * * * ?"
    everyDay  : "0 0 0 * * ?"

    default = everyChange
}


Items {
    * : strategy = everyMinute, restoreOnStartup
}

(Angelos) #6

strange…
obviously there are data for 1 hour back (since you get a delta result from the first rule)
maybe? there are no data available for 1 day back?
have you persisted long enough (more than 1 day) the state of this item?

try also: now.minusDays(1) … but I don’t think that this will make any difference :stuck_out_tongue:


( ) #7

Yeah, strange… :smiley:

There is data stored for the last 6 days.
Tried now.minusDays(1), but get the same error as above. Hmm.


(Angelos) #8

try the REST API to check item’s persistence data:

http://<OH2_IP>:8080/rest/persistence/items/ArbZ_Strom_TV_Summe

or

http://<OH2_IP>:8080/rest/persistence/items/ArbZ_Strom_TV_Summe?serviceId=rrd4j

by default, it will use: start time = 1 day before endtime. endtime = current time

you can change this in

http://<OH2_IP>:8080/doc/index.html#!/persistence/httpGetPersistenceItemData

( ) #9

Ah okay. There are 148 datapoints stored in that persistence, but can´t read that time format.

{"name":"ArbZ_Strom_TV_Summe","datapoints":"148","data":[{"time":1500096960000,"state":"81.3410156830444321940376539714634418487548828125"}, ... ,"state":"81.98284790234998808955424465239048004150390625"}]}

The second path you posted didn´t work for me.

I´m used to work with openhab 1.x and it´s kind of confusing working with the textual configuration of OH2. :slight_smile:


(Angelos) #10

ah! maybe you haven’t installed the REST Documentation (Misc Addon)

yeah… I don’t know how I can help here :slight_smile: That timestamp is strange also for me.


(Christoph Wempe) #11

It is like the standard linux epoch time, but in milliseconds rather than seconds.

https://www.epochconverter.com/


( ) #12

Ok, installed the binding and tried to understand, how I can change any values through restdocs…

http://<OH2_IP>:8080/doc/index.html#!/persistence/httpGetPersistenceItemData

But only get it managed to set a startTime string, which outputs some more time values.

After checking these with the epochconverter (thx @christoph_wempe) it truly seems that there are only historical values from today in my persistence.

In my charts all historical data (including the graphs for day and week) looks correct.


(Angelos) #13
offtopic

If you want a really robust time-series DB, I recommend Influx and use this as your secondary persistence service. You can then use Grafana for advanced graphs.
More here: InfluxDB+Grafana persistence and graphing


( ) #14

Yeah, sounds like a great idea… :slight_smile: Thx for your help