Panic-The Alba Alarm System

Hi Sergi

1.) I have made my own python device which is 'a/a/a'. I have registered in database server. When i am running this device which is by executing python alarmtest . It is running successfully.
But when I open Panic Gui, I am unable to add/save new alarm as my device is not listed there.

2.) Does Panic GUI detect java/Cpp Device Server running and show their respective devices in GUI?

Thanks and Regards

I think we need more information:

You want to add alarm based on one of your attributes.
You don't see the name of your device when you want to add a new alarm.

For me:
It's normal.
You will only see device of class PyAlarm in the Panic GUI.
You will have to directly write your alarm sequence like this example :
tango/test/temp/temperature > 24 and tango/test/temp/temperature < 30
in your case, I think maybe you want something like this:
a/a/a/State != ON

But I'm just assuming and maybe it's something different from what you want.

Edit : Just saw the Sergi answer
Edited 3 years ago
Hi Sergi,Sebastien

Thankyou for the solution.

Tcs-GMRT Team
Hi Sergi

1.) I have to do grouping of alarm. Whats the syntax for it ?

2.) How to perform automated action ? whats the syntax for it ?

For e.g. if @(a/a/a/Speed)>18 expression is true I want to set (a/a/a/WindSpeed)=10.

How can I achieve this ? whats the syntax for automated action ?

3.) Also could you please share the list of supported function in Panic-gui?

Thanks and Regards
Well, let's say that you already created a test/alarms/1 device and then you created 2 alarms:

import panic
alarms = panic.api()
alarms.add('GROUND_SPEED',device='test/alarms/1',description='speed 1',formula='a/a/a/Speed > 18')
alarms.add('WIND_SPEED',device='test/alarms/1',description='speed 1',formula='a/a/a/WindSpeed > 20')

There are two ways of "grouping" them. The first is just combining them with "and" or "or" logic operands.

alarms.add('ANY_SPEED',device='test/alarms/1',formula='GROUND_SPEED or WIND_SPEED')

The second method is using the "GROUP" macro, it is a quite recent method and it is still under testing. It allows to send a single message for multiple combined reasons.

The "technical" description of GROUP macro is: For an expression matching multiple ALARM attributes returns a new formula that will evaluate to True if any of the matching alarm changes to active state. NOTE, THIS IS NOT EQUAL TO "any(FIND(*))"; it will react ONLY on activation, but not if were already active!

For example, GROUP(test/alarms/*/TEST_[ABC]) would be equivalent to (alarm ds names are automatically replaced):

(any([d>0 for d in FIND(test/alarms/*/TEST_[ABC].delta)]) and FIND(test/alarms/*/TEST_[ABC]))

By default GROUP is active if any .delta is >0. It can be modified if the formula contains a semicolon ";" and a condition using 'x' as variable; in this case it will be used instead of delta to check for alarm

GROUP(bl09/vc/vgct-*/p[12],x>1e-5) => [x>1e-5 for x in FIND(bl09/vc/vgct-*/p[12])]

For the previous example you could declare this alarm that will be active every time that there is a CHANGE TO ACTIVE in the value of either GROUND_SPEED and WIND_SPEED. It means that if you set an AutoReset period to this alarm device (e.g. 30 seconds) the alarm will be activated/reset for any change in the previous alarms.


To setup an action as alarm receiver you have to do it using the receivers method, following the link I posted before:


Regarding the list of things that can be done with the Panic-GUI I would summarize it in:

  • Visualize status of declared alarms
  • Create/modify existing alarms
  • Configure existing PyAlarm devices
  • Test alarm formulas using the "preview" panel

  • To know what can be edited and the different properties of the PyAlarm devices you have to go to the previous document:

    Keep on dancing,
    Edited 3 years ago
    Hi Serbi

    Thanks for the solutions. I am able to setup the action.

    I have another set of queries

    1.) I have three devices for e.g. a/a/a/, a/a/b , a/a/c

    I am using following syntax for grouping
    (a/a/*/Speed)>10 —-> It says invalid syntax.
    GROUP(a/a/*/Speed)>10—–>It doesn't contain any value of attributes related to Speed in the preview button.

    What I need is I have active alarm in the three devices mentioned above i.e. a/a/a/Speed >10 , a/a/b/Speed/10 ,a/a/c/Speed>10

    Now I want to group them together how can i do that in one line?
    I thought by using (a/a/*/Speed)>10, it should come but it says invalid syntax.

    And also if parent is acknowledged , all its child alarm should also be acknowledged.

    How can I achieve this ?

    2.) I have made gui in taurus. I have to display alarm in Taurus Gui ? How to link Taurus with Panic alarm suite ?

    3.) Could you please share the list of supported functions for Panic_GUI ?

    Thanks and Regards
    Tcs-GMRT Team
    Hi Balkrishna,

    Most of your questions are answered in the presentations from the link I already sent you.

    The syntax for using regular expressions is:

    any([v>10 for v in FIND(a/a/*/Speed)])

    To display the alarm in taurus you must use the boolean attribute of the pyalarm device. If your device is test/alarms/1 and your alarm is SPEED then use the test/alarms/1/SPEED attribute as model.

    The functions of Panic-GUI are: Create, Edit, Test, Acknowledge, Disable, Enable, Reset and Delete alarms. In addition you can configure PyAlarm device servers, browse the ALARM snapshoting and modify the Phonebook property (aliases for receivers).

    Keep on dancing,
    Hi Sergi

    Thanks for the solutions of grouping.

    When I was setting action:

    When setting action on attribute alarm comes, I am able to do that by using the below syntax:

    But when I want to setup an action using command when alarm comes , I am not able to do that by using below syntax:
    ACTION(alarm:command,l/m/n/Speed_Inc) ——-? It didn't work

    Then I tried by passing an input argument as 1 in pogo while defining command " Speed_Inc " and wrote the syntax as
    ACTION(alarm:command,l/m/n/Speed_Inc,1)It ——-? It worked now.

    1.) So I want to ask while setting an action using command when alarm comes, is it necessary to pass an input argument ? Cant we setup the action using command without passing the argument ? Or I am using the wrong syntax ? What is the syntax actually ?

    2.) Is state transition possible while setting up action from on to off or off to on ? What is the syntax for state transition ?
    ACTION(alarm:attribute,l/m/n/State,OFF) —–? But it didn't worked.

    3.) Also Is it possible to display the status while setting up an action ?

    4.) While defining attribute property in pogo, there are two properties delta_t and delta_val , What exactly are the use of this properties and how is it related with alarm ? I read the tango-manual 8.1 about it, but i didn't understand. Can you please explain using example ?

    5.) The alarm sound doesn't come when it comes ( My PC sound is ON and Neither i have put headphones ). Where can I attach the sound file in panic_gui ?

    Thanks and Regards
    TCS-GMRT Team

    Edited 3 years ago
    Hi Sergi

    For Snap I downloaded PyTangoArchiving and installed PyTangoArchiving and its dependencies.

    Now my gui has one more button in toolbar i.e. alarm history viewer.

    In Alarm History Viewer, there are lots of snaps of the alarm.
    In the bottom of alarm history viewer, there is that Open Snapshot option. When I am clicking on that option, nothing is happening. Please can u tell my mistake here.

    Thanks and Regards
    TCS-GMRT Team
    Hi Balkrishna,

    Summarizing: commands in Tango can use only the arguments specified in Pogo at creation time, therefore you can't send an argument to State or expect a command with arguments to be executed w/out them. For existing commands you can check the current argument type from Jive (test device) or ipython+PyTango.

    To debug that try to launch the commands from ipython, then you'll get the exceptions with the error messages.

    For sound or snaps you have to install the Festival device server (that needs Festival module and KDE); it is written in the presentations.

    For viewing the snaps, you'll have to setup the launcher for the snap application (write a little script bin/ctsnaps launching the PyTangoArchiving/widget/snap/ file. I'll try to upload a sample script in the next commit.


    Keep on dancing,
    Hi Sergi

    1.) Whats the use of UseTaurus button in Panic GUI ? Also How to connect to taurus Gui ? I didnt understood the above reply to this question. Please elaborate more.

    2.) I was trying to use Panic Alarm suite over network.
    In One Machine , PyAlarm device , panic gui is running.
    In Other machine, I was trying to execute this
    —>python Panic/

    I got the following errors while executing:

    INFO 2015-08-04 11:44:09,226 TaurusRootLogger: Using "PyQt4" for Qt
    MainThread INFO 2015-08-04 11:44:09,226 TaurusRootLogger: Using "PyQt4" for Qt
    PyTangoArchiving.snap not available
    loading devattrchange …
    __main__ …
    2015-08-04 11:44:10: Launching Panic …
    2015-08-04 11:44:11: launching AlarmGUI … ['']
    2015-08-04 11:44:11: In AlarmGUI(): {}
    showing splash … PyQt4.QtCore.QSize()
    In AlarmAPI(*)
    Tue Aug 4 11:44:11 2015: Loading PyAlarm devices matching *
    Traceback (most recent call last):
    File "", line 1001, in <module>
    n = main(sys.argv[1:] or ([os.getenv('PANIC_DEFAULT')] if os.getenv('PANIC_DEFAULT') else [])).exec_()
    File "", line 933, in main
    alarmApp = AlarmGUI(filters='|'.join(a for a in sys.argv[1:] if not a.startswith('–')),options=opts,mainwindow=tmw)
    File "", line 69, in __init__
    self.api = panic.AlarmAPI()
    File "/opt/TangoSoftwares/Panic_Alarm_Suite/fandango/", line 346, in __new__
    cls.init_single(__instance,*p,**k) #If no __init__ or init_single has been defined it may trigger an object.__init__ warning!
    File "/opt/TangoSoftwares/Panic_Alarm_Suite/panic/", line 558, in __init__
    File "/opt/TangoSoftwares/Panic_Alarm_Suite/panic/", line 583, in load
    all_devices = map(str.lower,fandango.tango.get_database_device().DbGetDeviceList(['*','PyAlarm']))
    File "/usr/lib64/python2.7/site-packages/PyTango/", line 211, in __DeviceProxy__getattr
    raise AttributeError(name)
    AttributeError: DbGetDeviceList

    Thanks and Regards
    TCS-GMRT Team

    Register or login to create to post a reply.