Which one must I use rule, flow or groovy

good day all I am trying to figure out how to calculate the daily total people coming into a store. i have a people counter that gives a period total and then accumulative total. I am wanting to create a attribute that does a daily total. is there anyone that can help me with this.

An explanation of the JSON-, Groovy- and Flow rules can be found in the documentation:

.
If you want to do simple value calculations, Flow is probably your best choice.
Fun fact: we’ll soon add more processors like MIN, AVG and MAX. :wink:

@martin.peeters thanks I have gone through the document and I am thinking it would need to be a groovy rule for what I need to do. But I am quite confused how to formulate the groovy rule hence I am asking for help.

You could take a look at our documentation on Groovy rules.
There are also some examples, and guidance on how they work.

.
You can also search through the forum, as there are many topics regarding Groovy rules.
Hopefully this helps :+1:

@martin.peeters thanks will go through this and see if I can grasp it.

this is the thing asset I have

I am trying to get a daily total count so i have created the attribute.

this is the groovy rule i have so far with the help of chatGPT there is a issue with it that I am trying to find

package org.openremote.setup.integration.rules 

import org.openremote.manager.rules.RulesBuilder
import org.openremote.manager.rules.RulesFacts
import org.openremote.model.asset.impl.ThingAsset
import org.openremote.model.query.AssetQuery
import org.openremote.model.rules.AssetState

import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
import java.util.logging.Logger

Logger LOG = binding.LOG
RulesBuilder rules = binding.rules

// Define time format for daily tracking
final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd")

// Rule to track daily total and reset at midnight
rules.add()
    .name("Daily People Counter Total")
    .when({ facts ->
        def now = LocalDateTime.now()
        def formattedDate = now.format(DATE_FORMAT)

        // Get the people counter asset
        def peopleCounter = facts.matchFirstAssetState(
            new AssetQuery().types(ThingAsset).attributeValue("name", "People Counter")
        )

        if (peopleCounter.isPresent()) {
            def totalIn = facts.matchFirstAssetState(
                new AssetQuery().ids(peopleCounter.get().id).attributeName("Total_in")
            ).map { it.value.orElse(0) }.orElse(0)

            // Get stored daily total
            def dailyTotal = facts.matchFirstAssetState(
                new AssetQuery().ids(peopleCounter.get().id).attributeName("dailyTotal")
            ).map { it.value.orElse(0) }.orElse(0)

            // Get stored date to track if the day changed
            def lastRecordedDate = facts.matchFirstAssetState(
                new AssetQuery().ids(peopleCounter.get().id).attributeName("lastRecordedDate")
            ).map { it.value.orElse("") }.orElse("")

            // Check if the date has changed (reset needed)
            if (!lastRecordedDate.equals(formattedDate)) {
                facts.bind("resetNeeded", true)
                facts.bind("peopleCounterId", peopleCounter.get().id)
            } else {
                facts.bind("resetNeeded", false)
            }

            // Bind current total and daily total
            facts.bind("totalIn", totalIn)
            facts.bind("dailyTotal", dailyTotal)
            facts.bind("currentDate", formattedDate)
        }

        return peopleCounter.isPresent()
    })
    .then({ facts ->
        def resetNeeded = facts.bound("resetNeeded")
        def peopleCounterId = facts.bound("peopleCounterId")
        def totalIn = facts.bound("totalIn")
        def dailyTotal = facts.bound("dailyTotal")
        def currentDate = facts.bound("currentDate")

        if (resetNeeded) {
            LOG.info("Resetting daily total for People Counter at midnight.")
            facts.updateAssetState(peopleCounterId, "dailyTotal", totalIn)
            facts.updateAssetState(peopleCounterId, "lastRecordedDate", currentDate)
            facts.updateAssetState(peopleCounterId, "Total_in", 0)  // Reset the counter
        } else {
            LOG.info("Updating daily total for People Counter.")
            facts.updateAssetState(peopleCounterId, "dailyTotal", dailyTotal + totalIn)
        }
    })

this is a message i am getting in the container manager

2025-01-22 09:00:57 2025-01-22 08:00:57.908  INFO    [ContainerExecutor-17072       ] RulesEngine.RealmEngine-intellisec.RULES : Starting: RulesEngineId{scope=RealmRuleset, realm='intellisec', assetId='null'}

@jonty did you get this issue resolved? If you can provide the full stack trace of why the rule failed it would make it easier to help

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.