# \[FEATURE\] Add option to system.tag.getConfiguration to match output of tag browser \`copy JSON\`

**URL:** <https://forum.inductiveautomation.com/t/feature-add-option-to-system-tag-getconfiguration-to-match-output-of-tag-browser-copy-json/62807>\
**Category:** Ignition\
**Created:** [August 9, 2022, 3:16am UTC](https://forum.inductiveautomation.com/t/feature-add-option-to-system-tag-getconfiguration-to-match-output-of-tag-browser-copy-json/62807 "2022-08-09T03:16:36Z")\
**Posts on this page:** 16\
**Page:** 1

<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:** [August 9, 2022, 3:16am UTC](https://forum.inductiveautomation.com/t/feature-add-option-to-system-tag-getconfiguration-to-match-output-of-tag-browser-copy-json/62807/1 "2022-08-09T03:16:36Z")

</div>

When you use `system.tag.getConfiguration` to get the configuration of UDt instances, it retrieves all non-default configuration of the UDT definition’s tags by deep recursively searching.  
If you compare this to the Tag Browser’s `copy JSON` functionality, this only copies the properties of the UDT definition tags that are overridden at face value, as well as of the `name` and `tagType`.

When using `getConfiguration` with `configure`, the output from `copy JSON` is required otherwise you will essentially be overriding the UDT Instance tags with all of the non-default properties that have been set on the tags in the UDT Definition, thus defeating the purpose of a UDT.

For example, take this UDT Definition:

```auto
{
  "name": "TEST",
  "tagType": "UdtType",
  "tags": [
    {
      "valueSource": "memory",
      "name": "New Tag",
      "tooltip": "This is a great tag!",
      "value": 999,
      "tagType": "AtomicTag",
      "engUnit": "bob"
    }
  ]
}

```

This is the output from Copy JSON copying an instance of this UDT:

```auto
{
  "name": "Test Instance",
  "typeId": "_TESTING/TEST",
  "tagType": "UdtInstance",
  "tags": [
    {
      "name": "New Tag",
      "tagType": "AtomicTag"
    }
  ]
}

```

And this is the output from `system.tag.getConfiguration`:

```auto
[{
        "path": "[default]_TESTING/Test Instance",
        "tagType": "UdtInstance",
        "name": "Test Instance",
        "typeId": "_TEST/TEST",
        "tags": [{
                "path": "New Tag",
                "tooltip": "This is a great tag!",
                "tagType": "AtomicTag",
                "name": "New Tag",
                "engUnit": "bob",
                "valueSource": "memory",
                "value": "999"
            }
        ]
    }
]

```

If I was to use `configure` with the `getConfiguration` output, I would apply all of that tag config as overrides in the instance, thus practically unlinking all of the tag config from the UDT definition

I’m requesting that an argument be added into the getConfiguration function to determine what configuration to get: all non-default properties using a deep recursive search, or just the non-defaults at face value.

Vote here:

> **[Add option to system.tag.getConfiguration to match output of tag browser...](https://ideas.inductiveautomation.com/ignition-features-and-ideas/p/add-option-to-systemtaggetconfiguration-to-match-output-of-tag-browser-copy-json)**

---

<div class="post-metadata">

**Author:** ![Nathan\_Foster](https://avatars.discourse-cdn.com/v4/letter/n/ecd19e/32.png) [@Nathan\_Foster](https://forum.inductiveautomation.com/u/Nathan_Foster)\
**Post date:** [January 29, 2023, 9:19pm UTC](https://forum.inductiveautomation.com/t/feature-add-option-to-system-tag-getconfiguration-to-match-output-of-tag-browser-copy-json/62807/2 "2023-01-29T21:19:41Z")

</div>

I am needing this exact feature. Below is my temporary fix. Definitely not the most efficient, but works for me.

```auto
def getTagConfigStr(tagPath):
	filePath = system.file.getTempFile('.json')
	system.tag.exportTags(filePath, [tagPath])
	tagConfigStr = system.file.readFileAsString(filePath)
	
	return tagConfigStr

def getTagConfigObj(tagPath):
	return system.util.jsonDecode(getTagConfigStr(tagPath))	

```

---

<div class="post-metadata">

**Author:** ![Nathan\_Foster](https://avatars.discourse-cdn.com/v4/letter/n/ecd19e/32.png) [@Nathan\_Foster](https://forum.inductiveautomation.com/u/Nathan_Foster)\
**Post date:** [February 1, 2023, 11:44am UTC](https://forum.inductiveautomation.com/t/feature-add-option-to-system-tag-getconfiguration-to-match-output-of-tag-browser-copy-json/62807/3 "2023-02-01T11:44:14Z")

</div>

Update: Thanks to FrankP, no IO required!

```auto
def getTagConfigStr(tagPath):
	return system.tag.exportTags(tagPaths = [tagPath])
	
def getTagConfigObj(tagPath):
	return system.util.jsonDecode(getTagConfigStr(tagPath))	

```

---

<div class="post-metadata">

**Author:** ![richardNZ15](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/richardnz15/32/33373_2.png) [@richardNZ15](https://forum.inductiveautomation.com/u/richardNZ15)\
**Post date:** [April 26, 2023, 5:04am UTC](https://forum.inductiveautomation.com/t/feature-add-option-to-system-tag-getconfiguration-to-match-output-of-tag-browser-copy-json/62807/4 "2023-04-26T05:04:52Z")

</div>

Does it surprise anyone that the alarm "Enabled" property is not behaving correctly when using this method?  
I was super stoked to find this method and use it for returning Alarm overridden properties.  
But see the following:

Screenshot of a parent UDT definition "Basic/Bool" which has alarm enabled set to FALSE:

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

Screenshot of a UDT instance where the alarm has been overridden to have a MEDIUM priority, and Enabled set to TRUE (amongst other things):

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/b/5/b5091f3bac79b4b60c49bf93a4f19d9700101081.png)

Output of tag right click "Copy JSON". Note that no "enabled" property comes back...:

```auto
{
  "tagGroup": {
    "bindType": "parameter",
    "binding": "{Device}_Direct"
  },
  "eventScripts": [
    {
      "eventid": "alarmAcked",
      "script": "\tsystem.tag.writeBlocking([\"[.]Value\"], [0])"
    }
  ],
  "alarms": [
    {
      "setpointA": 1.0,
      "AlarmType": "Process",
      "name": "Alarm",
      "priority": "Medium",
      "TagType": "Bool",
      "TagName": {
        "bindType": "UDTParameter",
        "value": "{InstanceName}"
      },
      "TagPath": {
        "bindType": "Expression",
        "value": "{itemPath}"
      },
      "displayPath": {
        "bindType": "Expression",
        "value": "{InstanceName} + \": \" + {Description}"
      },
      "RoleString": {
        "bindType": "UDTParameter",
        "value": "{RoleString}"
      }
    }
  ],
  "name": "Value",
  "tagType": "AtomicTag"
}

```

,  
I also notice that ANY bound "Associated Data" properties are returned iwth the "Copy JSON" function as well, even when they are exactly the same bindings / properties to the parent UDT....

Pretty sad to discover this to be honest, and weeping a bit that it is so difficult to deal with alarm tags and overrides and re-configuring with scripting..

---

<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:** [April 26, 2023, 5:17am UTC](https://forum.inductiveautomation.com/t/feature-add-option-to-system-tag-getconfiguration-to-match-output-of-tag-browser-copy-json/62807/5 "2023-04-26T05:17:34Z")

</div>

😰  
that doesn't sound ideal...

---

<div class="post-metadata">

**Author:** ![richardNZ15](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/richardnz15/32/33373_2.png) [@richardNZ15](https://forum.inductiveautomation.com/u/richardNZ15)\
**Post date:** [April 26, 2023, 5:21am UTC](https://forum.inductiveautomation.com/t/feature-add-option-to-system-tag-getconfiguration-to-match-output-of-tag-browser-copy-json/62807/6 "2023-04-26T05:21:22Z")

</div>

Beginning to think that it is because at some point between UDT instance being created, and now, the parent UDT definition was changed, where Alarm enabled was changed from TRUE to FALSE.

Which **could** explain this behavour. Which implies the tags config is static somewhat and not updated realtime.  
And may need some kind of refresh to get updated.  
Will do some testing and see what i find..

---

<div class="post-metadata">

**Author:** ![Jay\_Baker](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/jay_baker/32/35448_2.png) [@Jay\_Baker](https://forum.inductiveautomation.com/u/Jay_Baker)\
**Post date:** [April 30, 2023, 9:54pm UTC](https://forum.inductiveautomation.com/t/feature-add-option-to-system-tag-getconfiguration-to-match-output-of-tag-browser-copy-json/62807/7 "2023-04-30T21:54:00Z")

</div>

Has this changed recently? Because I'm having the opposite problem...when I call system.tag.getConfiguration with a tag based on a UDT, I do get the UDT binding info, but I really want the actual values (for display to the user). Really need to have a flag you can pass in to specify what output you actually want.

```auto
[
   {
      "u""historyEnabled":true,
      "u""historyProvider":"u""US_KS_GAR01",
      "u""path":[US_KS_GAR01]"TestInstanceTag/TestParamTag",
      "u""tagType":"AtomicTag",
      "u""name":"u""TestParamTag",
      "u""deadband":{
         "bindType=parameter",
         "binding="{
            "Value_Deadband"
         }
      },
      "u""historyTimeDeadband":10,
      "u""engUnit":{
         "bindType=parameter",
         "binding="{
            "Value_EngUnit"
         }
      },
      "u""valueSource":"u""memory",
      "u""historyMaxAge":60,
      "u""value":3
   }
]

```

---

<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:** [April 30, 2023, 11:23pm UTC](https://forum.inductiveautomation.com/t/feature-add-option-to-system-tag-getconfiguration-to-match-output-of-tag-browser-copy-json/62807/8 "2023-04-30T23:23:57Z")

</div>

I assume you're talking about getting the actual values of the bound props? (e.g. engUnit). In that case, this has always returned what you're seeing; it's never returned the resultant values. Although that _would_ be super useful to be able to get.

If you want to get the actual values at the moment, you'll need to read them with `system.tag.readBlocking`

e.g.

```auto
system.tag.readBlocking(['tag/path/pump01/status.engUnit'])

```

---

<div class="post-metadata">

**Author:** ![Jay\_Baker](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/jay_baker/32/35448_2.png) [@Jay\_Baker](https://forum.inductiveautomation.com/u/Jay_Baker)\
**Post date:** [May 1, 2023, 12:34am UTC](https://forum.inductiveautomation.com/t/feature-add-option-to-system-tag-getconfiguration-to-match-output-of-tag-browser-copy-json/62807/9 "2023-05-01T00:34:53Z")

</div>

Yep, exactly. It's just a bit painful this way - you've always got to check whether a binding or an actual value is returned for each property, then look up the value. Would be great if you could just ask it to give you what you wanted in the first place!

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [May 1, 2023, 12:53am UTC](https://forum.inductiveautomation.com/t/feature-add-option-to-system-tag-getconfiguration-to-match-output-of-tag-browser-copy-json/62807/10 "2023-05-01T00:53:27Z")

</div>

Seems pretty clear to me. Read for values, getConfiguration for, well, _configuration_. 🤷‍♂️

---

<div class="post-metadata">

**Author:** ![Jay\_Baker](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/jay_baker/32/35448_2.png) [@Jay\_Baker](https://forum.inductiveautomation.com/u/Jay_Baker)\
**Post date:** [May 1, 2023, 12:58am UTC](https://forum.inductiveautomation.com/t/feature-add-option-to-system-tag-getconfiguration-to-match-output-of-tag-browser-copy-json/62807/11 "2023-05-01T00:58:30Z")

</div>

> [@nminchin](#):
>
> `system.tag.readBlocking`

I mean, I see what you're saying 🙂

BUT - system.tag.readBlocking is just reading a specific tag (or list of tags), right? I was using system.tag.getConfiguration to get the full recursive list of tags, with all of their details. If readBlocking had a recursion option that would work nicely, but as it stands it takes some extra work.

(Not the end of the world, just a little inconvenient)

---

<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:** [May 1, 2023, 1:21am UTC](https://forum.inductiveautomation.com/t/feature-add-option-to-system-tag-getconfiguration-to-match-output-of-tag-browser-copy-json/62807/12 "2023-05-01T01:21:13Z")

</div>

I would argue that tag configuration properties _are_ configuration, regardless if they're bound or not. If you want the configuration property values of a tag, currently it's far more work than should be needed to get this when you have bound properties

---

<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:** [May 1, 2023, 1:26am UTC](https://forum.inductiveautomation.com/t/feature-add-option-to-system-tag-getconfiguration-to-match-output-of-tag-browser-copy-json/62807/13 "2023-05-01T01:26:19Z")

</div>

> [@Jay\_Baker](#):
>
> you've always got to check whether a binding or an actual value is returned for each property, then look up the value

To make it simpler, I would just compile a list of all tagpaths of properties returned from getConfiguration, and just read them all again with readBlocking.  
That is, if the configuration returns:

```auto
[
   {
      "u""historyEnabled":true,
      "u""historyProvider":"u""US_KS_GAR01",
      "u""path":[US_KS_GAR01]"TestInstanceTag/TestParamTag",
      "u""tagType":"AtomicTag",
      "u""name":"u""TestParamTag",
      "u""deadband":{
         "bindType=parameter",
         "binding="{
            "Value_Deadband"
         }
      },
      "u""historyTimeDeadband":10,
      "u""engUnit":{
         "bindType=parameter",
         "binding="{
            "Value_EngUnit"
         }
      },
      "u""valueSource":"u""memory",
      "u""historyMaxAge":60,
      "u""value":3
   }
]

```

then compile a list of all of the tag properties from this:

```auto
[US_KS_GAR01]"TestInstanceTag/TestParamTag.historyEnabled
[US_KS_GAR01]"TestInstanceTag/TestParamTag.historyProvider
[US_KS_GAR01]"TestInstanceTag/TestParamTag.deadband
[US_KS_GAR01]"TestInstanceTag/TestParamTag.historyTimeDeadband
[US_KS_GAR01]"TestInstanceTag/TestParamTag.engUnit
....

```

and then read the whole lot with readBlocking. It's a bit inefficient because you're re-reading property values that you've already got from getConfiguration, but it's less code than trying to only read the bound props and combining it with the values you've already got from getConfiguration.

---

<div class="post-metadata">

**Author:** ![Chris\_Bingham](https://avatars.discourse-cdn.com/v4/letter/c/e5b9ba/32.png) [@Chris\_Bingham](https://forum.inductiveautomation.com/u/Chris_Bingham)\
**Post date:** [February 20, 2024, 2:56pm UTC](https://forum.inductiveautomation.com/t/feature-add-option-to-system-tag-getconfiguration-to-match-output-of-tag-browser-copy-json/62807/14 "2024-02-20T14:56:11Z")

</div>

I'm wondering if this behavior is because the default value for an alarm IS 'true'. If you change your Path/To/Tag/Alarms/Alarm.Enabled property to 'false' and then copy JSON again, does the property show up?

(Edit to add my experience):  
I performed a 'Copy JSON' from an existing tag of an instance UDT, pasted to notepad, no alarm objects appeared in the JSON:

```auto
{
  "name": "TEST_TAG",
  "tagType": "AtomicTag"
}

```

I then Edited the tag, and clicked to override the single alarm that was configured:

```auto
{
  "alarms": [
    {
      "mode": "Inequality",
      "ackPipeline": "MyPipeline",
      "activePipeline": "MyPipeline",
      "name": "Alarm",
      "clearPipeline": "MyPipeline",
      "priority": "High",
      "label": {
        "bindType": "Expression",
        "value": "{pMyParameter}"
      },
      "displayPath": {
        "bindType": "Expression",
        "value": "{pMyParameter}"
      }
    }
  ],
  "name": "TEST_TAG",
  "tagType": "AtomicTag"
}

```

I then modified the value of the alarm.enabled property and copied JSON again:

```auto
{
  "alarms": [
    {
      "mode": "Inequality",
      "ackPipeline": "MyPipeline",
      "activePipeline": "MyPipeline",
      "name": "Alarm",
      "clearPipeline": "MyPipeline",
      "priority": "High",
      "enabled": false,
      "label": {
        "bindType": "Expression",
        "value": "{pMyParameter}"
      },
      "displayPath": {
        "bindType": "Expression",
        "value": "{pMyParameter}"
      }
    }
  ],
  "name": "TEST_TAG",
  "tagType": "AtomicTag"
}

```

---

<div class="post-metadata">

**Author:** ![Chris\_Bingham](https://avatars.discourse-cdn.com/v4/letter/c/e5b9ba/32.png) [@Chris\_Bingham](https://forum.inductiveautomation.com/u/Chris_Bingham)\
**Post date:** [April 22, 2026, 12:51am UTC](https://forum.inductiveautomation.com/t/feature-add-option-to-system-tag-getconfiguration-to-match-output-of-tag-browser-copy-json/62807/15 "2026-04-22T00:51:44Z")

</div>

Now available in ~~8.3.5~~ 8.3.6!

> [@Nightly 8.3 Changelogs - 2026 and beyond](https://forum.inductiveautomation.com/t/nightly-8-3-changelogs-2026-and-beyond/113010/59):
>
> **IGN-15470: Add 'local' parameter to system.tag.getConfiguration**  
> Added an 'overridesOnly' parameter to system.tag.getConfiguration. If the tag is a member of a UDT then only the overridden properties will be returned, otherwise the parameter will have no effect.

I’m rarely this excited to throw away so much hard work (that went into my solution/workaround for this problem)…

---

<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:** [April 22, 2026, 6:43am UTC](https://forum.inductiveautomation.com/t/feature-add-option-to-system-tag-getconfiguration-to-match-output-of-tag-browser-copy-json/62807/16 "2026-04-22T06:43:11Z")

</div>

NICE! Extra words!
