Special Alarm Recipes

Special keys used in Alarm formulas

  • DEVICE: PyAlarm device name
  • DOMAIN,FAMILY,MEMBER: Parts of the device name
  • ALARMS: Alarms managed by this device
  • PANIC: API containing all declared alarms
  • t: time since the device was started
  • T(…): string to time
  • str2time(…): string to time
  • now, NOW(): current timestamp
  • DEVICES: instantiated devices
  • DEV(device): DeviceProxy(device)
  • NAMES(expression’): Finds all attributes matching the expression and return its names.
  • CACHE: Saved values
  • PREV: Previous values
  • READ(attr): TangoEval.read_attribute(attr)
  • FIND(‘expression’): Finds all attributes matching the expression and return its values.

Expiration Date

Disabling or re-enabling after a given date

A temporal condition can be achieved using the T() macro in the formula.

To disable an Alarm after a given date:

T() < T('2013-04-23') and D/F/M.A > V1

To re-enable it after a maintenance period:

T() > T('2013-04-23') and D/F/M.A > V1

Accessing PyAlarm Values CACHE

The PyAlarm CACHE dictionary contains the last values stored for each tango attribute that appeared in the formulas. The size of cache is AlarmTrheshold + 1

Usage:

PASS_BY_0=[(k,v.time.tv_sec,str(v.value)) for k,t in CACHE.items() for v in t if v.value==0]

This will trigger alarm if ALL values in the cache are equal, it is NOT the same as Delta because it checks only the first and last values:

not (lambda l:max(l)-min(l))([v.value for v in CACHE['wr/rf/circ-1/heartbeat']])

Clock: Alarm triggered by time

This alarm will be enabled/disabled every 5 seconds.

First, create a new PyAlarm device:

import fandango as fn
fn.tango.add_new_device('PyAlarm/Clock','PyAlarm','test/pyalarm/clock')

Add the new alarm (formula will use current time to switch True/False very 5 seconds)

from panic import AlarmAPI
alarms = AlarmAPI()
alarms.add(device='test/pyalarm/clock',tag='CLOCK',formula='NOW()%10<5')

Start your device server using Astor, fandango or manually

import fandango as fn
fn.Astor('test/pyalarm/clock').start_servers(host='your_hostname')

Then, configure the device properties to react every second for both activation and reset:

dtest = alarms.devices['test/pyalarm/clock']
dtest.get_config()
dtest.config['Enabled'] = 1
dtest.config['AutoReset'] = 1
dtest.config['AlarmThreshold'] = 1
dtest.config['PollingPeriod'] = 1
alarms.put_db_properties(dtest.name,dtest.config)
dtest.init()

This is the result you can expect when plotting test/pyalarm/clock/CLOCK in a taurustrend:

alternate text