Group alarm shelving based on Associated data

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 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.

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

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

	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)

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:

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)

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:

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.

Okay, so bail if the query returns no alarms:

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)