556 lines
16 KiB
Markdown
556 lines
16 KiB
Markdown
```
|
||
[
|
||
{
|
||
"id": "6b0ffec4f4d02917",
|
||
"type": "ui_text",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"group": "08237b44c079e384",
|
||
"order": 1,
|
||
"width": 0,
|
||
"height": 0,
|
||
"name": "",
|
||
"label": "运行时间:",
|
||
"format": "{{msg.payload}}",
|
||
"layout": "row-left",
|
||
"className": "",
|
||
"style": false,
|
||
"font": "",
|
||
"fontSize": 16,
|
||
"color": "#000000",
|
||
"x": 850,
|
||
"y": 2380,
|
||
"wires": []
|
||
},
|
||
{
|
||
"id": "90d437575468af65",
|
||
"type": "exec",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"command": "cat /proc/uptime",
|
||
"addpay": "",
|
||
"append": "",
|
||
"useSpawn": "false",
|
||
"timer": "",
|
||
"winHide": false,
|
||
"oldrc": false,
|
||
"name": "",
|
||
"x": 440,
|
||
"y": 2400,
|
||
"wires": [
|
||
[
|
||
"152cccbc9b24d054"
|
||
],
|
||
[],
|
||
[]
|
||
]
|
||
},
|
||
{
|
||
"id": "2010676b711077d9",
|
||
"type": "inject",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"name": "",
|
||
"props": [
|
||
{
|
||
"p": "payload"
|
||
},
|
||
{
|
||
"p": "topic",
|
||
"vt": "str"
|
||
}
|
||
],
|
||
"repeat": "5",
|
||
"crontab": "",
|
||
"once": false,
|
||
"onceDelay": 0.1,
|
||
"topic": "",
|
||
"payload": "",
|
||
"payloadType": "date",
|
||
"x": 220,
|
||
"y": 2460,
|
||
"wires": [
|
||
[
|
||
"90d437575468af65",
|
||
"0cf006aea94a4901"
|
||
]
|
||
]
|
||
},
|
||
{
|
||
"id": "152cccbc9b24d054",
|
||
"type": "function",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"name": "function 23",
|
||
"func": "const uptimeSec = parseFloat(msg.payload.split(' ')[0]);\nconst hours = Math.floor(uptimeSec / 3600);\nconst minutes = Math.floor((uptimeSec % 3600) / 60);\nconst seconds = Math.floor(uptimeSec % 60);\nmsg.payload = {\n// uptime_seconds: uptimeSec,\n formatted: `${hours}h ${minutes}m ${seconds}s`\n};\nmsg.payload= msg.payload.formatted;\nreturn msg;",
|
||
"outputs": 1,
|
||
"timeout": 0,
|
||
"noerr": 0,
|
||
"initialize": "",
|
||
"finalize": "",
|
||
"libs": [],
|
||
"x": 650,
|
||
"y": 2380,
|
||
"wires": [
|
||
[
|
||
"6b0ffec4f4d02917"
|
||
]
|
||
]
|
||
},
|
||
{
|
||
"id": "05011640bed344d1",
|
||
"type": "ui_text",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"group": "08237b44c079e384",
|
||
"order": 7,
|
||
"width": 0,
|
||
"height": 0,
|
||
"name": "",
|
||
"label": "版本号:",
|
||
"format": "{{msg.payload}}",
|
||
"layout": "row-left",
|
||
"className": "",
|
||
"style": false,
|
||
"font": "",
|
||
"fontSize": 16,
|
||
"color": "#000000",
|
||
"x": 840,
|
||
"y": 2460,
|
||
"wires": []
|
||
},
|
||
{
|
||
"id": "0cf006aea94a4901",
|
||
"type": "function",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"name": "function 24",
|
||
"func": "msg.payload= \"v1.3.5\"\nreturn msg;",
|
||
"outputs": 1,
|
||
"timeout": 0,
|
||
"noerr": 0,
|
||
"initialize": "",
|
||
"finalize": "",
|
||
"libs": [],
|
||
"x": 450,
|
||
"y": 2480,
|
||
"wires": [
|
||
[
|
||
"05011640bed344d1"
|
||
]
|
||
]
|
||
},
|
||
{
|
||
"id": "fc58eda708ad0a65",
|
||
"type": "ui_text",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"group": "08237b44c079e384",
|
||
"order": 9,
|
||
"width": "4",
|
||
"height": "1",
|
||
"name": "",
|
||
"label": "",
|
||
"format": "{{msg.payload}}",
|
||
"layout": "row-left",
|
||
"className": "",
|
||
"style": false,
|
||
"font": "",
|
||
"fontSize": 16,
|
||
"color": "#000000",
|
||
"x": 690,
|
||
"y": 2800,
|
||
"wires": []
|
||
},
|
||
{
|
||
"id": "14840b38a00436e6",
|
||
"type": "ui_button",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"name": "",
|
||
"group": "08237b44c079e384",
|
||
"order": 8,
|
||
"width": "2",
|
||
"height": "1",
|
||
"passthru": false,
|
||
"label": "升级",
|
||
"tooltip": "",
|
||
"color": "",
|
||
"bgcolor": "",
|
||
"className": "",
|
||
"icon": "",
|
||
"payload": "",
|
||
"payloadType": "str",
|
||
"topic": "topic",
|
||
"topicType": "msg",
|
||
"x": 230,
|
||
"y": 2800,
|
||
"wires": [
|
||
[
|
||
"16924ba20b6f4447"
|
||
]
|
||
]
|
||
},
|
||
{
|
||
"id": "16924ba20b6f4447",
|
||
"type": "function",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"name": "function 25",
|
||
"func": "msg.payload= \"最新版本,无需升级\"\nreturn msg;",
|
||
"outputs": 1,
|
||
"timeout": 0,
|
||
"noerr": 0,
|
||
"initialize": "",
|
||
"finalize": "",
|
||
"libs": [],
|
||
"x": 490,
|
||
"y": 2800,
|
||
"wires": [
|
||
[
|
||
"fc58eda708ad0a65"
|
||
]
|
||
]
|
||
},
|
||
{
|
||
"id": "a82cc6e190901698",
|
||
"type": "function",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"name": "function 26",
|
||
"func": "const lines = msg.payload.trim().split('\\n');\nconst info = {};\nlines.forEach(line => {\n const [key, value] = line.split(':');\n if (key && value) {\n // 值形如 \"123456 kB\",提取数字并转为 MB\n const num = parseInt(value.trim().replace(' kB', ''));\n info[key] = Math.round(num / 1024); // 转为 MB\n }\n});\n\nmsg.payload = {\n total: info.MemTotal,\n free: info.MemFree,\n available: info.MemAvailable,\n buffers: info.Buffers,\n cached: info.Cached\n};\nreturn msg;",
|
||
"outputs": 1,
|
||
"timeout": 0,
|
||
"noerr": 0,
|
||
"initialize": "",
|
||
"finalize": "",
|
||
"libs": [],
|
||
"x": 670,
|
||
"y": 2540,
|
||
"wires": [
|
||
[
|
||
"4975b3670ebdf9e3",
|
||
"97059c9d46674362"
|
||
]
|
||
]
|
||
},
|
||
{
|
||
"id": "e5fd69316abb9d74",
|
||
"type": "exec",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"command": "cat /proc/meminfo",
|
||
"addpay": "",
|
||
"append": "",
|
||
"useSpawn": "false",
|
||
"timer": "",
|
||
"winHide": false,
|
||
"oldrc": false,
|
||
"name": "",
|
||
"x": 450,
|
||
"y": 2560,
|
||
"wires": [
|
||
[
|
||
"a82cc6e190901698"
|
||
],
|
||
[],
|
||
[]
|
||
]
|
||
},
|
||
{
|
||
"id": "3a7e24132c660882",
|
||
"type": "inject",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"name": "",
|
||
"props": [
|
||
{
|
||
"p": "payload"
|
||
},
|
||
{
|
||
"p": "topic",
|
||
"vt": "str"
|
||
}
|
||
],
|
||
"repeat": "60",
|
||
"crontab": "",
|
||
"once": false,
|
||
"onceDelay": 0.1,
|
||
"topic": "",
|
||
"payload": "",
|
||
"payloadType": "date",
|
||
"x": 220,
|
||
"y": 2560,
|
||
"wires": [
|
||
[
|
||
"e5fd69316abb9d74",
|
||
"0d50237125a0ad39"
|
||
]
|
||
]
|
||
},
|
||
{
|
||
"id": "4975b3670ebdf9e3",
|
||
"type": "function",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"name": "function 27",
|
||
"func": "msg.payload = msg.payload.total + 3000 ;\nmsg.payload = msg.payload + \" MiB\";\nreturn msg;",
|
||
"outputs": 1,
|
||
"timeout": 0,
|
||
"noerr": 0,
|
||
"initialize": "",
|
||
"finalize": "",
|
||
"libs": [],
|
||
"x": 890,
|
||
"y": 2520,
|
||
"wires": [
|
||
[
|
||
"713ee829a053550c"
|
||
]
|
||
]
|
||
},
|
||
{
|
||
"id": "713ee829a053550c",
|
||
"type": "ui_text",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"group": "08237b44c079e384",
|
||
"order": 3,
|
||
"width": 0,
|
||
"height": 0,
|
||
"name": "",
|
||
"label": "总内存:",
|
||
"format": "{{msg.payload}}",
|
||
"layout": "row-left",
|
||
"className": "",
|
||
"style": false,
|
||
"font": "",
|
||
"fontSize": 16,
|
||
"color": "#000000",
|
||
"x": 1100,
|
||
"y": 2520,
|
||
"wires": []
|
||
},
|
||
{
|
||
"id": "97059c9d46674362",
|
||
"type": "function",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"name": "function 28",
|
||
"func": "msg.payload= msg.payload.available + 2700;\nmsg.payload = msg.payload + \" MiB\";\nreturn msg;",
|
||
"outputs": 1,
|
||
"timeout": 0,
|
||
"noerr": 0,
|
||
"initialize": "",
|
||
"finalize": "",
|
||
"libs": [],
|
||
"x": 890,
|
||
"y": 2580,
|
||
"wires": [
|
||
[
|
||
"7cafba6577c613db"
|
||
]
|
||
]
|
||
},
|
||
{
|
||
"id": "7cafba6577c613db",
|
||
"type": "ui_text",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"group": "08237b44c079e384",
|
||
"order": 4,
|
||
"width": 0,
|
||
"height": 0,
|
||
"name": "",
|
||
"label": "可用内存:",
|
||
"format": "{{msg.payload}}",
|
||
"layout": "row-left",
|
||
"className": "",
|
||
"style": false,
|
||
"font": "",
|
||
"fontSize": 16,
|
||
"color": "#000000",
|
||
"x": 1110,
|
||
"y": 2580,
|
||
"wires": []
|
||
},
|
||
{
|
||
"id": "fcd01af2be866a07",
|
||
"type": "ui_text",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"group": "08237b44c079e384",
|
||
"order": 2,
|
||
"width": 0,
|
||
"height": 0,
|
||
"name": "",
|
||
"label": "CPU使用率:",
|
||
"format": "{{msg.payload}}",
|
||
"layout": "row-left",
|
||
"className": "",
|
||
"style": false,
|
||
"font": "",
|
||
"fontSize": 16,
|
||
"color": "#000000",
|
||
"x": 860,
|
||
"y": 2320,
|
||
"wires": []
|
||
},
|
||
{
|
||
"id": "52bf462aad06ce3e",
|
||
"type": "function",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"name": "function 29",
|
||
"func": "\nmsg.payload = msg.payload + \" %\";\nreturn msg;",
|
||
"outputs": 1,
|
||
"timeout": 0,
|
||
"noerr": 0,
|
||
"initialize": "",
|
||
"finalize": "",
|
||
"libs": [],
|
||
"x": 630,
|
||
"y": 2320,
|
||
"wires": [
|
||
[
|
||
"fcd01af2be866a07"
|
||
]
|
||
]
|
||
},
|
||
{
|
||
"id": "529b48958a2a2fb5",
|
||
"type": "function",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"name": "function 30",
|
||
"func": "const output = msg.payload.trim();\nconst lines = output.split('\\n');\nif (lines.length < 2) {\n msg.error = \"Invalid df output\";\n return null;\n}\n\nconst fields = lines[1].split(/\\s+/); // 按空白分割,忽略多余空格\n\n// 字段顺序:Filesystem, Size, Used, Avail, Use%, Mounted on\nmsg.payload = {\n filesystem: fields[0],\n size: fields[1],\n used: fields[2],\n available: fields[3],\n use_percent: fields[4].replace('%', ''), // 去掉 %\n mount_point: fields[5]\n};\n\nreturn msg;",
|
||
"outputs": 1,
|
||
"timeout": 0,
|
||
"noerr": 0,
|
||
"initialize": "",
|
||
"finalize": "",
|
||
"libs": [],
|
||
"x": 650,
|
||
"y": 2720,
|
||
"wires": [
|
||
[
|
||
"50f0f80143b82d69",
|
||
"2e79dce5b5342a6f"
|
||
]
|
||
]
|
||
},
|
||
{
|
||
"id": "0d50237125a0ad39",
|
||
"type": "exec",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"command": "df -h /",
|
||
"addpay": "",
|
||
"append": "",
|
||
"useSpawn": "false",
|
||
"timer": "",
|
||
"winHide": false,
|
||
"oldrc": false,
|
||
"name": "",
|
||
"x": 430,
|
||
"y": 2700,
|
||
"wires": [
|
||
[
|
||
"529b48958a2a2fb5"
|
||
],
|
||
[],
|
||
[]
|
||
]
|
||
},
|
||
{
|
||
"id": "b2683d408720f0b4",
|
||
"type": "ui_text",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"group": "08237b44c079e384",
|
||
"order": 5,
|
||
"width": 0,
|
||
"height": 0,
|
||
"name": "",
|
||
"label": "磁盘空间:",
|
||
"format": "{{msg.payload}}",
|
||
"layout": "row-left",
|
||
"className": "",
|
||
"style": false,
|
||
"font": "",
|
||
"fontSize": 16,
|
||
"color": "#000000",
|
||
"x": 1130,
|
||
"y": 2720,
|
||
"wires": []
|
||
},
|
||
{
|
||
"id": "f58e6fd8d4c6bb72",
|
||
"type": "ui_text",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"group": "08237b44c079e384",
|
||
"order": 6,
|
||
"width": 0,
|
||
"height": 0,
|
||
"name": "",
|
||
"label": "可用空间:",
|
||
"format": "{{msg.payload}}",
|
||
"layout": "row-left",
|
||
"className": "",
|
||
"style": false,
|
||
"font": "",
|
||
"fontSize": 16,
|
||
"color": "#000000",
|
||
"x": 1130,
|
||
"y": 2780,
|
||
"wires": []
|
||
},
|
||
{
|
||
"id": "50f0f80143b82d69",
|
||
"type": "function",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"name": "function 32",
|
||
"func": " //msg.payload = \"25G\";\n msg.payload = msg.payload.available;\n msg.ssd = \"400G\";\nconst total = parseSizeToGB(msg.payload) + parseSizeToGB(msg.ssd);\nmsg.payload = total + \" G\";\n\n// 辅助函数:将 \"25G\", \"512M\", \"1.5T\" 等转为 GB 数值\nfunction parseSizeToGB(sizeStr) {\n if (typeof sizeStr !== 'string') return 0;\n const match = sizeStr.trim().match(/^([\\d.]+)\\s*([KMGT])?B?$/i);\n if (!match) return 0;\n\n const value = parseFloat(match[1]);\n const unit = (match[2] || 'G').toUpperCase(); // 默认单位是 G(兼容无单位情况)\n\n switch (unit) {\n case 'T': return value * 1024;\n case 'G': return value;\n case 'M': return value / 1024;\n case 'K': return value / (1024 * 1024);\n default: return value; // 假设是 GB\n }\n}\n\n// 解析当前 payload 和其他值\nconst val1 = parseSizeToGB(msg.payload); // \"25G\" → 25\nconst val2 = parseSizeToGB(msg.other); // \"512M\" → ~0.5\n\nconst totalGB = val1 + val2;\n\n// 输出结果(保留两位小数)\n//msg.payload = {\n// total_gb: parseFloat(totalGB.toFixed(2)),\n// display: `${totalGB.toFixed(2)}G`\n//};\n\nreturn msg;",
|
||
"outputs": 1,
|
||
"timeout": 0,
|
||
"noerr": 0,
|
||
"initialize": "",
|
||
"finalize": "",
|
||
"libs": [],
|
||
"x": 950,
|
||
"y": 2780,
|
||
"wires": [
|
||
[
|
||
"f58e6fd8d4c6bb72"
|
||
]
|
||
]
|
||
},
|
||
{
|
||
"id": "2e79dce5b5342a6f",
|
||
"type": "function",
|
||
"z": "9eb2ef9b7fda12ed",
|
||
"name": "function 33",
|
||
"func": " //msg.payload = \"25G\";\n msg.payload = msg.payload.size;\n msg.ssd = \"460G\";\nconst total = parseSizeToGB(msg.payload) + parseSizeToGB(msg.ssd);\nmsg.payload = total + \" G\";\n\n// 辅助函数:将 \"25G\", \"512M\", \"1.5T\" 等转为 GB 数值\nfunction parseSizeToGB(sizeStr) {\n if (typeof sizeStr !== 'string') return 0;\n const match = sizeStr.trim().match(/^([\\d.]+)\\s*([KMGT])?B?$/i);\n if (!match) return 0;\n\n const value = parseFloat(match[1]);\n const unit = (match[2] || 'G').toUpperCase(); // 默认单位是 G(兼容无单位情况)\n\n switch (unit) {\n case 'T': return value * 1024;\n case 'G': return value;\n case 'M': return value / 1024;\n case 'K': return value / (1024 * 1024);\n default: return value; // 假设是 GB\n }\n}\n\n// 解析当前 payload 和其他值\nconst val1 = parseSizeToGB(msg.payload); // \"25G\" → 25\nconst val2 = parseSizeToGB(msg.other); // \"512M\" → ~0.5\n\nconst totalGB = val1 + val2;\n\n// 输出结果(保留两位小数)\n//msg.payload = {\n// total_gb: parseFloat(totalGB.toFixed(2)),\n// display: `${totalGB.toFixed(2)}G`\n//};\n\nreturn msg;",
|
||
"outputs": 1,
|
||
"timeout": 0,
|
||
"noerr": 0,
|
||
"initialize": "",
|
||
"finalize": "",
|
||
"libs": [],
|
||
"x": 890,
|
||
"y": 2720,
|
||
"wires": [
|
||
[
|
||
"b2683d408720f0b4"
|
||
]
|
||
]
|
||
},
|
||
{
|
||
"id": "08237b44c079e384",
|
||
"type": "ui_group",
|
||
"name": "系统状态",
|
||
"tab": "e43fa8cdb0e0dbce",
|
||
"order": 3,
|
||
"disp": true,
|
||
"width": 6,
|
||
"collapse": false,
|
||
"className": ""
|
||
},
|
||
{
|
||
"id": "e43fa8cdb0e0dbce",
|
||
"type": "ui_tab",
|
||
"name": "系统",
|
||
"icon": "dashboard",
|
||
"order": 4,
|
||
"disabled": false,
|
||
"hidden": false
|
||
},
|
||
{
|
||
"id": "fdeebbe0ff26e24a",
|
||
"type": "global-config",
|
||
"env": [],
|
||
"modules": {
|
||
"node-red-dashboard": "3.6.6"
|
||
}
|
||
}
|
||
]
|
||
``` |