{"id":1134,"date":"2026-07-16T09:36:09","date_gmt":"2026-07-16T09:36:09","guid":{"rendered":"https:\/\/iotmanager.org\/?page_id=1134"},"modified":"2026-07-16T10:53:13","modified_gmt":"2026-07-16T10:53:13","slug":"1134-2","status":"publish","type":"page","link":"https:\/\/iotmanager.org\/en\/1134-2\/","title":{"rendered":"\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u044f\u0434\u0440\u0430"},"content":{"rendered":"<!-- ============================================================= -->\n<!--  IoTManager \u2014 \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u044f\u0434\u0440\u0430 (MQTT \/ \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440 \/ \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438) -->\n<!--  \u0413\u043e\u0442\u043e\u0432\u044b\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0434\u043b\u044f WordPress                               -->\n<!--  \u0412\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0432 \u0431\u043b\u043e\u043a \"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 HTML\" (Custom HTML)-->\n<!--  \u0412\u0441\u0435 \u0441\u0442\u0438\u043b\u0438 \u0438 SVG \u0437\u0430\u0441\u043a\u043e\u0443\u043f\u043b\u0435\u043d\u044b \u0432 .iotm-arch                     -->\n<!-- ============================================================= -->\n\n<div class=\"iotm-arch\">\n<style>\n\/* ---- \u0432\u0441\u0451 \u0432\u043d\u0443\u0442\u0440\u0438 .iotm-arch, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432\u0430\u0442\u044c \u0441 \u0442\u0435\u043c\u043e\u0439 WP ---- *\/\n.iotm-arch{\n  --iotm-accent:#1f6feb; --iotm-accent-d:#1550b8; --iotm-dark:#0d1117;\n  --iotm-text:#24292f; --iotm-grey:#57606a; --iotm-light:#f0f3f6;\n  --iotm-border:#d0d7de; --iotm-green:#1a7f37; --iotm-red:#cf222e;\n  --iotm-amber:#9a6700; --iotm-panel:#fbfcfd;\n  max-width:960px; margin:0 auto; padding:6px 4px;\n  font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif;\n  color:var(--iotm-text); line-height:1.62; font-size:16px; background:transparent;\n  -webkit-font-smoothing:antialiased; box-sizing:border-box;\n}\n.iotm-arch *{box-sizing:border-box;}\n.iotm-arch code{\n  font-family:\"SFMono-Regular\",Consolas,Menlo,monospace; background:var(--iotm-light);\n  padding:.12em .4em; border-radius:5px; font-size:.87em; color:#1f2328;\n  border:1px solid #e3e8ee; word-break:break-word;\n}\n.iotm-arch pre{\n  background:var(--iotm-light); border:1px solid var(--iotm-border); border-radius:8px;\n  padding:14px 16px; overflow-x:auto; font-size:.85em; line-height:1.5; margin:1em 0;\n}\n.iotm-arch pre code{background:none; border:none; padding:0; white-space:pre; display:block;\n  word-break:normal;}\n.iotm-arch h2,.iotm-arch h3,.iotm-arch h4{line-height:1.25;}\n.iotm-arch h2{font-size:1.55em; color:var(--iotm-dark); font-weight:700;\n  border-bottom:2px solid var(--iotm-light); padding-bottom:.3em; margin:2.2em 0 .6em;}\n.iotm-arch h3{font-size:1.22em; color:var(--iotm-accent); font-weight:700; margin:1.6em 0 .4em;}\n.iotm-arch h4{font-size:1.05em; color:var(--iotm-dark); font-weight:700; margin:1.2em 0 .3em;}\n.iotm-arch p{margin:.65em 0;}\n.iotm-arch a{color:var(--iotm-accent); text-decoration:none;}\n.iotm-arch a:hover{text-decoration:underline;}\n.iotm-arch ul,.iotm-arch ol{margin:.6em 0 .9em; padding-left:1.6em;}\n.iotm-arch li{margin:.32em 0;}\n.iotm-arch ul li::marker{color:var(--iotm-accent);}\n.iotm-arch ol li::marker{color:var(--iotm-accent); font-weight:700;}\n.iotm-arch table{border-collapse:collapse; width:100%; margin:1.1em 0; font-size:.9em;\n  border:1px solid var(--iotm-border); border-radius:8px; overflow:hidden;}\n.iotm-arch thead th{background:var(--iotm-accent); color:#fff; text-align:left;\n  padding:9px 12px; font-weight:600;}\n.iotm-arch tbody td{padding:8px 12px; border-top:1px solid var(--iotm-border); vertical-align:top;}\n.iotm-arch tbody tr:nth-child(odd){background:var(--iotm-light);}\n.iotm-arch .iotm-callout{border-left:5px solid var(--iotm-accent); background:var(--iotm-panel);\n  border-top:1px solid #e1e4e8; border-right:1px solid #e1e4e8; border-bottom:1px solid #e1e4e8;\n  border-radius:0 8px 8px 0; padding:11px 16px; margin:1.1em 0;}\n.iotm-arch .iotm-callout.green{border-left-color:var(--iotm-green);}\n.iotm-arch .iotm-callout.red{border-left-color:var(--iotm-red);}\n.iotm-arch .iotm-callout.amber{border-left-color:var(--iotm-amber);}\n.iotm-arch .iotm-callout b.lbl{color:var(--iotm-accent);}\n.iotm-arch .iotm-callout.green b.lbl{color:var(--iotm-green);}\n.iotm-arch .iotm-callout.red b.lbl{color:var(--iotm-red);}\n.iotm-arch .iotm-callout.amber b.lbl{color:var(--iotm-amber);}\n\n\/* cover *\/\n.iotm-arch .iotm-cover{background:linear-gradient(150deg,#0d1117 0%,#15263f 55%,#1f6feb 140%);\n  color:#fff; padding:44px 22px 38px; text-align:center; border-radius:12px; margin-bottom:6px;}\n.iotm-arch .iotm-cover .kick{letter-spacing:3px; text-transform:uppercase; font-size:.8em; color:#9fc2f5;}\n.iotm-arch .iotm-cover .ttl{font-size:2.4em; margin:.15em 0 .1em; font-weight:800; letter-spacing:-1px; line-height:1.15;}\n.iotm-arch .iotm-cover .sub{font-size:1.2em; color:#cfe0f7; font-weight:500;}\n.iotm-arch .iotm-cover .meta{margin-top:18px; font-size:.85em; color:#9fb4d0;}\n.iotm-arch .iotm-cover .meta code{background:rgba(255,255,255,.14); color:#dbe9ff; border-color:transparent;}\n\n\/* toc *\/\n.iotm-arch nav.iotm-toc{background:var(--iotm-panel); border:1px solid var(--iotm-border);\n  border-radius:10px; padding:16px 26px; margin:24px 0;}\n.iotm-arch nav.iotm-toc ol{padding-left:1.3em; margin:.4em 0 0;}\n.iotm-arch nav.iotm-toc a{color:var(--iotm-text);}\n.iotm-arch nav.iotm-toc a:hover{color:var(--iotm-accent);}\n\n\/* --- diagrams: \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u0430\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 --- *\/\n.iotm-arch .iotm-diagram{background:var(--iotm-panel); border:1px solid var(--iotm-border);\n  border-radius:10px; padding:10px; margin:1.2em 0;}\n.iotm-arch .iotm-diagram svg{display:block; width:100%; height:auto; max-width:100%;\n  font-family:-apple-system,\"Segoe UI\",Arial,sans-serif;}\n.iotm-arch .iotm-legend{font-size:.82em; color:var(--iotm-grey); text-align:center; padding:6px 4px 2px;}\n\n.iotm-arch .pill{display:inline-block; font-size:.72em; font-weight:700; padding:1px 8px;\n  border-radius:20px; vertical-align:middle; margin-left:6px; white-space:nowrap;}\n.iotm-arch .pill.core{background:#dbeafe; color:#1550b8;}\n.iotm-arch .pill.net{background:#dcfce7; color:#166534;}\n.iotm-arch .pill.mod{background:#fef3c7; color:#92400e;}\n\n.iotm-arch .iotm-foot{border-top:1px solid var(--iotm-border); margin-top:36px; padding-top:16px;\n  font-size:.85em; color:var(--iotm-grey); text-align:center;}\n\n@media (max-width:640px){\n  .iotm-arch{font-size:15px;}\n  .iotm-arch .iotm-cover .ttl{font-size:1.8em;}\n  .iotm-arch pre{font-size:.78em;} .iotm-arch table{font-size:.82em;}\n}\n<\/style>\n\n<!-- ================= COVER ================= -->\n<div class=\"iotm-cover\">\n  <div class=\"kick\">IoTManager \u00b7 \u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/div>\n  <div class=\"ttl\">\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u044f\u0434\u0440\u0430<\/div>\n  <div class=\"sub\">MQTT \u00b7 \u0412\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440 \u00b7 \u0414\u0432\u0438\u0436\u043e\u043a \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432<\/div>\n  <div class=\"meta\">\n    \u0412\u0435\u0440\u0441\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 1.0 \u00b7 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043e \u043d\u0430 \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u0432\u0435\u0442\u043a\u0438 <code>ver4stable<\/code><br>\n    <code>github.com\/IoTManagerProject\/IoTManager<\/code>\n  <\/div>\n<\/div>\n\n<!-- ================= TOC ================= -->\n<nav class=\"iotm-toc\">\n  <strong>Content<\/strong>\n  <ol>\n    <li><a href=\"#iotm-overview\">\u041e\u0431\u0437\u043e\u0440: \u0438\u0437 \u0447\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u044f\u0434\u0440\u043e<\/a><\/li>\n    <li><a href=\"#iotm-loop\">\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a<\/a><\/li>\n    <li><a href=\"#iotm-items\">\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 (IoTItems) \u043a\u0430\u043a \u0446\u0435\u043d\u0442\u0440 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/a><\/li>\n    <li><a href=\"#iotm-events\">\u0428\u0438\u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434 (Events &amp; Orders)<\/a><\/li>\n    <li><a href=\"#iotm-mqtt\">\u041f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 MQTT<\/a><\/li>\n    <li><a href=\"#iotm-web\">\u0412\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440: HTTP \u0438 WebSocket<\/a><\/li>\n    <li><a href=\"#iotm-scenario\">\u0414\u0432\u0438\u0436\u043e\u043a \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432<\/a><\/li>\n    <li><a href=\"#iotm-dataflow\">\u0421\u043a\u0432\u043e\u0437\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/a><\/li>\n    <li><a href=\"#iotm-files\">\u041a\u0430\u0440\u0442\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u044f\u0434\u0440\u0430<\/a><\/li>\n  <\/ol>\n<\/nav>\n\n<!-- ================= 1. OVERVIEW ================= -->\n<h2 id=\"iotm-overview\">1. \u041e\u0431\u0437\u043e\u0440: \u0438\u0437 \u0447\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u044f\u0434\u0440\u043e<\/h2>\n<p>\u042f\u0434\u0440\u043e IoTManager \u2014 \u044d\u0442\u043e \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438, \u043f\u043e\u0432\u0435\u0440\u0445 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043c\u043e\u0434\u0443\u043b\u0438. \u041e\u043d\u043e \u0440\u0435\u0448\u0430\u0435\u0442 \u0447\u0435\u0442\u044b\u0440\u0435 \u0437\u0430\u0434\u0430\u0447\u0438: \u0441\u0432\u044f\u0437\u044c \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043c\u0438\u0440\u043e\u043c (Wi-Fi, MQTT), \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 (\u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440 \u0438 WebSocket), \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 (\u0434\u0432\u0438\u0436\u043e\u043a \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432) \u0438 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u0447\u0435\u0440\u0435\u0437 \u0435\u0434\u0438\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u0430\u044f \u0438\u0434\u0435\u044f: <b>\u0432\u0441\u0451 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u2014 \u044d\u0442\u043e \u00ab\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u00bb (<code>IoTItem<\/code>)<\/b>. \u0414\u0430\u0442\u0447\u0438\u043a, \u0440\u0435\u043b\u0435, \u0442\u0430\u0439\u043c\u0435\u0440, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f, \u043b\u043e\u0433 \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. MQTT, \u0432\u0435\u0431-\u0441\u043e\u043a\u0435\u0442\u044b \u0438 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u043d\u0435 \u043e\u0431\u0449\u0430\u044e\u0442\u0441\u044f \u0441 \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u2014 \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u0449\u0443\u044e \u0448\u0438\u043d\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/p>\n\n<div class=\"iotm-diagram\">\n<svg viewbox=\"0 0 720 420\" preserveaspectratio=\"xMidYMid meet\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" role=\"img\" aria-label=\"\u0421\u0445\u0435\u043c\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u044f\u0434\u0440\u0430 \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043c\u0438\u0440\u043e\u043c\">\n  <defs>\n    <marker id=\"iotm-ar\" markerwidth=\"10\" markerheight=\"10\" refx=\"8\" refy=\"4\" orient=\"auto\" markerunits=\"userSpaceOnUse\">\n      <path d=\"M0,0 L8,4 L0,8 Z\" fill=\"#57606a\"\/>\n    <\/marker>\n  <\/defs>\n  <!-- external nodes -->\n  <rect x=\"20\" y=\"40\" width=\"156\" height=\"52\" rx=\"9\" fill=\"#dcfce7\" stroke=\"#166534\" stroke-width=\"1.5\"\/>\n  <text x=\"98\" y=\"64\" text-anchor=\"middle\" fill=\"#166534\" font-weight=\"700\" font-size=\"14\">\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/text>\n  <text x=\"98\" y=\"82\" text-anchor=\"middle\" fill=\"#166534\" font-size=\"12\">iOS \/ Android<\/text>\n\n  <rect x=\"20\" y=\"184\" width=\"156\" height=\"52\" rx=\"9\" fill=\"#dcfce7\" stroke=\"#166534\" stroke-width=\"1.5\"\/>\n  <text x=\"98\" y=\"208\" text-anchor=\"middle\" fill=\"#166534\" font-weight=\"700\" font-size=\"14\">\u0411\u0440\u043e\u043a\u0435\u0440 MQTT<\/text>\n  <text x=\"98\" y=\"226\" text-anchor=\"middle\" fill=\"#166534\" font-size=\"12\">\u043e\u0431\u043b\u0430\u043a\u043e \/ \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439<\/text>\n\n  <rect x=\"20\" y=\"328\" width=\"156\" height=\"52\" rx=\"9\" fill=\"#dcfce7\" stroke=\"#166534\" stroke-width=\"1.5\"\/>\n  <text x=\"98\" y=\"352\" text-anchor=\"middle\" fill=\"#166534\" font-weight=\"700\" font-size=\"14\">\u0411\u0440\u0430\u0443\u0437\u0435\u0440<\/text>\n  <text x=\"98\" y=\"370\" text-anchor=\"middle\" fill=\"#166534\" font-size=\"12\">\u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/text>\n\n  <!-- core container -->\n  <rect x=\"256\" y=\"24\" width=\"440\" height=\"372\" rx=\"14\" fill=\"#f6f9fe\" stroke=\"#1f6feb\" stroke-width=\"2\"\/>\n  <text x=\"476\" y=\"48\" text-anchor=\"middle\" fill=\"#1550b8\" font-weight=\"700\" font-size=\"15\">\u042f\u0414\u0420\u041e (ESP8266 \/ ESP32)<\/text>\n\n  <rect x=\"286\" y=\"66\" width=\"176\" height=\"46\" rx=\"8\" fill=\"#dbeafe\" stroke=\"#1550b8\" stroke-width=\"1.5\"\/>\n  <text x=\"374\" y=\"94\" text-anchor=\"middle\" fill=\"#1550b8\" font-weight=\"600\" font-size=\"13\">MQTT-\u043a\u043b\u0438\u0435\u043d\u0442<\/text>\n  <rect x=\"490\" y=\"66\" width=\"176\" height=\"46\" rx=\"8\" fill=\"#dbeafe\" stroke=\"#1550b8\" stroke-width=\"1.5\"\/>\n  <text x=\"578\" y=\"94\" text-anchor=\"middle\" fill=\"#1550b8\" font-weight=\"600\" font-size=\"13\">\u0412\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440<\/text>\n\n  <rect x=\"286\" y=\"166\" width=\"380\" height=\"58\" rx=\"9\" fill=\"#ffffff\" stroke=\"#1f6feb\" stroke-width=\"2\"\/>\n  <text x=\"476\" y=\"190\" text-anchor=\"middle\" fill=\"#0d1117\" font-weight=\"700\" font-size=\"14\">\u0428\u0438\u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434<\/text>\n  <text x=\"476\" y=\"210\" text-anchor=\"middle\" fill=\"#57606a\" font-size=\"12\">eventBuf \u00b7 orderBuf<\/text>\n\n  <rect x=\"286\" y=\"256\" width=\"176\" height=\"52\" rx=\"8\" fill=\"#dbeafe\" stroke=\"#1550b8\" stroke-width=\"1.5\"\/>\n  <text x=\"374\" y=\"279\" text-anchor=\"middle\" fill=\"#1550b8\" font-weight=\"600\" font-size=\"13\">\u0414\u0432\u0438\u0436\u043e\u043a<\/text>\n  <text x=\"374\" y=\"296\" text-anchor=\"middle\" fill=\"#1550b8\" font-weight=\"600\" font-size=\"13\">\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432<\/text>\n  <rect x=\"490\" y=\"256\" width=\"176\" height=\"52\" rx=\"8\" fill=\"#fef3c7\" stroke=\"#92400e\" stroke-width=\"1.5\"\/>\n  <text x=\"578\" y=\"279\" text-anchor=\"middle\" fill=\"#92400e\" font-weight=\"600\" font-size=\"13\">Modules<\/text>\n  <text x=\"578\" y=\"296\" text-anchor=\"middle\" fill=\"#92400e\" font-size=\"12\">(IoTItems)<\/text>\n\n  <rect x=\"286\" y=\"336\" width=\"380\" height=\"44\" rx=\"8\" fill=\"#eef2f6\" stroke=\"#8b98a5\" stroke-width=\"1.5\"\/>\n  <text x=\"476\" y=\"363\" text-anchor=\"middle\" fill=\"#42505f\" font-weight=\"600\" font-size=\"13\">\u0424\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u00b7 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u00b7 NTP<\/text>\n\n  <!-- connectors external<->core (\u043e\u0440\u0442\u043e\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435, \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0435) -->\n  <path d=\"M176,66 H256\" fill=\"none\" stroke=\"#57606a\" stroke-width=\"1.5\" marker-end=\"url(#iotm-ar)\"\/>\n  <path d=\"M176,210 H256\" fill=\"none\" stroke=\"#57606a\" stroke-width=\"1.5\" marker-end=\"url(#iotm-ar)\"\/>\n  <path d=\"M176,354 H236 V89 H256\" fill=\"none\" stroke=\"#57606a\" stroke-width=\"1.5\" marker-end=\"url(#iotm-ar)\"\/>\n  <!-- core internal links -->\n  <path d=\"M374,112 V166\" fill=\"none\" stroke=\"#1f6feb\" stroke-width=\"1.5\" marker-end=\"url(#iotm-ar)\"\/>\n  <path d=\"M578,112 V166\" fill=\"none\" stroke=\"#1f6feb\" stroke-width=\"1.5\" marker-end=\"url(#iotm-ar)\"\/>\n  <path d=\"M374,224 V256\" fill=\"none\" stroke=\"#1f6feb\" stroke-width=\"1.5\" marker-end=\"url(#iotm-ar)\"\/>\n  <path d=\"M578,256 V224\" fill=\"none\" stroke=\"#1f6feb\" stroke-width=\"1.5\" marker-end=\"url(#iotm-ar)\"\/>\n<\/svg>\n<\/div>\n<p class=\"iotm-legend\">\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u043c\u0438\u0440 (\u0437\u0435\u043b\u0451\u043d\u044b\u0439) \u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u0441 \u044f\u0434\u0440\u043e\u043c \u0447\u0435\u0440\u0435\u0437 MQTT-\u043a\u043b\u0438\u0435\u043d\u0442 \u0438 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440. \u0412\u043d\u0443\u0442\u0440\u0438 \u0432\u0441\u0451 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0448\u0438\u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0438\u0442\u0430\u044e\u0442 \u043c\u043e\u0434\u0443\u043b\u0438 \u0438 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 \u0434\u0432\u0438\u0436\u043e\u043a \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432.<\/p>\n\n<table>\n  <thead><tr><th>\u041f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430<\/th><th>\u041e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c<\/th><th>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b<\/th><\/tr><\/thead>\n  <tbody>\n    <tr><td>\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0446\u0438\u043a\u043b <span class=\"pill core\">core<\/span><\/td><td>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u043f\u043e\u043e\u0447\u0435\u0440\u0435\u0434\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0432\u0441\u0435\u0445 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c<\/td><td><code>src\/Main.cpp<\/code><\/td><\/tr>\n    <tr><td>\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b<\/td><td>\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0432\u0441\u0435\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439<\/td><td><code>classes\/IoTItem.*<\/code><\/td><\/tr>\n    <tr><td>\u0421\u043e\u0431\u044b\u0442\u0438\u044f\/\u043a\u043e\u043c\u0430\u043d\u0434\u044b<\/td><td>\u0411\u0443\u0444\u0435\u0440\u044b <code>eventBuf<\/code> \/ <code>orderBuf<\/code>, \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430<\/td><td><code>EventsAndOrders.cpp<\/code><\/td><\/tr>\n    <tr><td>MQTT <span class=\"pill net\">net<\/span><\/td><td>\u0421\u0432\u044f\u0437\u044c \u0441 \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u043c, \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f, \u0440\u0430\u0437\u0431\u043e\u0440 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0442\u043e\u043f\u0438\u043a\u043e\u0432<\/td><td><code>MqttClient.cpp<\/code><\/td><\/tr>\n    <tr><td>\u0412\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440 <span class=\"pill net\">net<\/span><\/td><td>HTTP-\u0440\u043e\u0443\u0442\u044b, \u043e\u0442\u0434\u0430\u0447\u0430 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u0444\u0430\u0439\u043b\u044b, OTA<\/td><td><code>StandWebServer.cpp<\/code>, <code>AsyncWebServer.cpp<\/code><\/td><\/tr>\n    <tr><td>WebSocket <span class=\"pill net\">net<\/span><\/td><td>\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0439 \u043e\u0431\u043c\u0435\u043d \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/td><td><code>WsServer.cpp<\/code><\/td><\/tr>\n    <tr><td>Scenarios<\/td><td>\u041b\u0435\u043a\u0441\u0435\u0440, \u043f\u0430\u0440\u0441\u0435\u0440 \u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438<\/td><td><code>classes\/IoTScenario.*<\/code><\/td><\/tr>\n    <tr><td>\u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a<\/td><td>\u041f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e \u0442\u0430\u0439\u043c\u0435\u0440\u0443<\/td><td><code>TickerScheduler<\/code>, <code>PeriodicTasks.cpp<\/code><\/td><\/tr>\n  <\/tbody>\n<\/table>\n\n<!-- ================= 2. LOOP ================= -->\n<h2 id=\"iotm-loop\">2. \u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a<\/h2>\n<p>\u041f\u0440\u043e\u0448\u0438\u0432\u043a\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043d\u0430 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0430\u0440\u0435 Arduino <code>setup()<\/code> \/ <code>loop()<\/code> (\u0444\u0430\u0439\u043b <code>src\/Main.cpp<\/code>). \u0412\u0441\u0451 \u044f\u0434\u0440\u043e \u2014 \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e-\u043c\u043d\u043e\u0433\u043e\u0437\u0430\u0434\u0430\u0447\u043d\u043e\u0435: \u043d\u0435\u0442 \u0432\u044b\u0442\u0435\u0441\u043d\u044f\u044e\u0449\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 <code>loop()<\/code>. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043c\u043e\u0434\u0443\u043b\u044f\u0445 \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>delay()<\/code> \u2014 \u043e\u043d \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 \u0432\u0441\u0435\u0445.<\/p>\n\n<h3>2.1. \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (setup)<\/h3>\n<p>\u041f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u044f\u0434\u0440\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0448\u0430\u0433\u0438 \u0432 \u0441\u0442\u0440\u043e\u0433\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435; \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u00ab\u043c\u0430\u0440\u043a\u0435\u0440\u043e\u043c \u043e\u0448\u0438\u0431\u043a\u0438\u00bb, \u0447\u0442\u043e\u0431\u044b \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0437\u0430\u0432\u0438\u0441\u0430\u043d\u0438\u044f \u0431\u044b\u043b\u043e \u0432\u0438\u0434\u043d\u043e, \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e:<\/p>\n<ol>\n  <li>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u0432\u044b\u0432\u043e\u0434 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438.<\/li>\n  <li>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0448\u0438\u043d\u044b I2C \u043f\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u043c \u043f\u0438\u043d\u0430\u043c.<\/li>\n  <li><code>configure(\"\/config.json\")<\/code> \u2014 <b>\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432<\/b> \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 (\u0441\u043c. \u0440\u0430\u0437\u0434\u0435\u043b&nbsp;3).<\/li>\n  <li><code>iotScen.loadScenario(\"\/scenario.txt\")<\/code> \u2014 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u0432\u0438\u0436\u043a\u0430 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432.<\/li>\n  <li>\u0421\u043e\u0431\u044b\u0442\u0438\u0435 <code>onInit<\/code> \u2014 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0446\u0435\u043f\u0438\u0442\u044c \u0431\u043b\u043e\u043a \u043a\u043e\u0434\u0430 \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u0440\u0430\u043d\u043d\u0438\u0439 \u0441\u0442\u0430\u0440\u0442.<\/li>\n  <li>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a Wi-Fi \u0440\u043e\u0443\u0442\u0435\u0440\u0443, \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u0432\u0435\u0431-\u0441\u043e\u043a\u0435\u0442\u043e\u0432.<\/li>\n  <li>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d <code>elementsLoop()<\/code>, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f NTP \u0438 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447.<\/li>\n  <li>\u0421\u043e\u0431\u044b\u0442\u0438\u0435 <code>onStart<\/code> \u2014 \u0431\u043b\u043e\u043a \u043a\u043e\u0434\u0430 \u043d\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/li>\n<\/ol>\n\n<h3>2.2. \u0422\u0435\u043b\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 (loop)<\/h3>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f <code>loop()<\/code> \u2014 \u044d\u0442\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c:<\/p>\n<pre><code>void loop() {\n    ts.update();              \/\/ 1. \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447\n    HTTP.handleClient();      \/\/ 2. \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432\n    standWebSocket.loop();    \/\/ 3. \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 WebSocket\n    mqttLoop();               \/\/ 4. \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 MQTT\n    elementsLoop();           \/\/ 5. \u043e\u043f\u0440\u043e\u0441 \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 + \u0448\u0438\u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\n}<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>elementsLoop()<\/code> \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e <code>loop()<\/code> (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438 \u043d\u0430\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>doByInterval()<\/code>), \u0430 \u0437\u0430\u0442\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f:<\/p>\n<pre><code>void elementsLoop() {\n    for (auto it = IoTItems.begin(); it != IoTItems.end(); ++it)\n        (*it)-&gt;loop();        \/\/ \u0442\u0430\u043a\u0442 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f\n    handleOrder();            \/\/ \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0438\u0437 orderBuf\n    handleEvent();            \/\/ \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0434\u043d\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0438\u0437 eventBuf\n}<\/code><\/pre>\n<div class=\"iotm-callout amber\"><b class=\"lbl\">\u0417\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u0437\u0430\u0432\u0438\u0441\u0430\u043d\u0438\u0439:<\/b> \u043d\u0430 ESP32 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0439 \u0442\u0430\u0439\u043c\u0435\u0440 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u00ab\u043b\u0435\u043d\u0438\u0432\u044b\u0435\u00bb \u0443\u0447\u0430\u0441\u0442\u043a\u0438. \u0415\u0441\u043b\u0438 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0441\u0435\u043a\u0446\u0438\u044f loop() \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u043b\u044c\u0448\u0435 ~400&nbsp;\u043c\u0441, \u0432 \u043b\u043e\u0433 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u0441 ID \u0437\u0430\u0432\u0438\u0441\u0448\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430. \u042d\u0442\u043e \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u0440\u043e\u0442\u0438\u0432 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439.<\/div>\n\n<h3>2.3. \u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a TickerScheduler<\/h3>\n<p>\u0417\u0430\u0434\u0430\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u0430 \u043d\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u043a\u0442), \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0435 <code>ts<\/code>. \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0437 \u044f\u0434\u0440\u0430: \u0435\u0436\u0435\u0441\u0435\u043a\u0443\u043d\u0434\u043d\u043e\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u0444\u043b\u0435\u0448, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u00ab\u0441\u0432\u0435\u0436\u0435\u0441\u0442\u0438\u00bb \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043f\u0438\u043d\u0433\u043e\u0432 WebSocket, \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a MQTT. \u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u2014 \u043e\u043d \u043b\u0438\u0448\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u043b\u043e \u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n\n<!-- ================= 3. ITEMS ================= -->\n<h2 id=\"iotm-items\">3. \u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043a\u0430\u043a \u0446\u0435\u043d\u0442\u0440 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/h2>\n<p>\u0421\u043f\u0438\u0441\u043e\u043a <code>IoTItems<\/code> (\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 <code>std::list&lt;IoTItem*&gt;<\/code>) \u2014 \u044d\u0442\u043e \u00ab\u0436\u0438\u0432\u0430\u044f\u00bb \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438. \u0412\u0441\u0451, \u0447\u0442\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u044d\u0442\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430.<\/p>\n\n<h3>3.1. \u041a\u0430\u043a \u0440\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442<\/h3>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 <code>\/config.json<\/code> \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>configure()<\/code> \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0445 \u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0430\u0431\u0440\u0438\u043a\u0443 <code>getAPI(subtype, params)<\/code>. \u042d\u0442\u0430 \u0444\u0430\u0431\u0440\u0438\u043a\u0430 (\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b <code>src\/modules\/API.cpp<\/code>) \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043c\u043e\u0434\u0443\u043b\u0438, \u043f\u043e\u043a\u0430 \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445 \u043d\u0435 \u043e\u043f\u043e\u0437\u043d\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 <code>subtype<\/code> \u0438 \u043d\u0435 \u0432\u0435\u0440\u043d\u0451\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442:<\/p>\n<pre><code>\/\/ \u0432\u043d\u0443\u0442\u0440\u0438 configure():\nmyIoTItem = (IoTItem*) getAPI(subtype, jsonArrayElement);\nif (myIoTItem) IoTItems.push_back(myIoTItem);<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f (\u0434\u0430\u043d\u043d\u044b\u0435) \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u044b (\u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435). \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0444\u0430\u0431\u0440\u0438\u043a\u0430 <code>getAPI<\/code> \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439.<\/p>\n\n<h3>3.2. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u0435\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 (regEvent)<\/h3>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u043e\u0434\u0443\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043e\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>regEvent()<\/code>. \u042d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043c\u0438\u0440. \u0412\u043d\u0443\u0442\u0440\u0438 <code>regEvent()<\/code> \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439:<\/p>\n<pre><code>void IoTItem::regEvent(const String&amp; value, ...) {\n    if (_needSave) { \/* \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430 \u0444\u043b\u0435\u0448 *\/ }\n    publishStatusMqtt(_id, value);   \/\/ \u2192 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 MQTT\n    publishStatusWs(_id, value);     \/\/ \u2192 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0447\u0435\u0440\u0435\u0437 WebSocket\n    if (genEvent) {\n        generateEvent(_id, value);   \/\/ \u2192 \u0432 \u0448\u0438\u043d\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (\u0434\u043b\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432)\n        if (_global) publishEvent(...); \/\/ \u2192 \u0434\u0440\u0443\u0433\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0432 \u0441\u0435\u0442\u0438\n    }\n}<\/code><\/pre>\n<div class=\"iotm-callout\"><b class=\"lbl\">\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0432\u044b\u0432\u043e\u0434:<\/b> \u043c\u043e\u0434\u0443\u043b\u044c \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c \u043f\u0440\u043e MQTT, \u0432\u0435\u0431-\u0441\u043e\u043a\u0435\u0442\u044b \u0438\u043b\u0438 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438. \u041e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 regEvent \u2014 \u0430 \u044f\u0434\u0440\u043e \u0441\u0430\u043c\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u043e \u0432\u0441\u0435 \u043a\u0430\u043d\u0430\u043b\u044b. \u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u00ab\u043a\u043b\u0435\u0439\u00bb \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b.<\/div>\n\n<h3>3.3. \u041f\u043e\u0438\u0441\u043a \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432<\/h3>\n<p>\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0445\u043e\u0434\u044f\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430 \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u043c\u0443 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0443 \u0447\u0435\u0440\u0435\u0437 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: <code>findIoTItem(id)<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442, <code>getItemValue(id)<\/code> \u2014 \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, <code>isItemExist(id)<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435. \u041d\u0430 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u043c\u0435\u0436\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u044f\u0437\u0438 \u0438 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438.<\/p>\n\n<!-- ================= 4. EVENTS ================= -->\n<h2 id=\"iotm-events\">4. \u0428\u0438\u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434<\/h2>\n<p>\u0421\u0435\u0440\u0434\u0446\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u0438 \u044f\u0434\u0440\u0430 \u2014 \u0434\u0432\u0430 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u0431\u0443\u0444\u0435\u0440\u0430 \u0432 <code>EventsAndOrders.cpp<\/code>. \u041e\u043d\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442 \u0434\u0432\u0430 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u0430.<\/p>\n\n<table>\n  <thead><tr><th><\/th><th>orderBuf (\u043a\u043e\u043c\u0430\u043d\u0434\u044b)<\/th><th>eventBuf (\u0441\u043e\u0431\u044b\u0442\u0438\u044f)<\/th><\/tr><\/thead>\n  <tbody>\n    <tr><td>\u0421\u043c\u044b\u0441\u043b<\/td><td>\u00ab\u0421\u0434\u0435\u043b\u0430\u0439 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441\u00bb<\/td><td>\u00ab\u0412\u043e\u0442 \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e, \u043f\u0440\u043e\u0432\u0435\u0440\u044c \u0432 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445\u00bb<\/td><\/tr>\n    <tr><td>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a<\/td><td>\u043a\u043d\u043e\u043f\u043a\u0430 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u043f\u0440\u044f\u043c\u043e\u0439 MQTT-order, \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439<\/td><td>\u043b\u044e\u0431\u043e\u0439 <code>regEvent()<\/code> \u043c\u043e\u0434\u0443\u043b\u044f<\/td><\/tr>\n    <tr><td>\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435<\/td><td>\u043c\u0435\u043d\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (<code>setValue<\/code>)<\/td><td>\u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432<\/td><\/tr>\n    <tr><td>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438<\/td><td><code>generateOrder(id, value)<\/code><\/td><td><code>generateEvent(id, value)<\/code><\/td><\/tr>\n    <tr><td>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u0430<\/td><td><code>handleOrder()<\/code><\/td><td><code>handleEvent()<\/code><\/td><\/tr>\n  <\/tbody>\n<\/table>\n\n<p>\u041e\u0431\u0430 \u0431\u0443\u0444\u0435\u0440\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043a\u0430\u043a \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440: \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u0438 \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0432 \u043a\u043e\u043d\u0435\u0446 \u0441\u0442\u0440\u043e\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u0438\u0434\u0430 <code>id \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435,<\/code>, \u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0442\u0430\u043a\u0442\u0435 <code>elementsLoop()<\/code> \u0441\u043d\u0438\u043c\u0430\u044e\u0442 \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0441 \u043d\u0430\u0447\u0430\u043b\u0430. \u0422\u0430\u043a\u0430\u044f \u0440\u0430\u0437\u0432\u044f\u0437\u043a\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u043e\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438: \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u043f\u043e\u0440\u043e\u0436\u0434\u0451\u043d\u043d\u043e\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0441\u0442\u0430\u043d\u0435\u0442 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0430 \u043d\u0435 \u0432\u044b\u0437\u043e\u0432\u0435\u0442\u0441\u044f \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e.<\/p>\n\n<h4>\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 handleEvent()<\/h4>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u0435\u0439: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0440\u0430\u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u043c \u0447\u0435\u0440\u0435\u0437 \u0445\u0443\u043a\u0438 (<code>onRegEvent<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 <code>onTrackingValue<\/code> \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442), \u0437\u0430\u0442\u0435\u043c \u043e\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0434\u0432\u0438\u0436\u043a\u0443 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432:<\/p>\n<pre><code>void handleEvent() {\n    String eventIdName = \/* id \u0438\u0437 \u043d\u0430\u0447\u0430\u043b\u0430 eventBuf *\/;\n    IoTItem* item = findIoTItem(eventIdName);\n    if (item)\n        for (auto it : IoTItems) {\n            it-&gt;onRegEvent(item);                        \/\/ \u0445\u0443\u043a \u0432\u0441\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u043c\n            if (it-&gt;isTracking(item)) it-&gt;onTrackingValue(item);\n        }\n    iotScen.exec(eventIdName);   \/\/ \u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438\n}<\/code><\/pre>\n\n<!-- ================= 5. MQTT ================= -->\n<h2 id=\"iotm-mqtt\">5. \u041f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 MQTT<\/h2>\n<p>MQTT \u2014 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u0430\u043d\u0430\u043b \u0441\u0432\u044f\u0437\u0438 \u0441 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0438 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432 <code>MqttClient.cpp<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 (\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439) MQTT-\u043a\u043b\u0438\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u00ab\u043f\u0440\u043e\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f\u00bb \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>mqttLoop()<\/code> \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430.<\/p>\n\n<h3>5.1. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0442\u043e\u043f\u0438\u043a\u043e\u0432<\/h3>\n<p>\u041a\u043e\u0440\u0435\u043d\u044c \u0432\u0441\u0435\u0445 \u0442\u043e\u043f\u0438\u043a\u043e\u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u043a\u0430\u043a <code>mqttPrefix + \"\/\" + chipId<\/code> (\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>mqttRootDevice<\/code>), \u0433\u0434\u0435 <code>chipId<\/code> \u0443\u043d\u0438\u043a\u0430\u043b\u0435\u043d \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043b\u0430\u0442\u044b. \u041e\u0442 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0440\u043d\u044f \u0440\u0430\u0441\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043f\u043e\u0434-\u0442\u043e\u043f\u0438\u043a\u0438:<\/p>\n<table>\n  <thead><tr><th>\u0422\u043e\u043f\u0438\u043a<\/th><th>\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/th><th>\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/th><\/tr><\/thead>\n  <tbody>\n    <tr><td><code>{root}\/{id}\/status<\/code><\/td><td>\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u2192 \u043c\u0438\u0440<\/td><td>\u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430<\/td><\/tr>\n    <tr><td><code>{root}\/{id}\/event<\/code><\/td><td>\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u2192 \u043c\u0438\u0440<\/td><td>\u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u0434\u043b\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 (\u0443 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432)<\/td><\/tr>\n    <tr><td><code>{root}\/{id}\/control<\/code><\/td><td>\u043c\u0438\u0440 \u2192 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e<\/td><td>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043e\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438, \u043f\u043e\u043b\u0437\u0443\u043d\u043e\u043a)<\/td><\/tr>\n    <tr><td><code>{root}\/{id}\/order<\/code><\/td><td>\u043c\u0438\u0440 \u2192 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e<\/td><td>\u041f\u0440\u044f\u043c\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e MQTT<\/td><\/tr>\n    <tr><td><code>{root}\/state<\/code><\/td><td>LWT<\/td><td>\u00ab\u0417\u0430\u0432\u0435\u0449\u0430\u043d\u0438\u0435\u00bb \u2014 \u0431\u0440\u043e\u043a\u0435\u0440 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442 offline \u043f\u0440\u0438 \u043e\u0431\u0440\u044b\u0432\u0435 \u0441\u0432\u044f\u0437\u0438<\/td><\/tr>\n  <\/tbody>\n<\/table>\n\n<h3>5.2. \u0420\u0430\u0437\u0431\u043e\u0440 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439<\/h3>\n<p>\u0412\u0441\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0432 \u0435\u0434\u0438\u043d\u044b\u0439 \u043a\u043e\u043b\u0431\u044d\u043a <code>mqttCallback()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 \u043f\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c\u0443 \u0442\u043e\u043f\u0438\u043a\u0430:<\/p>\n<div class=\"iotm-diagram\">\n<svg viewbox=\"0 0 720 330\" preserveaspectratio=\"xMidYMid meet\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" role=\"img\" aria-label=\"\u0421\u0445\u0435\u043c\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 MQTT-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439\">\n  <defs>\n    <marker id=\"iotm-ar2\" markerwidth=\"10\" markerheight=\"10\" refx=\"8\" refy=\"4\" orient=\"auto\" markerunits=\"userSpaceOnUse\">\n      <path d=\"M0,0 L8,4 L0,8 Z\" fill=\"#57606a\"\/>\n    <\/marker>\n  <\/defs>\n  <rect x=\"280\" y=\"16\" width=\"160\" height=\"44\" rx=\"9\" fill=\"#dbeafe\" stroke=\"#1550b8\" stroke-width=\"2\"\/>\n  <text x=\"360\" y=\"43\" text-anchor=\"middle\" fill=\"#1550b8\" font-weight=\"700\" font-size=\"14\">mqttCallback()<\/text>\n\n  <!-- 4 branches -->\n  <rect x=\"24\" y=\"120\" width=\"150\" height=\"58\" rx=\"8\" fill=\"#ffffff\" stroke=\"#8b98a5\" stroke-width=\"1.5\"\/>\n  <text x=\"99\" y=\"143\" text-anchor=\"middle\" font-weight=\"700\" fill=\"#0d1117\" font-size=\"13\">&#171;HELLO&#187;<\/text>\n  <text x=\"99\" y=\"162\" text-anchor=\"middle\" font-size=\"11.5\" fill=\"#57606a\">\u043f\u043e\u043b\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435<\/text>\n\n  <rect x=\"196\" y=\"120\" width=\"150\" height=\"58\" rx=\"8\" fill=\"#ffffff\" stroke=\"#8b98a5\" stroke-width=\"1.5\"\/>\n  <text x=\"271\" y=\"143\" text-anchor=\"middle\" font-weight=\"700\" fill=\"#0d1117\" font-size=\"13\">&#171;control&#187;<\/text>\n  <text x=\"271\" y=\"162\" text-anchor=\"middle\" font-size=\"11.5\" fill=\"#57606a\">\u2192 generateOrder<\/text>\n\n  <rect x=\"368\" y=\"120\" width=\"160\" height=\"58\" rx=\"8\" fill=\"#ffffff\" stroke=\"#8b98a5\" stroke-width=\"1.5\"\/>\n  <text x=\"448\" y=\"143\" text-anchor=\"middle\" font-weight=\"700\" fill=\"#0d1117\" font-size=\"13\">&#171;event&#187;<\/text>\n  <text x=\"448\" y=\"162\" text-anchor=\"middle\" font-size=\"11.5\" fill=\"#57606a\">\u2192 analyzeMsgFromNet<\/text>\n\n  <rect x=\"550\" y=\"120\" width=\"150\" height=\"58\" rx=\"8\" fill=\"#ffffff\" stroke=\"#8b98a5\" stroke-width=\"1.5\"\/>\n  <text x=\"625\" y=\"143\" text-anchor=\"middle\" font-weight=\"700\" fill=\"#0d1117\" font-size=\"13\">&#171;order&#187;<\/text>\n  <text x=\"625\" y=\"162\" text-anchor=\"middle\" font-size=\"11.5\" fill=\"#57606a\">\u2192 generateOrder<\/text>\n\n  <!-- hook note -->\n  <rect x=\"196\" y=\"238\" width=\"332\" height=\"52\" rx=\"8\" fill=\"#f0f3f6\" stroke=\"#8b98a5\" stroke-width=\"1.5\"\/>\n  <text x=\"362\" y=\"260\" text-anchor=\"middle\" font-size=\"12\" fill=\"#42505f\">\u0445\u0443\u043a onMqttRecive() \u0443 \u0432\u0441\u0435\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u2014<\/text>\n  <text x=\"362\" y=\"278\" text-anchor=\"middle\" font-size=\"12\" fill=\"#42505f\">\u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u041a\u0410\u0416\u0414\u041e\u0413\u041e \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f<\/text>\n\n  <!-- connectors: \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0437\u0434\u0430\u0447\u0430 \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u0449\u0443\u044e \u0448\u0438\u043d\u0443 -->\n  <path d=\"M360,60 V92\" fill=\"none\" stroke=\"#57606a\" stroke-width=\"1.5\"\/>\n  <path d=\"M99,92 H625\" fill=\"none\" stroke=\"#57606a\" stroke-width=\"1.5\"\/>\n  <path d=\"M99,92 V120\" fill=\"none\" stroke=\"#57606a\" stroke-width=\"1.5\" marker-end=\"url(#iotm-ar2)\"\/>\n  <path d=\"M271,92 V120\" fill=\"none\" stroke=\"#57606a\" stroke-width=\"1.5\" marker-end=\"url(#iotm-ar2)\"\/>\n  <path d=\"M448,92 V120\" fill=\"none\" stroke=\"#57606a\" stroke-width=\"1.5\" marker-end=\"url(#iotm-ar2)\"\/>\n  <path d=\"M625,92 V120\" fill=\"none\" stroke=\"#57606a\" stroke-width=\"1.5\" marker-end=\"url(#iotm-ar2)\"\/>\n  <path d=\"M360,60 V212 H362 V238\" fill=\"none\" stroke=\"#c0c8d0\" stroke-width=\"1.5\" stroke-dasharray=\"5 3\" marker-end=\"url(#iotm-ar2)\"\/>\n<\/svg>\n<\/div>\n<ul>\n  <li><b>HELLO<\/b> \u2014 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u043e\u0441\u044c. \u042f\u0434\u0440\u043e \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442 \u0432\u0441\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 (\u043f\u043e\u043b\u043d\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f).<\/li>\n  <li><b>control<\/b> \u2014 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043e\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f id \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>generateOrder()<\/code> \u2192 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u043d\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/li>\n  <li><b>event<\/b> \u2014 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043e\u0442 <i>\u0434\u0440\u0443\u0433\u043e\u0433\u043e<\/i> \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0415\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d \u043f\u0440\u0438\u0451\u043c (<code>mqttin<\/code>), \u043e\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432 <code>analyzeMsgFromNet()<\/code> \u0438 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u00ab\u0441\u0435\u0442\u0435\u0432\u043e\u0439\u00bb \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432 \u043c\u0435\u0441\u0442\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445.<\/li>\n  <li><b>order<\/b> \u2014 \u043f\u0440\u044f\u043c\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e MQTT \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439.<\/li>\n<\/ul>\n<div class=\"iotm-callout\"><b class=\"lbl\">\u0422\u043e\u0447\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043c\u043e\u0434\u0443\u043b\u0435\u0439:<\/b> \u043f\u0435\u0440\u0435\u0434 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043a\u043e\u043b\u0431\u044d\u043a \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>onMqttRecive(topic, msg)<\/code> \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f. \u0422\u0430\u043a \u043c\u043e\u0434\u0443\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0443\u0448\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0442\u043e\u043f\u0438\u043a\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0434\u0430\u0442\u0447\u0438\u043a \u043f\u043e MQTT), \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u044f \u044f\u0434\u0440\u043e.<\/div>\n\n<h3>5.3. \u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f<\/h3>\n<p>\u0418\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0434\u0443\u0442 \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439 <code>publish\u2026<\/code>: <code>publishStatusMqtt()<\/code> \u0434\u043b\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, <code>publishEvent()<\/code> \u0434\u043b\u044f \u043c\u0435\u0436\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, <code>publishWidgets()<\/code> \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u041f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0431\u0440\u043e\u043a\u0435\u0440\u0443 \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0441\u0432\u044f\u0437\u0438 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u044b \u0432 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430; \u043f\u0440\u0438 \u043f\u043e\u0442\u0435\u0440\u0435 Wi-Fi \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u043e\u0447\u043a\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 (AP-\u0440\u0435\u0436\u0438\u043c).<\/p>\n\n<!-- ================= 6. WEB ================= -->\n<h2 id=\"iotm-web\">6. \u0412\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440: HTTP \u0438 WebSocket<\/h2>\n<p>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u0430\u0436\u0435 \u0431\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430. \u041e\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u0435\u0439: HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0434\u0430\u0451\u0442 \u0441\u0442\u0430\u0442\u0438\u043a\u0443 \u0438 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u044b, \u0438 WebSocket-\u043a\u0430\u043d\u0430\u043b\u0430 \u0434\u043b\u044f \u0436\u0438\u0432\u043e\u0433\u043e \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430. \u0412 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0435 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u2014 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 (<code>StandWebServer.cpp<\/code> + <code>WsServer.cpp<\/code>) \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 (<code>AsyncWebServer.cpp<\/code>), \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c\u044b\u0435 \u0444\u043b\u0430\u0433\u0430\u043c\u0438 \u0441\u0431\u043e\u0440\u043a\u0438.<\/p>\n\n<h3>6.1. HTTP-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u044b<\/h3>\n<p>\u0412\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 (\u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0435 Svelte-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435) \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0438 \u043e\u0442\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u0442\u0430\u0442\u0438\u043a\u043e\u0439. \u041f\u043e\u043c\u0438\u043c\u043e \u0444\u0430\u0439\u043b\u043e\u0432, \u0441\u0435\u0440\u0432\u0435\u0440 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b:<\/p>\n<table>\n  <thead><tr><th>\u041c\u0430\u0440\u0448\u0440\u0443\u0442<\/th><th>\u041c\u0435\u0442\u043e\u0434<\/th><th>\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/th><\/tr><\/thead>\n  <tbody>\n    <tr><td><code>\/set<\/code><\/td><td>GET<\/td><td>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/td><\/tr>\n    <tr><td><code>\/status<\/code><\/td><td>GET<\/td><td>\u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/td><\/tr>\n    <tr><td><code>\/list<\/code><\/td><td>GET<\/td><td>\u0421\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435<\/td><\/tr>\n    <tr><td><code>\/edit<\/code><\/td><td>GET\/PUT\/POST\/DELETE<\/td><td>\u0424\u0430\u0439\u043b\u043e\u0432\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440: \u0447\u0442\u0435\u043d\u0438\u0435, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435, \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435<\/td><\/tr>\n    <tr><td><code>\/update<\/code><\/td><td>POST<\/td><td>\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u043f\u043e \u0432\u043e\u0437\u0434\u0443\u0445\u0443 (OTA)<\/td><\/tr>\n    <tr><td><code>\/localota<\/code><\/td><td>GET<\/td><td>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 OTA-\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435<\/td><\/tr>\n  <\/tbody>\n<\/table>\n<p>\u041e\u0442\u0434\u0430\u0447\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 <code>handleFileRead()<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 gzip-\u0441\u0436\u0430\u0442\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b (\u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0441\u0436\u0430\u0442\u044b\u043c \u0434\u043b\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u0444\u043b\u0435\u0448\u0430).<\/p>\n\n<h3>6.2. WebSocket: \u0436\u0438\u0432\u043e\u0439 \u043a\u0430\u043d\u0430\u043b<\/h3>\n<p>WebSocket \u0434\u0430\u0451\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0443 \u0442\u043e \u0436\u0435, \u0447\u0442\u043e MQTT \u0434\u0430\u0451\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u2014 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0435\u0437 \u043e\u043f\u0440\u043e\u0441\u0430. \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c-\u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435, \u043e\u0431\u0440\u0430\u043c\u043b\u0451\u043d\u043d\u044b\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c <code>|<\/code>. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a <code>webSocketEvent()<\/code> \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 \u0442\u0438\u043f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<table>\n  <thead><tr><th>\u041a\u043e\u043c\u0430\u043d\u0434\u0430<\/th><th>\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442<\/th><\/tr><\/thead>\n  <tbody>\n    <tr><td><code>\/config|<\/code><\/td><td>\u041e\u0442\u0434\u0430\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0443 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 (\u043f\u043e \u043a\u0430\u0434\u0440\u0430\u043c)<\/td><\/tr>\n    <tr><td><code>\/gifnoc|<\/code><\/td><td>\u041f\u0440\u0438\u043d\u044f\u0442\u044c \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e<\/td><\/tr>\n    <tr><td><code>\/oiranecs|<\/code><\/td><td>\u041f\u0440\u0438\u043d\u044f\u0442\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439, \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u0430\u0442\u044c <code>config<\/code> and <code>scenario<\/code><\/td><\/tr>\n    <tr><td><code>\/tuoyal|<\/code><\/td><td>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 (layout)<\/td><\/tr>\n    <tr><td><code>\/sgnittes|<\/code><\/td><td>\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/td><\/tr>\n    <tr><td><code>\/mqtt|<\/code><\/td><td>\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0431\u0440\u043e\u043a\u0435\u0440\u0443<\/td><\/tr>\n    <tr><td><code>\/charts|<\/code><\/td><td>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432<\/td><\/tr>\n  <\/tbody>\n<\/table>\n<div class=\"iotm-callout amber\"><b class=\"lbl\">\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435:<\/b> \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u00ab\u043d\u0430\u0438\u0437\u043d\u0430\u043d\u043a\u0443\u00bb (<code>gifnoc<\/code> = config \u0437\u0430\u0434\u043e\u043c \u043d\u0430\u043f\u0435\u0440\u0451\u0434, <code>oiranecs<\/code> = scenario). \u042d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u044c \u00ab\u0441\u043e\u0445\u0440\u0430\u043d\u0438\u00bb \u043e\u0442 \u00ab\u043e\u0442\u0434\u0430\u0439\u00bb \u0434\u043b\u044f \u043f\u0430\u0440\u043d\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430. \u0411\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u044b (\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f) \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044f\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 <code>sendFileToWsByFrames()<\/code>, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c.<\/div>\n<p>\u0416\u0438\u0432\u0443\u0447\u0435\u0441\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0438\u043d\u0433\u0430\u043c\u0438: \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0430\u0437 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u00ab\u043c\u043e\u043b\u0447\u0430\u0449\u0438\u0445\u00bb.<\/p>\n\n<h3>6.3. \u0414\u0432\u0430 \u043a\u0430\u043d\u0430\u043b\u0430 \u2014 \u043e\u0434\u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u044c<\/h3>\n<p>\u0412\u0430\u0436\u043d\u043e, \u0447\u0442\u043e MQTT \u0438 WebSocket \u043d\u0435 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u044e\u0442: \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>regEvent()<\/code> \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442 \u0435\u0433\u043e <b>\u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e<\/b> \u0432 \u043e\u0431\u0430 \u043a\u0430\u043d\u0430\u043b\u0430 (<code>publishStatusMqtt<\/code> and <code>publishStatusWs<\/code>). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0443\u0434\u0430 \u0443\u0433\u043e\u0434\u043d\u043e.<\/p>\n\n<!-- ================= 7. SCENARIO ================= -->\n<h2 id=\"iotm-scenario\">7. \u0414\u0432\u0438\u0436\u043e\u043a \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432<\/h2>\n<p>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u2014 \u044d\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430: \u00ab\u0435\u0441\u043b\u0438 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0432\u044b\u0448\u0435 25, \u0432\u044b\u043a\u043b\u044e\u0447\u0438 \u043d\u0430\u0433\u0440\u0435\u0432\u0430\u0442\u0435\u043b\u044c\u00bb. \u0414\u0432\u0438\u0436\u043e\u043a \u0432 <code>classes\/IoTScenario.cpp<\/code> \u2014 \u044d\u0442\u043e \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 (\u043b\u0435\u043a\u0441\u0435\u0440 \u2192 \u043f\u0430\u0440\u0441\u0435\u0440 \u2192 \u0434\u0435\u0440\u0435\u0432\u043e AST \u2192 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435). \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e \u043e\u043d \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0443\u0447\u0435\u0431\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 Kaleidoscope \u0438\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 LLVM.<\/p>\n\n<h3>7.1. \u0418\u0437 \u0447\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0434\u0432\u0438\u0436\u043e\u043a<\/h3>\n<ul>\n  <li><b>\u041b\u0435\u043a\u0441\u0435\u0440<\/b> (<code>gettok()<\/code>) \u2014 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u044b: \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b, \u0447\u0438\u0441\u043b\u0430, \u0441\u0442\u0440\u043e\u043a\u0438, \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b.<\/li>\n  <li><b>\u041f\u0430\u0440\u0441\u0435\u0440<\/b> (\u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e <code>Parse\u2026()<\/code>) \u2014 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0441\u043f\u0443\u0441\u043a \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432; \u0441\u0442\u0440\u043e\u0438\u0442 \u0434\u0435\u0440\u0435\u0432\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 (<code>ExprAST<\/code>).<\/li>\n  <li><b>\u0423\u0437\u043b\u044b AST<\/b> \u2014 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0438 <code>ExprAST<\/code> \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>exec()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>IoTValue<\/code>. \u0415\u0441\u0442\u044c \u0443\u0437\u043b\u044b \u0434\u043b\u044f \u0447\u0438\u0441\u0435\u043b, \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432, \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f <code>if\/then\/else<\/code>, \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/li>\n<\/ul>\n<p>\u0414\u0432\u0438\u0436\u043e\u043a \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0440\u0438 \u0440\u0435\u0436\u0438\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0440\u0430\u0434\u0438 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 (\u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f ESP8266): \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u043f\u043e\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e, \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u043b\u0438\u0431\u043e \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u0434\u043b\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438.<\/p>\n\n<h3>7.2. \u042f\u0437\u044b\u043a \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432<\/h3>\n<p>\u041f\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0438\u0437 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u044f\u0437\u044b\u043a \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u00ab\u0435\u0441\u043b\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0438\u0441\u0442\u0438\u043d\u043d\u043e \u2014 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0434\u043d\u043e, \u0438\u043d\u0430\u0447\u0435 \u2014 \u0434\u0440\u0443\u0433\u043e\u0435\u00bb. \u0412\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c:<\/p>\n<ul>\n  <li>\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 (\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f);<\/li>\n  <li>\u0447\u0438\u0441\u043b\u0430 (\u0446\u0435\u043b\u044b\u0435, \u0434\u0440\u043e\u0431\u043d\u044b\u0435, \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435) \u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u0445;<\/li>\n  <li>\u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f <code>&lt; &gt; &lt;= &gt;= == !=<\/code>, \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 <code>=<\/code>;<\/li>\n  <li>\u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0443 <code>+ - * \/<\/code> \u0438 \u043b\u043e\u0433\u0438\u043a\u0443 <code>&amp; |<\/code>;<\/li>\n  <li>\u0432\u044b\u0437\u043e\u0432\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 (\u0432 \u0442. \u0447. \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 <code>execute<\/code>);<\/li>\n  <li>\u0431\u043b\u043e\u043a\u0438 <code>{ }<\/code>, \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435 <code>if\/then\/else<\/code>, \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043f\u043e\u0441\u043b\u0435 <code>#<\/code>.<\/li>\n<\/ul>\n<pre><code># \u043f\u0440\u0438\u043c\u0435\u0440 \u043b\u043e\u0433\u0438\u043a\u0438\nif (temperature &gt; 25) then {\n    relay = 0                      # \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u0430\u0433\u0440\u0435\u0432\u0430\u0442\u0435\u043b\u044c\n    telegram.send(\"\u041f\u0435\u0440\u0435\u0433\u0440\u0435\u0432!\")     # \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0434\u0443\u043b\u044f\n} else {\n    relay = 1\n}<\/code><\/pre>\n\n<h3>7.3. \u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f: \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u043d\u0435 \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u0432 \u0446\u0438\u043a\u043b\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e. \u041e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f <b>\u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442 \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u0438<\/b>. \u042d\u0442\u043e \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u0441\u0432\u044f\u0437\u043a\u0438: <code>handleEvent()<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>iotScen.exec(eventIdName)<\/code>, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0438\u043c\u044f \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0432\u0448\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. \u0423\u0437\u043b\u044b AST \u0443\u043c\u0435\u044e\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 <code>hasEventIdName()<\/code> \u2014 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e\u0442 \u043b\u0438 \u043e\u043d\u0438 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0438. \u0415\u0441\u043b\u0438 \u043d\u0438 \u043e\u0434\u043d\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0431\u043b\u043e\u043a\u0430 \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c, \u0431\u043b\u043e\u043a \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f.<\/p>\n<div class=\"iotm-callout green\"><b class=\"lbl\">\u041f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e:<\/b> \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0438 \u043f\u0430\u043c\u044f\u0442\u044c. \u041d\u0430 \u043c\u0430\u043b\u043e\u043c\u043e\u0449\u043d\u043e\u043c ESP \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0438\u0437 \u0441\u043e\u0442\u043d\u0438 \u0441\u0442\u0440\u043e\u043a \u043d\u0435 \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0442\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u043a\u0430\u0441\u0430\u044e\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f.<\/div>\n\n<!-- ================= 8. DATAFLOW ================= -->\n<h2 id=\"iotm-dataflow\">8. \u0421\u043a\u0432\u043e\u0437\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/h2>\n<p>\u0421\u043e\u0431\u0435\u0440\u0451\u043c \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435 \u043d\u0430 \u0442\u0440\u0451\u0445 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u0430\u0445. \u042d\u0442\u043e \u043b\u0443\u0447\u0448\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043a\u0430\u043a \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441\u043e\u043e\u0431\u0449\u0430.<\/p>\n\n<h3>\u041f\u043e\u0442\u043e\u043a A. \u0414\u0430\u0442\u0447\u0438\u043a \u043e\u0431\u043d\u043e\u0432\u0438\u043b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/h3>\n<ol>\n  <li>\u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u043e\u0434\u0443\u043b\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>doByInterval()<\/code>.<\/li>\n  <li>\u041c\u043e\u0434\u0443\u043b\u044c \u0447\u0438\u0442\u0430\u0435\u0442 \u0436\u0435\u043b\u0435\u0437\u043e \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>regEvent(value)<\/code>.<\/li>\n  <li><code>regEvent<\/code> \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 MQTT (<code>\u2026\/status<\/code>) \u0438 \u0432 WebSocket \u2192 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e.<\/li>\n  <li><code>regEvent<\/code> \u043a\u043b\u0430\u0434\u0451\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0432 <code>eventBuf<\/code>.<\/li>\n  <li>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0442\u0430\u043a\u0442\u0435 <code>handleEvent()<\/code> \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0440\u0435\u0430\u043a\u0446\u0438\u044f.<\/li>\n<\/ol>\n\n<h3>\u041f\u043e\u0442\u043e\u043a B. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0436\u0430\u043b \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438<\/h3>\n<ol>\n  <li>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442 \u0432 \u0442\u043e\u043f\u0438\u043a <code>\u2026\/{id}\/control<\/code>.<\/li>\n  <li>\u0411\u0440\u043e\u043a\u0435\u0440 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 <code>mqttCallback()<\/code>.<\/li>\n  <li>\u0412\u0435\u0442\u043a\u0430 \u00abcontrol\u00bb \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>generateOrder(id, value)<\/code> \u2192 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 <code>orderBuf<\/code>.<\/li>\n  <li>\u0412 \u0442\u0430\u043a\u0442\u0435 <code>handleOrder()<\/code> \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>setValue()<\/code>.<\/li>\n  <li><code>setValue<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u043d\u043e\u0432\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>regEvent<\/code> \u2192 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u043a\u0430\u043d\u0430\u043b\u0430\u043c \u0438 \u0432 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 (\u041f\u043e\u0442\u043e\u043a A \u0441 \u0448\u0430\u0433\u0430 3).<\/li>\n<\/ol>\n\n<h3>\u041f\u043e\u0442\u043e\u043a C. \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u0441 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/h3>\n<ol>\n  <li>\u0414\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442 \u0441\u0432\u043e\u0451 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0432 <code>\u2026\/{id}\/event<\/code>.<\/li>\n  <li>\u041d\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0435\u0433\u043e (\u0435\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0451\u043d \u043f\u0440\u0438\u0451\u043c <code>mqttin<\/code>).<\/li>\n  <li><code>analyzeMsgFromNet()<\/code> \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u00ab\u0441\u0435\u0442\u0435\u0432\u043e\u0439\u00bb \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0434\u043e\u0432\u0435\u0440\u0438\u044f.<\/li>\n  <li>\u041f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u2192 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0432 \u043c\u0435\u0441\u0442\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445.<\/li>\n  <li>\u0415\u0441\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c, \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u00ab\u043f\u0440\u043e\u0442\u0443\u0445\u0430\u0435\u0442\u00bb \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f \u0432 <code>elementsLoop()<\/code>.<\/li>\n<\/ol>\n<div class=\"iotm-callout\"><b class=\"lbl\">\u0415\u0434\u0438\u043d\u044b\u0439 \u0437\u043d\u0430\u043c\u0435\u043d\u0430\u0442\u0435\u043b\u044c:<\/b> \u0432\u0441\u0435 \u0442\u0440\u0438 \u043f\u043e\u0442\u043e\u043a\u0430 \u0441\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0430 \u043f\u0430\u0440\u0435 <code>regEvent<\/code> \/ \u0448\u0438\u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u041e\u0442\u043a\u0443\u0434\u0430 \u0431\u044b \u043d\u0438 \u043f\u0440\u0438\u0448\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u2014 \u043e\u0442 \u0436\u0435\u043b\u0435\u0437\u0430, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0441\u0435\u0442\u0438 \u2014 \u0434\u0430\u043b\u044c\u0448\u0435 \u043e\u043d\u0438 \u0434\u0432\u0438\u0436\u0443\u0442\u0441\u044f \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0443. \u042d\u0442\u043e \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0439.<\/div>\n\n<!-- ================= 9. FILES ================= -->\n<h2 id=\"iotm-files\">9. \u041a\u0430\u0440\u0442\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u044f\u0434\u0440\u0430<\/h2>\n<table>\n  <thead><tr><th>\u0424\u0430\u0439\u043b<\/th><th>\u0427\u0442\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438<\/th><\/tr><\/thead>\n  <tbody>\n    <tr><td><code>src\/Main.cpp<\/code><\/td><td><code>setup()<\/code>, <code>loop()<\/code>, <code>elementsLoop()<\/code>, \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/td><\/tr>\n    <tr><td><code>src\/classes\/IoTItem.cpp<\/code><\/td><td>\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, <code>regEvent()<\/code>, \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/td><\/tr>\n    <tr><td><code>include\/classes\/IoTItem.h<\/code><\/td><td>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>IoTValue<\/code>, \u0445\u0443\u043a\u0438<\/td><\/tr>\n    <tr><td><code>src\/EventsAndOrders.cpp<\/code><\/td><td>\u0428\u0438\u043d\u0430: <code>generateOrder\/Event<\/code>, <code>handleOrder\/Event<\/code><\/td><\/tr>\n    <tr><td><code>src\/MqttClient.cpp<\/code><\/td><td>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0442\u043e\u043f\u0438\u043a\u0438, <code>mqttCallback()<\/code>, \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f<\/td><\/tr>\n    <tr><td><code>src\/StandWebServer.cpp<\/code><\/td><td>HTTP-\u0440\u043e\u0443\u0442\u044b, \u043e\u0442\u0434\u0430\u0447\u0430 \u0444\u0430\u0439\u043b\u043e\u0432, OTA<\/td><\/tr>\n    <tr><td><code>src\/WsServer.cpp<\/code><\/td><td>WebSocket, \u0440\u0430\u0437\u0431\u043e\u0440 \u043a\u043e\u043c\u0430\u043d\u0434, \u043f\u043e\u043a\u0430\u0434\u0440\u043e\u0432\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430<\/td><\/tr>\n    <tr><td><code>src\/classes\/IoTScenario.cpp<\/code><\/td><td>\u041b\u0435\u043a\u0441\u0435\u0440, \u043f\u0430\u0440\u0441\u0435\u0440, \u0443\u0437\u043b\u044b AST, <code>exec()<\/code><\/td><\/tr>\n    <tr><td><code>src\/ESPConfiguration.cpp<\/code><\/td><td><code>configure()<\/code>, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 <code>getAPI<\/code><\/td><\/tr>\n    <tr><td><code>src\/modules\/API.cpp<\/code><\/td><td>\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0430 <code>getAPI()<\/code> (\u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438)<\/td><\/tr>\n    <tr><td><code>src\/PeriodicTasks.cpp<\/code><\/td><td>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430<\/td><\/tr>\n  <\/tbody>\n<\/table>\n\n<div class=\"iotm-callout\"><b class=\"lbl\">\u041a\u0430\u043a \u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u0434 \u0434\u0430\u043b\u044c\u0448\u0435:<\/b> \u043d\u0430\u0447\u043d\u0438\u0442\u0435 \u0441 <code>Main.cpp<\/code> (\u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u0432), \u0437\u0430\u0442\u0435\u043c <code>IoTItem.cpp::regEvent<\/code> (\u0443\u0432\u0438\u0434\u0438\u0442\u0435, \u043a\u0443\u0434\u0430 \u0443\u0445\u043e\u0434\u044f\u0442 \u0434\u0430\u043d\u043d\u044b\u0435), \u0437\u0430\u0442\u0435\u043c <code>EventsAndOrders.cpp<\/code> (\u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0440\u0430\u0437\u0432\u044f\u0437\u043a\u0443). \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e MQTT, \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u00ab\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438\u00bb \u0438 \u00ab\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u0438\u00bb \u044d\u0442\u043e\u0439 \u0448\u0438\u043d\u044b.<\/div>\n\n<div class=\"iotm-foot\">\n  IoTManager \u2014 \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u044f\u0434\u0440\u0430 \u00b7 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u0432\u0435\u0442\u043a\u0438 <code>ver4stable<\/code><br>\n  \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434: github.com\/IoTManagerProject\/IoTManager\n<\/div>\n\n<\/div>\n<!-- ============ \u041a\u041e\u041d\u0415\u0426 \u0424\u0420\u0410\u0413\u041c\u0415\u041d\u0422\u0410 IoTManager (\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u044f\u0434\u0440\u0430) ============ -->","protected":false},"excerpt":{"rendered":"<p>IoTManager \u00b7 \u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u044f\u0434\u0440\u0430 MQTT \u00b7 \u0412\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440 \u00b7 \u0414\u0432\u0438\u0436\u043e\u043a \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0412\u0435\u0440\u0441\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 1.0 \u00b7 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043e \u043d\u0430 \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u0432\u0435\u0442\u043a\u0438 ver4stable github.com\/IoTManagerProject\/IoTManager \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u041e\u0431\u0437\u043e\u0440: \u0438\u0437 \u0447\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u044f\u0434\u0440\u043e \u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 (IoTItems) \u043a\u0430\u043a \u0446\u0435\u043d\u0442\u0440 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0428\u0438\u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434 (Events &amp; Orders) \u041f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 MQTT \u0412\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440: HTTP \u0438 WebSocket \u0414\u0432\u0438\u0436\u043e\u043a \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0421\u043a\u0432\u043e\u0437\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 &#8230; <a title=\"\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u044f\u0434\u0440\u0430\" class=\"read-more\" href=\"https:\/\/iotmanager.org\/en\/1134-2\/\" aria-label=\"More on \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u044f\u0434\u0440\u0430\">Read more<\/a><\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/iotmanager.org\/en\/wp-json\/wp\/v2\/pages\/1134"}],"collection":[{"href":"https:\/\/iotmanager.org\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/iotmanager.org\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/iotmanager.org\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/iotmanager.org\/en\/wp-json\/wp\/v2\/comments?post=1134"}],"version-history":[{"count":6,"href":"https:\/\/iotmanager.org\/en\/wp-json\/wp\/v2\/pages\/1134\/revisions"}],"predecessor-version":[{"id":1141,"href":"https:\/\/iotmanager.org\/en\/wp-json\/wp\/v2\/pages\/1134\/revisions\/1141"}],"wp:attachment":[{"href":"https:\/\/iotmanager.org\/en\/wp-json\/wp\/v2\/media?parent=1134"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}