Sure.
All updates of the base items happen in rules. Here is such (Jython) a rule:
@rule("PV uitlezen")
@when("Time cron 0 0/5 5-23 * * ?")
def pvUitlezen(event):
log.info("PV uitlezen")
# Connect to inverter using SBFspot
# Read last retrieved data from SQlite DB
# Allow 120s for operation to complete
pvdata = executeCommandLine("/home/openhabian/smadata/scripts/loadSolarDataOH.sh", 120000)
log.debug("pvdata: {}".format(pvdata))
pvbuffer = pvdata.split("|")
pvLastUpdateGS2 = pvbuffer[0].replace(" ","T")
pvPac1GS2 = pvbuffer[1]
pvIac1GS2 = pvbuffer[2]
pvUac1GS2 = pvbuffer[3]
pvFreqGS2 = pvbuffer[4]
pvPdc1GS2 = pvbuffer[5]
pvIdc1GS2 = pvbuffer[6]
pvUdc1GS2 = pvbuffer[7]
pvPdc2GS2 = pvbuffer[8]
pvIdc2GS2 = pvbuffer[9]
pvUdc2GS2 = pvbuffer[10]
pvConditiesGS2 = pvbuffer[11]
pvGridrelayGS2 = pvbuffer[12]
pvTempGS2 = pvbuffer[13]
pvEDayGS2 = pvbuffer[14]
pvETotGS2 = pvbuffer[15]
events.postUpdate("PVLastUpdateGS2", pvLastUpdateGS2)
pveTodayGS2 = float(pvEDayGS2)/1000
events.postUpdate("PVEtodayGS2", str(pveTodayGS2))
events.postUpdate("PVEtodayGS1", str(pveTodayGS2 * ratio))
pvPowerGS2 = float(pvPac1GS2)
events.postUpdate("PVPowerGS2", str(pvPowerGS2))
events.postUpdate("PVPowerGS1", str(pvPowerGS2 * ratio))
prevTotalGS1 = items["PVEtotalGS1"].floatValue()
prevMeter1 = items["PVEmeter1"].floatValue()
prevMeter2 = items["PVEmeter2"].floatValue()
# Take 1 minute later than real update time to make sure the right values are captured from the persistence service
totalGS1Update = DateTime(PersistenceExtensions.lastUpdate(ir.getItem("PVEtotalGS1"), "influxdb")).plusMinutes(1)
meter1Update = DateTime(PersistenceExtensions.lastUpdate(ir.getItem("PVEmeter1"), "influxdb")).plusMinutes(1)
meter2Update = DateTime(PersistenceExtensions.lastUpdate(ir.getItem("PVEmeter2"), "influxdb")).plusMinutes(1)
histTotalGS2GS = PersistenceExtensions.historicState(ir.getItem("PVEtotalGS2"), totalGS1Update, "influxdb").state.floatValue()
histTotalGS1M = PersistenceExtensions.historicState(ir.getItem("PVEtotalGS1"), meter1Update, "influxdb").state.floatValue()
histTotalGS2M = PersistenceExtensions.historicState(ir.getItem("PVEtotalGS2"), meter2Update, "influxdb").state.floatValue()
totalGS2 = float(pvETotGS2)/1000
totalGS1 = prevTotalGS1 + (totalGS2 - histTotalGS2GS)*ratio
meter1 = prevMeter1 + (totalGS1 - histTotalGS1M)
meter2 = prevMeter2 + (totalGS2 - histTotalGS2M)
events.postUpdate("PVEtotalGS1", str(totalGS1))
events.postUpdate("PVEtotalGS2", str(totalGS2))
events.postUpdate("PVEmeter1", str(meter1))
events.postUpdate("PVEmeter2", str(meter2))
I sum most of the values (1 & 2) using a sum group. I defined these in PaperUI. As an example, you can see the definition of PVPower, PVPowerGS1 and PVPowerGS2 from the REST API.
PVPower:
{
"members": [
{
"link": "http://openhabianpi:8080/rest/items/PVPowerGS2",
"state": "0.0",
"type": "Number",
"name": "PVPowerGS2",
"label": "PV Power GS2",
"tags": [],
"groupNames": [
"gEMeting",
"PVPower"
]
},
{
"link": "http://openhabianpi:8080/rest/items/PVPowerGS1",
"state": "0.0",
"type": "Number",
"name": "PVPowerGS1",
"label": "PV Power GS1",
"tags": [],
"groupNames": [
"gEMeting",
"PVPower"
]
}
],
"groupType": "Number",
"function": {
"name": "SUM"
},
"link": "http://openhabianpi:8080/rest/items/PVPower",
"state": "0.0",
"editable": true,
"type": "Group",
"name": "PVPower",
"label": "PV Power",
"tags": [],
"groupNames": [
"gEMeting"
]
}
PVPowerGS1:
{
"link": "http://openhabianpi:8080/rest/items/PVPowerGS1",
"state": "0.0",
"editable": true,
"type": "Number",
"name": "PVPowerGS1",
"label": "PV Power GS1",
"tags": [],
"groupNames": [
"gEMeting",
"PVPower"
]
}
PVPowerGS2:
{
"link": "http://openhabianpi:8080/rest/items/PVPowerGS2",
"state": "0.0",
"editable": true,
"type": "Number",
"name": "PVPowerGS2",
"label": "PV Power GS2",
"tags": [],
"groupNames": [
"gEMeting",
"PVPower"
]
}
And here is my influxdb persistence file (I also use mapdb all for RestoreOnStartup):
Strategies {
everyMin : "0 * * * * ? *"
everyHour : "0 0 * * * ? *"
default = everyChange
}
Items {
gEMeting* : strategy = everyChange
Emeter, PVPower, PVEmeter, PVEtotal, PVEtoday, TotVerbruik : strategy = everyChange
}
In the event.log, I have:
2020-02-24 17:15:08.156 [vent.ItemStateChangedEvent] - PVPowerGS2 changed from 18.0 to 3.0
2020-02-24 17:15:08.167 [vent.ItemStateChangedEvent] - PVPowerGS1 changed from 9.93744 to 1.65624
2020-02-24 17:15:08.171 [GroupItemStateChangedEvent] - PVPower changed from 27.93744 to 4.65624 through PVPowerGS1
...
2020-02-24 17:40:07.265 [vent.ItemStateChangedEvent] - PVPowerGS2 changed from 15.0 to 6.0
2020-02-24 17:40:07.274 [GroupItemStateChangedEvent] - PVPower changed from 14.2812 to 9.31248 through PVPowerGS1
2020-02-24 17:40:07.279 [vent.ItemStateChangedEvent] - PVPowerGS1 changed from 8.2812 to 3.31248
...
2020-02-24 17:45:06.831 [vent.ItemStateChangedEvent] - PVPowerGS2 changed from 6.0 to 0.0
2020-02-24 17:45:06.837 [GroupItemStateChangedEvent] - PVPower changed from 9.31248 to 3.31248 through PVPowerGS2
2020-02-24 17:45:06.841 [GroupItemStateChangedEvent] - PVPower changed from 3.31248 to 0.0 through PVPowerGS1
2020-02-24 17:45:06.844 [vent.ItemStateChangedEvent] - PVPowerGS1 changed from 3.31248 to 0.0
And later, after a restart of openHAB, restoreOnStartup from mapdb kicking in:
2020-02-24 23:10:40.474 [vent.ItemStateChangedEvent] - PVPowerGS2 changed from NULL to 0.0
2020-02-24 23:10:40.515 [vent.ItemStateChangedEvent] - PVPowerGS1 changed from NULL to 0.0
And later in the morning, first readings above 0, but no sum being made anymore from then on:
2020-02-25 08:00:07.143 [vent.ItemStateChangedEvent] - PVPowerGS2 changed from 0.0 to 30.0
2020-02-25 08:00:07.149 [vent.ItemStateChangedEvent] - PVPowerGS1 changed from 0.0 to 16.5624
Just before the restart, I did some maintenance in other areas of openHAB. I did not touch the items above or the persistence definitions.