[{"id":"8edcf448.d73278","type":"tab","allowCycles":false,"label":"24h Data Simulator","disabled":false,"info":"author:
[email protected]\n\n\ndescription:\nData simulation system that replays a single day's \nreference dataset in a continuous loop. \n\nUses a 24-hour sample file as a template \nto generate repeating daily patterns \nfor testing and simulation purposes."},{"id":"960fe822.f78cd8","type":"group","z":"8edcf448.d73278","name":"Daily Reference Pattern Replay // Continous data ingest and simulation based on 24h scheme reference file ","style":{"label":true},"nodes":["2159bd3e.fbd582","48bd139.db610ec","ceec7ee7.e5625","1d69b214.0f6bfe","eeee3487.33cae8","f4518285.e6eaf","d1f2548d.d27528","52de7c95.f92fe4"],"x":75,"y":120,"w":1110,"h":189},{"id":"2159bd3e.fbd582","type":"debug","z":"8edcf448.d73278","g":"960fe822.f78cd8","name":"","active":true,"console":"false","xaxis":"_time","complete":"true","x":1090,"y":160,"wires":[],"_type":"node"},{"id":"48bd139.db610ec","type":"function","z":"8edcf448.d73278","g":"960fe822.f78cd8","name":"Filter last x minutes","func":"function filterAndUpdateTimestamps(msg, timeRangeMinutes) {\n var data = msg.payload;\n var now = new Date();\n var timeRangeMs = timeRangeMinutes * 60000; // Convert minutes to milliseconds\n var cutoffTime = new Date(now.getTime() - timeRangeMs);\n\n // Debug: Log input data length\n node.warn(`Input data length: ${data.length}`);\n node.warn(`Filtering last ${timeRangeMinutes} minutes, from ${cutoffTime.toISOString()} to ${now.toISOString()}`);\n\n if (!Array.isArray(data)) {\n node.error(\"Input data is not an array\");\n return [];\n }\n\n // First, update all timestamps to today's date\n var updatedData = data.map(entry => {\n if (!entry._time) {\n node.warn(`Entry missing _time field: ${JSON.stringify(entry)}`);\n return entry;\n }\n var entryTime = new Date(entry._time);\n if (isNaN(entryTime.getTime())) {\n node.warn(`Invalid date: ${entry._time}`);\n return entry;\n }\n var updatedTime = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate(),\n entryTime.getHours(),\n entryTime.getMinutes(),\n entryTime.getSeconds(),\n entryTime.getMilliseconds()\n );\n return {\n ...entry,\n _time: updatedTime.toISOString()\n };\n });\n\n // Then, filter the updated data\n var filteredData = updatedData.filter(entry => {\n var entryTime = new Date(entry._time);\n return entryTime >= cutoffTime && entryTime <= now;\n });\n\n // Debug: Log filtered data length\n node.warn(`Filtered data length: ${filteredData.length}`);\n\n return filteredData;\n}\n\n// Usage\n// This can be set to any value you want in MINUTES\nvar timeRangeMinutes = msg.flowSetting_simulatorRun // 5; \n\nmsg.payload = filterAndUpdateTimestamps(msg, timeRangeMinutes);\n\n// Debug: Log final payload length\nnode.warn(`Final payload length: ${msg.payload.length}`);\n\nreturn msg;","outputs":1,"language":"javascript","noerr":0,"x":710,"y":200,"wires":[["ceec7ee7.e5625"]],"_type":"node"},{"id":"ceec7ee7.e5625","type":"function","z":"8edcf448.d73278","g":"960fe822.f78cd8","name":"prep TS values","func":"msg.payload = msg.payload.map(entry => {\n // Create a new object with all properties from the entry\n return Object.assign({}, entry);\n \n // Alternatively, use the spread operator:\n // return { ...entry };\n});\nreturn msg;","outputs":1,"language":"javascript","noerr":0,"x":920,"y":200,"wires":[["2159bd3e.fbd582","52de7c95.f92fe4"]],"_type":"node"},{"id":"1d69b214.0f6bfe","type":"inject","z":"8edcf448.d73278","g":"960fe822.f78cd8","name":"every 5min","topic":"","payload":"","payloadType":"date","repeat":"300","repeatEnd":"0","endTime":"0","crontab":"","offset":"","once":false,"properties":"","timezone":"utc","betweentimesunit":"m","showNextExecution":true,"powerMode":false,"x":190,"y":200,"wires":[["f4518285.e6eaf"]]},{"id":"eeee3487.33cae8","type":"comment","z":"8edcf448.d73278","g":"960fe822.f78cd8","name":"⬆️⬆️⬆️ adjust and config your flow here","info":"DO ONLY setup here, no other changes are needed","sticky":1,"x":460,"y":260,"wires":[],"_type":"node"},{"id":"f4518285.e6eaf","type":"function","z":"8edcf448.d73278","g":"960fe822.f78cd8","name":"CONFIG","func":"// ******************** CONFIGURATION TEMPLATE ********************\n// //\n// // EDITABLE VALUES:\n// var assetId = \"myAssetId\"; // Enter your asset ID\n// var aspectName = \"myAspectName\"; // Enter your aspect name\n// var filename = \"myFileNameWithPath\"; // Enter your file path\n// var simulatorRun = 5; // Enter the occurance your flow is run in minutes [min]\n// //\n// // DO NOT MODIFY BELOW THIS LINE\n// // **************************************************************\n// msg.asset = assetId\n// msg.file = filename\n// msg.topic = assetId + \"/\" + aspectName;\n// return msg;\n// **************************************************************\n\n\n// EDITABLE VALUES:\nvar assetId = \"26a76a1e8d8f48d791fc4ded12e39686\"; // Enter your asset ID\nvar aspectName = \"environmentData\"; // Enter your aspect name\nvar filename = \"env-data.json\"; // Enter your file path\nvar simulatorRun = 5; // set to run every 5min\n//\n//\n// DO NOT MODIFY BELOW THIS LINE\n// **************************************************************\nmsg.asset = assetId\nmsg.file = filename\nmsg.topic = assetId + \"/\" + aspectName;\nmsg.flowSetting_simulatorRun = simulatorRun\n\nreturn msg;\n","outputs":1,"language":"javascript","noerr":0,"x":360,"y":200,"wires":[["d1f2548d.d27528"]],"_type":"node"},{"id":"d1f2548d.d27528","type":"read file","z":"8edcf448.d73278","g":"960fe822.f78cd8","name":"","asset":"","file":"","x":520,"y":200,"wires":[["48bd139.db610ec"]]},{"id":"52de7c95.f92fe4","type":"write timeseries","z":"8edcf448.d73278","g":"960fe822.f78cd8","name":"","topic":"","topicData":"","topicLabel":"","assetName":"","aspectName":"","useMerging":false,"x":1100,"y":200,"wires":[]}]
0 commit comments