# Alarm Count filter

**URL:** <https://forum.inductiveautomation.com/t/alarm-count-filter/33419>\
**Category:** Ignition\
**Created:** [March 25, 2020, 11:48pm UTC](https://forum.inductiveautomation.com/t/alarm-count-filter/33419 "2020-03-25T23:48:47Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![lachguerabdallah](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/lachguerabdallah/32/25558_2.png) [@lachguerabdallah](https://forum.inductiveautomation.com/u/lachguerabdallah)\
**Post date:** [March 25, 2020, 11:48pm UTC](https://forum.inductiveautomation.com/t/alarm-count-filter/33419/1 "2020-03-25T23:48:47Z")

</div>

I want to filter the alarm count according to the path

i used:

if({Alarm Count Label.states} = “”,  
0,  
toInt(runScript(“len(system.alarm.queryStatus(state=[” +  
left({Alarm Count Label.states}, len({Alarm Count Label.states}) - 1) +  
“], source=[“_ABB_”,“_ADP_”]))”, {Alarm Count Label.UpdateRate}))  
)

it works but I want ‘source’ to be changed according to user roles like user roles=[ABB, ADP, other…]

any ideas please?

---

<div class="post-metadata">

**Author:** ![PEM.Kaleo](https://avatars.discourse-cdn.com/v4/letter/p/e56c9b/32.png) [@PEM.Kaleo](https://forum.inductiveautomation.com/u/PEM.Kaleo)\
**Post date:** [February 19, 2021, 9:46am UTC](https://forum.inductiveautomation.com/t/alarm-count-filter/33419/2 "2021-02-19T09:46:30Z")

</div>

Have you figured the user roles out yet?

---

<div class="post-metadata">

**Author:** ![lachguerabdallah](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/lachguerabdallah/32/25558_2.png) [@lachguerabdallah](https://forum.inductiveautomation.com/u/lachguerabdallah)\
**Post date:** [February 19, 2021, 9:56am UTC](https://forum.inductiveautomation.com/t/alarm-count-filter/33419/3 "2021-02-19T09:56:12Z")

</div>

Yes, what do you want to do?

---

<div class="post-metadata">

**Author:** ![PEM.Kaleo](https://avatars.discourse-cdn.com/v4/letter/p/e56c9b/32.png) [@PEM.Kaleo](https://forum.inductiveautomation.com/u/PEM.Kaleo)\
**Post date:** [February 19, 2021, 10:00am UTC](https://forum.inductiveautomation.com/t/alarm-count-filter/33419/4 "2021-02-19T10:00:35Z")

</div>

Actually what you used for filtering is exactly what I’m looking for.

I just had an idea about using a client tag for your request though I assumed you might have figure it out already since this was posted in March.

---

<div class="post-metadata">

**Author:** ![lachguerabdallah](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/lachguerabdallah/32/25558_2.png) [@lachguerabdallah](https://forum.inductiveautomation.com/u/lachguerabdallah)\
**Post date:** [February 19, 2021, 3:45pm UTC](https://forum.inductiveautomation.com/t/alarm-count-filter/33419/5 "2021-02-19T15:45:40Z")

</div>

In the alarm count template, add an internal property ‘source’. put something like that:

```auto
if(hasRole('operator'),'["prov:default:/tag:O*"]',
if(hasRole('admin'),'["prov:default:/tag:A*"]',
'["prov:default:/tag:*"]'))

```

then, you have to include the previous property ‘source’ in the property ‘count’ (the one that returns the number of alarms) something like this:

```auto
if({Alarm Count Label v2.states} = "", 

	0,
	toInt(runScript("len(system.alarm.queryStatus(priority="+{Alarm Count Label v2.priority}+",state="+{Alarm Count Label v2.states}+",source="+{Alarm Count Label v2.source}+"))", {Alarm Count Label v2.UpdateRate}))
)

```

---

<div class="post-metadata">

**Author:** ![PEM.Kaleo](https://avatars.discourse-cdn.com/v4/letter/p/e56c9b/32.png) [@PEM.Kaleo](https://forum.inductiveautomation.com/u/PEM.Kaleo)\
**Post date:** [February 23, 2021, 8:59pm UTC](https://forum.inductiveautomation.com/t/alarm-count-filter/33419/6 "2021-02-23T20:59:18Z")

</div>

thanks for sharing

---

<div class="post-metadata">

**Author:** ![nminchin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nminchin/32/6911_2.png) [@nminchin](https://forum.inductiveautomation.com/u/nminchin)\
**Post date:** [February 23, 2021, 9:12pm UTC](https://forum.inductiveautomation.com/t/alarm-count-filter/33419/7 "2021-02-23T21:12:22Z")

</div>

Just note, if you’re using calls to queryStatus from the Vision gui, you’re going to be decreasing its performance as these calls take a long time relatively and will lock up the gui thread while they run. I’ve had clients perform extremely poorly with these calls.

---

<div class="post-metadata">

**Author:** ![lachguerabdallah](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/lachguerabdallah/32/25558_2.png) [@lachguerabdallah](https://forum.inductiveautomation.com/u/lachguerabdallah)\
**Post date:** [March 2, 2021, 3:52pm UTC](https://forum.inductiveautomation.com/t/alarm-count-filter/33419/8 "2021-03-02T15:52:26Z")

</div>

Do you recommend using a gateway script instead of using an execution script in the expression?

for the alarm counter it would be a gateway script that runs every 5 seconds or so

---

<div class="post-metadata">

**Author:** ![nminchin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nminchin/32/6911_2.png) [@nminchin](https://forum.inductiveautomation.com/u/nminchin)\
**Post date:** [March 2, 2021, 3:53pm UTC](https://forum.inductiveautomation.com/t/alarm-count-filter/33419/9 "2021-03-02T15:53:04Z")

</div>

I use a UDT. Note: you’ll need to create a new Tag Group called ‘Area Alarms’. I set mine to direct 3000ms. You can ignore the Area PLCs for Alarm Reset tag.

![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/f/e/fefadfc8869d1da04974dc2b319a1642e5f7f0fc.png)

```auto
{
  "typeColor": -65536,
  "readOnly": false,
  "dataType": "Int4",
  "writePermissions": {
    "type": "AllOf",
    "securityLevels": []
  },
  "name": "Area Alarms",
  "readPermissions": {
    "type": "AllOf",
    "securityLevels": []
  },
  "tagGroup": "Default",
  "tagType": "UdtType",
  "enabled": true,
  "tags": [
    {
      "valueSource": "expr",
      "expression": "jsonGet({[.]Alarm Summary}, \u0027ActiveUnacked\u0027)",
      "readOnly": false,
      "dataType": "Int4",
      "writePermissions": {
        "type": "AllOf",
        "securityLevels": []
      },
      "name": "Active Unack",
      "executionMode": "TagGroupRate",
      "readPermissions": {
        "type": "AllOf",
        "securityLevels": []
      },
      "tagGroup": "Area Alarms",
      "tagType": "AtomicTag",
      "enabled": true
    },
    {
      "valueSource": "memory",
      "readOnly": false,
      "dataType": "DataSet",
      "writePermissions": {
        "type": "AllOf",
        "securityLevels": []
      },
      "name": "Area PLCs for Alarm Reset",
      "readPermissions": {
        "type": "AllOf",
        "securityLevels": []
      },
      "tagGroup": "Default",
      "value": "{\"columns\":[{\"name\":\"PLCName\",\"type\":\"java.lang.String\"},{\"name\":\"PLCParentPathOverride\",\"type\":\"java.lang.String\"},{\"name\":\"DisableAlarmReset\",\"type\":\"java.lang.Boolean\"}],\"rows\":[]}",
      "enabled": true,
      "tagType": "AtomicTag"
    },
    {
      "valueSource": "expr",
      "expression": "runScript(\r\n\"shared.alarms.getAlarmSummary(\u0027\" + replace({PathToParentFolder}, \u0027Area Alarms\u0027, \u0027\u0027) + \"*\u0027)\"\r\n,2000\r\n)",
      "dataType": "Document",
      "name": "Alarm Summary",
      "tagType": "AtomicTag"
    },
    {
      "valueSource": "expr",
      "expression": "jsonGet({[.]Alarm Summary}, \u0027ActiveAcked\u0027)",
      "readOnly": false,
      "dataType": "Int4",
      "writePermissions": {
        "type": "AllOf",
        "securityLevels": []
      },
      "name": "Active Ack",
      "executionMode": "TagGroupRate",
      "readPermissions": {
        "type": "AllOf",
        "securityLevels": []
      },
      "tagGroup": "Area Alarms",
      "tagType": "AtomicTag",
      "enabled": true
    },
    {
      "valueSource": "expr",
      "expression": "runScript(\r\n\"system.dataset.toDataSet([\u0027source\u0027, \u0027name\u0027],[[str(a.source).split(\u0027:\u0027)[3], a.name] for a in system.alarm.queryStatus(priority\u003d[1,2,3,4], state\u003d[\u0027ActiveUnacked\u0027], path\u003d[\u0027*:/tag:\" + replace({PathToParentFolder}, {InstanceName},\u0027\u0027) + \"*\u0027])])\"\r\n\r\n, 2000\r\n)",
      "dataType": "DataSet",
      "name": "Active Unack Alarms",
      "tagType": "AtomicTag"
    }
  ]
}

```

---

<div class="post-metadata">

**Author:** ![JimmyScrambles](https://avatars.discourse-cdn.com/v4/letter/j/cdc98d/32.png) [@JimmyScrambles](https://forum.inductiveautomation.com/u/JimmyScrambles)\
**Post date:** [February 11, 2022, 12:18am UTC](https://forum.inductiveautomation.com/t/alarm-count-filter/33419/10 "2022-02-11T00:18:43Z")

</div>

This looks like it will do exactly what I want, but I can’t see what’s happening at shared.alarms.getAlarmSummary. Can you show what that function is doing?
