[rules-users] sliding window question

Wolfgang Laun wolfgang.laun at gmail.com
Thu Feb 27 10:43:21 EST 2014


For an average, the accumulate CE would be best:

accumulate( Reading( $reading: reading ) over window:time( 30s );
                    $avg: average( $reading ) )

You could add this as the last pattern to the rule where you raise the alarm.

None of this was compiled or tested by me.

-W


On 27/02/2014, Lin Lin <lin.lin at comcast.net> wrote:
> Hi Wolfgang,
>
>   Thanks so much!   I will try the sliding window over the time.  I also
> need to give the average reading over the last 30 seconds in the alert
> message. How would I do that?
>
> Thanks
> Lin
>
>> On Feb 27, 2014, at 1:01 AM, Wolfgang Laun <wolfgang.laun at gmail.com>
>> wrote:
>>
>> The correct way to ascertain that something hasn't happened for
>> a certain interval must be based on "staking out" this interval. One
>> way is by means of two distinct events:
>>
>>   when
>>     $r1: Reading( reading >90 )
>>     $r2: Reading( reading > 90, this after[30s] $r1 )
>>     not Reading( reading <= 90, this after $r1 && before $r2 )
>>   then
>>
>> Clearly, this will only work if  Readings arrive regularly, and you may
>> have a
>> certain amount of delay at the end.
>>
>> Another way would be to use a sliding window over time:
>>
>>   when
>>     not Reading( reading <= 90 ) over window:time( 30s )
>>   then
>>
>> Here's a snag, too: If there are no readings at all, you'll also get an
>> alert.
>>
>> And then you'll have to think about the seconds following the 30th
>> second: should another alert be emitted repeatedly...
>>
>> Most of the time, it's not an issue in CEP ;-)
>>
>> -W
>>
>>
>>
>>
>>
>>
>>> On 27/02/2014, lin.lin <lin.lin at comcast.net> wrote:
>>> Hi,
>>>
>>> I tried to create a rule that gives an alert when a machine reading is
>>> high
>>> for 30 seconds. I modeled the machine reading input as events.  The
>>> following is the rule:
>>>
>>> rule "rule1"
>>> dialect "mvel"
>>>    when
>>>       $rd1 : mReading( reading >90 ) from entry-point ReadingStream
>>>       not ($rd2 : mReading (reading<=90 , this before [0s, 30s] $rd1 )
>>> from entry-point ReadingStream )
>>>    then
>>>      System.out.print ("alert: Reading high for 30 seconds \n");
>>> end
>>>
>>> This does not detect detect the bad reading.  However, If I changed the
>>> rule
>>> to be following (change second condition from "not" to "exists"), it
>>> detects
>>> all readings that are good.
>>>
>>> rule "rule1"
>>> dialect "mvel"
>>>    when
>>>       $rd1 : mReading( reading >90 ) from entry-point ReadingStream
>>>       exists ($rd2 : mReading (reading<=90 , this before [0s, 30s] $rd1 )
>>> from entry-point ReadingStream )
>>>    then
>>>      System.out.print ("alert: Reading high for 30 seconds \n");
>>> End
>>>
>>>
>>> Is this an issue in CEP or did I do something wrong?
>>>
>>> Thanks a lot!
>>> Lily
>>>
>>>
>>>
>>> --
>>> View this message in context:
>>> http://drools.46999.n3.nabble.com/sliding-window-question-tp4028367.html
>>> Sent from the Drools: User forum mailing list archive at Nabble.com.
>>> _______________________________________________
>>> rules-users mailing list
>>> rules-users at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/rules-users
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users



More information about the rules-users mailing list