# Group alarm shelving based on Associated data

**URL:** <https://forum.inductiveautomation.com/t/group-alarm-shelving-based-on-associated-data/82909>\
**Category:** Ignition\
**Tags:** scripting, perspective\
**Created:** [December 8, 2023, 5:50pm UTC](https://forum.inductiveautomation.com/t/group-alarm-shelving-based-on-associated-data/82909 "2023-12-08T17:50:11Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![NewBieNew](https://avatars.discourse-cdn.com/v4/letter/n/a183cd/32.png) [@NewBieNew](https://forum.inductiveautomation.com/u/NewBieNew)\
**Post date:** [December 8, 2023, 5:50pm UTC](https://forum.inductiveautomation.com/t/group-alarm-shelving-based-on-associated-data/82909/1 "2023-12-08T17:50:12Z")

</div>

New to Ignition perspective  
I am using v8.1.31

I am trying to shelve the alarms based on associated data: 'Group' when a button is clicked

I had previously [System.alarm.shelve](https://forum.inductiveautomation.com/t/system-alarm-shelve-throwing-an-error/52279) working as my folder Hierarchy allowed me but now all my alarms are spreaded out in multiple folder and has a 'Group' to differentiate between them.

---

<div class="post-metadata">

**Author:** ![NewBieNew](https://avatars.discourse-cdn.com/v4/letter/n/a183cd/32.png) [@NewBieNew](https://forum.inductiveautomation.com/u/NewBieNew)\
**Post date:** [December 8, 2023, 7:00pm UTC](https://forum.inductiveautomation.com/t/group-alarm-shelving-based-on-associated-data/82909/2 "2023-12-08T19:00:43Z")

</div>

Anyone...I have been searching but no success so far.

```auto
def runAction(self, event):
	group = alarmEvent.get("Group")
	if group == "Group A":
		return system.alarm.shelve(path=['?'], timeoutSeconds=60)

```

I don't know how to retrieve the tag path from here. Please Help. Thanks

---

<div class="post-metadata">

**Author:** ![NewBieNew](https://avatars.discourse-cdn.com/v4/letter/n/a183cd/32.png) [@NewBieNew](https://forum.inductiveautomation.com/u/NewBieNew)\
**Post date:** [December 8, 2023, 10:03pm UTC](https://forum.inductiveautomation.com/t/group-alarm-shelving-based-on-associated-data/82909/3 "2023-12-08T22:03:35Z")

</div>

```auto
	props = [("Group", "=", "GroupA")]
	state = ["ActiveUnacked", "ActiveAcked"]
	alarms = system.alarm.queryStatus(any_properties = props, state = state)
	if len(alarms) > 0:
		for alarm in alarms:
			almPath = str(alarm.source)
			system.alarm.shelve(path = almPath, timeoutSeconds = 30)

```

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [December 8, 2023, 10:56pm UTC](https://forum.inductiveautomation.com/t/group-alarm-shelving-based-on-associated-data/82909/4 "2023-12-08T22:56:08Z")

</div>

For the sake of your gateway's health in the future, change your script to pass all the paths to shelve at once, instead of calling shelve repeatedly. This will be dramatically more efficient:

```python
props = [("Group", "=", "GroupA")]
state = ["ActiveUnacked", "ActiveAcked"]
alarms = system.alarm.queryStatus(any_properties = props, state = state)
system.alarm.shelve(path = [str(alarm.source) for alarm in alarms], timeoutSeconds = 30)

```

---

<div class="post-metadata">

**Author:** ![NewBieNew](https://avatars.discourse-cdn.com/v4/letter/n/a183cd/32.png) [@NewBieNew](https://forum.inductiveautomation.com/u/NewBieNew)\
**Post date:** [December 8, 2023, 11:03pm UTC](https://forum.inductiveautomation.com/t/group-alarm-shelving-based-on-associated-data/82909/5 "2023-12-08T23:03:51Z")

</div>

com.inductiveautomation.ignition.common.script.JythonExecException  
Traceback (most recent call last):  
File "function:runAction", line 5, in runAction  
at com.inductiveautomation.ignition.common.script.builtin.AbstractAlarmUtilities.shelve(AbstractAlarmUtilities.java:125)  
at jdk.internal.reflect.GeneratedMethodAccessor89.invoke(Unknown Source)  
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)  
at java.base/java.lang.reflect.Method.invoke(Unknown Source)  
java.lang.IllegalArgumentException: java.lang.IllegalArgumentException: No paths were provided for the shelving operation.

```
at org.python.core.Py.JavaError(Py.java:547)
at com.inductiveautomation.ignition.common.script.builtin.AbstractAlarmUtilities.shelve(AbstractAlarmUtilities.java:125)
at jdk.internal.reflect.GeneratedMethodAccessor89.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at org.python.core.PyReflectedFunction. __call__ (PyReflectedFunction.java:190)
at com.inductiveautomation.ignition.common.script.ScriptManager$ReflectedInstanceFunction. __call__ (ScriptManager.java:552)
at org.python.core.PyObject. __call__ (PyObject.java:400)
at org.python.pycode._pyx32.runAction$1(<function:runAction>:5)
at org.python.pycode._pyx32.call_function(<function:runAction>)
at org.python.core.PyTableCode.call(PyTableCode.java:173)
at org.python.core.PyBaseCode.call(PyBaseCode.java:306)
at org.python.core.PyFunction.function ___call__ (PyFunction.java:474)
at org.python.core.PyFunction. __call__ (PyFunction.java:469)
at org.python.core.PyFunction. __call__ (PyFunction.java:464)
at com.inductiveautomation.ignition.common.script.ScriptManager.runFunction(ScriptManager.java:846)
at com.inductiveautomation.ignition.common.script.ScriptManager.runFunction(ScriptManager.java:828)
at com.inductiveautomation.ignition.gateway.project.ProjectScriptLifecycle$TrackingProjectScriptManager.runFunction(ProjectScriptLifecycle.java:832)
at com.inductiveautomation.ignition.common.script.ScriptManager$ScriptFunctionImpl.invoke(ScriptManager.java:1009)
at com.inductiveautomation.ignition.gateway.project.ProjectScriptLifecycle$AutoRecompilingScriptFunction.invoke(ProjectScriptLifecycle.java:897)
at com.inductiveautomation.perspective.gateway.script.ScriptFunctionHelper.invoke(ScriptFunctionHelper.java:158)
at com.inductiveautomation.perspective.gateway.script.ScriptFunctionHelper.invoke(ScriptFunctionHelper.java:97)
at com.inductiveautomation.perspective.gateway.action.ScriptAction.runAction(ScriptAction.java:74)
at com.inductiveautomation.perspective.gateway.model.ActionCollection$ActionSequence$ExecuteActionsTask.lambda$call$0(ActionCollection.java:263)
at com.inductiveautomation.perspective.gateway.api.LoggingContext.mdc(LoggingContext.java:54)
at com.inductiveautomation.perspective.gateway.model.ActionCollection$ActionSequence$ExecuteActionsTask.call(ActionCollection.java:252)
at com.inductiveautomation.perspective.gateway.model.ActionCollection$ActionSequence$ExecuteActionsTask.call(ActionCollection.java:221)
at com.inductiveautomation.perspective.gateway.threading.BlockingTaskQueue$TaskWrapper.run(BlockingTaskQueue.java:154)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at com.inductiveautomation.perspective.gateway.threading.BlockingWork$BlockingWorkRunnable.run(BlockingWork.java:58)
at java.base/java.lang.Thread.run(Unknown Source)

```

Caused by: org.python.core.PyException  
Traceback (most recent call last):  
File "function:runAction", line 5, in runAction  
at com.inductiveautomation.ignition.common.script.builtin.AbstractAlarmUtilities.shelve(AbstractAlarmUtilities.java:125)  
at jdk.internal.reflect.GeneratedMethodAccessor89.invoke(Unknown Source)  
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)  
at java.base/java.lang.reflect.Method.invoke(Unknown Source)  
java.lang.IllegalArgumentException: java.lang.IllegalArgumentException: No paths were provided for the shelving operation.

```
... 34 more

```

Caused by: java.lang.IllegalArgumentException  
com.inductiveautomation.ignition.common.GenericTransferrableException: No paths were provided for the shelving operation.  
... 33 more

Ignition v8.1.31 (b2023081007)  
Java: Azul Systems, Inc. 11.0.18

[quote="PGriffith, post:4, topic:82909, full:true"]  
For the sake of your gateway's health in the future, change your script to pass all the paths to shelve at once, instead of calling shelve repeatedly. This will be dramatically more efficient:

```python
props = [("Group", "=", "GroupA")]
state = ["ActiveUnacked", "ActiveAcked"]
alarms = system.alarm.queryStatus(any_properties = props, state = state)
system.alarm.shelve(path = [str(alarm.source) for alarm in alarms], timeoutSeconds = 30)

```

When I test this code it throws me this error.

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [December 8, 2023, 11:15pm UTC](https://forum.inductiveautomation.com/t/group-alarm-shelving-based-on-associated-data/82909/6 "2023-12-08T23:15:44Z")

</div>

Okay, so bail if the query returns no alarms:

```auto
props = [("Group", "=", "GroupA")]
state = ["ActiveUnacked", "ActiveAcked"]
alarms = system.alarm.queryStatus(any_properties = props, state = state)
if alarms:
    system.alarm.shelve(path = [str(alarm.source) for alarm in alarms], timeoutSeconds = 30)

```
