{"id":253,"date":"2026-03-20T21:08:28","date_gmt":"2026-03-20T13:08:28","guid":{"rendered":"https:\/\/home.snu1e.top\/index.php\/2026\/03\/20\/%e8%91%a1%e8%90%84%e5%9b%ad%e6%99%ba%e8%83%bd%e7%81%8c%e6%ba%89%e7%b3%bb%e7%bb%9f%ef%bc%9anode-red-%e4%b8%8e-mcgs-%e5%85%a8%e9%93%be%e8%b7%af%e9%80%9a%e8%ae%af%e4%b8%8e-ui-%e9%85%8d%e7%bd%ae%e6%89%8b\/"},"modified":"2026-03-20T21:08:28","modified_gmt":"2026-03-20T13:08:28","slug":"%e8%91%a1%e8%90%84%e5%9b%ad%e6%99%ba%e8%83%bd%e7%81%8c%e6%ba%89%e7%b3%bb%e7%bb%9f%ef%bc%9anode-red-%e4%b8%8e-mcgs-%e5%85%a8%e9%93%be%e8%b7%af%e9%80%9a%e8%ae%af%e4%b8%8e-ui-%e9%85%8d%e7%bd%ae%e6%89%8b","status":"publish","type":"post","link":"https:\/\/home.snu1e.top\/index.php\/2026\/03\/20\/%e8%91%a1%e8%90%84%e5%9b%ad%e6%99%ba%e8%83%bd%e7%81%8c%e6%ba%89%e7%b3%bb%e7%bb%9f%ef%bc%9anode-red-%e4%b8%8e-mcgs-%e5%85%a8%e9%93%be%e8%b7%af%e9%80%9a%e8%ae%af%e4%b8%8e-ui-%e9%85%8d%e7%bd%ae%e6%89%8b\/","title":{"rendered":"\u8461\u8404\u56ed\u667a\u80fd\u704c\u6e89\u7cfb\u7edf\uff1aNode-RED \u4e0e MCGS \u5168\u94fe\u8def\u901a\u8baf\u4e0e UI \u914d\u7f6e\u624b\u518c (v2.0 \u5b8c\u6574\u7248)"},"content":{"rendered":"<h1>\u8461\u8404\u56ed\u667a\u80fd\u704c\u6e89\u7cfb\u7edf\uff1aNode-RED \u4e0e MCGS \u5168\u94fe\u8def\u901a\u8baf\u4e0e UI \u914d\u7f6e\u624b\u518c (v2.0 \u5b8c\u6574\u7248)<\/h1>\n<blockquote><p>\n  \ud83d\udcd8 <strong>\u6587\u6863\u7248\u672c<\/strong>: v2.0 \u5b8c\u6574\u7248<br \/>\n  \ud83c\udfaf <strong>\u9002\u7528\u573a\u666f<\/strong>: \u73b0\u573a\u8fb9\u7f18\u7f51\u5173 (LubanCat-5 \/ Raspberry Pi 5) + MCGS + \u4f20\u611f\u5668\u7f51\u7edc<br \/>\n  \ud83d\udd27 <strong>\u6838\u5fc3\u529f\u80fd<\/strong>: \u4e0b\u884c 9 \u901a\u9053\u63a7\u5236 + \u4e0a\u884c 39 \u901a\u9053\u76d1\u6d4b + Dashboard \u5927\u5c4f<br \/>\n  \u26a0\ufe0f <strong>\u5173\u952e\u8bcd<\/strong>: \u591a\u901a\u9053\u6253\u5305\u3001\u5de5\u7a0b\u91cf\u6807\u5b9a\u3001\u6570\u5b57\u5b6a\u751f\u3001\u62a5\u8b66\u9632\u5f39\n<\/p><\/blockquote>\n<hr \/>\n<h2>\ud83d\udccb \u76ee\u5f55<\/h2>\n<ol>\n<li><a href=\"#\u4e00\u7cfb\u7edf\u67b6\u6784\u6982\u8ff0\">\u7cfb\u7edf\u67b6\u6784\u6982\u8ff0<\/a><\/li>\n<li><a href=\"#\u4e8c\u4e0b\u884c\u63a7\u5236\u94fe\u8def\u591a\u901a\u9053\u6307\u4ee4\u52a8\u6001\u6253\u5305\">\u4e0b\u884c\u63a7\u5236\u94fe\u8def\uff1a\u591a\u901a\u9053\u6307\u4ee4\u52a8\u6001\u6253\u5305<\/a><\/li>\n<li><a href=\"#\u4e09\u4e0a\u884c\u76d1\u6d4b\u94fe\u8def39-\u901a\u9053\u4f20\u611f\u5668\u6570\u636e\u89e3\u6790\u4e0e\u6807\u5b9a\">\u4e0a\u884c\u76d1\u6d4b\u94fe\u8def\uff1a39 \u901a\u9053\u6570\u636e\u89e3\u6790\u4e0e\u6807\u5b9a<\/a><\/li>\n<li><a href=\"#\u56dbdashboard-ui-\u754c\u9762\u6392\u7248\u4e0e\u89c6\u89c9\u4f18\u5316\">Dashboard UI \u754c\u9762\u6392\u7248\u4e0e\u89c6\u89c9\u4f18\u5316<\/a><\/li>\n<li><a href=\"#\u4e94\u6838\u5fc3\u6ce8\u610f\u4e8b\u9879\u9632\u5751\u6307\u5357\">\u6838\u5fc3\u6ce8\u610f\u4e8b\u9879\uff08\u9632\u5751\u6307\u5357\uff09<\/a><\/li>\n<li><a href=\"#\u516d\u8c03\u8bd5\u4e0e\u6392\u9519\">\u8c03\u8bd5\u4e0e\u6392\u9519<\/a><\/li>\n<li><a href=\"#\u4e03\u9644\u5f55\u914d\u7f6e\u901f\u67e5\u8868\u4e0e\u6269\u5c55\u6307\u5357\">\u9644\u5f55\uff1a\u914d\u7f6e\u901f\u67e5\u8868\u4e0e\u6269\u5c55\u6307\u5357<\/a><\/li>\n<\/ol>\n<hr \/>\n<h2>\u4e00\u3001\u7cfb\u7edf\u67b6\u6784\u6982\u8ff0<\/h2>\n<h3>1.1 \u6574\u4f53\u67b6\u6784\u56fe<\/h3>\n<pre><code>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502                          \u4e91\u7aef\/\u8fb9\u7f18\u7f51\u5173 (Node-RED \u4e0a\u4f4d\u673a)                           \u2502\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510   \u2502\n\u2502  \u2502                     \ud83d\udda5\ufe0f \u667a\u6167\u8461\u8404\u56ed\u4e3b\u63a7\u8231 Dashboard                        \u2502   \u2502\n\u2502  \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510   \u2502   \u2502\n\u2502  \u2502  \u2502  \ud83d\udcbb \u73b0\u573a\u8bbe\u5907\u63a7\u5236\u533a (9\u901a\u9053\u4e0b\u53d1)                                     \u2502   \u2502   \u2502\n\u2502  \u2502  \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510   \u2502   \u2502   \u2502\n\u2502  \u2502  \u2502  \u2502 \u6c34\u6cf5 S1 \u2502 \u2502 \u9600\u95e8 S2 \u2502 \u2502 \u65bd\u80a5 S3 \u2502 \u2502 \u538b\u529b Pres\u2502 \u2502 \u9891\u7387 Freq\u2502   \u2502   \u2502   \u2502\n\u2502  \u2502  \u2502  \u2502 [\u5f00\u5173]  \u2502 \u2502 [\u5f00\u5173]  \u2502 \u2502 [\u5f00\u5173]  \u2502 \u2502 [\u6ed1\u5757]   \u2502 \u2502 [\u6ed1\u5757]   \u2502   \u2502   \u2502   \u2502\n\u2502  \u2502  \u2502  \u2502   \ud83d\udca1   \u2502 \u2502   \ud83d\udca1   \u2502 \u2502   \ud83d\udca1   \u2502 \u2502         \u2502 \u2502         \u2502   \u2502   \u2502   \u2502\n\u2502  \u2502  \u2502  \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518   \u2502   \u2502   \u2502\n\u2502  \u2502  \u2502       \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518          \u2502   \u2502   \u2502\n\u2502  \u2502  \u2502                          \u2193                                        \u2502   \u2502   \u2502\n\u2502  \u2502  \u2502                   9\u901a\u9053\u52a8\u6001\u6253\u5305                                    \u2502   \u2502   \u2502\n\u2502  \u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518   \u2502   \u2502\n\u2502  \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510   \u2502   \u2502\n\u2502  \u2502  \u2502  \ud83c\udf31 \u571f\u58e4\u4e0e\u6c34\u8d28\u73af\u5883 (39\u901a\u9053\u76d1\u6d4b)                                    \u2502   \u2502   \u2502\n\u2502  \u2502  \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510   \u2502   \u2502   \u2502\n\u2502  \u2502  \u2502  \u2502  \ud83d\udcca \u5b9e\u65f6\u4eea\u8868  \u2502  \u2502  \ud83d\udcc8 \u5386\u53f2\u66f2\u7ebf  \u2502  \u2502  \ud83d\udccb \u4f20\u611f\u5668\u6570\u503c\u77e9\u9635       \u2502   \u2502   \u2502   \u2502\n\u2502  \u2502  \u2502  \u2502  NPK\/Gauge  \u2502  \u2502  Chart      \u2502  \u2502  \u6e29\u6e7f\u5ea6\/\u7535\u5bfc\u7387\/\u538b\u529b      \u2502   \u2502   \u2502   \u2502\n\u2502  \u2502  \u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518   \u2502   \u2502   \u2502\n\u2502  \u2502  \u2502                          \u2191                                        \u2502   \u2502   \u2502\n\u2502  \u2502  \u2502                   39\u901a\u9053\u89e3\u6790\u6807\u5b9a                                   \u2502   \u2502   \u2502\n\u2502  \u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518   \u2502   \u2502\n\u2502  \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510   \u2502   \u2502\n\u2502  \u2502  \u2502  \ud83d\udea8 \u7cfb\u7edf\u62a5\u8b66\u76d1\u63a7                                                   \u2502   \u2502   \u2502\n\u2502  \u2502  \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510     \u2502   \u2502   \u2502\n\u2502  \u2502  \u2502  \u2502  \ud83d\udfe2 \u8fd0\u884c\u6b63\u5e38  \/  \ud83d\udea8 \u62a5\u8b66: \u80a5\u8def\u5835\u585e                         \u2502     \u2502   \u2502   \u2502\n\u2502  \u2502  \u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518     \u2502   \u2502   \u2502\n\u2502  \u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518   \u2502   \u2502\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518   \u2502\n\u2502                                    \u2502                                            \u2502\n\u2502                              MQTT \u534f\u8bae (EMQX)                                  \u2502\n\u2502                         sub\/\u63a7\u5236\u5355\u5143 \u2190\u2192 attributes                             \u2502\n\u2502                                    \u2502                                            \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                                     \u2502\n                                     \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502                              \u73b0\u573a\u63a7\u5236\u5c42 (MCGS TPC)                               \u2502\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510   \u2502\n\u2502  \u2502                         MCGS \u89e6\u6478\u5c4f\u4e3b\u63a7\u754c\u9762                              \u2502   \u2502\n\u2502  \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u2502   \u2502\n\u2502  \u2502  \u2502   \u8bbe\u5907\u63a7\u5236\u533a     \u2502    \u2502   \u4f20\u611f\u5668\u663e\u793a     \u2502    \u2502     \u62a5\u8b66\u6307\u793a\u680f       \u2502  \u2502   \u2502\n\u2502  \u2502  \u2502   S1-S7 \u5f00\u5173    \u2502    \u2502   NPK\/\u6e29\u6e7f\u5ea6    \u2502    \u2502   \ud83d\udea8 \u591a\u8def\u62a5\u8b66\u706f      \u2502  \u2502   \u2502\n\u2502  \u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2502   \u2502\n\u2502  \u2502           \u2502                      \u2502                        \u2502             \u2502   \u2502\n\u2502  \u2502           \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518             \u2502   \u2502\n\u2502  \u2502                                  \u2502                                      \u2502   \u2502\n\u2502  \u2502                           \u534f\u8bae\u8f6c\u6362\/\u6253\u5305                                 \u2502   \u2502\n\u2502  \u2502                                  \u2502                                      \u2502   \u2502\n\u2502  \u2502           \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510             \u2502   \u2502\n\u2502  \u2502           \u2502              \u5e95\u5c42\u4f20\u611f\u5668\u7f51\u7edc                    \u2502             \u2502   \u2502\n\u2502  \u2502           \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u2502             \u2502   \u2502\n\u2502  \u2502           \u2502  \u2502NPK\u4f20\u611f \u2502 \u2502\u6e29\u6e7f\u5ea6  \u2502 \u2502\u7535\u5bfc\u7387  \u2502 \u2502\u538b\u529b\u4f20\u611f\u2502  \u2502             \u2502   \u2502\n\u2502  \u2502           \u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2502             \u2502   \u2502\n\u2502  \u2502           \u2502  RS-485 \/ Modbus \/ 4-20mA \/ 0-10V              \u2502             \u2502   \u2502\n\u2502  \u2502           \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518             \u2502   \u2502\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518   \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n<\/code><\/pre>\n<h3>1.2 \u53cc\u94fe\u8def\u8bbe\u8ba1\u8bf4\u660e<\/h3>\n<table>\n<thead>\n<tr>\n<th>\u94fe\u8def\u65b9\u5411<\/th>\n<th>Topic<\/th>\n<th>\u901a\u9053\u6570<\/th>\n<th>\u6570\u636e\u65b9\u5411<\/th>\n<th>\u6838\u5fc3\u529f\u80fd<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>\u4e0b\u884c\u63a7\u5236<\/strong><\/td>\n<td><code>sub\/\u63a7\u5236\u5355\u5143<\/code><\/td>\n<td>9 \u901a\u9053<\/td>\n<td>Node-RED \u2192 MCGS<\/td>\n<td>\u8bbe\u5907\u5f00\u5173 + \u6a21\u62df\u91cf\u8bbe\u5b9a<\/td>\n<\/tr>\n<tr>\n<td><strong>\u4e0a\u884c\u76d1\u6d4b<\/strong><\/td>\n<td><code>attributes<\/code><\/td>\n<td>39 \u901a\u9053<\/td>\n<td>MCGS \u2192 Node-RED<\/td>\n<td>\u4f20\u611f\u5668\u6570\u636e + \u62a5\u8b66 + \u72b6\u6001\u53cd\u9988<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>\u8bbe\u8ba1\u7406\u5ff5<\/strong>:<br \/>\n&#8211; <strong>\u63a7\u5236\u96c6\u7ea6\u5316<\/strong>: 9 \u4e2a\u63a7\u5236\u6307\u4ee4\u5408\u5e76\u4e3a 1 \u4e2a JSON \u4e0b\u53d1\uff0c\u51cf\u5c11\u7f51\u7edc\u5f00\u9500<br \/>\n&#8211; <strong>\u76d1\u6d4b\u539f\u5b50\u5316<\/strong>: 39 \u4e2a\u76d1\u6d4b\u5b57\u6bb5\u72ec\u7acb\u5206\u6d41\uff0c\u652f\u6301\u7cbe\u7ec6\u5316\u5c55\u793a<br \/>\n&#8211; <strong>\u72b6\u6001\u95ed\u73af<\/strong>: \u63a7\u5236\u6307\u4ee4\u6267\u884c\u7ed3\u679c\u901a\u8fc7\u4e0a\u884c\u94fe\u8def\u56de\u4f20\uff0c\u5b9e\u73b0\u6570\u5b57\u5b6a\u751f<\/p>\n<h3>1.3 \u6570\u636e\u901a\u9053\u660e\u7ec6\u8868<\/h3>\n<p><strong>\u4e0b\u884c\u63a7\u5236\u901a\u9053 (9 \u8def)<\/strong>:<\/p>\n<table>\n<thead>\n<tr>\n<th>\u901a\u9053<\/th>\n<th>\u540d\u79f0<\/th>\n<th>\u7c7b\u578b<\/th>\n<th>\u8303\u56f4<\/th>\n<th>\u8bf4\u660e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>S1<\/td>\n<td>\u6c34\u6cf5\u5f00\u5173<\/td>\n<td>Boolean<\/td>\n<td>true\/false<\/td>\n<td>\u4e3b\u704c\u6e89\u6cf5<\/td>\n<\/tr>\n<tr>\n<td>S2<\/td>\n<td>\u9600\u95e8\u5f00\u5173<\/td>\n<td>Boolean<\/td>\n<td>true\/false<\/td>\n<td>\u533a\u57df\u9600\u95e8<\/td>\n<\/tr>\n<tr>\n<td>S3<\/td>\n<td>\u65bd\u80a5\u5f00\u5173<\/td>\n<td>Boolean<\/td>\n<td>true\/false<\/td>\n<td>\u65bd\u80a5\u6cf5<\/td>\n<\/tr>\n<tr>\n<td>S4<\/td>\n<td>\u5907\u7528\u5f00\u5173 4<\/td>\n<td>Boolean<\/td>\n<td>true\/false<\/td>\n<td>\u9884\u7559\u6269\u5c55<\/td>\n<\/tr>\n<tr>\n<td>S5<\/td>\n<td>\u5907\u7528\u5f00\u5173 5<\/td>\n<td>Boolean<\/td>\n<td>true\/false<\/td>\n<td>\u9884\u7559\u6269\u5c55<\/td>\n<\/tr>\n<tr>\n<td>S6<\/td>\n<td>\u5907\u7528\u5f00\u5173 6<\/td>\n<td>Boolean<\/td>\n<td>true\/false<\/td>\n<td>\u9884\u7559\u6269\u5c55<\/td>\n<\/tr>\n<tr>\n<td>S7<\/td>\n<td>\u5907\u7528\u5f00\u5173 7<\/td>\n<td>Boolean<\/td>\n<td>true\/false<\/td>\n<td>\u9884\u7559\u6269\u5c55<\/td>\n<\/tr>\n<tr>\n<td>Pres1<\/td>\n<td>\u4e3b\u8def\u538b\u529b\u8bbe\u5b9a<\/td>\n<td>Number<\/td>\n<td>0-100<\/td>\n<td>\u5355\u4f4d: bar<\/td>\n<\/tr>\n<tr>\n<td>Freq<\/td>\n<td>\u8fd0\u884c\u9891\u7387<\/td>\n<td>Number<\/td>\n<td>0-50<\/td>\n<td>\u5355\u4f4d: Hz<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>\u4e0a\u884c\u76d1\u6d4b\u901a\u9053 (39 \u8def)<\/strong>:<\/p>\n<table>\n<thead>\n<tr>\n<th>\u7c7b\u522b<\/th>\n<th>\u5b57\u6bb5\u793a\u4f8b<\/th>\n<th>\u6570\u636e\u7c7b\u578b<\/th>\n<th>\u6807\u5b9a\u7cfb\u6570<\/th>\n<th>\u8bf4\u660e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>\u571f\u58e4\u517b\u5206<\/strong><\/td>\n<td>N, P, K<\/td>\n<td>UInt16<\/td>\n<td>\u00f7 10<\/td>\n<td>\u6c2e\u78f7\u94be\u542b\u91cf mg\/kg<\/td>\n<\/tr>\n<tr>\n<td><strong>\u73af\u5883\u53c2\u6570<\/strong><\/td>\n<td>RD11-RD20<\/td>\n<td>UInt16<\/td>\n<td>\u00f7 10<\/td>\n<td>\u591a\u8def\u6e29\u6e7f\u5ea6<\/td>\n<\/tr>\n<tr>\n<td><strong>\u6c34\u8d28\u53c2\u6570<\/strong><\/td>\n<td>EC, pH<\/td>\n<td>UInt16<\/td>\n<td>\u00f7 100<\/td>\n<td>\u7535\u5bfc\u7387\/\u9178\u78b1\u5ea6<\/td>\n<\/tr>\n<tr>\n<td><strong>\u7cfb\u7edf\u538b\u529b<\/strong><\/td>\n<td>Pres1, Pres2<\/td>\n<td>UInt16<\/td>\n<td>\u00f7 10<\/td>\n<td>\u4e3b\/\u652f\u8def\u538b\u529b<\/td>\n<\/tr>\n<tr>\n<td><strong>\u8bbe\u5907\u72b6\u6001<\/strong><\/td>\n<td>S1-S7<\/td>\n<td>Boolean<\/td>\n<td>&#8211;<\/td>\n<td>\u5f00\u5173\u771f\u5b9e\u72b6\u6001<\/td>\n<\/tr>\n<tr>\n<td><strong>\u62a5\u8b66\u4fe1\u606f<\/strong><\/td>\n<td>AM1-AM10<\/td>\n<td>String<\/td>\n<td>&#8211;<\/td>\n<td>\u591a\u8def\u62a5\u8b66\u4ee3\u7801<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2>\u4e8c\u3001\u4e0b\u884c\u63a7\u5236\u94fe\u8def\uff1a\u591a\u901a\u9053\u6307\u4ee4\u52a8\u6001\u6253\u5305<\/h2>\n<h3>2.1 \u529f\u80fd\u76ee\u6807<\/h3>\n<p>\u5c06\u7f51\u9875\u7aef 9 \u4e2a\u72ec\u7acb\u7684\u63a7\u5236\u6307\u4ee4\uff08S1-S7 \u8bbe\u5907\u5f00\u5173\u3001Pres1 \u538b\u529b\u8bbe\u5b9a\u3001Freq \u9891\u7387\u8bbe\u5b9a\uff09\u52a8\u6001\u5408\u5e76\u4e3a\u4e00\u4e2a\u5b8c\u6574\u7684 JSON \u62a5\u6587\u4e0b\u53d1\u3002<\/p>\n<p><strong>\u4e3a\u4ec0\u4e48\u9700\u8981\u6253\u5305\uff1f<\/strong><br \/>\n&#8211; \u51cf\u5c11 MQTT \u6d88\u606f\u6570\u91cf\uff089 \u6761 \u2192 1 \u6761\uff09<br \/>\n&#8211; \u4fdd\u8bc1\u6307\u4ee4\u539f\u5b50\u6027\uff08\u540c\u4e00\u6761\u62a5\u6587\u540c\u65f6\u751f\u6548\uff09<br \/>\n&#8211; \u7b80\u5316 MCGS \u7aef\u89e3\u6790\u903b\u8f91<\/p>\n<h3>2.2 \u7f51\u9875 UI \u8282\u70b9\u914d\u7f6e<\/h3>\n<h4>2.2.1 \u5f00\u5173\u63a7\u4ef6 (Switch) &#8211; S1 \u5230 S7<\/h4>\n<table>\n<thead>\n<tr>\n<th>\u914d\u7f6e\u9879<\/th>\n<th>\u503c<\/th>\n<th>\u5fc5\u987b\u6ce8\u610f<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Topic<\/strong><\/td>\n<td><code>S1<\/code> \/ <code>S2<\/code> \/ &#8230; \/ <code>S7<\/code><\/td>\n<td>\u7eaf\u6587\u672c\uff0c\u533a\u5206\u5927\u5c0f\u5199<\/td>\n<\/tr>\n<tr>\n<td><strong>On Payload<\/strong><\/td>\n<td><code>true<\/code><\/td>\n<td>\u26a0\ufe0f \u5fc5\u987b\u662f <strong>Boolean<\/strong> \u7c7b\u578b<\/td>\n<\/tr>\n<tr>\n<td><strong>Off Payload<\/strong><\/td>\n<td><code>false<\/code><\/td>\n<td>\u26a0\ufe0f \u5fc5\u987b\u662f <strong>Boolean<\/strong> \u7c7b\u578b<\/td>\n<\/tr>\n<tr>\n<td><strong>Indicator<\/strong><\/td>\n<td><code>state of the input<\/code><\/td>\n<td>\u6570\u5b57\u5b6a\u751f\u5fc5\u5907<\/td>\n<\/tr>\n<tr>\n<td><strong>Pass through<\/strong><\/td>\n<td>\u2610 \u53d6\u6d88\u52fe\u9009<\/td>\n<td>\u9632\u6b62\u6b7b\u5faa\u73af<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>\u914d\u7f6e\u9762\u677f\u793a\u610f<\/strong>:<\/p>\n<pre><code>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502  Group: [\ud83d\udcbb \u73b0\u573a\u8bbe\u5907\u63a7\u5236\u533a    \u25bc]        \u2502\n\u2502  Label: [\u6c34\u6cf5 S1              ]         \u2502\n\u2502  Topic: [S1                   ]         \u2502\n\u2502                                         \u2502\n\u2502  On Payload:  [true]  \u261c\u2500\u2500 \u5e03\u5c14\u7c7b\u578b \ud83d\udd35   \u2502\n\u2502  Off Payload: [false] \u261c\u2500\u2500 \u5e03\u5c14\u7c7b\u578b \ud83d\udd35   \u2502\n\u2502                                         \u2502\n\u2502  \u2610 Pass through msg... \u261c\u2500\u2500 \u5fc5\u987b\u53d6\u6d88     \u2502\n\u2502                                         \u2502\n\u2502  Indicator: [Switch icon shows        ] \u2502\n\u2502             [state of the input \u25bc]     \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n<\/code><\/pre>\n<h4>2.2.2 \u6ed1\u52a8\/\u6570\u5b57\u63a7\u4ef6 &#8211; Pres1 \/ Freq<\/h4>\n<table>\n<thead>\n<tr>\n<th>\u914d\u7f6e\u9879<\/th>\n<th>Pres1 (\u538b\u529b)<\/th>\n<th>Freq (\u9891\u7387)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Topic<\/strong><\/td>\n<td><code>Pres1<\/code><\/td>\n<td><code>Freq<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>Min<\/strong><\/td>\n<td>0<\/td>\n<td>0<\/td>\n<\/tr>\n<tr>\n<td><strong>Max<\/strong><\/td>\n<td>100<\/td>\n<td>50<\/td>\n<\/tr>\n<tr>\n<td><strong>Step<\/strong><\/td>\n<td>0.1<\/td>\n<td>0.1<\/td>\n<\/tr>\n<tr>\n<td><strong>\u5355\u4f4d<\/strong><\/td>\n<td>bar<\/td>\n<td>Hz<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>2.3 \u63a7\u5236\u6307\u4ee4\u6253\u5305 (Function \u8282\u70b9)<\/h3>\n<h4>2.3.1 \u903b\u8f91\u539f\u7406<\/h4>\n<p>\u91c7\u7528<strong>&#8220;\u7cfb\u7edf\u5168\u5c40\u8bb0\u5fc6&#8221;<\/strong>\u7b56\u7565\uff1a<br \/>\n1. \u5728 Node-RED \u7684 <code>flow<\/code> \u4e0a\u4e0b\u6587\u4e2d\u7ef4\u62a4 9 \u4e2a\u53c2\u6570\u7684\u6700\u65b0\u72b6\u6001<br \/>\n2. \u4efb\u610f UI \u8282\u70b9\u89e6\u53d1\u53d8\u5316\u65f6\uff0c\u66f4\u65b0\u5bf9\u5e94\u53c2\u6570<br \/>\n3. \u7edf\u4e00\u4e0b\u53d1\u5b8c\u6574 JSON\uff0c\u5185\u7f6e\u9632\u9519\u62e6\u622a\u673a\u5236<\/p>\n<h4>2.3.2 \u8282\u70b9\u914d\u7f6e<\/h4>\n<table>\n<thead>\n<tr>\n<th>\u5c5e\u6027<\/th>\n<th>\u503c<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>\u540d\u79f0<\/strong><\/td>\n<td><code>\u63a7\u5236\u6307\u4ee4\u6253\u5305<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>Outputs<\/strong><\/td>\n<td>1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>2.3.3 \u5b8c\u6574\u4ee3\u7801<\/h4>\n<pre><code class=\"language-javascript\">\/**\n * \u63a7\u5236\u6307\u4ee4\u6253\u5305\u5668 - 9\u901a\u9053\u52a8\u6001\u5408\u5e76\n * \u8f93\u5165: \u4efb\u610f UI \u8282\u70b9\u7684 msg (\u542b topic + payload)\n * \u8f93\u51fa: \u5b8c\u6574\u7684 9 \u53c2\u6570 JSON \u63a7\u5236\u62a5\u6587\n *\/\n\n\/\/ 1. \u4ece flow \u4e0a\u4e0b\u6587\u4e2d\u83b7\u53d6\u7cfb\u7edf\u8bb0\u5fc6\uff0c\u82e5\u65e0\u5219\u521d\u59cb\u5316\nvar control_state = flow.get('control_state') || {\n    \"Freq\": 0,      \/\/ \u9891\u7387\u8bbe\u5b9a\n    \"Pres1\": 0,     \/\/ \u538b\u529b\u8bbe\u5b9a\n    \"S1\": false,    \/\/ \u6c34\u6cf5\n    \"S2\": false,    \/\/ \u9600\u95e8\n    \"S3\": false,    \/\/ \u65bd\u80a5\n    \"S4\": false,    \/\/ \u5907\u7528\n    \"S5\": false,    \/\/ \u5907\u7528\n    \"S6\": false,    \/\/ \u5907\u7528\n    \"S7\": false     \/\/ \u5907\u7528\n};\n\n\/\/ 2. \u52a8\u6001\u5339\u914d\u5e76\u66f4\u65b0\u72b6\u6001\n\/\/    msg.topic \u5bf9\u5e94 Key, msg.payload \u5bf9\u5e94 Value\nif (control_state.hasOwnProperty(msg.topic)) {\n    control_state[msg.topic] = msg.payload;\n\n    \/\/ \u4fdd\u5b58\u5230 flow \u4e0a\u4e0b\u6587\uff08\u6301\u4e45\u5316\u8bb0\u5fc6\uff09\n    flow.set('control_state', control_state);\n\n    node.status({fill:\"green\", shape:\"dot\", \n                 text: msg.topic + \" \u2192 \" + msg.payload});\n} else {\n    \/\/ \u9632\u9519\u62e6\u622a\uff1a\u672a\u77e5\u7684 topic \u4e0d\u5904\u7406\n    node.warn(\"\u26a0\ufe0f \u672a\u77e5 Topic \u62e6\u622a: \" + msg.topic);\n    node.status({fill:\"red\", shape:\"ring\", \n                 text: \"\u672a\u77e5: \" + msg.topic});\n    return null; \/\/ \u7ec8\u6b62\u6d41\n}\n\n\/\/ 3. \u6784\u5efa\u6807\u51c6\u8f93\u51fa\u62a5\u6587\nmsg.topic = \"sub\/\u63a7\u5236\u5355\u5143\";  \/\/ \u5f3a\u5236\u6307\u5b9a\u4e0b\u53d1\u4e3b\u9898\nmsg.payload = control_state;  \/\/ \u5b8c\u6574 9 \u53c2\u6570\u5bf9\u8c61\n\n\/\/ \u8c03\u8bd5\u8f93\u51fa\uff08\u5f00\u53d1\u65f6\u5f00\u542f\uff09\n\/\/ node.warn(\"\u4e0b\u53d1\u62a5\u6587: \" + JSON.stringify(control_state));\n\nreturn msg;\n<\/code><\/pre>\n<h4>2.3.4 \u8f93\u51fa\u62a5\u6587\u793a\u4f8b<\/h4>\n<pre><code class=\"language-json\">{\n  \"topic\": \"sub\/\u63a7\u5236\u5355\u5143\",\n  \"payload\": {\n    \"Freq\": 35.5,\n    \"Pres1\": 2.8,\n    \"S1\": true,\n    \"S2\": false,\n    \"S3\": true,\n    \"S4\": false,\n    \"S5\": false,\n    \"S6\": false,\n    \"S7\": false\n  }\n}\n<\/code><\/pre>\n<h3>2.4 MQTT Out \u8282\u70b9\u914d\u7f6e<\/h3>\n<table>\n<thead>\n<tr>\n<th>\u914d\u7f6e\u9879<\/th>\n<th>\u503c<\/th>\n<th>\u8bf4\u660e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Server<\/strong><\/td>\n<td>EMQX \u5730\u5740<\/td>\n<td>192.168.137.238:1883<\/td>\n<\/tr>\n<tr>\n<td><strong>Topic<\/strong><\/td>\n<td><code>sub\/\u63a7\u5236\u5355\u5143<\/code><\/td>\n<td>MCGS \u8ba2\u9605\u6b64\u4e3b\u9898<\/td>\n<\/tr>\n<tr>\n<td><strong>QoS<\/strong><\/td>\n<td>1<\/td>\n<td>\u81f3\u5c11\u9001\u8fbe\u4e00\u6b21<\/td>\n<\/tr>\n<tr>\n<td><strong>Retain<\/strong><\/td>\n<td>false<\/td>\n<td>\u4e0d\u4fdd\u7559\u6700\u65b0\u6d88\u606f<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2>\u4e09\u3001\u4e0a\u884c\u76d1\u6d4b\u94fe\u8def\uff1a39 \u901a\u9053\u4f20\u611f\u5668\u6570\u636e\u89e3\u6790\u4e0e\u6807\u5b9a<\/h2>\n<h3>3.1 \u529f\u80fd\u76ee\u6807<\/h3>\n<p>\u63a5\u6536 MCGS \u6c47\u603b\u4e0a\u62a5\u7684\u5de5\u4e1a\u7ea7\u6570\u636e\u5305\uff08\u5305\u542b NPK\u3001\u6e29\u6e7f\u5ea6\u3001\u7535\u5bfc\u7387\u3001\u538b\u529b\u3001\u62a5\u8b66\u53ca\u8bbe\u5907\u53cd\u9988\u5171 39 \u4e2a\u5b57\u6bb5\uff09\uff0c\u8fdb\u884c\uff1a<br \/>\n&#8211; <strong>\u5de5\u7a0b\u91cf\u8fd8\u539f<\/strong>: \u5c06 UInt16 \u6574\u6570\u8f6c\u4e3a\u5b9e\u9645\u7269\u7406\u91cf<br \/>\n&#8211; <strong>\u591a\u8def\u5206\u6d41<\/strong>: 39 \u4e2a\u5b57\u6bb5\u5206\u53d1\u5230\u4e0d\u540c UI \u7ec4\u4ef6<br \/>\n&#8211; <strong>\u5bb9\u9519\u5904\u7406<\/strong>: \u5f02\u5e38\u6570\u636e\u62e6\u622a<\/p>\n<h3>3.2 MCGS \u4e0a\u62a5\u6570\u636e\u683c\u5f0f<\/h3>\n<p><strong>MCGS \u4e0a\u62a5\u62a5\u6587\u793a\u4f8b<\/strong>:<\/p>\n<pre><code class=\"language-json\">{\n  \"N\": 150,      \/\/ \u6c2e\u542b\u91cf (\u00d710 mg\/kg)\n  \"P\": 80,       \/\/ \u78f7\u542b\u91cf\n  \"K\": 120,      \/\/ \u94be\u542b\u91cf\n  \"RD11\": 258,   \/\/ 1\u53f7\u542b\u6c34\u7387 (\u00d710 %)\n  \"RD12\": 245,   \/\/ 1\u53f7\u6e29\u5ea6 (\u00d710 \u2103)\n  \"RD21\": 1560,  \/\/ \u7535\u5bfc\u7387 (\u00d7100 \u03bcS\/cm)\n  \"Pres1\": 28,   \/\/ \u538b\u529b (\u00d710 bar)\n  \"S1\": true,    \/\/ \u6c34\u6cf5\u5b9e\u9645\u72b6\u6001\n  \"AM1\": \"\"      \/\/ \u62a5\u8b66\u4fe1\u606f (\u7a7a=\u6b63\u5e38)\n  \/\/ ... \u5171 39 \u4e2a\u5b57\u6bb5\n}\n<\/code><\/pre>\n<h3>3.3 \u6570\u636e\u63a5\u6536\u4e0e\u683c\u5f0f\u5316<\/h3>\n<h4>3.3.1 MQTT In \u8282\u70b9<\/h4>\n<table>\n<thead>\n<tr>\n<th>\u914d\u7f6e\u9879<\/th>\n<th>\u503c<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Topic<\/strong><\/td>\n<td><code>attributes<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>QoS<\/strong><\/td>\n<td>1<\/td>\n<\/tr>\n<tr>\n<td><strong>Output<\/strong><\/td>\n<td>a parsed JSON object<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>3.3.2 JSON \u8282\u70b9\uff08\u5907\u7528\u8f6c\u6362\uff09<\/h4>\n<p>\u5982\u679c MQTT In \u8f93\u51fa\u7684\u662f\u5b57\u7b26\u4e32\uff0c\u6dfb\u52a0 JSON \u8282\u70b9\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<th>\u914d\u7f6e\u9879<\/th>\n<th>\u503c<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Action<\/strong><\/td>\n<td><code>Always convert to JavaScript Object<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>Property<\/strong><\/td>\n<td><code>msg.payload<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>3.4 \u8d85\u7ea7\u5206\u53d1\u4e2d\u5fc3 (Function \u8282\u70b9)<\/h3>\n<h4>3.4.1 \u8282\u70b9\u8bbe\u7f6e<\/h4>\n<table>\n<thead>\n<tr>\n<th>\u5c5e\u6027<\/th>\n<th>\u503c<\/th>\n<th>\u5fc5\u987b\u6ce8\u610f<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>\u540d\u79f0<\/strong><\/td>\n<td><code>39\u901a\u9053\u6570\u636e\u5206\u53d1<\/code><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><strong>Outputs<\/strong><\/td>\n<td>39<\/td>\n<td>\u26a0\ufe0f \u5fc5\u987b\u624b\u52a8\u6539\u4e3a 39\uff01<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>\u4fee\u6539\u65b9\u6cd5<\/strong>:<br \/>\n1. \u53cc\u51fb Function \u8282\u70b9<br \/>\n2. \u5e95\u90e8\u627e\u5230 <strong>&#8220;Outputs&#8221;<\/strong> \u8f93\u5165\u6846<br \/>\n3. \u5c06\u9ed8\u8ba4\u503c 1 \u6539\u4e3a <strong>39<\/strong><br \/>\n4. \u70b9\u51fb\u300c\u5b8c\u6210\u300d<br \/>\n5. \u8282\u70b9\u4f1a\u663e\u793a 39 \u4e2a\u8f93\u51fa\u7aef\u53e3<\/p>\n<h4>3.4.2 \u5de5\u7a0b\u91cf\u8fd8\u539f (Calibration)<\/h4>\n<p>\u9488\u5bf9\u5e95\u5c42\u4f20\u6765\u7684 UInt16 \u65e0\u7b26\u53f7\u6574\u6570\u8fdb\u884c\u7cfb\u6570\u8fd8\u539f\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<th>\u7269\u7406\u91cf<\/th>\n<th>\u539f\u59cb\u503c\u8303\u56f4<\/th>\n<th>\u7cfb\u6570<\/th>\n<th>\u7ed3\u679c\u5355\u4f4d<\/th>\n<th>\u793a\u4f8b<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u6e29\u5ea6<\/td>\n<td>0-65535<\/td>\n<td>\u00f7 10<\/td>\n<td>\u2103<\/td>\n<td>245 \u2192 24.5\u2103<\/td>\n<\/tr>\n<tr>\n<td>\u6e7f\u5ea6<\/td>\n<td>0-65535<\/td>\n<td>\u00f7 10<\/td>\n<td>%<\/td>\n<td>258 \u2192 25.8%<\/td>\n<\/tr>\n<tr>\n<td>NPK<\/td>\n<td>0-65535<\/td>\n<td>\u00f7 10<\/td>\n<td>mg\/kg<\/td>\n<td>150 \u2192 15.0mg\/kg<\/td>\n<\/tr>\n<tr>\n<td>\u7535\u5bfc\u7387<\/td>\n<td>0-65535<\/td>\n<td>\u00f7 100<\/td>\n<td>mS\/cm<\/td>\n<td>1560 \u2192 15.6mS\/cm<\/td>\n<\/tr>\n<tr>\n<td>\u538b\u529b<\/td>\n<td>0-65535<\/td>\n<td>\u00f7 10<\/td>\n<td>bar<\/td>\n<td>28 \u2192 2.8bar<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>3.4.3 \u5b8c\u6574\u4ee3\u7801<\/h4>\n<pre><code class=\"language-javascript\">\/**\n * 39\u901a\u9053\u6570\u636e\u5206\u53d1\u5668 - \u8d85\u7ea7\u5206\u53d1\u4e2d\u5fc3\n * \u8f93\u5165: MCGS \u4e0a\u62a5\u7684 39 \u5b57\u6bb5 JSON\n * \u8f93\u51fa: 39 \u8def\u72ec\u7acb msg\uff0c\u5206\u522b\u63a5\u5165\u4e0d\u540c UI \u7ec4\u4ef6\n *\/\n\nvar d = msg.payload;\n\n\/\/ 1. \u5bb9\u9519\u673a\u5236\uff1a\u68c0\u67e5\u6570\u636e\u6709\u6548\u6027\nif (!d || typeof d !== 'object') {\n    node.error(\"\u274c \u65e0\u6548\u6570\u636e\u683c\u5f0f\");\n    return null;\n}\n\n\/\/ 2. \u5de5\u7a0b\u91cf\u8fd8\u539f\u51fd\u6570\nfunction calibrate(value, factor) {\n    if (value === undefined || value === null) return 0;\n    return Number(value) \/ factor;\n}\n\n\/\/ 3. \u7269\u7406\u91cf\u8fd8\u539f (\u6309\u5b9e\u9645\u5b57\u6bb5\u8c03\u6574)\nvar temp_1 = calibrate(d.RD12, 10);   \/\/ 1\u53f7\u6e29\u5ea6 (\u2103)\nvar moist_1 = calibrate(d.RD11, 10);  \/\/ 1\u53f7\u542b\u6c34\u7387 (%)\nvar ec_1 = calibrate(d.RD21, 100);    \/\/ \u7535\u5bfc\u7387 (mS\/cm)\nvar pres_1 = calibrate(d.Pres1, 10);  \/\/ \u4e3b\u8def\u538b\u529b (bar)\nvar n_val = calibrate(d.N, 10);       \/\/ \u6c2e\u542b\u91cf\nvar p_val = calibrate(d.P, 10);       \/\/ \u78f7\u542b\u91cf\nvar k_val = calibrate(d.K, 10);       \/\/ \u94be\u542b\u91cf\n\n\/\/ 4. \u540c\u6b65\u66f4\u65b0\u63a7\u5236\u72b6\u6001\u8bb0\u5fc6\uff08\u7528\u4e8e\u4e0b\u884c\u94fe\u8def\u7684\u6570\u5b57\u5b6a\u751f\uff09\nflow.set('control_state', {\n    \"Freq\": d.Freq || 0,\n    \"Pres1\": d.Pres1 || 0,\n    \"S1\": d.S1 || false,\n    \"S2\": d.S2 || false,\n    \"S3\": d.S3 || false,\n    \"S4\": d.S4 || false,\n    \"S5\": d.S5 || false,\n    \"S6\": d.S6 || false,\n    \"S7\": d.S7 || false\n});\n\n\/\/ 5. \u6784\u5efa 39 \u8def\u8f93\u51fa\u6570\u7ec4\n\/\/    \u6bcf\u8def\u8f93\u51fa = { payload: \u503c, topic: \u663e\u793a\u540d\u79f0 }\n\/\/    \u987a\u5e8f\u5fc5\u987b\u4e0e UI \u7ec4\u4ef6\u7684\u8fde\u7ebf\u987a\u5e8f\u4e00\u81f4\uff01\nreturn [\n    \/\/ \u7b2c 1-10 \u8def: \u4e3b\u8981\u8bbe\u5b9a\u503c\u4e0e\u72b6\u6001\n    { payload: pres_1, topic: \"\u4e3b\u8def\u538b\u529b(bar)\" },      \/\/ \u8f93\u51fa 1 \u2192 Gauge\n    { payload: d.Freq || 0, topic: \"\u8fd0\u884c\u9891\u7387(Hz)\" },  \/\/ \u8f93\u51fa 2 \u2192 Gauge\n    { payload: n_val, topic: \"\u6c2e\u542b\u91cf(mg\/kg)\" },       \/\/ \u8f93\u51fa 3 \u2192 Gauge\n    { payload: p_val, topic: \"\u78f7\u542b\u91cf(mg\/kg)\" },       \/\/ \u8f93\u51fa 4 \u2192 Gauge\n    { payload: k_val, topic: \"\u94be\u542b\u91cf(mg\/kg)\" },       \/\/ \u8f93\u51fa 5 \u2192 Gauge\n    { payload: ec_1, topic: \"\u7535\u5bfc\u7387(mS\/cm)\" },        \/\/ \u8f93\u51fa 6 \u2192 Gauge\n    { payload: d.S1, topic: \"S1\u72b6\u6001\" },               \/\/ \u8f93\u51fa 7 \u2192 Switch \u53cd\u9988\n    { payload: d.S2, topic: \"S2\u72b6\u6001\" },               \/\/ \u8f93\u51fa 8 \u2192 Switch \u53cd\u9988\n    { payload: d.S3, topic: \"S3\u72b6\u6001\" },               \/\/ \u8f93\u51fa 9 \u2192 Switch \u53cd\u9988\n    { payload: d.S4, topic: \"S4\u72b6\u6001\" },               \/\/ \u8f93\u51fa 10\n\n    \/\/ \u7b2c 11-20 \u8def: \u591a\u8def\u6e29\u6e7f\u5ea6\n    { payload: moist_1, topic: \"1\u53f7\u542b\u6c34\u7387(%)\" },      \/\/ \u8f93\u51fa 11 \u2192 Chart\n    { payload: temp_1, topic: \"1\u53f7\u6e29\u5ea6(\u2103)\" },        \/\/ \u8f93\u51fa 12 \u2192 Chart\n    { payload: calibrate(d.RD13, 10), topic: \"2\u53f7\u542b\u6c34\u7387\" }, \/\/ \u8f93\u51fa 13\n    { payload: calibrate(d.RD14, 10), topic: \"2\u53f7\u6e29\u5ea6\" },   \/\/ \u8f93\u51fa 14\n    { payload: calibrate(d.RD15, 10), topic: \"3\u53f7\u542b\u6c34\u7387\" }, \/\/ \u8f93\u51fa 15\n    { payload: calibrate(d.RD16, 10), topic: \"3\u53f7\u6e29\u5ea6\" },   \/\/ \u8f93\u51fa 16\n    { payload: calibrate(d.RD17, 10), topic: \"4\u53f7\u542b\u6c34\u7387\" }, \/\/ \u8f93\u51fa 17\n    { payload: calibrate(d.RD18, 10), topic: \"4\u53f7\u6e29\u5ea6\" },   \/\/ \u8f93\u51fa 18\n    { payload: calibrate(d.RD19, 10), topic: \"5\u53f7\u542b\u6c34\u7387\" }, \/\/ \u8f93\u51fa 19\n    { payload: calibrate(d.RD20, 10), topic: \"5\u53f7\u6e29\u5ea6\" },   \/\/ \u8f93\u51fa 20\n\n    \/\/ \u7b2c 21-30 \u8def: \u62a5\u8b66\u4e0e\u6269\u5c55\n    { payload: d.AM1 || \"\", topic: \"\u4e3b\u8def\u62a5\u8b66\" },      \/\/ \u8f93\u51fa 21 \u2192 \u62a5\u8b66 Text\n    { payload: d.AM2 || \"\", topic: \"\u80a5\u8def\u62a5\u8b66\" },      \/\/ \u8f93\u51fa 22 \u2192 \u62a5\u8b66 Text\n    { payload: d.AM3 || \"\", topic: \"\u6cf5\u62a5\u8b66\" },        \/\/ \u8f93\u51fa 23\n    { payload: d.AM4 || \"\", topic: \"\u9600\u95e8\u62a5\u8b66\" },      \/\/ \u8f93\u51fa 24\n    { payload: d.AM5 || \"\", topic: \"\u5907\u7528\u62a5\u8b665\" },     \/\/ \u8f93\u51fa 25\n    { payload: d.AM6 || \"\", topic: \"\u5907\u7528\u62a5\u8b666\" },     \/\/ \u8f93\u51fa 26\n    { payload: d.AM7 || \"\", topic: \"\u5907\u7528\u62a5\u8b667\" },     \/\/ \u8f93\u51fa 27\n    { payload: d.AM8 || \"\", topic: \"\u5907\u7528\u62a5\u8b668\" },     \/\/ \u8f93\u51fa 28\n    { payload: d.AM9 || \"\", topic: \"\u5907\u7528\u62a5\u8b669\" },     \/\/ \u8f93\u51fa 29\n    { payload: d.AM10 || \"\", topic: \"\u5907\u7528\u62a5\u8b6610\" },   \/\/ \u8f93\u51fa 30\n\n    \/\/ \u7b2c 31-39 \u8def: \u66f4\u591a\u8bbe\u5907\u72b6\u6001\u53cd\u9988\uff08\u7528\u4e8e\u6570\u5b57\u5b6a\u751f\uff09\n    { payload: d.S5, topic: \"S5\u72b6\u6001\" },               \/\/ \u8f93\u51fa 31\n    { payload: d.S6, topic: \"S6\u72b6\u6001\" },               \/\/ \u8f93\u51fa 32\n    { payload: d.S7, topic: \"S7\u72b6\u6001\" },               \/\/ \u8f93\u51fa 33\n    \/\/ ... \u53ef\u7ee7\u7eed\u6269\u5c55\u81f3 39 \u8def\n    { payload: 0, topic: \"\u4fdd\u755934\" },                  \/\/ \u8f93\u51fa 34\n    { payload: 0, topic: \"\u4fdd\u755935\" },                  \/\/ \u8f93\u51fa 35\n    { payload: 0, topic: \"\u4fdd\u755936\" },                  \/\/ \u8f93\u51fa 36\n    { payload: 0, topic: \"\u4fdd\u755937\" },                  \/\/ \u8f93\u51fa 37\n    { payload: 0, topic: \"\u4fdd\u755938\" },                  \/\/ \u8f93\u51fa 38\n    { payload: 0, topic: \"\u4fdd\u755939\" }                   \/\/ \u8f93\u51fa 39\n];\n<\/code><\/pre>\n<h3>3.5 \u8f93\u51fa\u8fde\u7ebf\u65b9\u5f0f<\/h3>\n<pre><code>Function \u8282\u70b9 (39\u901a\u9053\u6570\u636e\u5206\u53d1)\n      \u2502\n      \u251c\u2500\u2500\u8f93\u51fa 1\u2500\u2500&gt; ui_gauge (\u4e3b\u8def\u538b\u529b)\n      \u251c\u2500\u2500\u8f93\u51fa 2\u2500\u2500&gt; ui_gauge (\u8fd0\u884c\u9891\u7387)\n      \u251c\u2500\u2500\u8f93\u51fa 3\u2500\u2500&gt; ui_gauge (\u6c2e\u542b\u91cf)\n      \u251c\u2500\u2500\u8f93\u51fa 4\u2500\u2500&gt; ui_gauge (\u78f7\u542b\u91cf)\n      \u251c\u2500\u2500\u8f93\u51fa 5\u2500\u2500&gt; ui_gauge (\u94be\u542b\u91cf)\n      \u251c\u2500\u2500\u8f93\u51fa 6\u2500\u2500&gt; ui_gauge (\u7535\u5bfc\u7387)\n      \u2502\n      \u251c\u2500\u2500\u8f93\u51fa 7\u2500\u2500&gt; ui_switch (S1 \u53cd\u9988\u8f93\u5165)\n      \u251c\u2500\u2500\u8f93\u51fa 8\u2500\u2500&gt; ui_switch (S2 \u53cd\u9988\u8f93\u5165)\n      \u251c\u2500\u2500\u8f93\u51fa 9\u2500\u2500&gt; ui_switch (S3 \u53cd\u9988\u8f93\u5165)\n      \u2502\n      \u251c\u2500\u2500\u8f93\u51fa 11\u2500\u2500&gt; ui_chart (\u542b\u6c34\u7387\u5386\u53f2\u66f2\u7ebf)\n      \u251c\u2500\u2500\u8f93\u51fa 12\u2500\u2500&gt; ui_chart (\u6e29\u5ea6\u5386\u53f2\u66f2\u7ebf)\n      \u2502\n      \u251c\u2500\u2500\u8f93\u51fa 21\u2500\u2500&gt; function (\u62a5\u8b66\u9632\u5f39) \u2500\u2500&gt; ui_text\n      \u2514\u2500\u2500\u8f93\u51fa 22\u2500\u2500&gt; function (\u62a5\u8b66\u9632\u5f39) \u2500\u2500&gt; ui_text\n<\/code><\/pre>\n<hr \/>\n<h2>\u56db\u3001Dashboard UI \u754c\u9762\u6392\u7248\u4e0e\u89c6\u89c9\u4f18\u5316<\/h2>\n<h3>4.1 \u7ed3\u6784\u5316\u6392\u7248 (Tab &amp; Group)<\/h3>\n<p>\u5728\u53f3\u4fa7\u7684 Dashboard \u2192 Layout \u9762\u677f\u4e2d\u5efa\u7acb\u4ee5\u4e0b\u5c42\u7ea7\uff1a<\/p>\n<pre><code>Dashboard Layout Tree:\n\u2502\n\u2514\u2500\u2500 \ud83d\udcf1 Tab: \u667a\u6167\u8461\u8404\u56ed\u4e3b\u63a7\u8231\n    \u2502\n    \u251c\u2500\u2500 \ud83d\udcbb Group: \u73b0\u573a\u8bbe\u5907\u63a7\u5236\u533a\n    \u2502   \u251c\u2500\u2500 [Switch] \u6c34\u6cf5 S1\n    \u2502   \u251c\u2500\u2500 [Switch] \u9600\u95e8 S2\n    \u2502   \u251c\u2500\u2500 [Switch] \u65bd\u80a5 S3\n    \u2502   \u251c\u2500\u2500 [Slider] \u538b\u529b Pres1\n    \u2502   \u2514\u2500\u2500 [Slider] \u9891\u7387 Freq\n    \u2502   Width: 6 (\u534a\u5c4f\u5bbd)\n    \u2502\n    \u251c\u2500\u2500 \ud83c\udf31 Group: \u571f\u58e4\u4e0e\u6c34\u8d28\u73af\u5883\n    \u2502   \u251c\u2500\u2500 [Gauge] NPK \u4eea\u8868\u76d8\n    \u2502   \u251c\u2500\u2500 [Gauge] \u7535\u5bfc\u7387\n    \u2502   \u251c\u2500\u2500 [Chart] \u6e29\u6e7f\u5ea6\u5386\u53f2\u66f2\u7ebf\n    \u2502   \u2514\u2500\u2500 [Text] \u5b9e\u65f6\u6570\u503c\u8868\n    \u2502   Width: 12-18 (\u5168\u5c4f\u6216\u66f4\u5bbd)\n    \u2502\n    \u2514\u2500\u2500 \ud83d\udea8 Group: \u7cfb\u7edf\u62a5\u8b66\u76d1\u63a7\n        \u251c\u2500\u2500 [Text] \u4e3b\u8def\u62a5\u8b66\n        \u251c\u2500\u2500 [Text] \u80a5\u8def\u62a5\u8b66\n        \u2514\u2500\u2500 [Text] \u7efc\u5408\u72b6\u6001\n        Width: 6 (\u534a\u5c4f\u5bbd)\n<\/code><\/pre>\n<p><strong>\u5e03\u5c40\u539f\u5219<\/strong>:<br \/>\n&#8211; <strong>\u63a7\u5236\u533a<\/strong>: \u5de6\u4fa7\/\u4e0a\u65b9\uff0c\u64cd\u4f5c\u6700\u9891\u7e41<br \/>\n&#8211; <strong>\u76d1\u6d4b\u533a<\/strong>: \u4e2d\u95f4\uff0c\u4fe1\u606f\u5bc6\u5ea6\u6700\u9ad8<br \/>\n&#8211; <strong>\u62a5\u8b66\u533a<\/strong>: \u53f3\u4fa7\/\u4e0b\u65b9\uff0c\u9700\u8981\u9192\u76ee\u63d0\u793a<\/p>\n<h3>4.2 \u62a5\u8b66\u72b6\u6001\u9632\u5f39\u89c6\u89c9\u4f18\u5316<\/h3>\n<h4>4.2.1 \u95ee\u9898\u63cf\u8ff0<\/h4>\n<p>\u5982\u679c\u76f4\u63a5\u5c06\u62a5\u8b66\u5b57\u6bb5\u63a5\u5165 <code>ui_text<\/code> \u8282\u70b9\uff1a<br \/>\n&#8211; \u6b63\u5e38\u8fd0\u884c\u65f6\u663e\u793a\u7a7a\u767d\u6216 &#8220;&#8221;<br \/>\n&#8211; \u64cd\u4f5c\u4eba\u5458\u8bef\u4ee5\u4e3a\u62a5\u8b66\u529f\u80fd\u5931\u6548<\/p>\n<h4>4.2.2 \u89e3\u51b3\u65b9\u6848\uff1a\u89c6\u89c9\u8f6c\u6362\u8fc7\u6ee4<\/h4>\n<p>\u5728\u6570\u636e\u5206\u53d1\u540e\u3001\u63a5\u5165 <code>ui_text<\/code> \u8282\u70b9\u524d\uff0c\u589e\u52a0 Function \u8282\u70b9\uff1a<\/p>\n<pre><code class=\"language-javascript\">\/**\n * \u62a5\u8b66\u9632\u5f39\u8fc7\u6ee4\u5668\n * \u5c06\u7a7a\u503c\/undefined \u8f6c\u6362\u4e3a\u53cb\u597d\u7684\"\u8fd0\u884c\u6b63\u5e38\"\u63d0\u793a\n *\/\n\n\/\/ \u517c\u5bb9 undefined\u3001null\u3001\u7a7a\u5b57\u7b26\u4e32\u3001\u7eaf\u7a7a\u683c\u7684\u9c81\u68d2\u6027\u5199\u6cd5\nvar val = msg.payload;\n\nif (val === \"\" || val === undefined || val === null || \n    (typeof val === 'string' &amp;&amp; val.trim() === \"\")) {\n    msg.payload = \"\ud83d\udfe2 \u8fd0\u884c\u6b63\u5e38\";\n    msg.color = \"#28a745\";  \/\/ \u7eff\u8272\n} else {\n    msg.payload = \"\ud83d\udea8 \u62a5\u8b66: \" + val;\n    msg.color = \"#dc3545\";  \/\/ \u7ea2\u8272\n}\n\nreturn msg;\n<\/code><\/pre>\n<h4>4.2.3 UI \u6548\u679c\u5bf9\u6bd4<\/h4>\n<table>\n<thead>\n<tr>\n<th>\u573a\u666f<\/th>\n<th>\u672a\u4f18\u5316<\/th>\n<th>\u4f18\u5316\u540e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u6b63\u5e38<\/td>\n<td>[\u7a7a\u767d] \u274c<\/td>\n<td>\ud83d\udfe2 \u8fd0\u884c\u6b63\u5e38 \u2705<\/td>\n<\/tr>\n<tr>\n<td>\u62a5\u8b66<\/td>\n<td>AM1:\u5835\u585e<\/td>\n<td>\ud83d\udea8 \u62a5\u8b66: AM1:\u5835\u585e<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>4.3 \u5f00\u5173\u72b6\u6001\u7684\u6570\u5b57\u5b6a\u751f\u53cc\u5411\u53cd\u9988<\/h3>\n<h4>4.3.1 \u95ed\u73af\u8bbe\u8ba1<\/h4>\n<pre><code>\u7528\u6237\u64cd\u4f5c Web Switch S1 \u2500\u2500&gt;\n    \u2502\n    \u251c\u2500\u2500 \u4e0b\u884c: Function \u6253\u5305 \u2500\u2500&gt; MQTT Out \u2500\u2500&gt; MCGS \u6267\u884c\n    \u2502\n    \u2514\u2500\u2500 \u4e0a\u884c: MCGS \u56de\u4f20\u5b9e\u9645\u72b6\u6001 \u2500\u2500&gt; MQTT In \u2500\u2500&gt; Function \u5206\u53d1 \u2500\u2500&gt;\n                                                        \u2502\n                                                        \u25bc\n                                              Web Switch S1 (\u8f93\u5165\u7aef)\n                                                        \u2502\n                                              Switch \u4f4d\u7f6e\u81ea\u52a8\u540c\u6b65\n<\/code><\/pre>\n<h4>4.3.2 Switch \u8282\u70b9\u5173\u952e\u914d\u7f6e<\/h4>\n<table>\n<thead>\n<tr>\n<th>\u914d\u7f6e\u9879<\/th>\n<th>\u503c<\/th>\n<th>\u4f5c\u7528<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Indicator<\/strong><\/td>\n<td><code>Switch icon shows state of the input<\/code><\/td>\n<td>\u6839\u636e\u56de\u4f20\u72b6\u6001\u6539\u53d8\u4f4d\u7f6e<\/td>\n<\/tr>\n<tr>\n<td><strong>Pass through<\/strong><\/td>\n<td>\u2610 \u53d6\u6d88\u52fe\u9009<\/td>\n<td>\u963b\u65ad\u5faa\u73af<\/td>\n<\/tr>\n<tr>\n<td><strong>On Payload<\/strong><\/td>\n<td><code>true<\/code> (Boolean)<\/td>\n<td>\u4e0e\u56de\u4f20\u6570\u636e\u7c7b\u578b\u5339\u914d<\/td>\n<\/tr>\n<tr>\n<td><strong>Off Payload<\/strong><\/td>\n<td><code>false<\/code> (Boolean)<\/td>\n<td>\u4e0e\u56de\u4f20\u6570\u636e\u7c7b\u578b\u5339\u914d<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>4.3.3 \u65f6\u5e8f\u8bf4\u660e<\/h4>\n<pre><code>\u65f6\u95f4\u8f74 \u2192\n\nT0: \u7528\u6237\u70b9\u51fb S1 \u5f00\u5173 (\u8bf7\u6c42\u5f00\u542f)\n    \u251c\u2500\u2500 Web Switch \u53d1\u51fa {topic:\"S1\", payload:true}\n    \u251c\u2500\u2500 Function \u6253\u5305 \u2192 MQTT \u4e0b\u53d1\n    \u2514\u2500\u2500 Switch \u4f4d\u7f6e\u6682\u65f6\u4e0d\u53d8 (\u7b49\u5f85\u786e\u8ba4)\n\nT1: MCGS \u6267\u884c\u5b8c\u6bd5\uff0c\u4e0a\u62a5 {S1:true, ...}\n    \u251c\u2500\u2500 MQTT In \u63a5\u6536\n    \u251c\u2500\u2500 Function \u5206\u53d1 \u2192 \u8f93\u51fa 7 \u2192 Switch \u8f93\u5165\n    \u2514\u2500\u2500 Web Switch \u4f4d\u7f6e\u53d8\u4e3a\"\u5f00\u542f\" \u2705\n\n\u7ed3\u679c: \u5f00\u5173\u4f4d\u7f6e\u53cd\u6620\u7684\u662f MCGS \u7684\u771f\u5b9e\u72b6\u6001\uff0c\u800c\u975e\u7528\u6237\u64cd\u4f5c\n<\/code><\/pre>\n<hr \/>\n<h2>\u4e94\u3001\u6838\u5fc3\u6ce8\u610f\u4e8b\u9879\uff08\u9632\u5751\u6307\u5357\uff09<\/h2>\n<h3>5.1 \u6570\u636e\u7c7b\u578b\u4e00\u81f4\u6027<\/h3>\n<h4>\u75c7\u72b6<\/h4>\n<ul>\n<li>Switch \u4e0d\u968f\u56de\u4f20\u6570\u636e\u53d8\u5316<\/li>\n<li>Debug \u770b\u5230\u6570\u636e\u4f46 UI \u65e0\u53cd\u5e94<\/li>\n<\/ul>\n<h4>\u6839\u56e0<\/h4>\n<p>Node-RED Switch \u5bf9\u6570\u636e\u7c7b\u578b\u654f\u611f\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<th>\u7c7b\u578b<\/th>\n<th>\u793a\u4f8b<\/th>\n<th>Switch \u5339\u914d<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Boolean<\/td>\n<td><code>true<\/code><\/td>\n<td>\u2705 \u5339\u914d On Payload (true)<\/td>\n<\/tr>\n<tr>\n<td>\u6570\u5b57<\/td>\n<td><code>1<\/code><\/td>\n<td>\u274c \u4e0d\u5339\u914d true<\/td>\n<\/tr>\n<tr>\n<td>\u5b57\u7b26\u4e32<\/td>\n<td><code>\"true\"<\/code><\/td>\n<td>\u274c \u4e0d\u5339\u914d<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>\u89e3\u51b3\u65b9\u6848<\/h4>\n<p>\u7edf\u4e00\u4f7f\u7528 <strong>Boolean<\/strong> \u7c7b\u578b\uff1a<br \/>\n&#8211; MCGS \u4e0a\u62a5: <code>true<\/code> \/ <code>false<\/code><br \/>\n&#8211; Function \u5206\u53d1: <code>d.S1<\/code> (\u539f\u59cb Boolean)<br \/>\n&#8211; Switch Payload: <code>true<\/code> \/ <code>false<\/code> (Boolean)<\/p>\n<h3>5.2 Function \u8f93\u51fa\u6570\u8bbe\u7f6e<\/h3>\n<h4>\u75c7\u72b6<\/h4>\n<ul>\n<li>\u53ea\u663e\u793a 1 \u4e2a\u8f93\u51fa\u7aef\u53e3<\/li>\n<li>\u65e0\u6cd5\u8fde\u63a5\u591a\u4e2a UI \u7ec4\u4ef6<\/li>\n<\/ul>\n<h4>\u89e3\u51b3\u65b9\u6848<\/h4>\n<p>\u53cc\u51fb Function \u8282\u70b9 \u2192 \u5e95\u90e8 <strong>Outputs<\/strong> \u2192 \u6539\u4e3a <strong>39<\/strong>\u3002<\/p>\n<h3>5.3 Topic \u547d\u540d\u4e00\u81f4\u6027<\/h3>\n<table>\n<thead>\n<tr>\n<th>\u4f4d\u7f6e<\/th>\n<th>Key\/Topic<\/th>\n<th>\u5927\u5c0f\u5199\u654f\u611f<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>MCGS JSON<\/td>\n<td><code>\"S1\"<\/code><\/td>\n<td>\u5927\u5199 S<\/td>\n<\/tr>\n<tr>\n<td>Node-RED Switch<\/td>\n<td><code>S1<\/code><\/td>\n<td>\u5927\u5199 S<\/td>\n<\/tr>\n<tr>\n<td>Function \u68c0\u67e5<\/td>\n<td><code>msg.topic === \"S1\"<\/code><\/td>\n<td>\u5927\u5199 S<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u26a0\ufe0f <code>s1<\/code> \u2260 <code>S1<\/code>\uff0c\u4e0d\u4e00\u81f4\u4f1a\u5bfc\u81f4\u62e6\u622a\u6216\u5931\u6548\u3002<\/p>\n<h3>5.4 \u6807\u5b9a\u7cfb\u6570\u6838\u5bf9<\/h3>\n<p>\u5e38\u89c1\u9519\u8bef\uff1a<br \/>\n&#8211; \u6e29\u5ea6\u663e\u793a 245\u2103\uff08\u5fd8\u8bb0 \u00f710\uff09<br \/>\n&#8211; \u7535\u5bfc\u7387 0.15\uff08\u7cfb\u6570\u7528\u9519\uff0c\u5e94\u8be5\u662f \u00f7100 \u800c\u975e \u00f71000\uff09<\/p>\n<p>\u5efa\u8bae\u5efa\u7acb<strong>\u6807\u5b9a\u5bf9\u7167\u8868<\/strong>\u8d34\u5728 MCGS \u548c Node-RED \u65c1\u3002<\/p>\n<hr \/>\n<h2>\u516d\u3001\u8c03\u8bd5\u4e0e\u6392\u9519<\/h2>\n<h3>6.1 \u5206\u7ea7\u8c03\u8bd5\u7b56\u7565<\/h3>\n<table>\n<thead>\n<tr>\n<th>\u5c42\u7ea7<\/th>\n<th>\u68c0\u67e5\u70b9<\/th>\n<th>\u65b9\u6cd5<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>\u901a\u8baf\u5c42<\/strong><\/td>\n<td>MQTT \u8fde\u63a5<\/td>\n<td>Dashboard \u2192 \u8282\u70b9\u72b6\u6001\u6307\u793a<\/td>\n<\/tr>\n<tr>\n<td><strong>\u534f\u8bae\u5c42<\/strong><\/td>\n<td>\u62a5\u6587\u683c\u5f0f<\/td>\n<td>Debug \u8282\u70b9\u67e5\u770b payload<\/td>\n<\/tr>\n<tr>\n<td><strong>\u903b\u8f91\u5c42<\/strong><\/td>\n<td>Function \u6267\u884c<\/td>\n<td>node.warn() \/ node.status()<\/td>\n<\/tr>\n<tr>\n<td><strong>UI \u5c42<\/strong><\/td>\n<td>\u663e\u793a\u6548\u679c<\/td>\n<td>\u6d4f\u89c8\u5668 F12 \u68c0\u67e5<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>6.2 \u5e38\u7528 Debug \u4ee3\u7801<\/h3>\n<p>\u5728 Function \u8282\u70b9\u4e2d\u6dfb\u52a0\uff1a<\/p>\n<pre><code class=\"language-javascript\">\/\/ \u67e5\u770b\u5b8c\u6574\u8f93\u5165\nnode.warn(\"\u8f93\u5165: \" + JSON.stringify(msg));\n\n\/\/ \u67e5\u770b\u7279\u5b9a\u5b57\u6bb5\nnode.warn(\"S1 = \" + msg.payload.S1 + \" (\u7c7b\u578b: \" + typeof msg.payload.S1 + \")\");\n\n\/\/ \u67e5\u770b flow \u8bb0\u5fc6\nnode.warn(\"\u8bb0\u5fc6: \" + JSON.stringify(flow.get('control_state')));\n\n\/\/ \u8bbe\u7f6e\u8282\u70b9\u72b6\u6001\uff08\u663e\u793a\u5728\u7f16\u8f91\u5668\u4e2d\uff09\nnode.status({fill:\"green\", shape:\"dot\", text:\"\u6b63\u5e38\"});\n<\/code><\/pre>\n<h3>6.3 \u95ee\u9898\u901f\u67e5\u8868<\/h3>\n<table>\n<thead>\n<tr>\n<th>\u73b0\u8c61<\/th>\n<th>\u53ef\u80fd\u539f\u56e0<\/th>\n<th>\u6392\u67e5\u65b9\u6cd5<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u5f00\u5173\u4e0d\u54cd\u5e94\u70b9\u51fb<\/td>\n<td>Pass through \u672a\u53d6\u6d88<\/td>\n<td>\u68c0\u67e5 Switch \u914d\u7f6e<\/td>\n<\/tr>\n<tr>\n<td>\u5f00\u5173\u4f4d\u7f6e\u4e0d\u8ddf\u968f<\/td>\n<td>Indicator \u8bbe\u7f6e\u9519\u8bef<\/td>\n<td>\u6539\u4e3a &#8220;state of the input&#8221;<\/td>\n<\/tr>\n<tr>\n<td>\u4e0b\u53d1\u6570\u636e\u4e0d\u5b8c\u6574<\/td>\n<td>9 \u53c2\u6570\u672a\u51d1\u9f50<\/td>\n<td>\u68c0\u67e5 flow.get(&#8216;control_state&#8217;)<\/td>\n<\/tr>\n<tr>\n<td>\u4f20\u611f\u5668\u6570\u636e\u4e3a 0<\/td>\n<td>\u6807\u5b9a\u7cfb\u6570\u9519\u8bef<\/td>\n<td>\u6838\u5bf9 \u00f710 \/ \u00f7100<\/td>\n<\/tr>\n<tr>\n<td>\u62a5\u8b66\u663e\u793a\u7a7a\u767d<\/td>\n<td>\u672a\u52a0\u9632\u5f39\u8fc7\u6ee4<\/td>\n<td>\u6dfb\u52a0\u7a7a\u503c\u68c0\u67e5 Function<\/td>\n<\/tr>\n<tr>\n<td>\u53ea\u6709 1 \u8def\u8f93\u51fa<\/td>\n<td>Outputs \u672a\u6539 39<\/td>\n<td>\u53cc\u51fb\u4fee\u6539<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2>\u4e03\u3001\u9644\u5f55\uff1a\u914d\u7f6e\u901f\u67e5\u8868\u4e0e\u6269\u5c55\u6307\u5357<\/h2>\n<h3>7.1 \u8282\u70b9\u914d\u7f6e\u6c47\u603b<\/h3>\n<table>\n<thead>\n<tr>\n<th>\u8282\u70b9<\/th>\n<th>\u540d\u79f0<\/th>\n<th>\u5173\u952e\u914d\u7f6e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>ui_switch<\/strong><\/td>\n<td>S1-S7<\/td>\n<td>Topic: S1-S7, Payload: Boolean, Indicator: input, Pass through: \u2610<\/td>\n<\/tr>\n<tr>\n<td><strong>ui_slider<\/strong><\/td>\n<td>Pres1\/Freq<\/td>\n<td>Topic: Pres1\/Freq, Min\/Max: 0-100\/50<\/td>\n<\/tr>\n<tr>\n<td><strong>function<\/strong><\/td>\n<td>\u63a7\u5236\u6307\u4ee4\u6253\u5305<\/td>\n<td>\u89c1 2.3.3 \u4ee3\u7801<\/td>\n<\/tr>\n<tr>\n<td><strong>function<\/strong><\/td>\n<td>39\u901a\u9053\u5206\u53d1<\/td>\n<td>Outputs: 39, \u89c1 3.4.3 \u4ee3\u7801<\/td>\n<\/tr>\n<tr>\n<td><strong>function<\/strong><\/td>\n<td>\u62a5\u8b66\u9632\u5f39<\/td>\n<td>\u89c1 4.2.2 \u4ee3\u7801<\/td>\n<\/tr>\n<tr>\n<td><strong>mqtt out<\/strong><\/td>\n<td>\u63a7\u5236\u4e0b\u53d1<\/td>\n<td>Topic: sub\/\u63a7\u5236\u5355\u5143<\/td>\n<\/tr>\n<tr>\n<td><strong>mqtt in<\/strong><\/td>\n<td>\u76d1\u6d4b\u63a5\u6536<\/td>\n<td>Topic: attributes<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>7.2 \u6269\u5c55\u66f4\u591a\u8bbe\u5907<\/h3>\n<p>\u5982\u9700\u589e\u52a0 S8\u3001S9\uff1a<\/p>\n<ol>\n<li><strong>Node-RED \u7aef<\/strong>:\n<pre><code class=\"language-javascript\">\/\/ control_state \u6dfb\u52a0\u65b0\u5b57\u6bb5\n\"S8\": false,\n\"S9\": false\n\n\/\/ 39 \u8def\u8f93\u51fa\u6539\u4e3a 41 \u8def\nOutputs: 41\n<\/code><\/pre>\n<\/li>\n<li><strong>MCGS \u7aef<\/strong>:\n<ul>\n<li>\u7ec4\u6001\u65b0\u589e\u5f00\u5173\u7ec4\u4ef6<\/li>\n<li>\u7b56\u7565\u811a\u672c\u6dfb\u52a0 S8\/S9 \u5230 JSON<\/li>\n<\/ul>\n<\/li>\n<li><strong>Dashboard<\/strong>:\n<ul>\n<li>Layout \u6dfb\u52a0\u65b0 Switch<\/li>\n<li>Group \u5bbd\u5ea6\u8c03\u6574<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3>7.3 \u5b8c\u6574\u6d41 JSON\uff08\u53ef\u5bfc\u5165\uff09<\/h3>\n<pre><code class=\"language-json\">[\n  {\n    \"id\": \"control_packer\",\n    \"type\": \"function\",\n    \"z\": \"grape_flow\",\n    \"name\": \"\u63a7\u5236\u6307\u4ee4\u6253\u5305\",\n    \"func\": \"var control_state = flow.get('control_state') || {\\\"Freq\\\":0,\\\"Pres1\\\":0,\\\"S1\\\":false,\\\"S2\\\":false,\\\"S3\\\":false,\\\"S4\\\":false,\\\"S5\\\":false,\\\"S6\\\":false,\\\"S7\\\":false};\\nif (control_state.hasOwnProperty(msg.topic)) {\\n    control_state[msg.topic] = msg.payload;\\n    flow.set('control_state', control_state);\\n} else {\\n    node.warn('\u672a\u77e5Topic:' + msg.topic);\\n    return null;\\n}\\nmsg.topic = 'sub\/\u63a7\u5236\u5355\u5143';\\nmsg.payload = control_state;\\nreturn msg;\",\n    \"outputs\": 1,\n    \"noerr\": 0,\n    \"initialize\": \"\",\n    \"finalize\": \"\",\n    \"libs\": [],\n    \"x\": 400,\n    \"y\": 100,\n    \"wires\": [[\"mqtt_out\"]]\n  }\n]\n<\/code><\/pre>\n<hr \/>\n<p><strong>\u6587\u6863\u7ed3\u675f<\/strong><\/p>\n<p>\u914d\u7f6e\u8fc7\u7a0b\u4e2d\u5982\u9047\u95ee\u9898\uff0c\u8bf7\u53c2\u8003\u7b2c\u516d\u7ae0\u8c03\u8bd5\u4e0e\u6392\u9519\u8fdb\u884c\u6392\u67e5\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u8461\u8404\u56ed\u667a\u80fd\u704c\u6e89\u7cfb\u7edf\uff1aNode-RED \u4e0e MCGS \u5168\u94fe\u8def\u901a\u8baf\u4e0e UI \u914d\u7f6e\u624b\u518c (v2.0 \u5b8c\u6574\u7248) \ud83d\udcd8 \u6587 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[28],"tags":[61,58,51,55,62,59,53],"class_list":["post-253","post","type-post","status-publish","format-standard","hentry","category-28","tag-dashboard","tag-mcgs","tag-mqtt","tag-node-red","tag-62","tag-59","tag-53"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/home.snu1e.top\/index.php\/wp-json\/wp\/v2\/posts\/253","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/home.snu1e.top\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/home.snu1e.top\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/home.snu1e.top\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/home.snu1e.top\/index.php\/wp-json\/wp\/v2\/comments?post=253"}],"version-history":[{"count":0,"href":"https:\/\/home.snu1e.top\/index.php\/wp-json\/wp\/v2\/posts\/253\/revisions"}],"wp:attachment":[{"href":"https:\/\/home.snu1e.top\/index.php\/wp-json\/wp\/v2\/media?parent=253"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/home.snu1e.top\/index.php\/wp-json\/wp\/v2\/categories?post=253"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/home.snu1e.top\/index.php\/wp-json\/wp\/v2\/tags?post=253"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}