MQTT Logger Dashboard UI

Based on http://www.steves-internet-guide.com/node-red-mqtt-topic-logger/, https://flows.nodered.org/flow/db68bd4934cf46f39e6e453a348bc419 and https://discourse.nodered.org/t/file-manager-in-node-red-dashboard/14350

[{"id":"db25dd5a.e0843","type":"tab","label":"Logger","disabled":false,"info":""},{"id":"6d525419.52a28c","type":"tab","label":"API","disabled":false,"info":""},{"id":"f0e9ef5f.a6f1e","type":"tab","label":"Files list","disabled":false,"info":""},{"id":"bcb09db2.e2dbe","type":"mqtt-broker","z":"","name":"","broker":"192.168.1.158","port":"1883","clientid":"test-client","usetls":false,"compatmode":true,"keepalive":"120","cleansession":true,"birthTopic":"sensors/connected/test-client","birthQos":"0","birthRetain":"true","birthPayload":"1","closeTopic":"","closePayload":"","willTopic":"sensors/connected/test-client","willQos":"0","willRetain":"true","willPayload":"0"},{"id":"c4656ecc.45506","type":"ui_group","z":"","name":"Control","tab":"d75883da.a335a","order":1,"disp":true,"width":"4","collapse":false},{"id":"fe00b70d.acef98","type":"ui_group","z":"","name":"Status","tab":"d75883da.a335a","order":1,"disp":true,"width":"6","collapse":false},{"id":"d75883da.a335a","type":"ui_tab","z":"","name":"Logger","icon":"dashboard"},{"id":"6a2614e1.a923ec","type":"mqtt-broker","z":"","name":"","broker":"AccessRunMosquittoTest","port":"8883","tls":"","clientid":"node_red_logger","usetls":true,"compatmode":true,"keepalive":"120","cleansession":true,"birthTopic":"logger","birthQos":"1","birthRetain":"true","birthPayload":"connected","closeTopic":"logger","closeQos":"1","closeRetain":"true","closePayload":"disconnected","willTopic":"logger","willQos":"1","willRetain":"true","willPayload":"disconected"},{"id":"cb8e26b1.e5c788","type":"ui_group","z":"","name":"Control","tab":"c5ec777c.266718","order":1,"disp":true,"width":"4","collapse":false},{"id":"b3944424.c4b8d8","type":"ui_group","z":"","name":"Status","tab":"c5ec777c.266718","order":1,"disp":true,"width":"6","collapse":false},{"id":"c5ec777c.266718","type":"ui_tab","z":"","name":"Logger","icon":"dashboard"},{"id":"2b98e52e.0a550a","type":"ui_base","theme":{"name":"theme-light","lightTheme":{"default":"#0094CE","baseColor":"#0094CE","baseFont":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif","edited":true,"reset":false},"darkTheme":{"default":"#097479","baseColor":"#097479","baseFont":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif","edited":false},"customTheme":{"name":"Untitled Theme 1","default":"#4B7930","baseColor":"#4B7930","baseFont":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif"},"themeState":{"base-color":{"default":"#0094CE","value":"#0094CE","edited":false},"page-titlebar-backgroundColor":{"value":"#0094CE","edited":false},"page-backgroundColor":{"value":"#fafafa","edited":false},"page-sidebar-backgroundColor":{"value":"#ffffff","edited":false},"group-textColor":{"value":"#1bbfff","edited":false},"group-borderColor":{"value":"#ffffff","edited":false},"group-backgroundColor":{"value":"#ffffff","edited":false},"widget-textColor":{"value":"#111111","edited":false},"widget-backgroundColor":{"value":"#0094ce","edited":false},"widget-borderColor":{"value":"#ffffff","edited":false},"base-font":{"value":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif"}},"angularTheme":{"primary":"indigo","accents":"blue","warn":"red","background":"grey"}},"site":{"name":"Node-RED Dashboard","hideToolbar":"false","allowSwipe":"false","lockMenu":"false","allowTempTheme":"true","dateFormat":"DD/MM/YYYY","sizes":{"sx":48,"sy":48,"gx":6,"gy":6,"cx":6,"cy":6,"px":0,"py":0}}},{"id":"766ec601.6e92f8","type":"ui_group","z":"","name":"Current Configuration","tab":"c5ec777c.266718","order":3,"disp":true,"width":"6","collapse":false},{"id":"23b37928.750596","type":"ui_group","z":"","name":"Data Export","tab":"42bee7d8.fe01e8","order":1,"disp":true,"width":"12"},{"id":"42bee7d8.fe01e8","type":"ui_tab","z":"","name":"Dashboard","icon":"dashboard","order":1},{"id":"5ff01aa4.224074","type":"ui_group","z":"","name":"Drive List","tab":"611bf602.42f2e8","order":3,"disp":true,"width":"12","collapse":true},{"id":"3e39db3a.30b694","type":"ui_group","z":"","name":"File List","tab":"611bf602.42f2e8","order":4,"disp":true,"width":"6","collapse":true},{"id":"611bf602.42f2e8","type":"ui_tab","z":"","name":"Files","icon":"dashboard","disabled":false,"hidden":false},{"id":"d960e773.485bf8","type":"ui_group","z":"","name":"Refresh","tab":"611bf602.42f2e8","order":3,"disp":true,"width":"6","collapse":true},{"id":"789d3ecd.309a3","type":"function","z":"db25dd5a.e0843","name":"Store Data","func":"var local=flow.get('local') || {};\nvar topic=msg.topic;\nvar payload=msg.payload;\nvar last_payload=\"\";\nvar msg2={};\nvar by_topic=local.by_topic || true; // log by topic\nvar all_data=local.all_data || true; // log all data or only changed data\nvar store_time=local[\"store_time\"] ||true;\nvar store_topic=local[\"store_topic\"] ||true;\nvar start_logger=local[\"start_logger\"] || true;\nvar ignore_switches=local['ignore-switches'] || true;\nvar max_size =5000000; //maximum log file size\n\n//node.log(\" topic =\"+topic +\"message \"+msg.payload);\n//node.log(\" store topic =\"+ store_topic +start_logger);\n//\nfunction get_filename(topic,payload)\n{\n\n if (!(topic in local))\n\tlocal[topic]={}; //create\n\nvar filename=local[topic][\"cf_name\"] || \"log000.txt\";\n\n//node.log(filename);\nvar cf_counter=local[topic].cf_counter || 0;\nvar cf_size=local[topic].cf_size || 0;\n//node.log(\"file size=\"+cf_size +\" counter  \"+cf_counter);\ncf_size = cf_size +payload.length;\n\nif (cf_size>max_size)\n{\n//node.log(\"size limit reached\")\ncf_counter+=1\nvar count=cf_counter.toString();\nif (count.length==1)\ncount=\"00\"+count;\nif (count.length==2)\ncount=\"0\"+count;\n//\nfilename=\"log\"+count+\".txt\";\ncf_size=0;\n}\n//node.log(\"file size=\"+cf_size +\" counter  \"+cf_counter);\n//\nlocal[topic][\"cf_name\"]=filename;\nlocal[topic][\"cf_counter\"]= cf_counter;\nlocal[topic][\"cf_size\"]= cf_size;\nflow.set(\"local\",local);\nmsg2.payload=cf_counter;\n\n//\nreturn filename;\n\n\n}\nfunction message_changed(payload,topic)\n{\n  \tif (!local.all_data) //not logging all data\n\t {  \n\t\tif (!(local[topic]===undefined)) //test exists\n\t\t{\n\t\n\t\tlast_payload=local[topic][\"last_payload\"];\n\n\t\t//node.log(\"last payload \"+ last_payload);\n\t\t//node.log(\"This payload \"+ payload);\n\t\t}\n\t\telse\n\t\t\t\tlocal[\"topic\"]={}; //initialise\n\n\t\t//\n\t\tif (payload===last_payload)\n\t\t{\n\t\t//node.log(\"same data \"+topic +\"not logging\");\n\t\treturn false;\n\t\t}\n\t}  \n\treturn true;\n}\n\n//node.log(\"start_logger is \"+start_logger);\n\nif (start_logger) {\n    //node.log(\"logging all data \"+local.all_data+ \"by topic\"+local.by_topic);\n    //\n    var d = new Date();\n    var t = d.getTime();\n    try {\n        new_payload=JSON.parse(payload); //convert to javascript\n        //node.log(\"data is already Json\");\n        payload=new_payload;\n    } catch (e){\n    \t//node.log(\"data is not Json\");\n    }\n    \n    if (store_time && store_topic)\n    \tpayload={\"time\":t,\"payload\":payload,\"topic\":topic};\n    if (store_time && !store_topic)\n    \tpayload={\"time\":t,\"payload\":payload};\n    if (!store_time && store_topic)\n    \tpayload={\"payload\":payload,\"topic\":topic};\n    if (!store_time && !store_topic)\n    \tpayload={\"payload\":payload};\n\n    payload=JSON.stringify(payload);\n    //node.log(\"payload is \",payload);\n\n    if (local.by_topic == true)\n        var topic = msg.topic;\n    else\n        var topic = \"default\";\n    \n    var filename = get_filename(topic, payload);\n\n    l = topic.length;\n    if (topic[l-1] !=\"/\")\n    msg.filename = \"/data/logs/\"+ topic +\"/\"+filename;\n    else\n    msg.filename = \"/data/logs/\"+ topic +filename;\n    //node.log(\"filename= \"+msg.filename);\n    msg.payload=payload;\n    if(message_changed(payload,topic))\n    {\n    local[topic][\"last_payload\"]=payload;\n    flow.set('local',local);\n    \n    return [msg,msg2];\n    }\n    else\n    return [null,msg2];\n}\n\nreturn [null,null];","outputs":2,"noerr":0,"initialize":"","finalize":"","x":390,"y":140,"wires":[["a57b80de.29302","77dddf6.d42d82"],["fab81943.82c798","201ea66d.a9285a"]]},{"id":"b3018e21.bf775","type":"mqtt in","z":"db25dd5a.e0843","name":"","topic":"ats/#","qos":"0","datatype":"auto","broker":"6a2614e1.a923ec","x":90,"y":140,"wires":[["789d3ecd.309a3"]]},{"id":"a57b80de.29302","type":"file","z":"db25dd5a.e0843","name":"log sensor data","filename":"","appendNewline":true,"createDir":true,"overwriteFile":"false","x":620,"y":140,"wires":[[]]},{"id":"365b8013.8e257","type":"switch","z":"db25dd5a.e0843","name":"","property":"payload","propertyType":"msg","rules":[{"t":"neq","v":"local.all_data","vt":"flow"}],"checkall":"false","repair":false,"outputs":1,"x":630,"y":360,"wires":[["424f099f.06fc68"]]},{"id":"bb73847c.724d58","type":"ui_switch","z":"db25dd5a.e0843","name":"","label":"All Data","tooltip":"","group":"cb8e26b1.e5c788","order":2,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"ALL-DATA","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","x":440,"y":360,"wires":[["365b8013.8e257"]]},{"id":"424f099f.06fc68","type":"switch","z":"db25dd5a.e0843","name":"","property":"local.ignore_switches","propertyType":"flow","rules":[{"t":"false"},{"t":"true"}],"checkall":"false","repair":false,"outputs":2,"x":750,"y":360,"wires":[["c784021e.3d21c"],["12abd65a.7905ca"]]},{"id":"12abd65a.7905ca","type":"change","z":"db25dd5a.e0843","name":"reset state all data","rules":[{"t":"set","p":"payload","pt":"msg","to":"local.all_data","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":150,"y":360,"wires":[["bb73847c.724d58"]]},{"id":"11cc03ba.5c7bec","type":"change","z":"db25dd5a.e0843","name":"reset state","rules":[{"t":"set","p":"payload","pt":"msg","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":130,"y":300,"wires":[["bb73847c.724d58","7ff0c396.b65c0c","ef1d5e92.330c4","f0c73ed7.63db7"]]},{"id":"c784021e.3d21c","type":"function","z":"db25dd5a.e0843","name":"Log All Data","func":"var local = flow.get('local') || {};\n\nif (local.ignore_switches) {\n    return [msg1, {}, local];\n}\n\nlocal.all_data = msg.payload;\n\nflow.set('local', local);\n\nnode.log(\"all_data \" + msg.payload);\n\nreturn [{}, local];\n","outputs":2,"noerr":0,"initialize":"","finalize":"","x":950,"y":360,"wires":[["fab81943.82c798"],["4453f06b.e1d21","c667bb5f.1ce318","5b460ad7.0eab64","3a770e45.7b6742","f7acb410.e48fa8"]]},{"id":"b67fde56.64ef6","type":"ui_button","z":"db25dd5a.e0843","name":"","group":"cb8e26b1.e5c788","order":0,"width":0,"height":0,"passthru":true,"label":"RESET","tooltip":"","color":"","bgcolor":"","icon":"","payload":"true","payloadType":"bool","topic":"RESET","x":380,"y":220,"wires":[["11cc03ba.5c7bec","632e8cff.3bd524","34815aff.370a06","77dddf6.d42d82"]]},{"id":"7ff0c396.b65c0c","type":"ui_switch","z":"db25dd5a.e0843","name":"","label":"Store Topic","tooltip":"","group":"cb8e26b1.e5c788","order":4,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"STORE-TOPIC","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","x":450,"y":480,"wires":[["d6372d9.8156fd"]]},{"id":"ef1d5e92.330c4","type":"ui_switch","z":"db25dd5a.e0843","name":"","label":"Store Date-Time","tooltip":"","group":"cb8e26b1.e5c788","order":4,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"STORE-TIME","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","x":460,"y":540,"wires":[["b342e303.2415f"]]},{"id":"f0c73ed7.63db7","type":"ui_switch","z":"db25dd5a.e0843","name":"","label":"Log By Topic","tooltip":"","group":"cb8e26b1.e5c788","order":3,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"BY-TOPIC","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","x":450,"y":420,"wires":[["89847b2d.ad1ff8"]]},{"id":"5bf6e125.be577","type":"ui_text","z":"db25dd5a.e0843","group":"b3944424.c4b8d8","order":0,"width":0,"height":0,"name":"","label":"Stop/Start","format":"{{msg.payload}}","layout":"row-spread","x":1220,"y":220,"wires":[]},{"id":"fab81943.82c798","type":"ui_text","z":"db25dd5a.e0843","group":"b3944424.c4b8d8","order":0,"width":0,"height":0,"name":"","label":"Status","format":"{{msg.payload}}","layout":"row-spread","x":1210,"y":260,"wires":[]},{"id":"4453f06b.e1d21","type":"ui_text","z":"db25dd5a.e0843","group":"766ec601.6e92f8","order":0,"width":0,"height":0,"name":"","label":"Logging","format":"{{msg.start_logger}}","layout":"row-spread","x":1220,"y":300,"wires":[]},{"id":"c667bb5f.1ce318","type":"ui_text","z":"db25dd5a.e0843","group":"766ec601.6e92f8","order":0,"width":0,"height":0,"name":"","label":"All Data","format":"{{msg.all_data}}","layout":"row-spread","x":1220,"y":360,"wires":[]},{"id":"201ea66d.a9285a","type":"debug","z":"db25dd5a.e0843","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":690,"y":260,"wires":[]},{"id":"fdfaf873.7c01e8","type":"inject","z":"db25dd5a.e0843","name":"Set Initial switch states","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"init","payload":"true","payloadType":"bool","x":140,"y":220,"wires":[["b67fde56.64ef6"]]},{"id":"632e8cff.3bd524","type":"function","z":"db25dd5a.e0843","name":"Reset Switches","func":"flow.set('local', {\n    start_logger: msg.payload,\n    all_data: true,\n    by_topic: true,\n    store_time: true,\n    store_topic: true,\n    ignore_switches: msg.payload,\n});\n\nnode.log(\"State reseted!\");\n\nreturn[{payload: \"Logging Stopped\"}, {payload: \"Manual Reset\"}, flow.get('local')];\n","outputs":3,"noerr":0,"initialize":"","finalize":"","x":960,"y":220,"wires":[["5bf6e125.be577"],["fab81943.82c798"],["4453f06b.e1d21","f7acb410.e48fa8"]]},{"id":"34815aff.370a06","type":"ui_switch","z":"db25dd5a.e0843","name":"","label":"Start Logging","tooltip":"","group":"cb8e26b1.e5c788","order":1,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"START","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","x":450,"y":300,"wires":[["21303d3a.8f5512"]]},{"id":"e282e4e4.fbe028","type":"function","z":"db25dd5a.e0843","name":"Set Switches","func":"var local=flow.get('local') || {};\nvar topic=msg.topic;\nvar msg1={};\nvar msg2={};\nmsg2.payload=\"\";\nvar by_topic=local[\"by_topic\"]|| false; // log by topic\nvar all_data=local[\"all_data\"] || true; // log all data or only changed data\nvar store_time=local[\"store_time\"] ||false;\nvar store_topic=local[\"store_topic\"] ||false;\nvar start_logger=local[\"start_logger\"] || false;\nvar ignore_switches=local['ignore-switches'] || false;\npayload=msg.payload;\nnode.log(\"in switch status\");\n\nfunction reset()\n{\nlocal={};\nlocal[\"all_data\"]=true\n local[\"by_topic\"]=false;   \n local[\"store_topic\"]=false; \n local[\"all_data\"]=true;\n local[\"store_time\"]=false;  \n local['ignore-switches']=false;\n local[\"start_logger\"]=false;\n \n}\n\tif (topic==\"RESET\")\n\t{\n\t    reset(); //reset stored data to default\n\t    flow.set('local',local);\n\t    msg2.payload=\"Manual Reset\";\n\t    node.log(\"start_logger is \"+local[\"start_logger\"]);\n\t    msg1.payload=\"Logging Stopped\";\n\t    return[msg1,msg2];\n\t    \n\t}\n\n\tif (topic==\"START\")\n\t{\n\t\tif (payload){\n\t\t\tnode.log(\"start_logger \");\n\t\t\tlocal[\"start_logger\"]=payload;\n\t\t\tlocal['ignore-switches']=true;\n\t\t\tflow.set('local',local);\n\t\t\tnode.log(\"start_logger \"+local.start_logger)\n\t\t\tmsg1.payload=\"Logging started\";\n\t\t\t\n\t\t\treturn [msg1,msg2];\n\t\t}\n\telse\n\t{\n\t\t\tmsg1.payload=\"Logging Stopped\";\n\t\t\tlocal[\"start_logger\"]=false;\n\t\t\treset(); //reset stored data to default\n\t\t\tflow.set('local',local);\n\t\t\tmsg2.payload=false //reset switches\n\t\t\treturn [msg1,msg2];\n\t}\n\t}\n\t\t\n\tif (topic==\"BY-TOPIC\" && !ignore_switches)\n\t{\n\t\tif (payload)\n\t\t{\n\t\t  local[\"by_topic\"]=true;\n\t\t  flow.set('local',local);\n\t\t  return [null,msg2];\n\t\t}\n\t\telse\n\t\t{\n\t\t  local[\"by_topic\"]=false;\n\t\t  flow.set('local',local);\n\t\t  return [null,msg2];\n\t\t}\t\n\t}\n\tif (topic==\"ALL-DATA\" && !ignore_switches)\n\t{\n\t\tif (payload)\n\t\t{\n\n\t\t  local[\"all_data\"]=true;\n\t\t  flow.set('local',local);\n\t\t  return [null,msg2];\n\t\t}\n\t\telse\n\t\t{\n\n\t\t  local[\"all_data\"]=false;\n\t\t  flow.set('local',local);\n\t\t  return [null,msg2];\n\t\t}\n\t}\n\tif (topic==\"STORE-TOPIC\" && !ignore_switches)\n\t{\n\t\tif (payload)\n\t\t{\n\t\t  local[\"store_topic\"]=true;\n\t\t  flow.set('local',local);\n\t\t return [null,msg2];\n\t\t}\n\telse\n\t\t{\n\t\t  local[\"store_topic\"]=false;\n\t\t  flow.set('local',local);\n\t\t  return [null,msg2];\n\t\t}\n\t}\n\t\n\tif (topic==\"STORE-TIME\" && !ignore_switches)\n\t{\n\t\tif (payload)\n\t\t{\n\t\t  local[\"store_time\"]=true;\n\t\t  flow.set('local',local);\n\t\t return [null,msg2];\n\t\t}\n\telse\n\t\t{\n\t\t  local[\"store_time\"]=false;\n\t\t  flow.set('local',local);\n\t\t return [null,msg2];\n\t\t}\n\t}\t\t\n\n\n\n\n","outputs":2,"noerr":0,"initialize":"","finalize":"","x":970,"y":580,"wires":[[],[]]},{"id":"19b9e092.85847f","type":"change","z":"db25dd5a.e0843","name":"reset state store topic","rules":[{"t":"set","p":"payload","pt":"msg","to":"local.store_topic","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":160,"y":480,"wires":[["7ff0c396.b65c0c"]]},{"id":"95a0e643.8e7728","type":"change","z":"db25dd5a.e0843","name":"reset state store time","rules":[{"t":"set","p":"payload","pt":"msg","to":"local.store_time","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":160,"y":540,"wires":[["ef1d5e92.330c4"]]},{"id":"f89d8486.5b5018","type":"change","z":"db25dd5a.e0843","name":"reset state by topic","rules":[{"t":"set","p":"payload","pt":"msg","to":"local.by_topic","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":150,"y":420,"wires":[["f0c73ed7.63db7"]]},{"id":"21303d3a.8f5512","type":"function","z":"db25dd5a.e0843","name":"Start Logging","func":"var msg1 = {payload: \"\"};\nvar msg2 = {payload: \"\"};\nvar local = flow.get('local') || {};\n\nlocal.start_logger = msg.payload;\nlocal.ignore_switches = msg.payload;\n\nflow.set('local', local);\n\nif (msg.payload) {\n\tmsg1.payload=\"Logging Started\";\n} else {\n\tmsg1.payload=\"Logging Stopped\";\n}\n\nnode.log(\"start_logger \" + msg.payload);\n\nreturn [msg1, {}, local];\n","outputs":3,"noerr":0,"initialize":"","finalize":"","x":950,"y":300,"wires":[["5bf6e125.be577"],["fab81943.82c798"],["4453f06b.e1d21","c667bb5f.1ce318","5b460ad7.0eab64","3a770e45.7b6742","f7acb410.e48fa8"]]},{"id":"89847b2d.ad1ff8","type":"switch","z":"db25dd5a.e0843","name":"","property":"payload","propertyType":"msg","rules":[{"t":"neq","v":"local.by_topic","vt":"flow"}],"checkall":"false","repair":false,"outputs":1,"x":630,"y":420,"wires":[["7c53a835.7386d8"]]},{"id":"7c53a835.7386d8","type":"switch","z":"db25dd5a.e0843","name":"","property":"local.ignore_switches","propertyType":"flow","rules":[{"t":"false"},{"t":"true"}],"checkall":"false","repair":false,"outputs":2,"x":750,"y":420,"wires":[["4a8363f7.9f75bc"],["f89d8486.5b5018"]]},{"id":"b342e303.2415f","type":"switch","z":"db25dd5a.e0843","name":"","property":"payload","propertyType":"msg","rules":[{"t":"neq","v":"local.store_time","vt":"flow"}],"checkall":"false","repair":false,"outputs":1,"x":630,"y":540,"wires":[["559f42fb.b6ff2c"]]},{"id":"559f42fb.b6ff2c","type":"switch","z":"db25dd5a.e0843","name":"","property":"local.ignore_switches","propertyType":"flow","rules":[{"t":"false"},{"t":"true"}],"checkall":"false","repair":false,"outputs":2,"x":750,"y":540,"wires":[["741122d6.8adc4c"],["95a0e643.8e7728"]]},{"id":"d6372d9.8156fd","type":"switch","z":"db25dd5a.e0843","name":"","property":"payload","propertyType":"msg","rules":[{"t":"neq","v":"local.store_topic","vt":"flow"}],"checkall":"false","repair":false,"outputs":1,"x":630,"y":480,"wires":[["762126e7.164098"]]},{"id":"762126e7.164098","type":"switch","z":"db25dd5a.e0843","name":"","property":"local.ignore_switches","propertyType":"flow","rules":[{"t":"false"},{"t":"true"}],"checkall":"false","repair":false,"outputs":2,"x":750,"y":480,"wires":[["f1dbf386.950c3"],["19b9e092.85847f"]]},{"id":"4a8363f7.9f75bc","type":"function","z":"db25dd5a.e0843","name":"Log By Topic","func":"var local = flow.get('local') || {};\n\nif (local.ignore_switches) {\n    return [{}, local];\n}\n\nlocal.by_topic = msg.payload;\n\nflow.set('local', local);\n\nnode.log(\"by_topic \" + msg.payload);\n\nreturn [{}, local];\n","outputs":2,"noerr":0,"initialize":"","finalize":"","x":950,"y":420,"wires":[["fab81943.82c798"],["5b460ad7.0eab64","4453f06b.e1d21","c667bb5f.1ce318","3a770e45.7b6742","f7acb410.e48fa8"]]},{"id":"741122d6.8adc4c","type":"function","z":"db25dd5a.e0843","name":"Log Date Time","func":"var local = flow.get('local') || {};\n\nif (local.ignore_switches) {\n    return [{}, local];\n}\n\nlocal.store_time = msg.payload;\n\nflow.set('local', local);\n\nnode.log(\"store_time \" + msg.payload);\n\nreturn [{}, local];\n","outputs":2,"noerr":0,"initialize":"","finalize":"","x":960,"y":540,"wires":[["fab81943.82c798"],["4453f06b.e1d21","c667bb5f.1ce318","5b460ad7.0eab64","3a770e45.7b6742","f7acb410.e48fa8"]]},{"id":"f1dbf386.950c3","type":"function","z":"db25dd5a.e0843","name":"Log Store Topic","func":"var local = flow.get('local') || {};\n\nif (local.ignore_switches) {\n    return [{}, local];\n}\n\nlocal.store_topic = msg.payload;\n\nflow.set('local', local);\n\nnode.log(\"store_topic \" + msg.payload);\n\nreturn [{}, local];\n","outputs":2,"noerr":0,"initialize":"","finalize":"","x":960,"y":480,"wires":[["fab81943.82c798"],["3a770e45.7b6742","4453f06b.e1d21","c667bb5f.1ce318","5b460ad7.0eab64","f7acb410.e48fa8"]]},{"id":"5b460ad7.0eab64","type":"ui_text","z":"db25dd5a.e0843","group":"766ec601.6e92f8","order":0,"width":0,"height":0,"name":"","label":"By Topic","format":"{{msg.by_topic}}","layout":"row-spread","x":1220,"y":420,"wires":[]},{"id":"3a770e45.7b6742","type":"ui_text","z":"db25dd5a.e0843","group":"766ec601.6e92f8","order":0,"width":0,"height":0,"name":"","label":"Store Topic","format":"{{msg.store_topic}}","layout":"row-spread","x":1230,"y":480,"wires":[]},{"id":"f7acb410.e48fa8","type":"ui_text","z":"db25dd5a.e0843","group":"766ec601.6e92f8","order":0,"width":0,"height":0,"name":"","label":"Date Time","format":"{{msg.store_time}}","layout":"row-spread","x":1220,"y":540,"wires":[]},{"id":"9c7cae82.4c091","type":"ui_button","z":"db25dd5a.e0843","name":"","group":"cb8e26b1.e5c788","order":0,"width":0,"height":0,"passthru":true,"label":"Delete Saved Logs","tooltip":"","color":"","bgcolor":"","icon":"","payload":"true","payloadType":"bool","topic":"DELETE-LOGS","x":410,"y":60,"wires":[["644602d9.06561c"]]},{"id":"644602d9.06561c","type":"exec","z":"db25dd5a.e0843","command":"rm","addpay":false,"append":"-rf /data/logs","useSpawn":"false","timer":"","oldrc":false,"name":"","x":610,"y":60,"wires":[["201ea66d.a9285a","fab81943.82c798"],["201ea66d.a9285a","fab81943.82c798"],["77dddf6.d42d82"]]},{"id":"c9493fcd.81ee8","type":"function","z":"6d525419.52a28c","name":"Set base path","func":"//restrict to c:\\temp\\\nvar basePath = \"/data/logs/\";\nvar filename = msg.req.params[0];\n\n\nif(filename.includes(\"..\\\\\")){\n    msg.payload = \"Illegal file path\";\n    msg.statusCode = 405;//not allowed\n    return [null, msg];//fire output 2\n} else if(filename.includes(\"../\")){\n    msg.payload = \"Illegal file path\";\n    msg.statusCode = 405;//not allowed\n    return [null, msg];//fire output 2\n} \n//TODO: add more checks\n\nmsg.filename = basePath + filename;\nreturn [msg, null];//fire output 1\n\n\n","outputs":2,"noerr":0,"initialize":"","finalize":"","x":460,"y":240,"wires":[["933412f0.d9076"],["224b450d.7eae7a"]]},{"id":"224b450d.7eae7a","type":"http response","z":"6d525419.52a28c","name":"","statusCode":"","headers":{},"x":790,"y":280,"wires":[]},{"id":"933412f0.d9076","type":"file in","z":"6d525419.52a28c","name":"","filename":"","format":"","chunk":false,"sendError":false,"encoding":"none","x":630,"y":220,"wires":[["224b450d.7eae7a"]]},{"id":"72307587.2cc54c","type":"catch","z":"6d525419.52a28c","name":"","scope":null,"uncaught":false,"x":260,"y":320,"wires":[["ef76841c.f5b158","880e062b.096448"]]},{"id":"ef76841c.f5b158","type":"function","z":"6d525419.52a28c","name":"Set 404","func":"msg.payload = msg.error;\nmsg.statusCode = 404;//resource not found\nreturn msg;","outputs":1,"noerr":0,"x":640,"y":320,"wires":[["224b450d.7eae7a"]]},{"id":"880e062b.096448","type":"debug","z":"6d525419.52a28c","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":290,"y":360,"wires":[]},{"id":"ba5a71ba.8b25b","type":"ui_template","z":"6d525419.52a28c","group":"23b37928.750596","name":"ui_temlplate - present download links on dashboard","order":0,"width":0,"height":0,"format":"<div >\n    <a href=\"/files/log.log\">download log.log</a>\n    <a href=\"/files/log2.log\">download log2.log</a>\n</div>","storeOutMessages":true,"fwdInMessages":true,"resendOnRefresh":false,"templateScope":"local","x":630,"y":400,"wires":[[]]},{"id":"6fb201c6.eedab","type":"comment","z":"6d525419.52a28c","name":"Create http endpoint <nodered>/files/xxx  where xxx is the file name to download","info":"","x":480,"y":180,"wires":[]},{"id":"108ee7b4.d68358","type":"http in","z":"6d525419.52a28c","name":"","url":"/files/*","method":"get","upload":false,"swaggerDoc":"","x":260,"y":240,"wires":[["c9493fcd.81ee8","d3474ca7.bbe51"]]},{"id":"82a5a027.2d3dd","type":"ui_template","z":"f0e9ef5f.a6f1e","group":"5ff01aa4.224074","name":"Display File List","order":1,"width":"12","height":"10","format":"<script>\n \nthis.scope.action = function(opt) {\n var playFile = opt || \"no data passed to function\";\n// console.warn(playFile)\n return playFile; } \n</script>\n\n\n<div style=\"max-width:900px;\">\n <ul>\n <li ng-repeat=\"file in msg.payload track by $index\" style=\"list-style-type: none;\">\n <label>\n <input type=\"radio\" ng-model=\"$parent.file\" name=\"data\" value=\"{{file}}\" required  ng-click=\"send({payload:action(file)})\"/>{{file.substring(11)}}\n </label>\n </li>\n </ul>\n</div>\n\n","storeOutMessages":false,"fwdInMessages":false,"resendOnRefresh":false,"templateScope":"local","x":740,"y":160,"wires":[["8766ad2d.e7215"]]},{"id":"316d4874.3132f8","type":"ui_template","z":"f0e9ef5f.a6f1e","group":"3e39db3a.30b694","name":"","order":0,"width":"6","height":"10","format":"<div style=\"max-width:900px;\">\n <ul>\n <li ng-repeat=\"file in msg.files track by $index\" style=\"list-style-type: none;\">\n    <a ng-model=\"$parent.file\" href=\"/files/{{msg.payload.substring(11)}}/{{file}}\">{{file}}</a>\n </li>\n </ul>\n</div>\n\n","storeOutMessages":true,"fwdInMessages":true,"resendOnRefresh":false,"templateScope":"local","x":1160,"y":160,"wires":[["d544e0a3.0e11"]]},{"id":"b5584017.6a742","type":"ui_button","z":"f0e9ef5f.a6f1e","name":"","group":"cb8e26b1.e5c788","order":0,"width":"0","height":"0","passthru":true,"label":"Refresh Log Files","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"date","topic":"","x":330,"y":180,"wires":[["8a7357d9.6671d8"]]},{"id":"d544e0a3.0e11","type":"debug","z":"f0e9ef5f.a6f1e","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":1350,"y":100,"wires":[]},{"id":"8766ad2d.e7215","type":"fs-ops-dir","z":"f0e9ef5f.a6f1e","name":"/data/logs/ats","path":"payload","pathType":"msg","filter":"*txt","filterType":"str","dir":"files","dirType":"msg","x":960,"y":100,"wires":[["316d4874.3132f8"]]},{"id":"8a7357d9.6671d8","type":"fs-file-lister","z":"f0e9ef5f.a6f1e","name":"","start":"/data/logs","pattern":"*.*","folders":"*","hidden":false,"lstype":"directories","path":true,"single":true,"depth":"100","stat":false,"showWarnings":true,"x":540,"y":100,"wires":[["82a5a027.2d3dd"]]},{"id":"fa5e5987.dffe18","type":"inject","z":"f0e9ef5f.a6f1e","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"init","payload":"true","payloadType":"bool","x":130,"y":180,"wires":[["b5584017.6a742"]]},{"id":"77dddf6.d42d82","type":"link out","z":"db25dd5a.e0843","name":"notfy changes","links":["b213fa67.7be5c8"],"x":555,"y":100,"wires":[]},{"id":"b213fa67.7be5c8","type":"link in","z":"f0e9ef5f.a6f1e","name":"","links":["77dddf6.d42d82"],"x":275,"y":100,"wires":[["8a7357d9.6671d8"]]},{"id":"d3474ca7.bbe51","type":"debug","z":"6d525419.52a28c","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":510,"y":100,"wires":[]}]

Flow Info

Created 4 years, 11 months ago
Rating: not yet rated

Owner

Actions

Rate:

Node Types

Core
  • catch (x1)
  • change (x5)
  • comment (x1)
  • debug (x4)
  • exec (x1)
  • file (x1)
  • file in (x1)
  • function (x10)
  • http in (x1)
  • http response (x1)
  • inject (x2)
  • link in (x1)
  • link out (x1)
  • mqtt in (x1)
  • mqtt-broker (x2)
  • switch (x8)
Other
  • fs-file-lister (x1)
  • fs-ops-dir (x1)
  • tab (x3)
  • ui_base (x1)
  • ui_button (x3)
  • ui_group (x9)
  • ui_switch (x5)
  • ui_tab (x4)
  • ui_template (x3)
  • ui_text (x7)

Tags

Copy this flow JSON to your clipboard and then import into Node-RED using the Import From > Clipboard (Ctrl-I) menu option