If the complexity is not too high perhaps you can use simple mustache syntax in a template node and the use a UI template.
Have a look on session tags: http://mustache.github.io/mustache.5.html
<!DOCTYPE html>
<html>
<head></head>
<body>
<ul>{{#payload.Device_Num_338.states}}
<li>{{id}}, {{variable}}, {{value}}</li>
{{/payload.Device_Num_338.states}}
</ul>
</body>
</html>
Flow:
[{"id":"7990827b.2a24bc","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"69133e4e.4a38e","type":"inject","z":"7990827b.2a24bc","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":140,"y":180,"wires":[["20325d4.738c4a2"]]},{"id":"20325d4.738c4a2","type":"function","z":"7990827b.2a24bc","name":"Build JSON","func":"msg.payload =\n\n{\n \"Device_Num_338\": {\n \"states\": [\n {\n \"id\": 168,\n \"service\": \"urn:micasaverde-com:serviceId:SecuritySensor1\",\n \"variable\": \"Armed\",\n \"value\": \"0\"\n },\n {\n \"id\": 169,\n \"service\": \"urn:micasaverde-com:serviceId:SecuritySensor1\",\n \"variable\": \"Tripped\",\n \"value\": \"0\"\n },\n {\n \"id\": 170,\n \"service\": \"urn:micasaverde-com:serviceId:SecuritySensor1\",\n \"variable\": \"LastTrip\",\n \"value\": \"1536256617\"\n },\n {\n \"id\": 171,\n \"service\": \"urn:micasaverde-com:serviceId:SecuritySensor1\",\n \"variable\": \"Timestamp\",\n \"value\": \"06/09 18:56:57\"\n },\n {\n \"id\": 172,\n \"service\": \"urn:micasaverde-com:serviceId:SecuritySensor1\",\n \"variable\": \"PreviousLastTrip\",\n \"value\": \"1523470055\"\n },\n {\n \"id\": 173,\n \"service\": \"urn:micasaverde-com:serviceId:SecuritySensor1\",\n \"variable\": \"PreviousTimestamp\",\n \"value\": \"11/04 19:11:31\"\n },\n {\n \"id\": 174,\n \"service\": \"urn:micasaverde-com:serviceId:SecuritySensor1\",\n \"variable\": \"TripsSoFar\",\n \"value\": \"2\"\n },\n {\n \"id\": 175,\n \"service\": \"urn:micasaverde-com:serviceId:HaDevice1\",\n \"variable\": \"LastUpdate\",\n \"value\": \"1536256622\"\n },\n {\n \"id\": 176,\n \"service\": \"urn:micasaverde-com:serviceId:HaDevice1\",\n \"variable\": \"Configured\",\n \"value\": \"0\"\n },\n {\n \"id\": 177,\n \"service\": \"urn:nodecentral-net:serviceId:SecuritySensor1\",\n \"variable\": \"TripCount\",\n \"value\": \"1\"\n }\n ],\n \"Jobs\": [],\n \"tooltip\": {\n \"display\": 0\n },\n \"status\": -1\n },\n \"LoadTime\": 1536263791,\n \"DataVersion\": 263795575,\n \"UserData_DataVersion\": 263791113,\n \"TimeStamp\": 1536273233,\n \"ZWaveStatus\": 1,\n \"LocalTime\": \"2018-09-06 23:33:53 N\"\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":310,"y":180,"wires":[["7b2d95a0.82ba0c"]]},{"id":"7b2d95a0.82ba0c","type":"template","z":"7990827b.2a24bc","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<!DOCTYPE html>\n<html>\n <head></head>\n <body>\n <ul>{{#payload.Device_Num_338.states}}\n <li>{{id}}, {{variable}}, {{value}}</li>\n {{/payload.Device_Num_338.states}}\n </ul>\n</body>\n</html>","x":480,"y":180,"wires":[["39d2007b.a60e"]]},{"id":"c9e53e6d.2497c","type":"debug","z":"7990827b.2a24bc","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":790,"y":180,"wires":[]},{"id":"39d2007b.a60e","type":"ui_template","z":"7990827b.2a24bc","group":"3dfd1195.df4f4e","name":"","order":0,"width":"6","height":"10","format":"<div ng-bind-html=\"msg.payload\"></div>","storeOutMessages":true,"fwdInMessages":true,"templateScope":"local","x":640,"y":180,"wires":[["c9e53e6d.2497c"]]},{"id":"3dfd1195.df4f4e","type":"ui_group","z":"","name":"Test","tab":"d50effcd.c6b68","disp":true,"width":"6","collapse":false},{"id":"d50effcd.c6b68","type":"ui_tab","z":"","name":"Test","icon":"dashboard","order":5}]