# Automation Professionals' Integration Toolkit Module

**URL:** <https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934>\
**Category:** 3rd Party Modules\
**Tags:** ignition83, vision, ignition81, perspective, scripting\
**Created:** [June 13, 2023, 12:42am UTC](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934 "2023-06-13T00:42:35Z")\
**Posts on this page:** 18\
**Page:** 18

<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:** [July 1, 2026, 11:37am UTC](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934/342 "2026-07-01T11:37:41Z")

</div>

The predefined category keys are defined as constants in [WellKnownTagProps](https://sdk.inductiveautomation.com/javadoc/ignition83/8.3.7/com/inductiveautomation/ignition/common/tags/config/properties/WellKnownTagProps.html) as `CAT_*`. Only those will get an icon in the tag editor tree. Additional strings are defined in bundles by 3rd party modules, and my toolkit supplies a couple. Any other keys used for tag prop categories display with question marks.

---

<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:** [July 1, 2026, 11:39am UTC](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934/343 "2026-07-01T11:39:05Z")

</div>

Raw localized strings (key-less) crash the tag editor. Blank tree, blank list of props, no error thrown. ☹

Raw localized strings are fine for display name and description. (And the only practical way to provide those outside of a 3rd party module.)

---

<div class="post-metadata">

**Author:** ![bmusson](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/bmusson/32/87530_2.png) [@bmusson](https://forum.inductiveautomation.com/u/bmusson)\
**Post date:** [July 1, 2026, 3:42pm UTC](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934/344 "2026-07-01T15:42:08Z")

</div>

> [@pturmel](#):
>
> Blank tree, blank list of props, no error thrown. ☹

Wacky 🤷🏻‍♂️

---

<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:** [August 5, 2026, 3:14pm UTC](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934/345 "2026-08-05T15:14:47Z")

</div>

Automation Professionals is pleased to announce new **Production** releases of this module, with bug fixes to address anomalies in the designer tag browser, discussed over here:

> [@Bad\_NotFound in tag properties](https://forum.inductiveautomation.com/t/bad-notfound-in-tag-properties/116626):
>
> Ignition 8.3.8 , docker environment Hi everyone, When adding any tag from the Siemens S7-1500 PLC field, whether in an OPC-UA connection with a Siemens server or with the new Siemens Enhanced driver, the tag is connected correctly. I read the correct value, but if I expand the tag and view the internal properties, these tags are in Bad\_NotFound. I haven't found anything regarding the functionality. I've tested various tag types, including DTL float arrays, and I get the same error. I repeat, i…

For Ignition v8.3.x: [v2.1.6.262181311](https://www.automation-pros.com/ignition/Integration%20Toolkit-2.1.6.262181311-v83.modl)

For Ignition v8.1.x: [v2.1.6.262171502](https://www.automation-pros.com/ignition/Integration%20Toolkit-2.1.6.262171502-v81.modl)

The tag browser issues do not appear to be other than cosmetic, so upgrading is not urgent.

Edit: v8.3 replaced with minor fix to `@runInGateway` permissions.

---

<div class="post-metadata">

**Author:** ![ryan.white](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/ryan.white/32/73193_2.png) [@ryan.white](https://forum.inductiveautomation.com/u/ryan.white)\
**Post date:** [August 26, 2026, 5:01pm UTC](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934/346 "2026-08-26T17:01:16Z")

</div>

> [@nminchin](#):
>
> pageVarMap

I'm running into something similar to this on a 8.3.8 Gateway and version 2.1.6 of Integration Toolkit. The difference I'm getting is that the expression using this function is giving me an error and not returning a value. The error is citing the `pageVarMap` function specifically.

The module is marked as running with no errors, and I did not see any errors in the log related to the toolkit.

> **Example Binding with Error**
>
> ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/4/c/4c733fae0eed1111b7af3129d36f546b633be895.png)

I did find the following stack trace in the logs as an INFO level message, but since this appears to be firing off on some tags in our tag tree I'm not sure its related to the expression error in the perspective view.

> **Stack Trace**
>
> ```python
> java.lang.LinkageError: loader com.inductiveautomation.ignition.gateway.modules.ModuleClassLoader @59680116 attempted duplicate class definition for com.automation_pros.simaids.gateway.expressions.SessionVarMap. (com.automation_pros.simaids.gateway.expressions.SessionVarMap is in unnamed module of loader com.inductiveautomation.ignition.gateway.modules.ModuleClassLoader @59680116, parent loader com.inductiveautomation.ignition.gateway.modules.NativeLibraryManagerImpl @bc48999)
> 
> at java.base/java.lang.ClassLoader.defineClass1(Native Method)
> 
> at java.base/java.lang.ClassLoader.defineClass(Unknown Source)
> 
> at java.base/java.security.SecureClassLoader.defineClass(Unknown Source)
> 
> at java.base/java.net.URLClassLoader.defineClass(Unknown Source)
> 
> at java.base/java.net.URLClassLoader$1.run(Unknown Source)
> 
> at java.base/java.net.URLClassLoader$1.run(Unknown Source)
> 
> at java.base/java.security.AccessController.doPrivileged(Unknown Source)
> 
> at java.base/java.net.URLClassLoader.findClass(Unknown Source)
> 
> at com.inductiveautomation.ignition.gateway.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:35)
> 
> at com.inductiveautomation.ignition.gateway.modules.ModuleClassLoader.loadClass(ModuleClassLoader.java:102)
> 
> at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
> 
> at com.automation_pros.simaids.gateway.GatewayHook.configureFunctionFactory(GatewayHook.java:102)
> 
> at com.inductiveautomation.ignition.gateway.IgnitionGateway.configureFunctionFactory(IgnitionGateway.java:3100)
> 
> at com.inductiveautomation.ignition.gateway.IgnitionGateway.getExpressionFunctionFactory(IgnitionGateway.java:3088)
> 
> at com.inductiveautomation.ignition.gateway.tags.TagProviderImpl.getExpressionFunctionFactory(TagProviderImpl.java:1299)
> 
> at com.inductiveautomation.ignition.gateway.tags.runtime.nodes.ExecutableTag.getExpressionParseContext(ExecutableTag.java:966)
> 
> at com.inductiveautomation.ignition.gateway.tags.actors.factories.alarming.AlarmingActor.ensureEvaluatorCreated(AlarmingActor.java:299)
> 
> at com.inductiveautomation.ignition.gateway.tags.actors.factories.alarming.AlarmingActor.initialize(AlarmingActor.java:89)
> 
> at com.inductiveautomation.ignition.gateway.tags.runtime.nodes.ExecutableTag.manageActor(ExecutableTag.java:268)
> 
> at com.inductiveautomation.ignition.gateway.tags.runtime.nodes.ExecutableTag.configureActors(ExecutableTag.java:844)
> 
> at com.inductiveautomation.ignition.gateway.tags.runtime.nodes.ExecutableTag.applyPropertyChangesToTag(ExecutableTag.java:655)
> 
> at com.inductiveautomation.ignition.gateway.tags.runtime.nodes.BasicTagDefinition.managePropertyChanges(BasicTagDefinition.java:874)
> 
> at com.inductiveautomation.ignition.gateway.tags.runtime.nodes.BasicTagDefinition.startPropModel(BasicTagDefinition.java:513)
> 
> at com.inductiveautomation.ignition.gateway.tags.runtime.nodes.BasicTagDefinition.activate(BasicTagDefinition.java:1067)
> 
> at com.inductiveautomation.ignition.gateway.tags.runtime.nodes.complex.InheritedExecutableTag.activate(InheritedExecutableTag.java:30)
> 
> at com.inductiveautomation.ignition.gateway.tags.runtime.nodes.BasicTagDefinition.startupInternal(BasicTagDefinition.java:1051)
> 
> at com.inductiveautomation.ignition.gateway.tags.runtime.nodes.BasicTagDefinition.startup(BasicTagDefinition.java:1034)
> 
> at java.base/java.util.ArrayList.forEach(Unknown Source)
> 
> at com.inductiveautomation.ignition.gateway.tags.runtime.nodes.FolderNode.startup(FolderNode.java:443)
> 
> at com.inductiveautomation.ignition.gateway.tags.runtime.ProviderRootNodeImpl.loadConfiguration(ProviderRootNodeImpl.java:364)
> 
> at com.inductiveautomation.ignition.gateway.tags.TagProviderImpl$TagStorageListener.onInitialLoad(TagProviderImpl.java:1534)
> 
> at com.inductiveautomation.ignition.gateway.tags.config.storage.resource.TagConfigLoader$ProcessUDTAction.compute(TagConfigLoader.kt:248)
> 
> at com.inductiveautomation.ignition.gateway.tags.config.storage.resource.TagConfigLoader$ProcessUDTAction.compute(TagConfigLoader.kt:236)
> 
> at java.base/java.util.concurrent.RecursiveTask.exec(Unknown Source)
> 
> at java.base/java.util.concurrent.ForkJoinTask.doExec(Unknown Source)
> 
> at java.base/java.util.concurrent.ForkJoinTask.invokeAll(Unknown Source)
> 
> at com.inductiveautomation.ignition.gateway.tags.config.storage.resource.TagConfigLoader$ProcessUDTAction.compute(TagConfigLoader.kt:255)
> 
> at com.inductiveautomation.ignition.gateway.tags.config.storage.resource.TagConfigLoader$ProcessUDTAction.compute(TagConfigLoader.kt:236)
> 
> at java.base/java.util.concurrent.RecursiveTask.exec(Unknown Source)
> 
> at java.base/java.util.concurrent.ForkJoinTask.doExec(Unknown Source)
> 
> at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Unknown Source)
> 
> at java.base/java.util.concurrent.ForkJoinPool.scan(Unknown Source)
> 
> at java.base/java.util.concurrent.ForkJoinPool.runWorker(Unknown Source)
> 
> at java.base/java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source)
> 
> ```

---

<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:** [August 26, 2026, 5:30pm UTC](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934/347 "2026-08-26T17:30:56Z")

</div>

Haven't been able to reproduce with v8.3.8 yet. Unknown function suggests a problem registering at module startup. Can you send a wrapper log from gateway startup through RUNNING? (To my support email, please.)

---

<div class="post-metadata">

**Author:** ![ryan.white](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/ryan.white/32/73193_2.png) [@ryan.white](https://forum.inductiveautomation.com/u/ryan.white)\
**Post date:** [August 26, 2026, 6:33pm UTC](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934/348 "2026-08-26T18:33:24Z")

</div>

File has been sent your way, hopefully you can gleam something from it.

---

<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:** [August 26, 2026, 6:41pm UTC](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934/349 "2026-08-26T18:41:27Z")

</div>

Yeah, lots of these:

```python
INFO | jvm 2 | 2026/08/26 13:55:12 | I [c.a.s.g.GatewayHook] [13:55:12.484]: Skipped loading Perspective-specific expression functions tag=Tag_Path_3
INFO | jvm 2 | 2026/08/26 13:55:12 | java.lang.LinkageError: loader com.inductiveautomation.ignition.gateway.modules.ModuleClassLoader @4c0cabce attempted duplicate class definition for com.automation_pros.simaids.gateway.expressions.SessionVarMap. (com.automation_pros.simaids.gateway.expressions.SessionVarMap is in unnamed module of loader com.inductiveautomation.ignition.gateway.modules.ModuleClassLoader @4c0cabce, parent loader com.inductiveautomation.ignition.gateway.modules.NativeLibraryManagerImpl @bc48999)
INFO | jvm 2 | 2026/08/26 13:55:12 | at java.base/java.lang.ClassLoader.defineClass1(Native Method)
INFO | jvm 2 | 2026/08/26 13:55:12 | at java.base/java.lang.ClassLoader.defineClass(Unknown Source)
INFO | jvm 2 | 2026/08/26 13:55:12 | at java.base/java.security.SecureClassLoader.defineClass(Unknown Source)
INFO | jvm 2 | 2026/08/26 13:55:12 | at java.base/java.net.URLClassLoader.defineClass(Unknown Source)
INFO | jvm 2 | 2026/08/26 13:55:12 | at java.base/java.net.URLClassLoader$1.run(Unknown Source)
INFO | jvm 2 | 2026/08/26 13:55:12 | at java.base/java.net.URLClassLoader$1.run(Unknown Source)
INFO | jvm 2 | 2026/08/26 13:55:12 | at java.base/java.security.AccessController.doPrivileged(Unknown Source)
INFO | jvm 2 | 2026/08/26 13:55:12 | at java.base/java.net.URLClassLoader.findClass(Unknown Source)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:35)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.modules.ModuleClassLoader.loadClass(ModuleClassLoader.java:102)
INFO | jvm 2 | 2026/08/26 13:55:12 | at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.automation_pros.simaids.gateway.GatewayHook.configureFunctionFactory(GatewayHook.java:102)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.IgnitionGateway.configureFunctionFactory(IgnitionGateway.java:3100)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.IgnitionGateway.getExpressionFunctionFactory(IgnitionGateway.java:3088)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.tags.TagProviderImpl.getExpressionFunctionFactory(TagProviderImpl.java:1299)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.tags.runtime.nodes.ExecutableTag.getExpressionParseContext(ExecutableTag.java:966)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.tags.actors.factories.alarming.AlarmingActor.ensureEvaluatorCreated(AlarmingActor.java:299)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.tags.actors.factories.alarming.AlarmingActor.initialize(AlarmingActor.java:89)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.tags.runtime.nodes.ExecutableTag.manageActor(ExecutableTag.java:268)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.tags.runtime.nodes.ExecutableTag.configureActors(ExecutableTag.java:844)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.tags.runtime.nodes.ExecutableTag.applyPropertyChangesToTag(ExecutableTag.java:655)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.tags.runtime.nodes.BasicTagDefinition.managePropertyChanges(BasicTagDefinition.java:874)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.tags.runtime.nodes.BasicTagDefinition.startPropModel(BasicTagDefinition.java:513)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.tags.runtime.nodes.BasicTagDefinition.activate(BasicTagDefinition.java:1067)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.tags.runtime.nodes.complex.InheritedExecutableTag.activate(InheritedExecutableTag.java:30)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.tags.runtime.nodes.BasicTagDefinition.startupInternal(BasicTagDefinition.java:1051)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.tags.runtime.nodes.BasicTagDefinition.startup(BasicTagDefinition.java:1034)
INFO | jvm 2 | 2026/08/26 13:55:12 | at java.base/java.util.ArrayList.forEach(Unknown Source)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.tags.runtime.nodes.FolderNode.startup(FolderNode.java:443)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.tags.runtime.ProviderRootNodeImpl.loadConfiguration(ProviderRootNodeImpl.java:364)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.tags.TagProviderImpl$TagStorageListener.onInitialLoad(TagProviderImpl.java:1534)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.tags.config.storage.resource.TagConfigLoader$ProcessUDTAction.compute(TagConfigLoader.kt:248)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.tags.config.storage.resource.TagConfigLoader$ProcessUDTAction.compute(TagConfigLoader.kt:236)
INFO | jvm 2 | 2026/08/26 13:55:12 | at java.base/java.util.concurrent.RecursiveTask.exec(Unknown Source)
INFO | jvm 2 | 2026/08/26 13:55:12 | at java.base/java.util.concurrent.ForkJoinTask.doExec(Unknown Source)
INFO | jvm 2 | 2026/08/26 13:55:12 | at java.base/java.util.concurrent.ForkJoinTask.invokeAll(Unknown Source)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.tags.config.storage.resource.TagConfigLoader$ProcessUDTAction.compute(TagConfigLoader.kt:255)
INFO | jvm 2 | 2026/08/26 13:55:12 | at com.inductiveautomation.ignition.gateway.tags.config.storage.resource.TagConfigLoader$ProcessUDTAction.compute(TagConfigLoader.kt:236)
INFO | jvm 2 | 2026/08/26 13:55:12 | at java.base/java.util.concurrent.RecursiveTask.exec(Unknown Source)
INFO | jvm 2 | 2026/08/26 13:55:12 | at java.base/java.util.concurrent.ForkJoinTask.doExec(Unknown Source)
INFO | jvm 2 | 2026/08/26 13:55:12 | at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Unknown Source)
INFO | jvm 2 | 2026/08/26 13:55:12 | at java.base/java.util.concurrent.ForkJoinPool.scan(Unknown Source)
INFO | jvm 2 | 2026/08/26 13:55:12 | at java.base/java.util.concurrent.ForkJoinPool.runWorker(Unknown Source)
INFO | jvm 2 | 2026/08/26 13:55:12 | at java.base/java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source)

```

**BEFORE** this:

```python
INFO | jvm 2 | 2026/08/26 13:55:21 | I [ModuleInstance] [13:55:21.563]: Starting up module 'com.automation_pros.simaids' v2.1.6 (b262181311)... module-name=Integration Toolkit

```

However, I don't understand why anyone would expect it to work in an **expression tag**. It is only documented to work in Perspective expression bindings--it needs access to Perspective's thread locals.

---

<div class="post-metadata">

**Author:** ![ryan.white](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/ryan.white/32/73193_2.png) [@ryan.white](https://forum.inductiveautomation.com/u/ryan.white)\
**Post date:** [August 26, 2026, 6:46pm UTC](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934/350 "2026-08-26T18:46:52Z")

</div>

That's the strange part, those tags were not built / configured to use any of the expression functions from your module. I just installed the module today to use your spreadsheet import tool.

---

<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:** [August 26, 2026, 6:50pm UTC](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934/351 "2026-08-26T18:50:58Z")

</div>

Hmmm. My toolkit declares a dependency on Perspective, to make it possible to reference its classes for the thread locals. I need to experiment some more.

---

<div class="post-metadata">

**Author:** ![ryan.white](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/ryan.white/32/73193_2.png) [@ryan.white](https://forum.inductiveautomation.com/u/ryan.white)\
**Post date:** [August 26, 2026, 7:25pm UTC](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934/352 "2026-08-26T19:25:16Z")

</div>

I'll make it more fun, all the tags listed in the log that I've found are OPC or Memory tags, unless someone made one instance an expression tag somewhere that I missed and that's what is tripping up the module. If I had the full tag path in the log that would make it easier to nail down which one exactly it is.

I looked at the raw JSON of each tag in the log that I could find to make sure there wasn't a leftover expression from someone changing the type of tag.

---

<div class="post-metadata">

**Author:** ![michael.flagler](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/michael.flagler/32/26272_2.png) [@michael.flagler](https://forum.inductiveautomation.com/u/michael.flagler)\
**Post date:** [September 3, 2026, 7:31pm UTC](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934/353 "2026-09-03T19:31:17Z")

</div>

So, I installed this module to try to take advantage of the Tag Actors functionality to republish some value from one device to another. What I noticed though is that there's an `opcServer` parameter that gets added to every tag which seems to possibly conflict with my own 'OPCServer' parameter that we have on all our OPC tags. What is this used for? I've got this value configured on all my tags and while right now the value hasn't been changed, I worry that it may get set by some configuration of the tag actors functionality if I'm ever using a different OPC server for the republish than I am for my tag.

I also didn't see anything in the documentation about it, so was curious if this written to by the module or what the risk is in using the module and conflicting with all of our tags existing parameters.

---

<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:** [September 4, 2026, 11:38am UTC](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934/354 "2026-09-04T11:38:01Z")

</div>

My module _uses_ the `opcServer` prop definition to obtain its acceptable value list for use with the destination OPC Server fields that the tag actors need. Should not change its appearance for other uses.

---

<div class="post-metadata">

**Author:** ![michael.flagler](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/michael.flagler/32/26272_2.png) [@michael.flagler](https://forum.inductiveautomation.com/u/michael.flagler)\
**Post date:** [September 4, 2026, 12:15pm UTC](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934/355 "2026-09-04T12:15:43Z")

</div>

So it's it ok for me to write to it, or is there a chance it will get overwritten by the module?

---

<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:** [September 4, 2026, 6:07pm UTC](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934/356 "2026-09-04T18:07:51Z")

</div>

My module doesn't _write_ to _ **any** _ tag props.

---

<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:** [September 30, 2026, 7:30pm UTC](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934/357 "2026-09-30T19:30:15Z")

</div>

Automation Professionals is pleased to announce a **BETA** of this module, with a single new feature: a [Read Substitution Tag Action](https://www.automation-pros.com/toolkit/doc/actors.html#read-substitution-action).

For Ignition v8.3.\*: ~~v2.1.7.262731920~~

I anticipate backporting this to v8.1 ~~in the near future~~. _Done_

The primary motivation for this feature is to help make clean history for users that have to handle bad quality when machines are turned off or otherwise cease communicating for expected reasons.

---

<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:** [October 6, 2026, 4:34pm UTC](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934/358 "2026-10-06T16:34:23Z")

</div>

Alternate **BETA** over here:

> [@Spreadsheet Import Tool](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500/58):
>
> It's a module loading race with tag provider startup. Try this BETA: [https://www.automation-pros.com/ignition/Integration%20Toolkit-2.1.8.262791318-v83.modl](https://www.automation-pros.com/ignition/Integration%20Toolkit-2.1.8.262791318-v83.modl) (I haven't reproduced this--I need affected users to test for me...) It seems that the gateway hook's configureFunctionFactory is being called on a thread with a different classloader from the gateway hook.

To attempt to address the missing Perspective functions, apparently due to races with tag providers.

---

<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:** [October 7, 2026, 2:39pm UTC](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934/359 "2026-10-07T14:39:09Z")

</div>

Testers have confirmed that v2.1.8 fixes the startup race condition, so I am declaring it a Production Release:

For Ignition 8.3.\*: [v2.1.8.262791318](https://www.automation-pros.com/ignition/Integration%20Toolkit-2.1.8.262791318-v83.modl)

Edit, backport:

For Ignition v8.1.\*: [v2.1.8.262811728](https://www.automation-pros.com/ignition/Integration%20Toolkit-2.1.8.262811728-v81.modl)

[Previous page](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934.md?page=17)
