I tried to write a rule to store the calculated average cloudiness for the coming four hours to a HABApp Item to make it available for other scripts.
The cloudiness values (openweathermap) are updated every hour. To ensure that the calculation function gets run once on startup of the rule I called self.run.soon(calculation function)
in the init portion of the rule.
The calculation function listens to value updates on the openhab item One_Call_API_Bewolking_plus_0H
(One_Call_API_Cloudiness_plus_0H).
When loaded this gives an error:
[2025-07-08 07:40:17,961] [ HABApp.Worker] ERROR | TypeError: CalcBewolking.CalcGemBewolking() missing 1 required positional argument: 'event'
It took me about two days to figure out the problem:
self.run.soon(self.CalcGemBewolking)
when commenting out this line the error goes away.
So I should pass a ValueUpdateEvent with see.run.soon
. Question is: how?
Below is my code:
import HABApp
from HABApp.core.items import Item
from HABApp.core.events import ValueChangeEvent, ValueChangeEventFilter, ValueUpdateEventFilter, ValueUpdateEvent
from HABApp.openhab.items import NumberItem, SwitchItem, GroupItem
from HABApp.mqtt.items import MqttPairItem, MqttItem
import statistics
import logging
import HABApp.util
log = logging.getLogger("RuleLog")
class CalcBewolking(HABApp.Rule):
def __init__(self):
super().__init__()
self.bewolking0H = NumberItem.get_item('One_Call_API_Bewolking_plus_0H')
self.bewolking1H = NumberItem.get_item('One_Call_API_Bewolking_plus_1H')
self.bewolking2H = NumberItem.get_item('One_Call_API_Bewolking_plus_2H')
self.bewolking3H = NumberItem.get_item('One_Call_API_Bewolking_plus_3H')
self.avgCloudiness = Item.get_create_item('meanClouds')
# self.run.soon(self.CalcGemBewolking)
self.bewolking0H.listen_event(self.CalcGemBewolking, ValueUpdateEventFilter())
def CalcGemBewolking(self, event: ValueUpdateEvent):
log.debug(f'BEWOLKINGSCALCULATIE -- Bewolking 0H: {self.bewolking0H.value} - Bewolking1H: {self.bewolking1H.value} - Bewolking 2H: {self.bewolking2H.value} - Bewolking3H: {self.bewolking3H.value}')
self.BewolkingsBerekening = statistics.mean([self.bewolking0H.value,self.bewolking1H.value,self.bewolking2H.value,self.bewolking3H.value])
self.avgCloudiness.post_value(self.BewolkingsBerekening)
log.debug(f'BEWOLKINGSCALCULATIE -- De berekende gemiddelde bewolking in de komende vier uur is: {self.avgCloudiness.value}')
CalcBewolking()
And while I’m at it: I use the python statistics module. But how would I use the HABApp.core.util Statistics class in this case? Or shouldn’t I?