Alarms: respond when a PV goes out of range¶
Overview¶
The alarm
module provides an Alarm object to specify an alarm
condition and what to do when that condition is met.
- class alarm.Alarm(pvname[, comparison=None[, trip_point=None[, callback=None[, alert_delay=10]]]])¶
creates an alarm object.
- param pvname:
name of Epics PV (string)
- param comparison:
operation used to compare PV value to trip_point.
- type comparison:
string or callable. Built in comparisons are listed in Table of Alarm Operators.
- param trip_point:
value that will trigger the alarm
- param callback:
user-defined callback function to be run when the PVs value meets the alarm condition
- type callback:
callable or None
- param alert_delay:
time (in seconds) to wait before executing another alarm callback.
The alarm works by checking the value of the PV each time it changes. If the new value is outside the acceptable range (violates the trip point), then the user-supplied callback function is run. This callback could be set do send a message or to take some other course of action.
The comparison supplied can either be a string as listed in Table of
Alarm Operators or a custom callable function which takes
the two values (PV.value, trip_point) and returns True
or False
based on those values.
Table of built-in Operators for Alarms:
operator
Python operator
‘eq’, ‘==’
__eq__
‘ne’, ‘!=’
__ne__
‘le’, ‘<=’
__le__
‘lt’, ‘<’
__lt__
‘ge’, ‘>=’
__ge__
‘gt’, ‘>’
__gt__
The alert_delay
prevents the alarm callback from being called too
many times. For PVs with floating point values, the value may
fluctuate around the trip_point for a while. If the value violates the
trip_point, then momentarily goes back to an acceptable value, and back
again to a violating value, it may not be desirable to send repeated,
identical messages. To prevent this situation, the alarm callback will be
called when the alarm condition is met and the callback was not called
within the time specified by alert_delay
.
Alarm Example¶
An epics Alarm is very easy to use. Here is an alarm set to print a message when a PV’s value reaches a certain value:
from epics import Alarm, poll
def alertMe(pvname=None, char_value=None, **kw):
print(f"Soup's on! {pvname}= {char_value}")
my_alarm = Alarm(pvname = 'WaterTemperature.VAL',
comparison = '>',
callback = alertMe,
trip_point = 100.0,
alert_delay = 600)
while True:
poll()