# Automation Professionals' Integration Toolkit Module

**URL:** <https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934>\
**Category:** 3rd Party Modules\
**Tags:** ignition83, scripting, ignition81, vision, perspective\
**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:** 1\
**Showing post:** 1

<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:** [June 13, 2023, 12:42am UTC](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934/1 "2023-06-13T00:42:35Z")

</div>

Automation Professionals is pleased to announce the immediately availability of a major upgrade to its **free** ~~Simulation Aids~~ **Integration Toolkit** module. The new feature justifying the "major upgrade" language is the implementation of ~~**eleven**~~ **_thirty-one_** new expression functions which use **iteration** to accomplish complex transforms of datasets and lists, to or from other datasets and lists, applying filtering, ordering, and computed new columns along the way. While there are certain operations that are still only available in the view() expression function, most of its functionality is now available **without** calling jython code.

Available for Ignition v8.1 **only** : ~~v2.0.0.231640004~~

_Visit my [Module Sales](https://www.automation-pros.com/modulesales.html) page for the latest._

The list handling and generation code, including the handling of nested mappings, has no equivalent among the scripted functions, and is intended to accommodate the more complex data structures of Perspective. As with many of the technologies I implement, performance is the primary motivation for this work.

The online documentation has been updated ~~in place~~ , so both the module showcase and my Module Sales pages link to the [latest content](https://www.automation-pros.com/toolkit/doc/).

This functionality is also a stretch for the expression language foundation, as noted over here:

> [@Dynamic Dataset creation for template repeater Vision](https://forum.inductiveautomation.com/t/dynamic-dataset-creation-for-template-repeater-vision/74800/5):
>
> Funny you should say that. I had to stay home today, so my thumb twiddling has been off in that sort of left field....

Paul's statement, only four days old, is no longer true. 😁

There are debug loggers for the key iteration functions that report performance. Put "simaids" into the logger search box to get to them quickly.

If you would like a quick start to see these functions in action, I've been playing with this view:

> **View JSON**
>
> ```python
> {
> "custom": {},
> "params": {},
> "props": {},
> "root": {
> "children": [
> {
> "children": [
> {
> "custom": {
> "filtered": [
> "Folsom",
> "Helsinki",
> "San Francisco",
> "Washington, DC",
> "Wellington",
> "Sydney",
> "Wellington"
> ],
> "filteredDS": {
> "$": [
> "ds",
> 192,
> 1686616771960
> ],
> "$columns": [
> {
> "data": [
> "Folsom",
> "Helsinki",
> "Jakarta",
> "Madrid",
> "Prague",
> "San Diego",
> "San Francisco",
> "Shanghai",
> "Tokyo",
> "Washington, DC",
> "Wellington",
> "Delhi",
> "Dhaka",
> "Lagos",
> "Karachi",
> "Istanbul",
> "Cairo",
> "Mexico City",
> "London",
> "New York City",
> "Tehran",
> "Bogota",
> "Rio de Janeiro",
> "Riyadh",
> "Singapore",
> "Saint Petersburg",
> "Sydney",
> "Abidjan",
> "Dar es Salaam",
> "Wellington",
> "Los Angeles",
> "Berlin",
> "Jeddah",
> "Kabul",
> "Mashhad",
> "Milan",
> "Kiev",
> "Rome",
> "Chicago",
> "Osaka",
> "Bandung",
> "Managua",
> "Paris",
> "Shiraz",
> "Manila",
> "Montreal",
> "Guadalajara",
> "Dallas",
> "Yerevan",
> "Tunis"
> ],
> "name": "city",
> "type": "String"
> },
> {
> "data": [
> "United States",
> "Finland",
> "Indonesia",
> "Spain",
> "Czech Republic",
> "United States",
> "United States",
> "China",
> "Japan",
> "United States",
> "New Zealand",
> "India",
> "Bangladesh",
> "Nigeria",
> "Pakistan",
> "Turkey",
> "Egypt",
> "Mexico",
> "United Kingdom",
> "United States",
> "Iran",
> "Colombia",
> "Brazil",
> "Saudi Arabia",
> "Singapore",
> "Russia",
> "Australia",
> "Ivory Coast",
> "Tanzania",
> "New Zealand",
> "United States",
> "Germany",
> "Saudi Arabia",
> "Afghanistan",
> "Iran",
> "Italy",
> "Ukraine",
> "Italy",
> "United States",
> "Japan",
> "Indonesia",
> "Nicaragua",
> "France",
> "Iran",
> "Philippines",
> "Canada",
> "Mexico",
> "United States",
> "Armenia",
> "Tunisia"
> ],
> "name": "country",
> "type": "String"
> },
> {
> "data": [
> 77271,
> 635591,
> 10187595,
> 3233527,
> 1241664,
> 1406630,
> 884363,
> 24153000,
> 13617000,
> 658893,
> 405000,
> 11034555,
> 14399000,
> 16060303,
> 14910352,
> 14025000,
> 10230350,
> 8974724,
> 8825001,
> 8622698,
> 8154051,
> 7878783,
> 6429923,
> 5676621,
> 5535000,
> 5191690,
> 208374,
> 4765000,
> 4364541,
> 405000,
> 3884307,
> 3517424,
> 3456259,
> 3414100,
> 3001184,
> 1359905,
> 2908703,
> 2877215,
> 2695598,
> 2691742,
> 2575478,
> 2560789,
> 2229621,
> 1869001,
> 1780148,
> 1649519,
> 1495189,
> 1317929,
> 1060138,
> 1056247
> ],
> "name": "population",
> "type": "int"
> }
> ]
> },
> "rawData": [
> {
> "city": {
> "align": "center",
> "editable": true,
> "justify": "left",
> "style": {
> "backgroundColor": "#F7901D",
> "classes": "some-class"
> },
> "value": "Folsom"
> },
> "country": "United States",
> "population": 77271
> },
> {
> "city": "Helsinki",
> "country": "Finland",
> "population": 635591
> },
> {
> "city": "Jakarta",
> "country": "Indonesia",
> "population": 10187595
> },
> {
> "city": "Madrid",
> "country": "Spain",
> "population": 3233527
> },
> {
> "city": "Prague",
> "country": "Czech Republic",
> "population": 1241664
> },
> {
> "city": "San Diego",
> "country": "United States",
> "population": 1406630
> },
> {
> "city": "San Francisco",
> "country": "United States",
> "population": 884363
> },
> {
> "city": "Shanghai",
> "country": "China",
> "population": 24153000
> },
> {
> "city": "Tokyo",
> "country": "Japan",
> "population": 13617000
> },
> {
> "city": "Washington, DC",
> "country": "United States",
> "population": 658893
> },
> {
> "city": "Wellington",
> "country": "New Zealand",
> "population": 405000
> },
> {
> "city": "Delhi",
> "country": "India",
> "population": 11034555
> },
> {
> "city": "Dhaka",
> "country": "Bangladesh",
> "population": 14399000
> },
> {
> "city": "Lagos",
> "country": "Nigeria",
> "population": 16060303
> },
> {
> "city": "Karachi",
> "country": "Pakistan",
> "population": 14910352
> },
> {
> "city": "Istanbul",
> "country": "Turkey",
> "population": 14025000
> },
> {
> "city": "Cairo",
> "country": "Egypt",
> "population": 10230350
> },
> {
> "city": "Mexico City",
> "country": "Mexico",
> "population": 8974724
> },
> {
> "city": "London",
> "country": "United Kingdom",
> "population": 8825001
> },
> {
> "city": "New York City",
> "country": "United States",
> "population": 8622698
> },
> {
> "city": "Tehran",
> "country": "Iran",
> "population": 8154051
> },
> {
> "city": "Bogota",
> "country": "Colombia",
> "population": 7878783
> },
> {
> "city": "Rio de Janeiro",
> "country": "Brazil",
> "population": 6429923
> },
> {
> "city": "Riyadh",
> "country": "Saudi Arabia",
> "population": 5676621
> },
> {
> "city": "Singapore",
> "country": "Singapore",
> "population": 5535000
> },
> {
> "city": "Saint Petersburg",
> "country": "Russia",
> "population": 5191690
> },
> {
> "city": "Sydney",
> "country": "Australia",
> "population": 208374
> },
> {
> "city": "Abidjan",
> "country": "Ivory Coast",
> "population": 4765000
> },
> {
> "city": "Dar es Salaam",
> "country": "Tanzania",
> "population": 4364541
> },
> {
> "city": "Wellington",
> "country": "New Zealand",
> "population": 405000
> },
> {
> "city": "Los Angeles",
> "country": "United States",
> "population": 3884307
> },
> {
> "city": "Berlin",
> "country": "Germany",
> "population": 3517424
> },
> {
> "city": "Jeddah",
> "country": "Saudi Arabia",
> "population": 3456259
> },
> {
> "city": "Kabul",
> "country": "Afghanistan",
> "population": 3414100
> },
> {
> "city": "Mashhad",
> "country": "Iran",
> "population": 3001184
> },
> {
> "city": "Milan",
> "country": "Italy",
> "population": 1359905
> },
> {
> "city": "Kiev",
> "country": "Ukraine",
> "population": 2908703
> },
> {
> "city": "Rome",
> "country": "Italy",
> "population": 2877215
> },
> {
> "city": "Chicago",
> "country": "United States",
> "population": 2695598
> },
> {
> "city": "Osaka",
> "country": "Japan",
> "population": 2691742
> },
> {
> "city": "Bandung",
> "country": "Indonesia",
> "population": 2575478
> },
> {
> "city": "Managua",
> "country": "Nicaragua",
> "population": 2560789
> },
> {
> "city": "Paris",
> "country": "France",
> "population": 2229621
> },
> {
> "city": "Shiraz",
> "country": "Iran",
> "population": 1869001
> },
> {
> "city": "Manila",
> "country": "Philippines",
> "population": 1780148
> },
> {
> "city": "Montreal",
> "country": "Canada",
> "population": 1649519
> },
> {
> "city": "Guadalajara",
> "country": "Mexico",
> "population": 1495189
> },
> {
> "city": "Dallas",
> "country": "United States",
> "population": 1317929
> },
> {
> "city": "Yerevan",
> "country": "Armenia",
> "population": 1060138
> },
> {
> "city": "Tunis",
> "country": "Tunisia",
> "population": 1056247
> }
> ]
> },
> "meta": {
> "name": "Table1"
> },
> "position": {
> "basis": "400px",
> "grow": 1
> },
> "propConfig": {
> "custom.constList": {
> "binding": {
> "config": {
> "expression": "asList(\u0027Hello\u0027, \"Cruel\", \"World\", 56, \"Today\")"
> },
> "type": "expr"
> }
> },
> "custom.constMap": {
> "binding": {
> "config": {
> "expression": "asMap(\u0027key1\u0027, \u0027Value1\u0027, \"key2\", \"Another\", \u0027key3\u0027, \u0027Cruel\u0027, \u0027key4\u0027, \u0027World\u0027)"
> },
> "type": "expr"
> }
> },
> "custom.filtered": {
> "access": "PRIVATE",
> "binding": {
> "config": {
> "expression": "forEach({this.props.data}, if(it()[\u0027population\u0027] \u003c 1000000, unMap(it()[\u0027city\u0027], \u0027value\u0027), null))"
> },
> "previewEnabled": false,
> "type": "expr"
> },
> "persistent": true
> },
> "custom.filteredDS": {
> "access": "PRIVATE",
> "binding": {
> "config": {
> "expression": "unionAll(\n\tasList(\u0027city\u0027, \u0027country\u0027, \u0027population\u0027),\n\tasList(\u0027str\u0027, \u0027str\u0027, \u0027i\u0027),\n\tforEach(\n\t\t{this.props.data},\n\t\tasList(unMap(it()[\u0027city\u0027], \u0027value\u0027), it()[\u0027country\u0027], it()[\u0027population\u0027])\n\t)\n)"
> },
> "type": "expr"
> },
> "persistent": true
> },
> "custom.rawData": {
> "access": "PRIVATE"
> },
> "props.data": {
> "binding": {
> "config": {
> "expression": "forEach(\n\t{this.custom.filteredDS},\n\tasMap(it())\n)"
> },
> "type": "expr"
> }
> }
> },
> "type": "ia.display.table"
> }
> ],
> "meta": {
> "name": "FlexContainer"
> },
> "position": {
> "basis": "34px",
> "grow": 1
> },
> "props": {
> "direction": "column"
> },
> "type": "ia.container.flex"
> }
> ],
> "meta": {
> "name": "root"
> },
> "props": {
> "direction": "column"
> },
> "type": "ia.container.flex"
> }
> }
> 
> ```

Note: the new stuff is only lightly tested. The changes were sufficiently non-invasive that I consider the balance of the module to still be production-grade.

Edit: Name changed with v2.0.14 release.

## New Wiki Topic

As of April 14, 2025, for usage discussions and guidance. Please do not ask usage questions in **this** announcements topic going forward. Use the Wiki:

> [@Integration Toolkit Solutions Wiki](https://forum.inductiveautomation.com/t/integration-toolkit-solutions-wiki/105080):
>
> By popular request, I've created this topic to be used in wiki mode for collaborative generation of solutions to particular problems. To keep this neat, please follow these guidelines: New problems seeking solutions should be posted as replies, and the discussion of that problem kept within that comment, wiki-style. A one-line summary should be added to this topic starter, with an embedded link (not on its own line). After posting, be sure to convert the comment to operate in wiki mode.

---

_[View the full topic](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934)._
