Group Header Gadget be it be linked to open like a Page?

I’m converting/duplicating a PAC Display project into Groov View. The PAC had many “pop up” screens that were smaller in size then the screen that called the ‘pop up’ screen. They usually have a ‘Close’ button that would ‘close’ the pop up screen. After the pop up closed, you would be left on the screen the pop up was called from.
In Groov View, I have not found these features, so I am attempting to replace all the PAC ‘pop up’ screens using the ‘Group Header’ gadget. I am then using a state of a ‘flag’ in Strategy or create an Event to make the Group Header gadget visible.
My question is this, I am ending up with a lot of Events to open all the Group Header gadgets. Can the group Header gadget be linked to open like a ‘Page’ in Groov View?
I’m thinking not, but I thought I would ask. If not, has anyone come up with more creative ways to display/call a “pop up” screen or message and be on top of the main screen that called it?

I’ve ended up making dedicated pages for all ‘popups’ that would need user interaction (as in save/load/delete screens).

I also didn’t want to make 100+ events to control visibility. So, I end up having Node-Red do a conversion from the PAC Control int32 variables into boolean values and then pass the boolean values to groov VIEW. Then I have arrays of boolean values to use for visibility in groov VIEW.

This approach can run into an issue, because there is only one single-threaded job queue between Node-Red and groov VIEW. So depending on how many variables, and how fast you want to have visibility change, you can quickly overflow this queue and it will stop transmitting.

I work around this with selective use of the rbe node in NR and splitting my Visibility boolean arrays into multiple smaller arrays and only transmitting the select variables that are actually changing. This prevents overflow for me. – see attached flow but not sure how clear my code is.

[{"id":"e96b9086.91fb58","type":"pac-read","z":"7dcf805a.da93f","device":"da7a377f.2e79c8","dataType":"int32-table","tagName":"ntTEMP_DisplayVars","tableStartIndex":"","tableLength":"","value":"","valueType":"msg.payload","topic":"DisplayVars","topicType":"user","name":"","x":330,"y":440,"wires":[["7c200e3a.d19ed8"]]},{"id":"f78c078e.b43868","type":"inject","z":"7dcf805a.da93f","name":"","topic":"","payload":"","payloadType":"date","repeat":"0.33","crontab":"","once":false,"onceDelay":"2","x":130,"y":440,"wires":[["e96b9086.91fb58","a3fd4d.69695ab"]]},{"id":"bc5bef8b.9beb1","type":"groov-write-ds","z":"7dcf805a.da93f","dataStore":"6961d0ec.3296a","tagName":"","tableStartIndex":"","value":"payload.value","valueType":"msg","name":"","x":1150,"y":381,"wires":[[]]},{"id":"6dff7f70.ea652","type":"function","z":"7dcf805a.da93f","name":"process","func":"var data = []; var data1 = []; var data2 = []; var data3 = [];\nNo_of_SS = msg.payload.ControlType.length - 5; //current number of SS minus the 5 hardwired Limit controllers\nfor(j = 0; j < No_of_SS; j++)\n{\n    if(msg.payload.ControlType[j] <= 1)  //if SS is enabled (0=PLC; 1=On/Off; 2=Disabled; 3=Limit)\n    {\n        for(i = 1; i < 6; i++)  //each SS has 5 types of variables used create a profile\n        {\n          if (msg.payload.DisplayVars[i+j*5] >= 1)\n          {\n            data.push({ tagName : 'Prof_DisVars_Typ0',\n                        tableStartIndex : i+j*5,\n                        value : true});     \n          } else{\n            data.push({ tagName : 'Prof_DisVars_Typ0',\n                        tableStartIndex : i+j*5,\n                        value : false});    }            \n                        \n          if (msg.payload.DisplayVars[i+j*5] == 1)\n          {\n            data1.push({ tagName : 'Prof_DisVars_Typ1',\n                        tableStartIndex : i+j*5,\n                        value : true});     \n          } else{\n            data1.push({ tagName : 'Prof_DisVars_Typ1',\n                        tableStartIndex : i+j*5,\n                        value : false});    }               \n                      \n          if (msg.payload.DisplayVars[i+j*5] == 2)\n          {\n            data2.push({ tagName : 'Prof_DisVars_Typ2',\n                        tableStartIndex : i+j*5,\n                        value : true});     \n          } else{\n            data2.push({ tagName : 'Prof_DisVars_Typ2',\n                        tableStartIndex : i+j*5,\n                        value : false});    }\n                       \n          if (msg.payload.DisplayVars[i+j*5] == 3)\n          {\n            data3.push({ tagName : 'Prof_DisVars_Typ3',\n                        tableStartIndex : i+j*5,\n                        value : true});     \n          } else{\n            data3.push({ tagName : 'Prof_DisVars_Typ3',\n                        tableStartIndex : i+j*5,\n                        value : false});    }    \n        }\n    }\n}\nreturn [{payload : data }, {payload : data1 },\n        {payload : data2 },{payload : data3 }]; // this object array becomes the new payload\n        \n        \n        ","outputs":4,"noerr":0,"x":700,"y":441,"wires":[["c49e2de7.186e6"],["8f26c4a2.6f313"],["6f45590c.20574"],["96a922f6.35667"]]},{"id":"f732073f.df3f28","type":"split","z":"7dcf805a.da93f","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":990,"y":381,"wires":[["bc5bef8b.9beb1"]]},{"id":"c49e2de7.186e6","type":"rbe","z":"7dcf805a.da93f","name":"","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":850,"y":381,"wires":[["f732073f.df3f28"]]},{"id":"6f45590c.20574","type":"rbe","z":"7dcf805a.da93f","name":"","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":850,"y":475,"wires":[["e67b0880.c4cfe"]]},{"id":"8f26c4a2.6f313","type":"rbe","z":"7dcf805a.da93f","name":"","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":850,"y":428,"wires":[["18056a59.af87fe"]]},{"id":"96a922f6.35667","type":"rbe","z":"7dcf805a.da93f","name":"","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":850,"y":522,"wires":[["9e48a5f7.3b7368"]]},{"id":"390bab8d.6f111c","type":"groov-write-ds","z":"7dcf805a.da93f","dataStore":"6961d0ec.3296a","tagName":"","tableStartIndex":"","value":"payload.value","valueType":"msg","name":"","x":1150,"y":428,"wires":[[]]},{"id":"18056a59.af87fe","type":"split","z":"7dcf805a.da93f","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":990,"y":428,"wires":[["390bab8d.6f111c"]]},{"id":"c9842c32.69e12","type":"groov-write-ds","z":"7dcf805a.da93f","dataStore":"6961d0ec.3296a","tagName":"","tableStartIndex":"","value":"payload.value","valueType":"msg","name":"","x":1150,"y":475,"wires":[[]]},{"id":"e67b0880.c4cfe","type":"split","z":"7dcf805a.da93f","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":990,"y":475,"wires":[["c9842c32.69e12"]]},{"id":"44a64a8a.d0faac","type":"groov-write-ds","z":"7dcf805a.da93f","dataStore":"6961d0ec.3296a","tagName":"","tableStartIndex":"","value":"payload.value","valueType":"msg","name":"","x":1150,"y":522,"wires":[[]]},{"id":"9e48a5f7.3b7368","type":"split","z":"7dcf805a.da93f","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":990,"y":522,"wires":[["44a64a8a.d0faac"]]},{"id":"165764b5.890beb","type":"comment","z":"7dcf805a.da93f","name":"Show/Hide SS Variables during Profile Create - Tied to Create_Profile Chart in PAC Control","info":"","x":360,"y":380,"wires":[]},{"id":"7c200e3a.d19ed8","type":"join","z":"7dcf805a.da93f","name":"","mode":"custom","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"2","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":550,"y":441,"wires":[["6dff7f70.ea652"]]},{"id":"a3fd4d.69695ab","type":"pac-read","z":"7dcf805a.da93f","device":"da7a377f.2e79c8","dataType":"int32-table","tagName":"ntSET_ControlType","tableStartIndex":"","tableLength":"","value":"","valueType":"msg.payload","topic":"ControlType","topicType":"user","name":"","x":320,"y":491,"wires":[["7c200e3a.d19ed8"]]},{"id":"da7a377f.2e79c8","type":"pac-device","z":"","address":"localhost","protocol":"https"},{"id":"6961d0ec.3296a","type":"groov-data-store","z":"","project":"e81a7d90.07d29","dsName":"VIEW_Variables"},{"id":"e81a7d90.07d29","type":"groov-project","z":"","address":"localhost"}]

Eric, Thanks for the ideas. Currently I only have 25 Events that I’m using visibility purposes, not all for the “pop ups” or my use of the ‘Group Header’ gadget’s that I’m going to use to replace many of the old PAC Display “pop up” screens. I’m guessing I’ll end up with 30 or so, so maybe not to bad. I haven’t ventured into Node-Red yet, but I think as the project progresses I will. Could you expound on your 'dedicated page(s) for all ‘popups’… Sounds interesting, not sure it would work for my application, but worth looking into.

Hi DWatts,
Let me verify that I understand your challenge: You’re faking a popup window by creating a bunch of gadgets whose visibility is controlled by a tag created just for that purpose. For appearances, you put all the gadgets within a group header to give it a window-like look. The problem is that you need many different windows so you need even more gadgets. Say each “window” has 5 gadgets, and then you need 5 windows, so you have to manage the visibility of 25 gadgets.

If this is an accurate depiction of your situation, it reminds me of a prototype I built several years ago: I used pointer variables in PAC Control to control which tags were being represented by one set of gadgets. I had a warehouse with 20 door gadgets. If you wanted a different warehouse, you’d choose one, and all 20 door gadgets would get reassigned to the doors of the 2nd warehouse. This could be made more elegant by newer features of groov that could display a different group header gadget or other cosmetic art with each selection.

Does this sound close? Let me know. I work at Opto so I’ll be easy to find.

john garrett (Illustrator)

Let me try this: The PAC Display project I am re-creating in an Groov View application that will be running on the EPIC system, has many smaller display’s that are called ‘popup xxx’ that called from a button on a full sized display (operator input) or from a condition in the Opto controller. These conditions could be an over temperature, a state of a flag when not energized (=0), etc. These conditions are also used for Visibility for these smaller displays “popups” in PAC Display. Many of these smaller displays “popups” have a button that will close itself and disappear from the full size screen in the background. All of these smaller displays “popups”, when reproduced in Groov View do not look or act as the same screen in PAC Display. I can not resize the “popup” screen to be smaller, I can not have a button that will close the “popup” screen, etc. So I have found that if I create the same PAC Display “popup” screen using the ‘Group Header’ gadget and use an Event of other condition to control visibility, this seems to work. I can then also lessen the overall Groov View Pages when running the project. So right now its not to overwhelming, just trying to find, possibly, simpler method of creating “popup” like pages in Groov View. I hope I explained it a little better? Would an archive of the PAC Display Project make it easier to see what I’m trying to explain. Assuming you have the tools/software to open an archived PAC Display Project. Dave

Thanks for elaborating. I don’t have a suggestion for you, but I hate to give up without looking at your archived project. If you’d like to send it to me, email me at I could take a look tomorrow morning and let you know if any ideas come to mind.

I make new pages on groov View for each type of pop-up. Then use the Auto Navigator gadget to control when the “pop up” is triggered. Then on the “pop up” page I use a Page Navigator gadget (with Display Mode = Button) to navigate back, or to confirm, or to take whatever action.

This method runs into a problem though because the Auto Navigator gadget can not use PAC Control Int32 variables as Tags. So that’s where Events come in handy. Hope that helps.

I also dont use the drop down menu to navigate between pages in groov View. I set my project up like @Beno does in this post. This means I can have all the pages I want on the back end without it becoming an eyesore or making navigation difficult.

ok , ill do that


Eric, We did a project with Opto early on with Groov on a Linux platform. They, Ben was a huge help, developed some custom gadgets etc. It turned out real nice, we’re actually expected to get an order for 12 more units with that system pretty soon. But I digress. Even with all the custom gadgets, we fully utilized the ‘Auto Navigator’ gadget then the ‘Hidden Auto Navigator’ gadget. This was pre ‘visibility’ in Groov View. Every page that called a popup or another page that required to go ‘back’ to the main page had to have a separate page created. Many of the ‘popups’ are Abort, Alarm, Warning message screens that are called from many displays. That racked up the total Page count a lot, which is what I’m trying to avoid with the many new gadgets in Groov View. I am, initially, trying to re-create the PAC Display displays and functionality first. Once we have it running with Groov View, we plan to ‘tweak’ the displays/pages as we test and add/remove parts. So it will get better. Who knows, maybe Groov View will get more cool gadgets.
Thanks for your input

1 Like

Thanks for all the advice & tips on this issue. I’ve been working with John Garrett of Opto Tech Support. After reviewing my project, it seems that what I’m doing is the correct path for my application, at this time. As Groov View adds functionality, I’m sure there will be simpler ways to accomplish what I am doing.