{"id":398026,"date":"2024-06-29T13:49:34","date_gmt":"2024-06-29T13:49:34","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=398026"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-06-29T13:49:34","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=398026","title":{"rendered":"<span>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0446\u0438\u0435\u0439. \u0422\u0438\u043f\u043e\u0432\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0438 \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 wb-rules<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a7e\/416\/7bc\/a7e4167bceb5d41e94ef1335df0d6b53.png\" width=\"780\" height=\"440\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a7e\/416\/7bc\/a7e4167bceb5d41e94ef1335df0d6b53.png\"\/><\/figure>\n<blockquote>\n<p><a href=\"https:\/\/habr.com\/ru\/company\/wirenboard\/blog\/702444\/\">\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0446\u0438\u0435\u0439: \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c, \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u043c, \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043c<\/a><br \/><a href=\"https:\/\/habr.com\/ru\/company\/wirenboard\/blog\/705900\/\">\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0446\u0438\u0435\u0439. \u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u0430\u0433\u0440\u0435\u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0430. \u042d\u0441\u0441\u0435 \u043f\u0440\u043e \u0442\u0435\u0445\u043d\u0438\u043a\u0443 \u0438 \u0434\u0435\u043d\u044c\u0433\u0438<\/a><br \/>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0446\u0438\u0435\u0439. \u0422\u0438\u043f\u043e\u0432\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0438 \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 wb-rules<\/p>\n<\/blockquote>\n<p>\u0412 \u0444\u0438\u043d\u0430\u043b\u0435 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 <a href=\"https:\/\/habr.com\/ru\/company\/wirenboard\/blog\/705900\/\"><u>\u0441\u0442\u0430\u0442\u044c\u0438<\/u><\/a> \u044f \u0443\u0441\u0442\u0440\u043e\u0438\u043b \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043d\u0438\u0435, \u0434\u043b\u044f \u043a\u0430\u043a\u043e\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b: \u0441 \u0432\u043e\u0434\u044f\u043d\u044b\u043c \u043d\u0430\u0433\u0440\u0435\u0432\u043e\u043c \u0438\u043b\u0438 \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0431\u0435\u0434\u0443 \u043e\u0434\u0435\u0440\u0436\u0430\u043b \u0432\u043e\u0434\u044f\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0435\u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0430. \u041d\u0443, \u0437\u043d\u0430\u0447\u0438\u0442, \u0442\u0430\u043a \u0442\u043e\u043c\u0443 \u0438 \u0431\u044b\u0442\u044c.<\/p>\n<h2>\u0412\u0432\u043e\u0434\u043d\u044b\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h2>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043d\u0430\u0448\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438. \u0412\u043e\u0442 <a href=\"https:\/\/drive.google.com\/file\/d\/12nra5iexl4B8TnbWWTkATBR9NUvhbMPK\/view?usp=sharing\"><u>\u0441\u0445\u0435\u043c\u0430<\/u><\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u042f \u0435\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u2014 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c \u0441 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u0435\u0439 \u00ab\u041f\u0443\u0441\u043a\/\u0421\u0442\u043e\u043f\u00bb \u0438 \u0437\u0430\u0432\u0435\u043b \u0435\u0433\u043e \u043d\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0440\u0435\u043b\u0435\u0439\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f.\u00a0<\/p>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0445\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0434\u0438\u0442\u044c, \u0447\u0442\u043e \u044f \u043d\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442, \u0430 \u0438\u043d\u0436\u0435\u043d\u0435\u0440, \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0432\u0448\u0438\u0439\u0441\u044f. \u042f \u043c\u043e\u0433\u0443 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0442\u0435\u0440\u043c\u0438\u043d\u044b, \u043d\u0435 \u0437\u043d\u0430\u0442\u044c \u0442\u0438\u043f\u043e\u0432\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b\u2026 \u043e\u0442\u043d\u0435\u0441\u0438\u0442\u0435\u0441\u044c \u0441\u043d\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u0447\u0442\u043e. \u042f \u0441\u0440\u0430\u0437\u0443 \u0441\u043e\u0433\u043b\u0430\u0441\u0435\u043d \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443: \u0438 \u043b\u0443\u0447\u0448\u0435, \u0438 \u043f\u0440\u043e\u0449\u0435, \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u0435\u0435\u2026 \u041c\u043e\u044f \u0446\u0435\u043b\u044c \u2014 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 <a href=\"https:\/\/wirenboard.com\/ru\/product\/wiren-board-7\/\"><u>Wiren Board<\/u><\/a> \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0435 \u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443. \u0417\u043d\u0430\u043d\u0438\u044f \u044f \u0447\u0435\u0440\u043f\u0430\u043b \u0438\u0437 <a href=\"https:\/\/github.com\/wirenboard\/wb-rules\"><u>\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f<\/u><\/a> \u043d\u0430\u0448\u0435\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 \u043f\u0440\u0430\u0432\u0438\u043b wb-rules, <a href=\"https:\/\/wirenboard.com\/wiki\/Rule_Examples\"><u>\u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432<\/u><\/a> \u043f\u0440\u0430\u0432\u0438\u043b \u0438 <a href=\"https:\/\/262.ecma-international.org\/5.1\/#sec-4.2.1\"><u>\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/u><\/a> \u044f\u0437\u044b\u043a\u0430 ECMAScript.<\/p>\n<p>\u042f \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0432\u0441\u0451 \u043c\u043d\u043e\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u0441\u0442\u0435\u043d\u0434\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/cd6\/d3f\/7f1\/cd6d3f7f110264cfcfce15ca3ce12911.jpg\" width=\"3000\" height=\"4000\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cd6\/d3f\/7f1\/cd6d3f7f110264cfcfce15ca3ce12911.jpg\" data-blurred=\"true\"\/><\/figure>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0433\u0443 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e \u0437\u0430\u044f\u0432\u0438\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (\u043d\u0430 \u0444\u043e\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u043b\u0438\u0448\u043d\u0435\u0433\u043e, \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0439\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f).\u00a0<\/p>\n<p>\u0414\u0430, \u0434\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f Production \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0435\u0449\u0435 \u043d\u0430\u0434\u043e \u00ab\u043e\u0442\u043b\u0438\u0437\u044b\u0432\u0430\u0442\u044c\u00bb, \u043d\u043e \u0432\u0435\u0441\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d.\u00a0<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0435\u0439, \u044f \u043f\u043e\u0448\u0435\u043b \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>\u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0442\u043e\u0447\u043d\u0430\u044f \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 (\u0434\u043b\u044f \u0432\u044b\u0442\u044f\u0436\u043d\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0442\u0435 \u0436\u0435, \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044f \u043d\u0430\u0433\u0440\u0435\u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0430);<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0433\u0440\u0435\u0432\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 \u0432 \u043b\u0435\u0442\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0435 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e (\u044d\u0442\u043e \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u043e\u0437\u0434\u0443\u0445 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0433\u0440\u0435\u0442, \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u0435\u043d\u0442\u0438\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0432 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043c\u0430\u043b\u043e\u0433\u043e \u043a\u0440\u0443\u0433\u0430 \u0438 \u0446\u0438\u0440\u043a\u0443\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043d\u0430\u0441\u043e\u0441 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0437\u0440\u044f).<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0435\u043d\u0438\u0439.<\/p>\n<h2>\u041f\u0440\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b<\/h2>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b (\u0442\u043e\u0447\u043d\u0435\u0435, \u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u044b) \u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u043b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0435\u0440\u0432\u0438\u0441 <a href=\"https:\/\/drakonhub.com\/\"><u>DrakonHub<\/u><\/a>, \u043d\u0430 \u00ab\u0434\u0440\u0430\u043a\u043e\u043d\u044c\u0435\u043c\u00bb <a href=\"https:\/\/drakonhub.com\/drakon-reference\"><u>\u044f\u0437\u044b\u043a\u0435<\/u><\/a>. \u041e\u043d \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u0435\u043d, \u0447\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u0434\u0430\u0432\u0430\u043b\u0438 \u043d\u0430 \u0443\u0440\u043e\u043a\u0430\u0445 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u043a\u0438. \u041d\u0430 \u044d\u0442\u043e\u043c \u0436\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0435\u0441\u0442\u044c <a href=\"https:\/\/drakonhub.com\/files\/pe_drakon_automata_mitkin_2019.pdf\"><u>\u0441\u0442\u0430\u0442\u044c\u044f<\/u><\/a>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b. \u0414\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u2014 \u043c\u043e\u0438\u0445 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 \u043a \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.  <\/p>\n<h2>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f<\/h2>\n<p>\u041d\u0430\u0447\u043d\u0443 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <a href=\"https:\/\/wirenboard.com\/wiki\/Wiren_Board_Web_Interface\"><u>\u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/u><\/a> \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430. \u0414\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e <a href=\"https:\/\/wirenboard.com\/wiki\/Wiren_Board_Web_Interface#%D0%A1%D0%BC%D0%B5%D0%BD%D0%B0_%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D1%8F_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0\"><u>\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0430<\/u><\/a> \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u00bb.<\/p>\n<h3>\u0414\u0430\u0442\u0447\u0438\u043a\u0438<\/h3>\n<p>\u0414\u0430\u0442\u0447\u0438\u043a\u0438 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 \u043a \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 1-Wire, \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u0414\u0440\u0430\u0439\u0432\u0435\u0440 wb-mqtt-w1 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u0435\u0434\u0435\u0442 \u043e\u043f\u0440\u043e\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u0442\u0447\u0438\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d, \u043e\u043d \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 <code>\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/code> \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430. \u0422\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0435\u0433\u043e \u0430\u0434\u0440\u0435\u0441 \u0438\u00a0  \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b.<\/p>\n<p>\u0412 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e26\/791\/c64\/e26791c6466b95b625ee22dbfecb5577.png\" width=\"389\" height=\"108\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e26\/791\/c64\/e26791c6466b95b625ee22dbfecb5577.png\"\/><\/figure>\n<h3>\u0420\u0435\u043b\u0435\u0439\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c<\/h3>\n<p>\u0420\u0435\u043b\u0435\u0439\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c <a href=\"https:\/\/wirenboard.com\/ru\/product\/WB-MR6C_v3\/\">WB-MR6C v.3<\/a> \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u043f\u043e\u0440\u0442\u0443 RS-485 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 Wiren Board 7. \u041e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u0441 \u043c\u043e\u0434\u0443\u043b\u0435\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 <code>wb-mqtt-serial<\/code>. \u0412\u043e\u0442 \u0435\u0433\u043e \u043c\u043d\u0435 \u0438 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c. \u0412\u044b\u0431\u0438\u0440\u0430\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 <code>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b - \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 serial \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432<\/code>, \u0432\u0438\u0436\u0443 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0440\u0442\u043e\u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430. \u0412\u044b\u0431\u0438\u0440\u0430\u044e \u043f\u043e\u0440\u0442, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0438\u0437 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u044e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f. \u041d\u0430\u0436\u0438\u043c\u0430\u044e <code>\u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c<\/code>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/da5\/59a\/36e\/da559a36e3dd66d18f2a3133fd80ce00.png\" width=\"1128\" height=\"618\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/da5\/59a\/36e\/da559a36e3dd66d18f2a3133fd80ce00.png\"\/><\/figure>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u2014 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0440\u0442\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0437\u0430\u0432\u043e\u0434\u0441\u043a\u0438\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u00a0 \u043a\u0430\u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430, \u0442\u0430\u043a \u0438 Modbus-\u043c\u043e\u0434\u0443\u043b\u0435\u0439. \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0432\u044b \u043b\u0435\u0433\u043a\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0445 <a href=\"https:\/\/wirenboard.com\/wiki\/UART_Communication_Settings\"><u>\u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c<\/u><\/a>.\u00a0<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0441\u0430\u043c \u0440\u0435\u043b\u0435\u0439\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c. \u041e\u043d, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u0438 \u0433\u043e\u0442\u043e\u0432 \u043a \u0440\u0430\u0431\u043e\u0442\u0435, \u043d\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043a\u043e\u0435-\u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c. \u0422\u043e, \u0447\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u043a \u0441\u0430\u043c\u043e\u0439 \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u0442\u0430\u043a \u0438 \u0434\u043e\u043c\u0430 \u0432 \u0446\u0435\u043b\u043e\u043c. <\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435 \u2014 \u044d\u0442\u043e \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u0438\u0442\u0430\u043d\u0438\u044f. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0432\u0441\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u043a\u0443 \u0434\u043e\u043c\u0430 \u0432 \u0441\u0438\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0440\u043e\u0437. \u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443 \u043d\u0443\u0436\u043d\u0430 \u043f\u0430\u0440\u0430 \u043c\u0438\u043d\u0443\u0442 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u2014 \u0437\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0437\u0430\u043c\u043e\u0440\u043e\u0437\u0438\u0442\u044c \u043a\u0430\u043b\u043e\u0440\u0438\u0444\u0435\u0440. \u0421\u043a\u0430\u0436\u0443 \u043c\u043e\u0434\u0443\u043b\u044e, \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u0434\u0430\u0447\u0435 \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0438 \u0432\u044b\u0445\u043e\u0434\u044b \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u0418 \u0443\u043a\u0430\u0436\u0443, \u043a\u0430\u043a\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/04c\/2ed\/8f6\/04c2ed8f664e0e2977f42d6392ba7663.png\" width=\"822\" height=\"606\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/04c\/2ed\/8f6\/04c2ed8f664e0e2977f42d6392ba7663.png\"\/><\/figure>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u044d\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u0432\u043e\u0437\u0434\u0443\u0448\u043d\u0430\u044f \u0437\u0430\u0441\u043b\u043e\u043d\u043a\u0430 (\u0432\u044b\u0445\u043e\u0434 1) \u0437\u0430\u043a\u0440\u044b\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u0441\u043e\u0441 (\u0432\u044b\u0445\u043e\u0434 2) \u0432\u043a\u043b\u044e\u0447\u0435\u043d;<\/p>\n<\/li>\n<li>\n<p>\u0432\u0435\u043d\u0442\u0438\u043b\u044c (\u0432\u044b\u0445\u043e\u0434 3) \u043e\u0442\u043a\u0440\u044b\u0442;<\/p>\n<\/li>\n<li>\n<p>\u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440 (\u0432\u044b\u0445\u043e\u0434 5) \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043d\u0430\u0440\u0443\u0436\u043d\u044b\u0439 \u0432\u043e\u0437\u0434\u0443\u0445 \u0447\u0435\u0440\u0435\u0437 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f, \u0433\u043e\u0440\u044f\u0447\u0430\u044f \u0432\u043e\u0434\u0430 \u0446\u0438\u0440\u043a\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u0432 \u043a\u0430\u043b\u043e\u0440\u0438\u0444\u0435\u0440\u0435 \u2014 \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e. \u0418 \u0434\u0430\u0436\u0435 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0436\u0430\u0440\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u043d\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u0412 \u0442\u0430\u043a\u043e\u0435 \u0436\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0438 \u0432\u044b\u0445\u043e\u0434\u044b \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0442\u0435\u0440\u0438 \u0441\u0432\u044f\u0437\u0438 \u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c. \u0418 \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043c\u043e\u0434\u0443\u043b\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0432\u043e\u0438\u0445 \u0432\u0445\u043e\u0434\u043e\u0432.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2c3\/663\/5d7\/2c36635d750d2fda0ec99b8853ae5c97.png\" width=\"719\" height=\"716\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2c3\/663\/5d7\/2c36635d750d2fda0ec99b8853ae5c97.png\"\/><\/figure>\n<p>\u0412\u0441\u0451, \u043c\u043e\u0434\u0443\u043b\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d. \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u0439\u0442\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 <code>\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/code>, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u043f\u043e\u0449\u0435\u043b\u043a\u0430\u0442\u044c \u0432\u044b\u0445\u043e\u0434\u0430\u043c\u0438. \u0422\u0443\u0442 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c, \u0447\u0442\u043e \u043a \u0432\u044b\u0445\u043e\u0434\u0430\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435 (\u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0442\u0430\u043a), \u0438 \u0449\u0435\u043b\u043a\u0430\u0442\u044c \u0441\u043e \u0437\u043d\u0430\u043d\u0438\u0435\u043c \u0434\u0435\u043b\u0430.  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a5a\/2ca\/287\/a5a2ca287d2014f5a3f1e11e2777aa31.png\" width=\"632\" height=\"760\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a5a\/2ca\/287\/a5a2ca287d2014f5a3f1e11e2777aa31.png\"\/><\/figure>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u044b, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.<\/p>\n<h2>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<h3>\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043a\u043e\u0434\u0430<\/h3>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 <code>\u041f\u0440\u0430\u0432\u0438\u043b\u0430<\/code> \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 <code>\u0421\u043e\u0437\u0434\u0430\u0442\u044c<\/code>, \u0432\u0432\u043e\u0434\u0438\u043c \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c js. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/198\/778\/3ef\/1987783ef51010ce3b70f415f47d4660.png\" width=\"900\" height=\"499\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/198\/778\/3ef\/1987783ef51010ce3b70f415f47d4660.png\"\/><\/figure>\n<p>\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0446\u0432\u0435\u0442\u043e\u043c, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u041f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0434 \u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0438. \u0415\u0441\u043b\u0438 \u043e\u0448\u0438\u0431\u043b\u0438\u0441\u044c \u2014 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0433\u0434\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0438 \u0432 \u0447\u0435\u043c. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0438\u0436\u0435 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>makeSensorController<\/code> \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 59 \u0444\u0430\u0439\u043b\u0430 <code>ventilation.js<\/code>:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/199\/315\/28e\/19931528efa4bbd3cc85e19de44e8212.png\" width=\"303\" height=\"22\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/199\/315\/28e\/19931528efa4bbd3cc85e19de44e8212.png\"\/><\/figure>\n<p>\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0443 \u043e\u0448\u0438\u0431\u043a\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0442\u043e\u0436\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442. \u0412\u0441\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b \u0434\u043b\u044f JS, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0433\u0443\u0433\u043b\u0438\u0442\u044c \u0438 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043d\u0435 \u0442\u0430\u043a.<\/p>\n<h3>MQTT<\/h3>\n<p>\u0412\u0441\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 <a href=\"https:\/\/wirenboard.com\/wiki\/MQTT\"><u>MQTT<\/u><\/a>, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0431\u0449\u0430\u044e\u0442\u0441\u044f \u043d\u0435 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0430 \u0447\u0435\u0440\u0435\u0437 MQTT \u0431\u0440\u043e\u043a\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u0430\u043a \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041c\u043e\u0436\u043d\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u0438\u0440\u043c\u0443, \u0433\u0434\u0435 \u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u0440\u044f (\u0431\u0440\u043e\u043a\u0435\u0440\u0430). <\/p>\n<p>\u0423 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u0440\u044f \u0435\u0441\u0442\u044c \u043f\u0430\u043f\u043a\u0438 (\u0442\u043e\u043f\u0438\u043a\u0438) \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c\u0438. \u0412 \u043f\u0430\u043f\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0438\u043c\u0435\u044e\u0449\u0435\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u043e\u0442\u043c\u0435\u0442\u043a\u0443 (retain \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435), \u043b\u0438\u0431\u043e \u043f\u0430\u043f\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0439.\u00a0<\/p>\n<p>\u0421\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0438 \u043f\u0438\u0448\u0443\u0442 \u0441\u0432\u043e\u0438 \u0444\u0430\u043c\u0438\u043b\u0438\u0438 \u043d\u0430 \u043d\u0443\u0436\u043d\u044b\u0445 \u0438\u043c \u043f\u0430\u043f\u043a\u0430\u0445 (\u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0442\u043e\u043f\u0438\u043a\u0438). \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 \u043d\u0435\u0442 &#8212; \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u0440\u044c \u0435\u0435 \u0437\u0430\u0432\u043e\u0434\u0438\u0442.\u00a0<\/p>\n<p>\u0412 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u0440\u044c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0445\u0440\u0430\u043d\u044f\u0449\u0435\u0435\u0441\u044f \u0432 \u043f\u0430\u043f\u043a\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0443, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u0442\u0430\u043c \u0435\u0441\u0442\u044c.\u00a0<\/p>\n<p>\u0421\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0438 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u043e\u0433\u0443\u0442\u00a0 \u043f\u0440\u0438\u043d\u0435\u0441\u0442\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0430\u043f\u043a\u0438 \u0441 \u0442\u0430\u043a\u0438\u043c-\u0442\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c (\u043f\u0443\u0431\u043b\u0438\u043a\u0443\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0442\u043e\u043f\u0438\u043a\u0438). \u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u0435\u0441\u043b\u0438 \u043f\u0430\u043f\u043a\u0438 \u043d\u0435\u0442 &#8212; \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u0440\u044c \u0435\u0435 \u0437\u0430\u0432\u0435\u0434\u0435\u0442. \u0414\u0430\u043b\u0435\u0435, \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u0440\u044c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u043c, \u0447\u044c\u0438 \u0444\u0430\u043c\u0438\u043b\u0438\u0438 \u0435\u0441\u0442\u044c \u043d\u0430 \u043f\u0430\u043f\u043a\u0435 (\u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430\u043c). \u0415\u0441\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u043a\u0443 retain &#8212; \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u0440\u044c \u043a\u043b\u0430\u0434\u0435\u0442 \u0435\u0433\u043e \u0432 \u043f\u0430\u043f\u043a\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u043b\u0435\u0436\u0430\u0449\u0435\u0433\u043e \u0442\u0430\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u043e\u0442\u043c\u0435\u0442\u043a\u0438 \u043d\u0435\u0442 &#8212; \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043a\u0430\u0437\u0430.<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0440\u0430\u0439\u0432\u0435\u0440\u044b, \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0442\u043e\u043f\u0438\u043a\u0438. \u0412\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u043d\u0430 \u0432\u0441\u0435 \u0442\u043e\u043f\u0438\u043a\u0438, \u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u0443\u0434\u0430 \u043d\u043e\u0432\u044b\u0435. \u0421\u0435\u0440\u0432\u0438\u0441 <code>wb-rules<\/code> \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u043e \u0432\u0441\u0435\u043c \u0442\u043e\u043f\u0438\u043a\u0430\u043c, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438 \u043c\u044b \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445 \u043c\u043e\u0436\u0435\u043c (\u0438 \u0431\u0443\u0434\u0435\u043c) \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.\u00a0<\/p>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0432\u0441\u0435\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0442\u043e\u043f\u0438\u043a\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 <code>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 - \u041a\u0430\u043d\u0430\u043b\u044b MQTT<\/code>.<\/p>\n<p>\u042f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b \u0434\u0430\u0442\u0447\u0438\u043a\u0438 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b, \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0440\u0435\u043b\u0435\u0439\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043c\u043d\u0435 \u0442\u043e\u043f\u0438\u043a\u0438:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"center\"><strong>\u0422\u043e\u043f\u0438\u043a<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"center\"><strong>\u0421\u0438\u043d\u043e\u043d\u0438\u043c<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044f<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-w1\/controls\/28-000009795bc2<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">ai_t_air<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-w1\/controls\/28-00000978ba32<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">ai_t_water<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0432\u043e\u0434\u044b \u0432 \u00ab\u043e\u0431\u0440\u0430\u0442\u043a\u0435\u00bb<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/Input 0<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">di_not_fire<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0438\u0433\u043d\u0430\u043b \u00ab\u041f\u043e\u0436\u0430\u0440\u00bb \u043e\u0442 \u0410\u0423\u041f\u0421<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0440\u0430\u0437\u043e\u043c\u043a\u043d\u0443\u0442\u043e = \u043f\u043e\u0436\u0430\u0440<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/Input 1<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">di_ps_filter<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0435\u043b\u0435 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0440\u0430\u0437\u043e\u043c\u043a\u043d\u0443\u0442\u043e = \u0447\u0438\u0441\u0442\u044b\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/Input 2<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">di_ps_fan<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0435\u043b\u0435 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0437\u0430\u043c\u043a\u043d\u0443\u0442\u043e = \u0440\u0430\u0441\u0447\u0435\u0442\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/Input 3<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">di_open<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u0430\u0441\u043b\u043e\u043d\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0437\u0430\u043c\u043a\u043d\u0443\u0442\u043e = \u043e\u0442\u043a\u0440\u044b\u0442\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/Input 4<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">di_closed<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u0430\u0441\u043b\u043e\u043d\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0437\u0430\u043c\u043a\u043d\u0443\u0442\u043e = \u0437\u0430\u043a\u0440\u044b\u0442\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/Input 5<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">di_ts_fan<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u0435\u0440\u043c\u043e\u043a\u043e\u043d\u0442\u0430\u043a\u0442\u044b \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0440\u0430\u0437\u043e\u043c\u043a\u043d\u0443\u0442\u043e = \u043f\u0435\u0440\u0435\u0433\u0440\u0435\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/Input 6<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">di_hs<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c \u0441 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u0435\u0439 \u00ab\u041f\u0443\u0441\u043a\/\u0421\u0442\u043e\u043f\u00bb<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0437\u0430\u043c\u043a\u043d\u0443\u0442\u043e = \u043f\u0443\u0441\u043a<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/K1<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">do_open<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0435\u043b\u0435 \u0437\u0430\u0441\u043b\u043e\u043d\u043a\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0437\u0430\u043c\u043a\u043d\u0443\u0442\u043e = \u043e\u0442\u043a\u0440\u044b\u0442\u044c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/K2<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">do_pump<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0435\u043b\u0435 \u043d\u0430\u0441\u043e\u0441\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/K3<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">do_more<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0435\u043b\u0435 \u0432\u0435\u043d\u0442\u0438\u043b\u044f \u00ab\u0431\u043e\u043b\u044c\u0448\u0435\u00bb<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/K4<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">do_less<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0435\u043b\u0435 \u0432\u0435\u043d\u0442\u0438\u043b\u044f \u00ab\u043c\u0435\u043d\u044c\u0448\u0435\u00bb<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/K5<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">do_fan<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0435\u043b\u0435 \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0439\u0442\u0435, \u0447\u0442\u043e \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u0442\u043e\u043f\u0438\u043a\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0430\u0434\u0440\u0435\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u0432\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043c\u0435\u0441\u0442\u043e <code>28-000009795bc2<\/code>, <code>28-00000978ba32<\/code> \u0438 <code>111<\/code> \u0431\u0443\u0434\u0443\u0442 \u0430\u0434\u0440\u0435\u0441\u0430 \u0432\u0430\u0448\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432.<\/p>\n<p>\u0418\u043c\u0435\u043d\u0430 \u0442\u043e\u043f\u0438\u043a\u043e\u0432 \u043c\u0430\u043b\u043e\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u044b \u2014 \u0432 \u043a\u043e\u043b\u043e\u043d\u043a\u0435 <code>\u0421\u0438\u043d\u043e\u043d\u0438\u043c<\/code> \u044f \u043f\u0440\u0438\u0432\u0435\u043b \u0442\u043e \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445. \u0412 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0442\u0430\u043a\u0443\u044e \u043d\u043e\u0442\u0430\u0446\u0438\u044e: <code>[\u0432\u0438\u0434 \u0441\u0438\u0433\u043d\u0430\u043b\u0430]_[\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440]_[\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e]<\/code>. \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u2014 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e.<\/p>\n<p>\u0412 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0442\u043e\u043f\u0438\u043a\u0430\u043c MQTT \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u043e\u0431\u044a\u0435\u043a\u0442 <code>dev[\u0438\u043c\u044f_\u0442\u043e\u043f\u0438\u043a\u0430]<\/code>. \u0412 \u0438\u043c\u0435\u043d\u0438 \u0442\u043e\u043f\u0438\u043a\u0430 <code>\/devices<\/code> \u0438 <code>\/controls<\/code> \u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 x \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0432\u043e\u0437\u0434\u0443\u0445\u0430, \u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"javascript\">x =\u00a0 dev['wb-w1\/28-000009795bc2'];<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u0430\u0441\u043e\u0441:<\/p>\n<pre><code>dev['wb-mr6cv3_111\/K2'] = true;<\/code><\/pre>\n<p>\u041e\u0431\u044a\u0435\u043a\u0442 dev \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u043d\u0435\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"javascript\">var AI_T_AIR = 'wb-w1\/28-000009795bc2';  x = dev[AI_T_AIR];<\/code><\/pre>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043d\u0435 \u0438 \u043d\u0443\u0436\u043d\u044b \u0441\u0438\u043d\u043e\u043d\u0438\u043c\u044b. \u0412 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u043c\u0438 \u0431\u0443\u043a\u0432\u0430\u043c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0438\u043d\u043e\u043d\u0438\u043c \u0432 \u043a\u043e\u0434\u0435 \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043a\u0430\u043a \u043f\u0440\u043e\u043f\u0438\u0441\u043d\u044b\u043c\u0438, \u0442\u0430\u043a \u0438 \u0441\u0442\u0440\u043e\u0447\u043d\u044b\u043c\u0438 \u0431\u0443\u043a\u0432\u0430\u043c\u0438, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f.   <\/p>\n<h3>\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/h3>\n<p>\u0418\u0437 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043b\u043e\u0433-\u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0438\u043b\u0438 \u043e\u043a\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u043b\u043e, \u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435\u043a\u0430\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u043b\u0430\u0441\u044c \u0432 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u0414\u043b\u044f \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>defineVirtualDevice<\/code>.\u00a0<\/p>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0435\u0440\u0432\u0438\u0441 wb-rules \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0442\u043e\u043f\u0438\u043a\u0438, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c:<br \/><code>\/devices\/\u0438\u043c\u044f_\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\/controls\/\u0438\u043c\u044f_\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430<\/code><\/p>\n<p>\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u044f \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0443 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u0410 \u0432\u043e\u0442 \u0441\u0438\u043d\u043e\u043d\u0438\u043c\u044b \u0434\u043b\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u044b \u0438 \u043b\u0435\u0433\u043a\u043e \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0442\u0441\u044f;<\/p>\n<\/li>\n<li>\n<p>\u044d\u0442\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u0441\u044f, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043c\u0435\u043d\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (\u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u0438\u0441\u043f\u0440\u0430\u0432\u043d\u043e\u0441\u0442\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440).<\/p>\n<\/li>\n<\/ul>\n<h3>\u0421\u043e\u0431\u044b\u0442\u0438\u044f<\/h3>\n<p>\u0412 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438 \u043d\u0430\u043c \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u0435\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e: \u043f\u043e\u0449\u0443\u043f\u0430\u043b \u0432\u043e\u0434\u0443 \u2014 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u043b \u0440\u0443\u043a\u043e\u044f\u0442\u043a\u0443 \u043a\u0440\u0430\u043d\u0430 \u2014 \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u043b \u2014 \u043f\u043e\u0449\u0443\u043f\u0430\u043b \u0432\u043e\u0434\u0443. \u041c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u0438 \u043c\u0435\u0436\u0434\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c\u0438 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e. \u0414\u0432\u0438\u0436\u043e\u043a \u043f\u0440\u0430\u0432\u0438\u043b <code>wb-rules<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0442\u0430\u043a, \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c\u0438.\u00a0<\/p>\n<p>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0442\u043e\u043f\u0438\u043a\u0430 MQTT, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c. \u0414\u043b\u044f \u043d\u0430\u0441 \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0432\u043e\u0437\u0434\u0443\u0445\u0430 \u0438 \u0432\u043e\u0434\u044b, \u043b\u044e\u0431\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0432\u0445\u043e\u0434\u043e\u0432 \u0438 \u0432\u044b\u0445\u043e\u0434\u043e\u0432. \u0418 \u0432\u0441\u0435 \u044d\u0442\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e. \u0410 \u0435\u0441\u043b\u0438 \u0442\u043e\u0447\u043d\u0435\u0435, \u0442\u043e \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442: <code>wb-rules<\/code> \u043f\u043e\u0434\u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u0435 \u0442\u043e\u043f\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u0445, \u0438 \u043f\u0440\u0438 \u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430\u0448\u0430 \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0437\u0430\u0441\u043b\u043e\u043d\u043a\u0438, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u0443\u0436\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0430.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c\u0438 \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>whenChanged<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043f\u0440\u0438 \u043b\u044e\u0431\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0442\u043e\u043f\u0438\u043a\u0430 (\u0438\u043b\u0438 \u0442\u043e\u043f\u0438\u043a\u043e\u0432). \u0415\u0441\u0442\u044c \u0435\u0449\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>when<\/code> \u0438 <code>asSoonAs<\/code>, \u043d\u043e \u043c\u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u043b\u043e <code>whenChanged<\/code>.<\/p>\n<p>\u0415\u0449\u0435 \u043e\u0434\u043d\u0438\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u0430\u0439\u043c\u0435\u0440\u044b. \u042f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0443 <code>setTimeout<\/code> \/ <code>clearTimeout<\/code>. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>setTimeout<\/code> \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u0441\u043f\u0443\u0441\u0442\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>clearTimeout<\/code> \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u044d\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0435\u0449\u0435 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b.<\/p>\n<h3>\u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430<\/h3>\n<p>\u041e\u0431\u0449\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b wb-rules \u0442\u0430\u043a\u043e\u0432\u0430:<\/p>\n<ul>\n<li>\n<p>\u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 wb-rules (\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u0435\u0441\u044c \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043d\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 <code>whenChanged<\/code> \u0438 <code>setTimeout<\/code> (\u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044f \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b, \u043d\u043e \u0442\u0430\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0442\u043e\u0442 \u0436\u0435);<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 <code>whenChanged<\/code> \u0438 <code>setTimeout<\/code>, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0438 \u0438\u0445 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432 (\u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0435 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e).<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0443 wb-rules \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430 \u0444\u0430\u0439\u043b\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u0435\u043d\u0443\u0435\u0442\u0441\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u043c. \u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u044f \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043b \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432\u043e \u0432\u0441\u0435\u0445 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u0445, \u0438 \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u044c\u0441\u044f \u043e \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0438 \u0438\u043c\u0435\u043d \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u043c\u0438.\u00a0<\/p>\n<p>\u042f \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043b \u043a\u043e\u0434 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u043c\u0438 (\u043d\u0435 \u043f\u0443\u0442\u0430\u0442\u044c \u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c \u2014 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c). \u042d\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>sensorController (\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0434\u0430\u0442\u0447\u0438\u043a\u0430 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b);<\/p>\n<\/li>\n<li>\n<p>flapController (\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u0434\u0443\u0448\u043d\u043e\u0439 \u0437\u0430\u0441\u043b\u043e\u043d\u043a\u043e\u0439);<\/p>\n<\/li>\n<li>\n<p>fanController (\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c);<\/p>\n<\/li>\n<li>\n<p>heaterController (\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0430\u043b\u043e\u0440\u0438\u0444\u0435\u0440\u043e\u043c);<\/p>\n<\/li>\n<li>\n<p>safetyController (\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438);<\/p>\n<\/li>\n<li>\n<p>mainController (\u0432\u0435\u0440\u0445\u043e\u0432\u043d\u044b\u0439 \u0430\u0440\u0431\u0438\u0442\u0440);<\/p>\n<\/li>\n<li>\n<p>logger (\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432).<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0441\u043e\u0437\u0434\u0430\u043b \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u0432 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u0432\u0438\u0434\u0435\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438.<\/p>\n<h4>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h4>\n<p>\u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u043e\u0435\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u2014 \u0442\u0435 \u0441\u0430\u043c\u044b\u0435 \u0441\u0438\u043d\u043e\u043d\u0438\u043c\u044b, \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u044e\u0449\u0438\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430. \u042f \u0434\u043b\u044f \u043d\u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u043b \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c <code>topics<\/code>:<\/p>\n<pre><code class=\"javascript\">var topics = {   AI_T_AIR: 'wb-w1\/28-00000978ba32',   AI_T_WATER: 'wb-w1\/28-000009795bc2',   DI_NOT_FIRE: 'wb-mr6cv3_111\/Input 0',   DI_PS_FILTER: 'wb-mr6cv3_111\/Input 1',   DI_PS_FAN: 'wb-mr6cv3_111\/Input 2',   DI_OPEN: 'wb-mr6cv3_111\/Input 3',   DI_CLOSED: 'wb-mr6cv3_111\/Input 4',   DI_TS_FAN: 'wb-mr6cv3_111\/Input 5',   DI_HS: 'wb-mr6cv3_111\/Input 6',   DO_OPEN: 'wb-mr6cv3_111\/K1',   DO_PUMP: 'wb-mr6cv3_111\/K2',   DO_MORE: 'wb-mr6cv3_111\/K3',   DO_LESS: 'wb-mr6cv3_111\/K4',   DO_FAN: 'wb-mr6cv3_111\/K5', };<\/code><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0449\u0435:<br \/><code>var AI_T_AIR = 'wb-w1\/28-00000978ba32';<br \/><\/code>\u041d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 topics \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0435\u0435.  <\/p>\n<p>\u041f\u0440\u0438 \u0437\u0430\u043c\u0435\u043d\u0435 \u0434\u0430\u0442\u0447\u0438\u043a\u0430 \u043b\u0438\u0431\u043e \u0440\u0435\u043b\u0435\u0439\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u043c\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u043d\u0435\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u044d\u0442\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438.  <\/p>\n<h4>sensorController<\/h4>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440. \u041e\u043d \u043c\u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 (\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e\u0441\u0442\u044c) \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043e\u0442 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b.\u00a0<\/p>\n<p>\u0412\u043e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c. \u041c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b wb-rules: \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u0430\u043a \u0447\u0438\u0442\u0430\u0442\u044c \u0414\u0420\u0410\u041a\u041e\u041d-\u0441\u0445\u0435\u043c\u044b<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043b\u0438\u043d\u0438\u0438 &#8212; \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 (\u0432\u0435\u0442\u043a\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430). \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437.\u00a0\u00a0<\/p>\n<p>\u0422\u0430\u043a\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 (\u044d\u0442\u043e\u0442 &#8212; \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 init, \u0442.\u0435. \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0442\u0430\u0440\u0442\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 wb-rules):<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bda\/8e8\/f50\/bda8e8f5003c84dd84dca8831a533d1d.png\" width=\"172\" height=\"71\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bda\/8e8\/f50\/bda8e8f5003c84dd84dca8831a533d1d.png\"\/><\/figure>\n<p>\u0417\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043d\u0438\u0436\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u0432 \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/be5\/5c0\/251\/be55c02514164995c79476b5cef80493.png\" width=\"174\" height=\"71\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/be5\/5c0\/251\/be55c02514164995c79476b5cef80493.png\"\/><\/figure>\n<p>\u041f\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c \u044f\u0437\u044b\u043a\u0430 \u0414\u0440\u0430\u043a\u043e\u043d \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0432\u0435\u0434\u0435\u0442 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0438\u043b\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438 &#8212; \u043e\u0431\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u0443\u0434\u0443\u0442 \u0441 \u0437\u0430\u043a\u0440\u0430\u0448\u0435\u043d\u043d\u044b\u043c \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u043c:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5c7\/836\/949\/5c7836949394b9aff29107f0c6bbe05c.png\" width=\"256\" height=\"71\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5c7\/836\/949\/5c7836949394b9aff29107f0c6bbe05c.png\"\/><\/figure>\n<p>\u041d\u0430\u0445\u043e\u0434\u044f\u0441\u044c \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 (receive) \u0441\u0438\u0433\u043d\u0430\u043b\u044b &#8212; \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a9e\/a0d\/050\/a9ea0d050e94a95a975add03225e9583.png\" width=\"485\" height=\"156\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a9e\/a0d\/050\/a9ea0d050e94a95a975add03225e9583.png\"\/><\/figure>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0434\u0432\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f: \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 error \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u0442\u0447\u0438\u043a\u0430. \u0412\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u044d\u0442\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f.  <\/p>\n<p>\u0421\u043e\u0431\u044b\u0442\u0438\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u043b\u044e\u0431\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435, \u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0422\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/97e\/6fb\/008\/97e6fb008a6f4bd75a83c39163e510d6.png\" width=\"149\" height=\"71\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/97e\/6fb\/008\/97e6fb008a6f4bd75a83c39163e510d6.png\"\/><\/figure>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043d\u0430\u043c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438\u0437\u0432\u043d\u0435:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dbc\/4bd\/1d3\/dbc4bd1d307c0c978aaf2930d3886f0a.png\" width=\"174\" height=\"74\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dbc\/4bd\/1d3\/dbc4bd1d307c0c978aaf2930d3886f0a.png\"\/><\/figure>\n<p>\u0410 \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u044b\u0434\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043c\u0438\u0440:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/45e\/166\/2ba\/45e1662ba9c208eb6d61735021c29bce.png\" width=\"257\" height=\"84\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/45e\/166\/2ba\/45e1662ba9c208eb6d61735021c29bce.png\"\/><\/figure>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043c\u044b \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440 \u043d\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0442\u0441\u0447\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e8c\/254\/fae\/e8c254faee34817917b52bf48f6e3252.png\" width=\"178\" height=\"54\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e8c\/254\/fae\/e8c254faee34817917b52bf48f6e3252.png\"\/><\/figure>\n<p>\u0417\u0434\u0435\u0441\u044c \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c (\u043e\u0442\u043c\u0435\u043d\u044f\u0435\u043c):<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/96f\/2d2\/b1d\/96f2d2b1d18a1c5a5a589dd885a520c3.png\" width=\"169\" height=\"51\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/96f\/2d2\/b1d\/96f2d2b1d18a1c5a5a589dd885a520c3.png\"\/><\/figure>\n<p>\u0410 \u0437\u0434\u0435\u0441\u044c \u0442\u0430\u0439\u043c\u0435\u0440 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0442\u0441\u0447\u0435\u0442 \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/572\/449\/008\/572449008b216da8f14917641700fc7d.png\" width=\"151\" height=\"69\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/572\/449\/008\/572449008b216da8f14917641700fc7d.png\"\/><\/figure>\n<\/p>\n<\/div>\n<\/details>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e29\/63b\/b9f\/e2963bb9fc40f6fd53c7c78f0a5f25d2.png\" width=\"1420\" height=\"1600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e29\/63b\/b9f\/e2963bb9fc40f6fd53c7c78f0a5f25d2.png\"\/><\/figure>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043d\u0438 \u043e\u0442 \u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u2014 \u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0434\u0430\u0447\u0438 \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u0434\u043e \u0435\u0433\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 <code>wb-rules<\/code> \u044f \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u044e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 <code>minSensorValue<\/code> \u0438 <code>maxSensorValue<\/code>, \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0438\u0445 \u043e\u0442 \u0434\u0430\u0442\u0447\u0438\u043a\u0430. \u042d\u0442\u0438 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u044f \u0445\u0440\u0430\u043d\u044e \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0434\u0435, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u043b\u0438\u0431\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0433 \u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c, \u043d\u0435 \u0432\u043b\u0435\u0437\u0430\u044f \u0432 \u043a\u043e\u0434.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0436\u0434\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u0414\u043b\u044f \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 1-Wire \u0438\u0445 \u0434\u0432\u0430: \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0438 \u043f\u0440\u0438\u0437\u043d\u0430\u043a \u043e\u0448\u0438\u0431\u043a\u0438 <code>#error<\/code> (\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u043c).\u00a0<\/p>\n<p>\u041f\u0440\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0441\u0440\u0430\u0437\u0443 \u0441\u0447\u0438\u0442\u0430\u044e \u0434\u0430\u0442\u0447\u0438\u043a \u043d\u0435\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u044b\u043c. \u0415\u0441\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u043d\u0435\u0442 \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u043e\u0442 \u0434\u0430\u0442\u0447\u0438\u043a\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0445 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445. \u0415\u0441\u043b\u0438 \u0438 \u0442\u0443\u0442 \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e &#8212; \u0441\u0447\u0438\u0442\u0430\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u044b\u043c \u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u044e <code>value<\/code> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u043e\u0442 \u0434\u0430\u0442\u0447\u0438\u043a\u0430, \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u043d\u043e\u0435 \u0434\u043e 1 \u0437\u043d\u0430\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 (\u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435 \u044f \u0440\u0430\u0437\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u0441\u0442\u0430\u043b, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u0441\u043b\u043e\u0432\u0430\u043c\u0438).<\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0430\u0441 \u0434\u0432\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0434\u0430\u0442\u0447\u0438\u043a\u0430, \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434. \u0412\u043e\u0442 \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f:<\/p>\n<pre><code class=\"javascript\">function makeSensorController(name, target, minSensorValue, maxSensorValue) {   defineVirtualDevice(name, {     title: 'sensorController ' + name,     cells: {       value: {         type: 'value',         units: 'deg C',         value: null,         readonly: true,       },       valid: {         type: 'switch',         value: false,         readonly: true,       },     }   });    defineRule({     whenChanged: [target, target + '#error', ],     then: function (newValue, devName, cellName) {       var valid = true;       if (typeof(dev[target + '#error']) !== 'undefined') {         valid = false;       }       if (dev[target] == undefined || dev[target] == null) {         valid = false;       }       if (dev[target] > maxSensorValue) {         valid = false;       }       if (dev[target] &lt; minSensorValue) {         valid = false;       }       dev[name]['valid'] = valid;       if (valid) {         dev[name]['value'] = Number(dev[target].toFixed(1));       }     }   }); }<\/code><\/pre>\n<p>\u0421\u0430\u043c\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438:  <\/p>\n<pre><code>makeSensorController('ai_t_air', topics.AI_T_AIR, 0, 50); makeSensorController('ai_t_water', topics.AI_T_WATER, 0, 100);<\/code><\/pre>\n<p>\u041d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u044d\u0442\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f6c\/cb1\/0f8\/f6ccb10f8e91f4cfc85d29e11fb081f2.png\" width=\"787\" height=\"127\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f6c\/cb1\/0f8\/f6ccb10f8e91f4cfc85d29e11fb081f2.png\"\/><\/figure>\n<p>\u0412\u0438\u0434\u043d\u044b \u0438 \u0441\u0430\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0438 \u0438\u0445 \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u044c.<\/p>\n<h4>flapController<\/h4>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043e\u0437\u0434\u0443\u0448\u043d\u043e\u0439 \u0437\u0430\u0441\u043b\u043e\u043d\u043a\u043e\u0439. \u041e\u043d \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043d\u0446\u0435\u0432\u044b\u0435 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u0438 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0437\u0430\u0441\u043b\u043e\u043d\u043a\u0438 <code>di_open<\/code> \u0438 <code>di_close<\/code>. \u0410 \u0442\u0430\u043a\u0436\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0435\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0434\u0430\u0435\u0442 \u043f\u0438\u0442\u0430\u043d\u0438\u0435 \u043d\u0430 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043f\u0440\u0438\u0432\u043e\u0434 \u0437\u0430\u0441\u043b\u043e\u043d\u043a\u0438 \u0434\u043b\u044f \u0435\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f <code>do_open<\/code>. \u0417\u0430\u0441\u043b\u043e\u043d\u043a\u0430 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043d\u043e\u0439 \u043f\u0440\u0443\u0436\u0438\u043d\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u043d\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d.\u00a0<\/p>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443 \u043c\u043e\u0436\u043d\u043e \u0434\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 <code>enable = true<\/code>. \u0415\u0441\u043b\u0438 <code>enable = false<\/code> \u2014 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435.<\/p>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9cf\/4a2\/680\/9cf4a26801a20d622c2d62bfa4e7b9ec.png\" width=\"3580\" height=\"1440\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9cf\/4a2\/680\/9cf4a26801a20d622c2d62bfa4e7b9ec.png\"\/><\/figure>\n<p>\u0412\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: <code>open<\/code>, <code>close<\/code>, <code>moving<\/code> \u0438 <code>fault<\/code>.<\/p>\n<p>\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f <code>open<\/code> \u0438 <code>close<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u043a\u043e\u043d\u0446\u0435\u0432\u044b\u043c \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044f\u043c.\u00a0<\/p>\n<p>\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>moving<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0430\u0437\u043e\u043c\u043a\u043d\u0443\u0442\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u044d\u0442\u0438\u0445 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u0435\u0439. \u0412 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>moving<\/code> \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0445\u043e\u0434\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0430 (\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043f\u0430\u0441\u043f\u043e\u0440\u0442\u0435 \u043d\u0430 \u043f\u0440\u0438\u0432\u043e\u0434 \u0437\u0430\u0441\u043b\u043e\u043d\u043a\u0438).\u00a0<\/p>\n<p>\u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u043e \u2014 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>fault<\/code> (\u0437\u0430\u0441\u043b\u043e\u043d\u043a\u0430 \u0437\u0430\u0441\u0442\u0440\u044f\u043b\u0430 \u0432 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u043c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438). \u0422\u0430\u043a\u0436\u0435 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>fault<\/code> \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442, \u0435\u0441\u043b\u0438 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>close<\/code> \u0440\u0430\u0437\u043c\u044b\u043a\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c <code>di_close<\/code>, \u043b\u0438\u0431\u043e \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>open<\/code> \u0440\u0430\u0437\u043c\u044b\u043a\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c <code>di_open<\/code>. \u042d\u0442\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u043f\u0440\u0438\u0432\u043e\u0434\u043e\u043c \u0437\u0430\u0441\u043b\u043e\u043d\u043a\u0438, \u043b\u0438\u0431\u043e \u0441 \u043a\u043e\u043d\u0446\u0435\u0432\u044b\u043c\u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044f\u043c\u0438, \u043b\u0438\u0431\u043e \u0441 \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u0430\u043c\u0438.<\/p>\n<p>\u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>fault<\/code> \u0440\u0435\u043b\u0435 <code>do_open<\/code> \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0438 \u0437\u0430\u0441\u043b\u043e\u043d\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c \u043f\u0440\u0443\u0436\u0438\u043d\u044b. \u0412 \u044d\u0442\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043d\u0435 \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442 \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 <code>di_open<\/code> \u0438 <code>di_close<\/code>.\u00a0<\/p>\n<p>\u0414\u043b\u044f \u0441\u0431\u0440\u043e\u0441\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f <code>fault<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c \u00ab\u041f\u0443\u0441\u043a\/\u0421\u0442\u043e\u043f\u00bb <code>di_hs<\/code>. \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u0440\u043e\u0441\u0430 <code>di_close<\/code> \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u043c (\u0437\u0430\u0441\u043b\u043e\u043d\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0430) \u2014 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>close<\/code>. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u2014 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0432 <code>fault<\/code>.\u00a0<\/p>\n<p>\u041a\u043e\u0434, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u0434\u0430\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c.<br \/>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c:<\/p>\n<pre><code class=\"javascript\">var idFlapTimer = null; \/\/\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0437\u0430\u0441\u043b\u043e\u043d\u043a\u0438 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043c var FLAP_TIMEOUT_S = 30;  \/\/\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0437\u0430\u0441\u043b\u043e\u043d\u043a\u0438, \u0441<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0430\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440:<\/p>\n<pre><code class=\"javascript\">defineVirtualDevice('flapController', {   title: 'Flap controller',   cells: {     enable: {       type: 'switch',       value: false,       readonly: true     },     state: {       type: 'text', \/\/open, close, moving, fault       value: 'close',       readonly: true     }   } });<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f, \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0430\u044f \u0442\u0430\u0439\u043c\u0435\u0440 \u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043f\u0440\u0438 \u0435\u0433\u043e \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0438 (\u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u0432\u043e\u0434 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>fault<\/code>):<\/p>\n<pre><code class=\"javascript\">function startFlapTimer() {   return setTimeout(function () {     dev[topics.DO_OPEN] = false;     dev['flapController\/state'] = 'fault';   }, FLAP_TIMEOUT_S * 1000); }<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b enable (\u0437\u0434\u0435\u0441\u044c newValue \u2014 \u044d\u0442\u043e \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0432\u0448\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c true \u0438\u043b\u0438 false):<\/p>\n<pre><code class=\"javascript\">defineRule('flapControllerEnableTrigger', {   whenChanged: 'flapController\/enable',   then: function (newValue, devName, cellName) {     switch (dev['flapController\/state']) {     case 'close':       if (newValue) {         dev[topics.DO_OPEN] = true;         idFlapTimer = startFlapTimer();         dev['flapController\/state'] = 'moving';       }       break;     case 'open':       if (!newValue) {         dev[topics.DO_OPEN] = false;         idFlapTimer = startFlapTimer();         dev['flapController\/state'] = 'moving';       }       break;     }   } });<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0446\u0435\u0432\u043e\u0433\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044f \u00ab\u0417\u0430\u043a\u0440\u044b\u0442\u0430\u00bb (newValue \u2014 \u0435\u0433\u043e \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435):<\/p>\n<pre><code class=\"javascript\">defineRule('flapControllerSwClosedTrigger', {   whenChanged: topics.DI_CLOSED,   then: function (newValue, devName, cellName) {     switch (dev['flapController\/state']) {     case 'close':       if (!newValue) {         dev['flapController\/state'] = 'fault';       }       break;     case 'moving':       if (newValue) {         clearTimeout(idFlapTimer);         dev['flapController\/state'] = 'close';       }       break;     case 'fault':       if (!dev[topics.DI_HS] &amp;&amp; newValue) {         dev['flapController\/state'] = 'close';       }       break;     }   } });<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0446\u0435\u0432\u043e\u0433\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044f \u00ab\u041e\u0442\u043a\u0440\u044b\u0442\u0430\u00bb:<\/p>\n<pre><code class=\"javascript\">defineRule('flapControllerSwOpenTrigger', {   whenChanged: topics.DI_OPEN,   then: function (newValue, devName, cellName) {     switch (dev['flapController\/state']) {     case 'open':       if (!newValue) {         dev[topics.DO_OPEN] = false;         dev['flapController\/state'] = 'fault';       }       break;     case 'moving':       if (newValue) {         clearTimeout(idFlapTimer);         dev['flapController\/state'] = 'open';       }       break;     }   } });<\/code><\/pre>\n<p>\u041d\u0443 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0440\u0443\u0447\u043d\u043e\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432\u0435\u043d\u0442. \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u2014 \u0441\u0431\u0440\u043e\u0441\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 fault, \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435:<\/p>\n<pre><code class=\"javascript\">defineRule('flapControllerHsTrigger', {   whenChanged: topics.DI_HS,   then: function (newValue, devName, cellName) {     switch (dev['flapController\/state']) {     case 'fault':       if (!newValue &amp;&amp; dev[topics.DI_CLOSED]) {         dev['flapController\/state'] = 'close';       }       break;     }   } });<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>case<\/code> \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u2014 \u044f \u0435\u0433\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0412 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ebc\/fee\/0b2\/ebcfee0b25df879a7a1fb2370467077f.png\" width=\"385\" height=\"123\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ebc\/fee\/0b2\/ebcfee0b25df879a7a1fb2370467077f.png\"\/><\/figure>\n<h4>fanController<\/h4>\n<p>\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440\u0430. \u041a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u0440\u043c\u043e\u043a\u043e\u043d\u0442\u0430\u043a\u0442\u044b \u043e\u0431\u043c\u043e\u0442\u043a\u0438 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f <code>di_ts_fan<\/code> \u0438 \u0440\u0435\u043b\u0435 \u043f\u0435\u0440\u0435\u043f\u0430\u0434\u0430 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f <code>di_ps_fan<\/code>.   <\/p>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1a7\/cf8\/0cc\/1a7cf80ccdf6ddfdc2f4bc07557215d3.png\" width=\"4860\" height=\"1340\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1a7\/cf8\/0cc\/1a7cf80ccdf6ddfdc2f4bc07557215d3.png\"\/><\/figure>\n<p>\u041c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u0445 <code>stop<\/code>, <code>run<\/code> (\u0432\u043a\u043b\u044e\u0447\u0435\u043d, \u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0430\u0434\u0430 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0435\u0449\u0435 \u043d\u0435\u0442), <code>work<\/code> \u0438 <code>fault<\/code>. \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>enable<\/code>.\u00a0<\/p>\n<p>\u0412 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>fault<\/code> \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043f\u0440\u0438:<\/p>\n<ul>\n<li>\n<p>\u0440\u0430\u0437\u043c\u044b\u043a\u0430\u043d\u0438\u0438 \u0442\u0435\u0440\u043c\u043e\u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432 (\u043f\u0435\u0440\u0435\u0433\u0440\u0435\u0432 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f);<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 <code>run<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0437\u043c\u044b\u043a\u0430\u043d\u0438\u0438 \u0440\u0435\u043b\u0435 \u043f\u0435\u0440\u0435\u043f\u0430\u0434\u0430 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 <code>work<\/code> (\u0444\u0438\u043b\u044c\u0442\u0440 \u0437\u0430\u0431\u0438\u043b\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440);<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0440\u0435\u043b\u0435 \u043f\u0435\u0440\u0435\u043f\u0430\u0434\u0430 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 <code>stop<\/code> (\u043d\u0435\u0438\u0441\u043f\u0440\u0430\u0432\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043b\u0435 \u0438\u043b\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u043e\u0434\u043e\u0432).<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u0441\u0431\u0440\u043e\u0441\u0430 \u0440\u0435\u0436\u0438\u043c\u0430 <code>fault<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u0436\u0430\u0442\u044c \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c \u00ab\u041f\u0443\u0441\u043a\/\u0421\u0442\u043e\u043f\u00bb.<\/p>\n<p>\u041a\u043e\u0434 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0435\u0433\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443.<\/p>\n<details class=\"spoiler\">\n<summary>fanController<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"javascript\">var idFanTimer = null; var FAN_TIMEOUT_S = 10; \/\/\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 run, \u0441  function startFanTimer() {   return setTimeout(function () {     dev[topics.DO_FAN] = false;     dev['fanController\/state'] = 'fault';   }, FAN_TIMEOUT_S * 1000); }  defineVirtualDevice('fanController', {   title: 'Fan controller',   cells: {     enable: {       type: 'switch',       value: false,       readonly: true     },     state: { \/\/stop, run, work, fault       type: 'text',       value: 'stop',       readonly: true     }   } });  defineRule('fanControllerEnableTrigger', {   whenChanged: 'fanController\/enable',   then: function (newValue, devName, cellName) {     switch (dev['fanController\/state']) {     case 'stop':       if (newValue) {         dev[topics.DO_FAN] = true;         idFanTimer = startFanTimer();         dev['fanController\/state'] = 'run';       }       break;     case 'run':       if (!newValue) {         dev[topics.DO_FAN] = false;         dev['fanController\/state'] = 'stop';       }       break;     case 'work':       if (!newValue) {         dev[topics.DO_FAN] = false;         dev['fanController\/state'] = 'stop';       }       break;     }   } });  defineRule('fanControllerTsTrigger', {   whenChanged: topics.DI_TS_FAN,   then: function (newValue, devName, cellName) {     switch (dev['fanController\/state']) {     case 'stop':       if (!newValue) {         dev['fanController\/state'] = 'fault';       }       break;     case 'run':       if (!newValue) {         dev[topics.DO_FAN] = false;         dev['fanController\/state'] = 'fault';       }       break;     case 'work':       if (!newValue) {         dev[topics.DO_FAN] = false;         dev['fanController\/state'] = 'fault';       }       break;     case 'fault':       if (!dev[topics.DI_HS] &amp;&amp; newValue &amp;&amp; !dev[topics.DI_PS_FAN]) {         dev['fanController\/state'] = 'stop';       }       break;     }   } });  defineRule('fanControllerPsTrigger', {   whenChanged: topics.DI_PS_FAN,   then: function (newValue, devName, cellName) {     switch (dev['fanController\/state']) {     case 'stop':       if (newValue) {         dev['fanController\/state'] = 'fault';       }       break;     case 'run':       if (newValue) {         clearTimeout(idFanTimer);         dev['fanController\/state'] = 'work';       }       break;     case 'work':       if (!newValue) {         dev[topics.DO_FAN] = false;         dev['fanController\/state'] = 'fault';       }       break;     case 'fault':       if (!dev[topics.DI_HS] &amp;&amp; dev[topics.DI_TS_FAN] &amp;&amp; !newValue) {         dev['fanController\/state'] = 'stop';       }       break;     }   } });  defineRule('fanControllerHsTrigger', {   whenChanged: topics.DI_HS,   then: function (newValue, devName, cellName) {     switch (dev['fanController\/state']) {     case 'fault':       if (!newValue &amp;&amp; dev[topics.DI_TS_FAN] &amp;&amp; !dev[topics.DI_PS_FAN]) {         dev['fanController\/state'] = 'stop';       }       break;     }   } });<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/73c\/223\/e8b\/73c223e8b6cc5b9f88cd757c6f434812.png\" width=\"389\" height=\"125\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/73c\/223\/e8b\/73c223e8b6cc5b9f88cd757c6f434812.png\"\/><\/figure>\n<h4>heaterController<\/h4>\n<p>\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0433\u0440\u0435\u0432\u043e\u043c. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0443\u044e \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0443 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0432\u0435\u043d\u0442. \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044f \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043f\u0440\u0438\u0432\u043e\u0434\u043e\u043c \u0441\u043c\u0435\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0435\u043d\u0442\u0438\u043b\u044f. \u0422\u0430\u043a\u0436\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0441\u043e\u0441\u043e\u043c.<\/p>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f91\/208\/d07\/f91208d072d02117bba6a1f810c09d63.png\" width=\"5620\" height=\"1600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f91\/208\/d07\/f91208d072d02117bba6a1f810c09d63.png\"\/><\/figure>\n<p>\u041c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u0445 <code>safe<\/code> \u0438 <code>work<\/code>. \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0440\u0435\u0436\u0438\u043c\u0430\u043c\u0438 \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435 <code>enable<\/code>.\u00a0<\/p>\n<p>\u0412 \u0440\u0435\u0436\u0438\u043c\u0435 <code>safe<\/code> (\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439) \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u043b\u043e\u0440\u0438\u0444\u0435\u0440\u0430:<\/p>\n<ul>\n<li>\n<p>\u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043d\u0430\u0441\u043e\u0441;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u043c\u0435\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u0435\u043d\u0442\u0438\u043b\u044c.\u00a0\u00a0<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u0440\u0435\u0436\u0438\u043c\u0435 <code>work<\/code> \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u041f\u0418\u0414 \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u0435\u0445\u0442\u043e\u0447\u0435\u0447\u043d\u044b\u043c \u043f\u0440\u0438\u0432\u043e\u0434\u043e\u043c \u0441\u043c\u0435\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0435\u043d\u0442\u0438\u043b\u044f, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044f \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u044b \u00ab\u0431\u043e\u043b\u044c\u0448\u0435\u00bb \u0438\u043b\u0438 \u00ab\u043c\u0435\u043d\u044c\u0448\u0435\u00bb \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0439 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0445 \u041f\u0418\u0414 \u0440\u0435\u0433\u0443\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0430\u0445 \u0421\u0435\u0442\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u2014 \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u043d\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442. \u041e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0445 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0445 \u041f\u0418\u0414 \u0440\u0435\u0433\u0443\u043b\u044f\u0442\u043e\u0440\u0430\u0445 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043f\u0440\u0438\u0432\u043e\u0434\u0430\u043c\u0438 \u0432\u0435\u043d\u0442\u0438\u043b\u0435\u0439 &#8212; \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430.\u00a0<\/p>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0443 \u0431\u0443\u0434\u0435\u043c \u0441 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c\u044e +\/- <code>ERROR<\/code>.\u00a0<\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0435 <code>PERIOD_S<\/code> \u0441\u0435\u043a\u0443\u043d\u0434 (\u0448\u0430\u0433 \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f) \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u043d\u0435 \u0432\u044b\u0448\u043b\u0430 \u043b\u0438 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 <code>ai_t_air<\/code> \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\u00a0 <code>SETPOINT_T_AIR<\/code> +\/- <code>ERROR<\/code>. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0432\u044b\u0448\u043b\u0430 \u2014 \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0438\u0447\u0435\u0433\u043e.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b\u0448\u043b\u0430 \u2014 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0440\u0430\u0441\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u0435 <code>diff<\/code> \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435\u043c \u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c <code>delta<\/code>.<\/p>\n<p>\u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f <code>pulseTime<\/code>. \u0421\u043b\u0438\u0448\u043a\u043e\u043c \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u044b \u043f\u0440\u0438\u0432\u043e\u0434 \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u043e \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442. \u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u044b \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u044b \u043a\u043e\u0440\u043e\u0447\u0435 300 \u043c\u0441. \u0415\u0441\u043b\u0438 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u043a\u043e\u0440\u043e\u0447\u0435 \u2014 \u0438\u043c\u043f\u0443\u043b\u044c\u0441 \u043d\u0435 \u0432\u044b\u0434\u0430\u0435\u043c, \u0430 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0446\u0438\u043a\u043b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0415\u0441\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u043f\u044f\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 &#8212; \u043e\u043f\u044f\u0442\u044c \u0438\u043c\u043f\u0443\u043b\u044c\u0441 \u043d\u0435 \u0432\u044b\u0434\u0430\u0435\u043c, \u0430 \u0441\u0443\u043c\u043c\u0443 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c. \u0422\u0430\u043a \u0438 \u043d\u0430\u043a\u043e\u043f\u0438\u043c.\u00a0<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u043e\u043c\u043d\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0437\u043d\u0430\u043a\u0430, \u0447\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u2014 \u043e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u043e\u043c\u043d\u0435\u043d\u043d\u043e\u0435.\u00a0\u00a0<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0439 \u2014 \u0432\u044b\u0434\u0430\u0435\u043c \u0438\u043c\u043f\u0443\u043b\u044c\u0441 (\u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0440\u0435\u043b\u0435 \u043d\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f). \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e \u0437\u043d\u0430\u043a\u043e\u043c. \u0415\u0441\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 &#8212; \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0440\u0435\u043b\u0435 <code>do_more<\/code>. \u0415\u0441\u043b\u0438 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u2014 \u0440\u0435\u043b\u0435 <code>do_less<\/code>.<\/p>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u043e\u0434. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f:<\/p>\n<pre><code class=\"javascript\">var error = 0.5; \/\/\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0432\u043e\u0437\u0434\u0443\u0445\u0430 var idMoreTimer = null; \/\/\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0434\u043b\u044f \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430 \"\u0431\u043e\u043b\u044c\u0448\u0435\" var idLessTimer = null; \/\/\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0434\u043b\u044f \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430 \"\u043c\u0435\u043d\u044c\u0448\u0435\" var idPidTimer = null; \/\/\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u041f\u0418\u0414 \u0440\u0435\u0433\u0443\u043b\u044f\u0442\u043e\u0440\u0430 var SETPOINT_T_AIR = 22; \/\/\u0443\u0441\u0442\u0430\u0432\u043a\u0430 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0432\u043e\u0437\u0434\u0443\u0445\u0430 var pid = { \/\/\u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u041f\u0418\u0414 \u0440\u0435\u0433\u0443\u043b\u044f\u0442\u043e\u0440\u0430   K: 50, \/\/\u043e\u0431\u0449\u0438\u0439 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0443\u0441\u0438\u043b\u0435\u043d\u0438\u044f   TAU: 5, \/\/\u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u043f\u0440\u0438 \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0439, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a \u0440\u0435\u0437\u043a\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440   BORDER_MS: 300, \/\/\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u043c\u0441   PERIOD_S: 10 \/\/\u043f\u0435\u0440\u0438\u043e\u0434 \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0441 } var prevDiff = null; \/\/\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0440\u0430\u0441\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u0435 var leftover = null; \/\/\u0435\u0441\u043b\u0438 \u043f\u0440\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445 \u0434\u043b\u0438\u043d\u0430 \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 - \u043f\u0438\u0448\u0435\u043c \u0441\u044e\u0434\u0430<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0438\u043e\u0434 \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b. \u0414\u0440\u0430\u0439\u0432\u0435\u0440 wb-mqtt-w1 \u00ab\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\u00bb \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440 \u0440\u0430\u0437 \u0432 10 \u0441\u0435\u043a\u0443\u043d\u0434. \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0447\u0430\u0449\u0435 \u2014 \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/support.wirenboard.com\/t\/chastota-oprosa-datchikov-1-wire\/13515\"><u>\u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c<\/u><\/a> \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u0443\u044e \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c <code>PERIOD_S<\/code>. \u041d\u043e, \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0438\u043d\u0435\u0440\u0446\u0438\u043e\u043d\u043d\u043e\u0441\u0442\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u0434\u0430\u0442\u0447\u0438\u043a\u0430, \u0432\u0430\u043c \u0432\u0440\u044f\u0434 \u043b\u0438 \u044d\u0442\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f.<\/p>\n<p>\u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u041f\u0418\u0414 \u0440\u0435\u0433\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u043e\u0434 \u0432\u0430\u0448\u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443. \u041a\u0430\u043a? \u0415\u0441\u0442\u044c \u043a\u0443\u0447\u0430 \u0441\u0442\u0430\u0442\u0435\u0439 \u0432 \u0421\u0435\u0442\u0438 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043b\u0430\u0434\u043a\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u043c\u043d\u043e\u0439 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0443\u0442.\u00a0<\/p>\n<p>\u0421\u0430\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440:<\/p>\n<pre><code class=\"javascript\">defineVirtualDevice('heaterController', {   title: 'Heater controller',   cells: {     enable: {       type: 'switch',       value: false,     },     state: { \/\/work, safe       type: 'text',       value: 'safe',       readonly: true,     }   } });<\/code><\/pre>\n<p>\u041f\u0430\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u043e\u0432 \u00ab\u0411\u043e\u043b\u044c\u0448\u0435\u00bb \u0438 \u00ab\u041c\u0435\u043d\u044c\u0448\u0435\u00bb (\u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u043c \u0440\u0435\u043b\u0435):<\/p>\n<pre><code class=\"javascript\">function generateMoreImpulse(pulseTime_s) {   if (idMoreTimer) {     clearTimeout(idMoreTimer);     idMoreTimer = null;   } else {     dev[topics.DO_MORE] = true;   }   idMoreTimer = setTimeout(function() {     dev[topics.DO_MORE] = false;     idMoreTimer = null;   }, pulseTime_s * 1000); }  function generateLessImpulse(pulseTime_s) {   if (idLessTimer) {     clearTimeout(idLessTimer);     idLessTimer = null;   } else {     dev[topics.DO_LESS] = true;   }   idLessTimer = setTimeout(function() {     dev[topics.DO_LESS] = false;     idLessTimer = null;   }, pulseTime_s * 1000); }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430:<\/p>\n<pre><code class=\"javascript\">function calculatePulseTime() {   var diff = SETPOINT_T_AIR - dev[topics.AI_T_AIR]; \/\/\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0440\u0430\u0441\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u0435   var delta = diff - prevDiff; \/\/\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c\u0438 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f\u043c\u0438   var result = Math.round(2.5 * pid.K * (diff + pid.TAU * delta));   if (((result > 0) &amp;&amp; (leftover &lt; 0)) || ((result &lt; 0) &amp;&amp; (leftover > 0))) {     leftover = 0;   }   result = result + leftover;   \/\/ \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0440\u0430\u0437\u043d\u0438\u0446\u0443   prevDiff = diff;   leftover = 0;   \/\/ \u041f\u0440\u0438 \u0434\u043b\u0438\u043d\u0435 \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 - \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u043d\u043e \u043d\u0435 \u0432\u044b\u0434\u0430\u0435\u043c   if (Math.abs(result) &lt; pid.BORDER_MS) {     leftover = result;     result = 0;   }   return result; }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u043f\u043e \u0442\u0430\u0439\u043c\u0435\u0440\u0443 \u0441 \u043f\u0435\u0440\u0438\u043e\u0434\u043e\u043c \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"javascript\">function run() {   \/\/\u0435\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0430\u044f T \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0443\u0441\u0442\u0430\u0432\u043a\u0438 +\/- \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c - \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c   if (Math.abs(dev[topics.AI_T_AIR] - SETPOINT_T_AIR) &lt; error) {     return;   }    var out = calculatePulseTime();   dev[topics.DO_MORE] = false;   dev[topics.DO_LESS] = false;   if (out &lt; 0) {     generateLessImpulse(Math.abs(out) \/ 1000);   }   if (out > 0) {     generateMoreImpulse(out \/ 1000);   } }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u0438, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0435 \u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0435 \u041f\u0418\u0414 \u0440\u0435\u0433\u0443\u043b\u044f\u0442\u043e\u0440:<\/p>\n<pre><code class=\"javascript\">function enablePid() {   if (idPidTimer == null) {     idPidTimer = setInterval(function() {       run();     }, pid.PERIOD_S * 1000);   }  }  function disablePid() {   if (idPidTimer != null) {     clearInterval(idPidTimer);     idPidTimer = null;   }  }<\/code><\/pre>\n<p>\u041d\u0443 \u0438 \u0441\u0430\u043c\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\/\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435:<\/p>\n<pre><code class=\"javascript\">defineRule('heaterControllerEnableTrigger', {   whenChanged: 'heaterController\/enable',   then: function (newValue, devName, cellName) {     switch (dev['heaterController\/state']) {     case 'safe':       if (newValue) {         dev['heaterController\/state'] = 'work';         enablePid();       }       break;     case 'work':       if (!newValue) {         dev[topics.DO_LESS] = false;         dev[topics.DO_MORE] = true;         dev[topics.DO_PUMP] = true;         dev['heaterController\/state'] = 'safe';         disablePid();       }       break;     }   } });<\/code><\/pre>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d0a\/bc8\/ffa\/d0abc8ffa15d7f61b5b6f49404b70072.png\" width=\"387\" height=\"125\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d0a\/bc8\/ffa\/d0abc8ffa15d7f61b5b6f49404b70072.png\"\/><\/figure>\n<h4>safetyController<\/h4>\n<p>\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u041e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441: \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u0438\u043b\u0438 \u043d\u0435\u0442.<\/p>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f0d\/393\/38a\/f0d39338a22474daabdb42cfeee866c1.png\" width=\"3400\" height=\"1640\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f0d\/393\/38a\/f0d39338a22474daabdb42cfeee866c1.png\"\/><\/figure>\n<p>\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 <code>valid<\/code> \u0443 <code>sensorController<\/code>, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>fault<\/code> \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u043c\u044b\u0445 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440 \u0438 \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u043f\u043e\u0436\u0430\u0440\u0435. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0445\u043e\u0434 <code>safe<\/code> \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.  <\/p>\n<p>\u0412 \u043a\u043e\u0434\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0445\u0438\u0442\u0440\u043e\u0433\u043e:<\/p>\n<details class=\"spoiler\">\n<summary>safetyController<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"javascript\">var T_AIR_MIN = 10; \/\/\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0430\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 var T_WATER_MIN = 20; \/\/\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0430\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0432\u043e\u0434\u044b \u0432 \"\u043e\u0431\u0440\u0430\u0442\u043a\u0435\"  defineVirtualDevice('safetyController', {   title: 'Safety controller',   cells: {     safe: {       type: 'switch',       value: false,       readonly: true     },   } });  function setSafetyControllerState() {   if (!dev['ai_t_air\/valid']) {     return false;   }   if (!dev['ai_t_water\/valid']) {     return false;   }   if (dev['ai_t_air\/value'] &lt; T_AIR_MIN) {     return false;   }   if (dev['ai_t_water\/value'] &lt; T_WATER_MIN) {     return false;   }   if (dev['flapController\/state'] == 'fault') {     return false;   }   if (dev['fanController\/state'] == 'fault') {     return false;   }   if (!dev[topics.DI_NOT_FIRE]) {     return false;   }   return true; }  defineRule('safetyControllerTriggers', {   whenChanged: ['ai_t_air\/valid',                  'ai_t_water\/valid',                  'ai_t_air\/value',                  'ai_t_water\/value',                  'flapController\/state',                  'fanController\/state',                  topics.DI_NOT_FIRE],   then: function (newValue, devName, cellName) {     dev['safetyController\/safe'] = setSafetyControllerState();   } });<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d53\/b24\/8ab\/d53b248ab7a0728bb91f74760f935ae1.png\" width=\"388\" height=\"114\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d53\/b24\/8ab\/d53b248ab7a0728bb91f74760f935ae1.png\"\/><\/figure>\n<h4>mainController<\/h4>\n<p>\u0412\u0435\u0440\u0445\u043e\u0432\u043d\u044b\u0439 \u0430\u0440\u0431\u0438\u0442\u0440, \u043a\u0430\u043a \u044f \u0435\u0433\u043e \u043d\u0430\u0437\u0432\u0430\u043b. \u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0441\u0435\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432 \u0446\u0435\u043b\u043e\u043c. <\/p>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/acb\/a9b\/a81\/acba9ba81438a2fae9e8737e24e90d6e.png\" width=\"6400\" height=\"1600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/acb\/a9b\/a81\/acba9ba81438a2fae9e8737e24e90d6e.png\"\/><\/figure>\n<p>\u0412\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>safe<\/code> (\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435), <code>warming<\/code> (\u043f\u0440\u043e\u0433\u0440\u0435\u0432 \u043a\u0430\u043b\u043e\u0440\u0438\u0444\u0435\u0440\u0430), <code>opening<\/code> (\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0441\u043b\u043e\u043d\u043a\u0438), <code>running<\/code> (\u0440\u0430\u0441\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440\u0430), <code>work<\/code> (\u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0440\u0435\u0436\u0438\u043c).<\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0431\u044b\u043b\u0430 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u044b \u043d\u0430\u0436\u0430\u043b\u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c \u041f\u0443\u0441\u043a\/\u0421\u0442\u043e\u043f \u0438 <code>safeController<\/code> \u0441\u0447\u0438\u0442\u0430\u043b, \u0447\u0442\u043e \u0432\u0441\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e. \u0412\u0441\u0435 \u0442\u0430\u043a? \u0422\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>warming<\/code> \u2014 \u0433\u0440\u0435\u0435\u043c \u043a\u0430\u043b\u043e\u0440\u0438\u0444\u0435\u0440.\u00a0<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043a\u0430\u043b\u043e\u0440\u0438\u0444\u0435\u0440 \u043f\u0440\u043e\u0433\u0440\u0435\u0442 (\u0438\u043b\u0438 \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0433\u0440\u0435\u0435\u0442\u0441\u044f) \u2014 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>opening<\/code> \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443 <code>flapController<\/code>. \u0410 \u0442\u043e\u0442 \u0443\u0436\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u0441\u043b\u043e\u043d\u043a\u0443 \u0438 \u0441\u043b\u0435\u0434\u0438\u0442 \u0437\u0430 \u0442\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u043b\u0430\u0441\u044c \u0438 \u043f\u043e\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439.\u00a0<\/p>\n<p>\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e <code>flapController<\/code> \u0441\u043e\u043e\u0431\u0449\u0438\u0442 \u043d\u0430\u043c, \u0447\u0442\u043e \u0437\u0430\u0441\u043b\u043e\u043d\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0430 \u2014 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>running<\/code> \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443 <code>fanController<\/code>. \u0422\u043e\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440 \u0438 \u0441\u043b\u0435\u0434\u0438\u0442 \u0437\u0430 \u0440\u0435\u043b\u0435 \u043f\u0435\u0440\u0435\u043f\u0430\u0434\u0430 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u043f\u0435\u0440\u0435\u043f\u0430\u0434 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0438 <code>fanController<\/code> \u043f\u0435\u0440\u0435\u0448\u0435\u043b \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>work<\/code>? \u0422\u043e\u0436\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>work<\/code> \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443 <code>heaterController<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0443 \u0432\u043e\u0437\u0434\u0443\u0445\u0430, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044f \u0441\u043c\u0435\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0432\u0435\u043d\u0442\u0438\u043b\u0435\u043c. \u0412 \u044d\u0442\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043e\u0441\u0442\u0430\u0435\u043c\u0441\u044f.<\/p>\n<p>\u0412 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 <code>safeController<\/code> \u043c\u043e\u0436\u0435\u0442 \u0440\u0435\u0448\u0438\u0442\u044c, \u0447\u0442\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u2014 \u0442\u043e\u0433\u0434\u0430 <code>mainController<\/code> \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0442\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u043c, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043d\u043e \u0435\u0441\u0442\u044c. \u0418 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0442\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u044d\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u043d\u0430\u0441\u043e\u0441 \u0432\u043a\u043b\u044e\u0447\u0435\u043d;<\/p>\n<\/li>\n<li>\n<p>\u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d;<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u0441\u043b\u043e\u043d\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0430:<\/p>\n<\/li>\n<li>\n<p>\u0432\u0435\u043d\u0442\u0438\u043b\u044c \u0432 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u00ab\u043e\u0442\u043a\u0440\u044b\u0442\u00bb.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0436\u0434\u0435\u043c \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u0445\u043e\u0437\u044f\u0438\u043d\u0430 \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438. \u041e\u043d \u0434\u043e\u043b\u0436\u0435\u043d:<\/p>\n<ul>\n<li>\n<p>\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>fault<\/code> \u0438\u043b\u0438 \u043d\u0435 <code>valid<\/code> \u2014 \u0442\u0435 \u0438 \u0432\u0438\u043d\u043e\u0432\u0430\u0442\u044b;<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u0432\u0441\u0435 \u043f\u043e\u0447\u0438\u043d\u0438\u0442\u044c;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u0436\u0430\u0442\u044c \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c \u00ab\u041f\u0443\u0441\u043a\/\u0421\u0442\u043e\u043f\u00bb \u0438 \u0441\u043d\u043e\u0432\u0430 \u0435\u0433\u043e \u043d\u0430\u0436\u0430\u0442\u044c.\u00a0<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 <code>safeController<\/code> \u0440\u0435\u0448\u0438\u0442, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0435 \u041e\u043a \u2014 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>warming<\/code> \u0438 \u043f\u043e \u043d\u043e\u0432\u043e\u0439&#8230;<\/p>\n<p>\u0412 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0445\u043e\u0437\u044f\u0438\u043d \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \u00ab\u041f\u0443\u0441\u043a\/\u0421\u0442\u043e\u043f\u00bb. \u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b: \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0435, \u043e\u0441\u0442\u0430\u0435\u043c\u0441\u044f \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438.<\/p>\n<p>\u041a\u043e\u0434 \u043d\u0438\u0447\u0443\u0442\u044c \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>mainController<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f:<\/p>\n<pre><code class=\"javascript\">\/\/\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0432\u043e\u0434\u044b \u0432 \"\u043e\u0431\u0440\u0430\u0442\u043a\u0435\", \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u0441\u0442\u0430\u0440\u0442 \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438  var T_WATER_START = 30;<\/code><\/pre>\n<p>\u0421\u0430\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440:<\/p>\n<pre><code class=\"javascript\">defineVirtualDevice('mainController', {   title: 'Main controller',   cells: {     state: { \/\/safe, warming, opening, running, work       type: 'text',       value: 'safe',       readonly: true     }   } });<\/code><\/pre>\n<p>\u0420\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u043c \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044f \u00ab\u041f\u0443\u0441\u043a\/\u0421\u0442\u043e\u043f\u00bb:<\/p>\n<pre><code class=\"javascript\">defineRule('mainControllerHsTrigger', {   whenChanged: topics.DI_HS,   then: function (newValue, devName, cellName) {     switch (dev['mainController\/state']) {     case 'safe':       if (newValue &amp;&amp; dev['safetyController\/safe']) {         dev['mainController\/state'] = 'warming';       }       break;     case 'warming':       if (!newValue) {         dev['mainController\/state'] = 'safe';         break;       }     case 'opening':       if (!newValue) {         dev['flapController\/enable'] = false;         dev['mainController\/state'] = 'safe';       }       break;     case 'running':       if (!newValue) {         dev['flapController\/enable'] = false;         dev['fanController\/enable'] = false;         dev['mainController\/state'] = 'safe';       }       break;     case 'work':       if (!newValue) {         dev['heaterController\/enable'] = false;         dev['flapController\/enable'] = false;         dev['fanController\/enable'] = false;         dev['mainController\/state'] = 'safe';       }       break;     }   } });<\/code><\/pre>\n<p>\u041d\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u043c \u0441\u0442\u0430\u0440\u0442 \u0432\u0435\u043d\u0442. \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u043f\u043e\u043a\u0430 \u043a\u0430\u043b\u043e\u0440\u0438\u0444\u0435\u0440 \u043d\u0435 \u043f\u0440\u043e\u0433\u0440\u0435\u0442:<\/p>\n<pre><code class=\"javascript\">defineRule('mainControllerAiTrigger', {   whenChanged: 'ai_t_water\/value',   then: function (newValue, devName, cellName) {     if (newValue &lt; T_WATER_START)       return;     switch (dev['mainController\/state']) {     case 'warming':       dev['flapController\/enable'] = true;       dev['mainController\/state'] = 'opening';       break;     }   } });<\/code><\/pre>\n<p>\u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432:<\/p>\n<pre><code class=\"javascript\">defineRule('mainControllerFlapTrigger', {   whenChanged: 'flapController\/state',   then: function (newValue, devName, cellName) {     if (newValue != 'open')       return;     switch (dev['mainController\/state']) {     case 'opening':       dev['fanController\/enable'] = true;       dev['mainController\/state'] = 'running';       break;     }   } });  defineRule('mainControllerSafeTrigger', {   whenChanged: 'safetyController\/safe',   then: function (newValue, devName, cellName) {     if (newValue)       return;     switch (dev['mainController\/state']) {     case 'safe':       if (dev[topics.DI_HS] &amp;&amp; newValue) {         dev['mainController\/state'] = 'warming';       }       dev['mainController\/state'] = 'safe';       break;     case 'warming':       dev['mainController\/state'] = 'safe';       break;     case 'opening':       dev['flapController\/enable'] = false;       dev['mainController\/state'] = 'safe';       break;     case 'running':       dev['flapController\/enable'] = false;       dev['fanController\/enable'] = false;       dev['mainController\/state'] = 'safe';       break;     case 'work':       dev['heaterController\/enable'] = false;       dev['flapController\/enable'] = false;       dev['fanController\/enable'] = false;       dev['mainController\/state'] = 'safe';       break;     }   } });  defineRule('mainControllerFanTrigger', {   whenChanged: 'fanController\/state',   then: function (newValue, devName, cellName) {     if (newValue != 'work')       return;     switch (dev['mainController\/state']) {     case 'running':       dev['heaterController\/enable'] = true;       dev['mainController\/state'] = 'work';       break;     }   } });<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u043d\u0435 \u0441\u043a\u0430\u0436\u0443 \u2014 \u0432\u0441\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f40\/5a4\/a90\/f405a4a908c545c4b29f204a75ffeaad.png\" width=\"390\" height=\"89\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f40\/5a4\/a90\/f405a4a908c545c4b29f204a75ffeaad.png\"\/><\/figure>\n<h4>logger<\/h4>\n<p>\u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0432 \u043e\u0442\u043b\u0430\u0434\u043a\u0435. \u041e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c\/\u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u0442\u043b\u0430\u0434\u043a\u0443.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/123\/5a4\/301\/1235a430124c24956d8bf389e11f7748.png\" width=\"387\" height=\"103\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/123\/5a4\/301\/1235a430124c24956d8bf389e11f7748.png\"\/><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043e\u043d \u0441\u043b\u0435\u0434\u0438\u0442 \u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u043d\u043e\u0432\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432 \u043e\u043a\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432 \u043b\u043e\u0433-\u0444\u0430\u0439\u043b \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0441\u043b\u0443\u0436\u0431\u044b \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:  <\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/86d\/17b\/817\/86d17b817c77f269d4d3c9dae4409449.png\" width=\"346\" height=\"195\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/86d\/17b\/817\/86d17b817c77f269d4d3c9dae4409449.png\"\/><\/figure>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u043a\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u0443\u044e \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043d\u0438\u0436\u043d\u0435\u043c \u0443\u0433\u043b\u0443 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0443:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/147\/34b\/c05\/14734bc053835f129e7af092e069f5e7.png\" width=\"53\" height=\"50\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/147\/34b\/c05\/14734bc053835f129e7af092e069f5e7.png\"\/><\/figure>\n<p>\u041a\u043e\u0434 \u0432\u043f\u043e\u043b\u043d\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u0435\u043d:<\/p>\n<details class=\"spoiler\">\n<summary>logger<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"javascript\">defineVirtualDevice('logger', {   title: 'Logger',   cells: {     enable: {       type: 'switch',       value: false,     }   } });  defineRule('changeControllersState', {   whenChanged: ['safetyController\/state',                  'flapController\/state',                  'fanController\/state',                  'heaterController\/state',                  'mainController\/state'],   then: function (newValue, devName, cellName) {     if (dev['logger\/enable']) {       log.info('[' + devName + '] state:' + newValue);     }   } });<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0439 JS \u043c\u043e\u0434\u0443\u043b\u044c<\/h3>\n<p>\u041f\u043e\u043a\u0430\u0436\u0443 \u0441\u0440\u0430\u0437\u0443, \u043a\u0430\u043a \u0441\u043a\u0440\u0438\u043f\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0439 JS \u043c\u043e\u0434\u0443\u043b\u044c. \u041d\u0443\u0436\u043d\u043e \u044d\u0442\u043e \u0434\u043b\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 &#8212; \u0432\u044b\u043d\u0435\u0441\u043b\u0438 \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u0434\u0430 \u0441 \u0447\u0435\u0442\u043a\u043e \u043e\u0447\u0435\u0440\u0447\u0435\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b, \u0443\u0431\u0440\u0430\u043b\u0438 \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043f\u043e\u0447\u043a\u0443, \u0438 \u043f\u043e \u043c\u0435\u0440\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a \u0441\u043a\u0440\u0438\u043f\u0442\u0443, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e. \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0432\u044b \u043e\u0442\u043b\u0430\u0434\u0438\u043b\u0438 \u043a\u043e\u0434 \u0438 \u0432\u0430\u043c \u0432\u0441\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f.<\/p>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 wb-rules \u0438\u0449\u0435\u0442 \u0432\u00a0 <code>\/etc\/wb-rules-modules<\/code>. \u0421\u044e\u0434\u0430 \u0435\u0433\u043e \u0438 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043c. \u041a\u0441\u0442\u0430\u0442\u0438, \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u043e\u043d \u043e\u0442\u0441\u044e\u0434\u0430 \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0434\u0435\u043d\u0435\u0442\u0441\u044f, \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0420\u0430\u0431\u043e\u0442\u0443 \u0441 \u043c\u043e\u0434\u0443\u043b\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439: \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 wb-rules \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0432 \u043d\u0435\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0443\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0430\u043c. \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0437\u0430\u0432\u0435\u0440\u043d\u0435\u043c \u0432\u0435\u0441\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043a\u043e\u0434 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>init<\/code>.<\/p>\n<details class=\"spoiler\">\n<summary>\/etc\/wb-rules-module\/ventilation2wb.js<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"javascript\">function init(topics) {   \/\/-------------------------------------------------------------------------------------------------------------------------   \/\/sensorController   function makeSensorController(title, name, target, minSensorValue, maxSensorValue) {     defineVirtualDevice(name, {       title: 'Sensor Controller ' + title,       cells: {         value: {           title: \"Temperature\",           type: 'value',           units: 'deg C',           value: null,           readonly: true,         },         valid: {           title: \"Valid Value\",           type: 'switch',           value: false,           readonly: true,         },       }     });      defineRule({       whenChanged: [target, target + '#error',],       then: function (newValue, devName, cellName) {         var valid = true;         if (typeof (dev[target + '#error']) !== 'undefined') {           valid = false;         }         if (dev[target] == undefined || dev[target] == null) {           valid = false;         }         if (dev[target] > maxSensorValue) {           valid = false;         }         if (dev[target] &lt; minSensorValue) {           valid = false;         }         dev[name]['valid'] = valid;         if (valid) {           dev[name]['value'] = Number(dev[target].toFixed(1));         }       }     });   }    makeSensorController('Air', 'ai_t_air', topics.AI_T_AIR, 0, 50);   makeSensorController('Water', 'ai_t_water', topics.AI_T_WATER, 0, 100);    \/\/-------------------------------------------------------------------------------------------------------------------------   \/\/safetyController   var T_AIR_MIN = 10; \/\/\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0430\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438   var T_WATER_MIN = 20; \/\/\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0430\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0432\u043e\u0434\u044b \u0432 \"\u043e\u0431\u0440\u0430\u0442\u043a\u0435\"    defineVirtualDevice('safetyController', {     title: 'Safety Controller',     cells: {       safe: {         title: \"Safe Mode\",         type: 'switch',         value: false,         readonly: true       },     }   });    function setSafetyControllerState() {     if (!dev['ai_t_air\/valid']) {       return false;     }     if (!dev['ai_t_water\/valid']) {       return false;     }     if (dev['ai_t_air\/value'] &lt; T_AIR_MIN) {       return false;     }     if (dev['ai_t_water\/value'] &lt; T_WATER_MIN) {       return false;     }     if (dev['flapController\/state'] == 'fault') {       return false;     }     if (dev['fanController\/state'] == 'fault') {       return false;     }     if (!dev[topics.DI_NOT_FIRE]) {       return false;     }     return true;   }    defineRule('safetyControllerTriggers', {     whenChanged: ['ai_t_air\/valid',       'ai_t_water\/valid',       'ai_t_air\/value',       'ai_t_water\/value',       'flapController\/state',       'fanController\/state',       topics.DI_NOT_FIRE],     then: function (newValue, devName, cellName) {       dev['safetyController\/safe'] = setSafetyControllerState();     }   });    \/\/-------------------------------------------------------------------------------------------------------------------------   \/\/flapController   var idFlapTimer = null;   var FLAP_TIMEOUT_S = 30;  \/\/\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0437\u0430\u0441\u043b\u043e\u043d\u043a\u0438, \u0441    defineVirtualDevice('flapController', {     title: 'Flap Controller',     cells: {       enable: {         title: \"Enable\",         type: 'switch',         value: false,         readonly: true       },       state: {         title: \"State\",         type: 'text', \/\/open, close, moving, fault         value: 'close',         readonly: true       }     }   });    function startFlapTimer() {     return setTimeout(function () {       dev[topics.DO_OPEN] = false;       dev['flapController\/state'] = 'fault';     }, FLAP_TIMEOUT_S * 1000);   }    defineRule('flapControllerEnableTrigger', {     whenChanged: 'flapController\/enable',     then: function (newValue, devName, cellName) {       switch (dev['flapController\/state']) {         case 'close':           if (newValue) {             dev[topics.DO_OPEN] = true;             idFlapTimer = startFlapTimer();             dev['flapController\/state'] = 'moving';           }           break;         case 'open':           if (!newValue) {             dev[topics.DO_OPEN] = false;             idFlapTimer = startFlapTimer();             dev['flapController\/state'] = 'moving';           }           break;       }     }   });    defineRule('flapControllerSwClosedTrigger', {     whenChanged: topics.DI_CLOSED,     then: function (newValue, devName, cellName) {       switch (dev['flapController\/state']) {         case 'close':           if (!newValue) {             dev['flapController\/state'] = 'fault';           }           break;         case 'moving':           if (newValue) {             clearTimeout(idFlapTimer);             dev['flapController\/state'] = 'close';           }           break;         case 'fault':           if (!dev[topics.DI_HS] &amp;&amp; newValue) {             dev['flapController\/state'] = 'close';           }           break;       }     }   });    defineRule('flapControllerSwOpenTrigger', {     whenChanged: topics.DI_OPEN,     then: function (newValue, devName, cellName) {       switch (dev['flapController\/state']) {         case 'open':           if (!newValue) {             dev[topics.DO_OPEN] = false;             dev['flapController\/state'] = 'fault';           }           break;         case 'moving':           if (newValue) {             clearTimeout(idFlapTimer);             dev['flapController\/state'] = 'open';           }           break;       }     }   });    defineRule('flapControllerHsTrigger', {     whenChanged: topics.DI_HS,     then: function (newValue, devName, cellName) {       switch (dev['flapController\/state']) {         case 'fault':           if (!newValue &amp;&amp; dev[topics.DI_CLOSED]) {             dev['flapController\/state'] = 'close';           }           break;       }     }   });    \/\/-------------------------------------------------------------------------------------------------------------------------   \/\/fanController   var idFanTimer = null;   var FAN_TIMEOUT_S = 10; \/\/\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 run, \u0441    function startFanTimer() {     return setTimeout(function () {       dev[topics.DO_FAN] = false;       dev['fanController\/state'] = 'fault';     }, FAN_TIMEOUT_S * 1000);   }    defineVirtualDevice('fanController', {     title: 'Fan Controller',     cells: {       enable: {         title: \"Enable\",         type: 'switch',         value: false,         readonly: true       },       state: { \/\/stop, run, work, fault         title: \"State\",         type: 'text',         value: 'stop',         readonly: true       }     }   });    defineRule('fanControllerEnableTrigger', {     whenChanged: 'fanController\/enable',     then: function (newValue, devName, cellName) {       switch (dev['fanController\/state']) {         case 'stop':           if (newValue) {             dev[topics.DO_FAN] = true;             idFanTimer = startFanTimer();             dev['fanController\/state'] = 'run';           }           break;         case 'run':           if (!newValue) {             dev[topics.DO_FAN] = false;             dev['fanController\/state'] = 'stop';           }           break;         case 'work':           if (!newValue) {             dev[topics.DO_FAN] = false;             dev['fanController\/state'] = 'stop';           }           break;       }     }   });    defineRule('fanControllerTsTrigger', {     whenChanged: topics.DI_TS_FAN,     then: function (newValue, devName, cellName) {       switch (dev['fanController\/state']) {         case 'stop':           if (!newValue) {             dev['fanController\/state'] = 'fault';           }           break;         case 'run':           if (!newValue) {             dev[topics.DO_FAN] = false;             dev['fanController\/state'] = 'fault';           }           break;         case 'work':           if (!newValue) {             dev[topics.DO_FAN] = false;             dev['fanController\/state'] = 'fault';           }           break;         case 'fault':           if (!dev[topics.DI_HS] &amp;&amp; newValue &amp;&amp; !dev[topics.DI_PS_FAN]) {             dev['fanController\/state'] = 'stop';           }           break;       }     }   });    defineRule('fanControllerPsTrigger', {     whenChanged: topics.DI_PS_FAN,     then: function (newValue, devName, cellName) {       switch (dev['fanController\/state']) {         case 'stop':           if (newValue) {             dev['fanController\/state'] = 'fault';           }           break;         case 'run':           if (newValue) {             clearTimeout(idFanTimer);             dev['fanController\/state'] = 'work';           }           break;         case 'work':           if (!newValue) {             dev[topics.DO_FAN] = false;             dev['fanController\/state'] = 'fault';           }           break;         case 'fault':           if (!dev[topics.DI_HS] &amp;&amp; dev[topics.DI_TS_FAN] &amp;&amp; !newValue) {             dev['fanController\/state'] = 'stop';           }           break;       }     }   });    defineRule('fanControllerHsTrigger', {     whenChanged: topics.DI_HS,     then: function (newValue, devName, cellName) {       switch (dev['fanController\/state']) {         case 'fault':           if (!newValue &amp;&amp; dev[topics.DI_TS_FAN] &amp;&amp; !dev[topics.DI_PS_FAN]) {             dev['fanController\/state'] = 'stop';           }           break;       }     }   });    \/\/-------------------------------------------------------------------------------------------------------------------------   \/\/heaterController   var error = 0.5; \/\/\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0432\u043e\u0437\u0434\u0443\u0445\u0430   var idMoreTimer = null; \/\/\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0434\u043b\u044f \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430 \"\u0431\u043e\u043b\u044c\u0448\u0435\"   var idLessTimer = null; \/\/\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0434\u043b\u044f \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430 \"\u043c\u0435\u043d\u044c\u0448\u0435\"   var idPidTimer = null; \/\/\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u041f\u0418\u0414 \u0440\u0435\u0433\u0443\u043b\u044f\u0442\u043e\u0440\u0430   var SETPOINT_T_AIR = 22; \/\/\u0443\u0441\u0442\u0430\u0432\u043a\u0430 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0432\u043e\u0437\u0434\u0443\u0445\u0430   var pid = { \/\/\u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u041f\u0418\u0414 \u0440\u0435\u0433\u0443\u043b\u044f\u0442\u043e\u0440\u0430     K: 50, \/\/\u043e\u0431\u0449\u0438\u0439 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0443\u0441\u0438\u043b\u0435\u043d\u0438\u044f     TAU: 5, \/\/\u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u043f\u0440\u0438 \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0439, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a \u0440\u0435\u0437\u043a\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440     BORDER_MS: 300, \/\/\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u043c\u0441     PERIOD_S: 10 \/\/\u043f\u0435\u0440\u0438\u043e\u0434 \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0441   }   var prevDiff = null; \/\/\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0440\u0430\u0441\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u0435   var leftover = null; \/\/\u0435\u0441\u043b\u0438 \u043f\u0440\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445 \u0434\u043b\u0438\u043d\u0430 \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 - \u043f\u0438\u0448\u0435\u043c \u0441\u044e\u0434\u0430    function generateMoreImpulse(pulseTime_s) {     if (idMoreTimer) {       clearTimeout(idMoreTimer);       idMoreTimer = null;     } else {       dev[topics.DO_MORE] = true;     }     idMoreTimer = setTimeout(function () {       dev[topics.DO_MORE] = false;       idMoreTimer = null;     }, pulseTime_s * 1000);   }    function generateLessImpulse(pulseTime_s) {     if (idLessTimer) {       clearTimeout(idLessTimer);       idLessTimer = null;     } else {       dev[topics.DO_LESS] = true;     }     idLessTimer = setTimeout(function () {       dev[topics.DO_LESS] = false;       idLessTimer = null;     }, pulseTime_s * 1000);   }    function calculatePulseTime() {     var diff = SETPOINT_T_AIR - dev[topics.AI_T_AIR]; \/\/\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0440\u0430\u0441\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u0435     var delta = diff - prevDiff; \/\/\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c\u0438 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f\u043c\u0438     var result = Math.round(2.5 * pid.K * (diff + pid.TAU * delta));     if (((result > 0) &amp;&amp; (leftover &lt; 0)) || ((result &lt; 0) &amp;&amp; (leftover > 0))) {       leftover = 0;     }     result = result + leftover;     \/\/ \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0440\u0430\u0437\u043d\u0438\u0446\u0443     prevDiff = diff;     leftover = 0;     \/\/ \u041f\u0440\u0438 \u0434\u043b\u0438\u043d\u0435 \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 - \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u043d\u043e \u043d\u0435 \u0432\u044b\u0434\u0430\u0435\u043c     if (Math.abs(result) &lt; pid.BORDER_MS) {       leftover = result;       result = 0;     }     return result;   }    function run() {     \/\/\u0435\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0430\u044f T \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0443\u0441\u0442\u0430\u0432\u043a\u0438 +\/- \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c - \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c     if (Math.abs(dev[topics.AI_T_AIR] - SETPOINT_T_AIR) &lt; error) {       return;     }     var out = calculatePulseTime();     dev[topics.DO_MORE] = false;     dev[topics.DO_LESS] = false;     if (out &lt; 0) {       generateLessImpulse(Math.abs(out) \/ 1000);     }     if (out > 0) {       generateMoreImpulse(out \/ 1000);     }   }    function enablePid() {     if (idPidTimer == null) {       idPidTimer = setInterval(function () {         run();       }, pid.PERIOD_S * 1000);     }   }    function disablePid() {     if (idPidTimer != null) {       clearInterval(idPidTimer);       idPidTimer = null;     }   }    defineVirtualDevice('heaterController', {     title: 'Heater Controller',     cells: {       enable: {         title: \"Enable\",         type: 'switch',         value: false,       },       state: { \/\/work, safe         title: \"State\",         type: 'text',         value: 'safe',         readonly: true,       }     }   });     defineRule('heaterControllerEnableTrigger', {     whenChanged: 'heaterController\/enable',     then: function (newValue, devName, cellName) {       switch (dev['heaterController\/state']) {         case 'safe':           if (newValue) {             dev['heaterController\/state'] = 'work';             enablePid();           }           break;         case 'work':           if (!newValue) {             dev[topics.DO_LESS] = false;             dev[topics.DO_MORE] = true;             dev[topics.DO_PUMP] = true;             dev['heaterController\/state'] = 'safe';             disablePid();           }           break;       }     }   });    \/\/-------------------------------------------------------------------------------------------------------------------------   \/\/mainController   var T_WATER_START = 30; \/\/\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0432\u043e\u0434\u044b \u0432 \"\u043e\u0431\u0440\u0430\u0442\u043a\u0435\", \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u0441\u0442\u0430\u0440\u0442 \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438     defineVirtualDevice('mainController', {     title: 'Main Controller',     cells: {       state: { \/\/safe, warming, opening, running, work         title: \"State\",         type: 'text',         value: 'safe',         readonly: true       }     }   });    defineRule('mainControllerHsTrigger', {     whenChanged: topics.DI_HS,     then: function (newValue, devName, cellName) {       switch (dev['mainController\/state']) {         case 'safe':           if (newValue &amp;&amp; dev['safetyController\/safe']) {             dev['mainController\/state'] = 'warming';           }           break;         case 'warming':           if (!newValue) {             dev['mainController\/state'] = 'safe';             break;           }         case 'opening':           if (!newValue) {             dev['flapController\/enable'] = false;             dev['mainController\/state'] = 'safe';           }           break;         case 'running':           if (!newValue) {             dev['flapController\/enable'] = false;             dev['fanController\/enable'] = false;             dev['mainController\/state'] = 'safe';           }           break;         case 'work':           if (!newValue) {             dev['heaterController\/enable'] = false;             dev['flapController\/enable'] = false;             dev['fanController\/enable'] = false;             dev['mainController\/state'] = 'safe';           }           break;       }     }   });    defineRule('mainControllerAiTrigger', {     whenChanged: 'ai_t_water\/value',     then: function (newValue, devName, cellName) {       if (newValue &lt; T_WATER_START)         return;       switch (dev['mainController\/state']) {         case 'warming':           dev['flapController\/enable'] = true;           dev['mainController\/state'] = 'opening';           break;       }     }   });    defineRule('mainControllerFlapTrigger', {     whenChanged: 'flapController\/state',     then: function (newValue, devName, cellName) {       if (newValue != 'open')         return;       switch (dev['mainController\/state']) {         case 'opening':           dev['fanController\/enable'] = true;           dev['mainController\/state'] = 'running';           break;       }     }   });    defineRule('mainControllerSafeTrigger', {     whenChanged: 'safetyController\/safe',     then: function (newValue, devName, cellName) {       if (newValue)         return;       switch (dev['mainController\/state']) {         case 'safe':           if (dev[topics.DI_HS] &amp;&amp; newValue) {             dev['mainController\/state'] = 'warming';           }           dev['mainController\/state'] = 'safe';           break;         case 'warming':           dev['mainController\/state'] = 'safe';           break;         case 'opening':           dev['flapController\/enable'] = false;           dev['mainController\/state'] = 'safe';           break;         case 'running':           dev['flapController\/enable'] = false;           dev['fanController\/enable'] = false;           dev['mainController\/state'] = 'safe';           break;         case 'work':           dev['heaterController\/enable'] = false;           dev['flapController\/enable'] = false;           dev['fanController\/enable'] = false;           dev['mainController\/state'] = 'safe';           break;       }     }   });    defineRule('mainControllerFanTrigger', {     whenChanged: 'fanController\/state',     then: function (newValue, devName, cellName) {       if (newValue != 'work')         return;       switch (dev['mainController\/state']) {         case 'running':           dev['heaterController\/enable'] = true;           dev['mainController\/state'] = 'work';           break;       }     }   });    \/\/-------------------------------------------------------------------------------------------------------------------------   \/\/logger   defineVirtualDevice('logger', {     title: 'Logger',     cells: {       enable: {         type: 'switch',         value: false,       }     }   });    defineRule('changeControllersState', {     whenChanged: ['safetyController\/state', 'flapController\/state', 'fanController\/state', 'heaterController\/state', 'mainController\/state'],     then: function (newValue, devName, cellName) {       if (dev['logger\/enable']) {         log.info('[' + devName + '] state:' + newValue);       }     }   }); }  exports.init = function (topics) {   init(topics); };<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c &#8212; \u0438 \u0432\u0441\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0443\u043b\u044f:<\/p>\n<pre><code class=\"javascript\">var vent = require(\"ventilation2wb\"); \/\/ \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044c    var mqttTopics = {     AI_T_AIR: 'wb-w1\/28-00000978ba32', \/\/ \u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0430     AI_T_WATER: 'wb-w1\/28-000009795bc2', \/\/ \u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0432\u043e\u0434\u044b \u0432 \u00ab\u043e\u0431\u0440\u0430\u0442\u043a\u0435\u00bb     DI_NOT_FIRE: 'wb-mr6cv3_111\/Input 0', \/\/ \u0421\u0438\u0433\u043d\u0430\u043b \u00ab\u041f\u043e\u0436\u0430\u0440\u00bb \u043e\u0442 \u0410\u0423\u041f\u0421     DI_PS_FILTER: 'wb-mr6cv3_111\/Input 1', \/\/ \u0420\u0435\u043b\u0435 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430     DI_PS_FAN: 'wb-mr6cv3_111\/Input 2', \/\/ \u0420\u0435\u043b\u0435 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440\u0430     DI_OPEN: 'wb-mr6cv3_111\/Input 3', \/\/ \u0417\u0430\u0441\u043b\u043e\u043d\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0430     DI_CLOSED: 'wb-mr6cv3_111\/Input 4', \/\/ \u0417\u0430\u0441\u043b\u043e\u043d\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0430     DI_TS_FAN: 'wb-mr6cv3_111\/Input 5', \/\/ \u0422\u0435\u0440\u043c\u043e\u043a\u043e\u043d\u0442\u0430\u043a\u0442\u044b \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440\u0430     DI_HS: 'wb-mr6cv3_111\/Input 6', \/\/ \u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c \u0441 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u0435\u0439 \u00ab\u041f\u0443\u0441\u043a\/\u0421\u0442\u043e\u043f\u00bb     DO_OPEN: 'wb-mr6cv3_111\/K1', \/\/ \u0420\u0435\u043b\u0435 \u0437\u0430\u0441\u043b\u043e\u043d\u043a\u0438     DO_PUMP: 'wb-mr6cv3_111\/K2', \/\/ \u0420\u0435\u043b\u0435 \u043d\u0430\u0441\u043e\u0441\u0430     DO_MORE: 'wb-mr6cv3_111\/K3', \/\/ \u0420\u0435\u043b\u0435 \u0432\u0435\u043d\u0442\u0438\u043b\u044f \u00ab\u0431\u043e\u043b\u044c\u0448\u0435\u00bb     DO_LESS: 'wb-mr6cv3_111\/K4', \/\/ \u0420\u0435\u043b\u0435 \u0432\u0435\u043d\u0442\u0438\u043b\u044f \u00ab\u043c\u0435\u043d\u044c\u0448\u0435\u00bb     DO_FAN: 'wb-mr6cv3_111\/K5', \/\/ \u0420\u0435\u043b\u0435 \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440\u0430   };  vent.init(mqttTopics);<\/code><\/pre>\n<h2>\u041e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u0432\u044b\u0441\u0442\u0440\u043e\u0435\u043d\u0430, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0440\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u043e.\u00a0<\/p>\n<p>\u0423\u0434\u043e\u0431\u043d\u043e \u2014 \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f \u043a \u043d\u0435\u0439. \u0418 \u043a\u043e\u0433\u0434\u0430, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043c \u043e\u0431 \u044d\u0442\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c. \u041c\u043e\u0436\u043d\u043e \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c? \u041c\u043e\u0436\u043d\u043e.<\/p>\n<p>\u041d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 WIren Board \u0435\u0441\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439. \u041c\u043e\u0434\u0443\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0441 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0442\u044c \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b \u0438\/\u0438\u043b\u0438 \u0421\u041c\u0421 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 (\u0435\u0441\u043b\u0438 \u0432\u044b \u0435\u0433\u043e \u043a\u0443\u043f\u0438\u043b\u0438 \u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435 \u0441 GSM \u043c\u043e\u0434\u0435\u043c\u043e\u043c). \u041d\u0443 \u0430 \u0440\u0430\u0437 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0430, \u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u043f\u0440\u043e\u0447\u0438\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439.\u00a0<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 Wiren Board \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0437 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Linux. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>curl<\/code> \u2014 \u0441 \u0435\u0435 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0441 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u043e\u043c Telegram. \u041d\u043e \u044d\u0442\u043e \u0442\u0435\u043c\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u0430.\u00a0<\/p>\n<p>\u042f \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u043f\u043e \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u0435. \u041f\u0443\u0441\u0442\u044c \u0442\u0430\u043a, \u0431\u0435\u0437 \u0437\u0430\u0442\u0435\u0439. \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c Wiren Board \u043d\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u043c\u0443 \u0432\u0430\u043c\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b. \u0412\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 <a href=\"https:\/\/wirenboard.com\/wiki\/Notification_module\"><u>\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438<\/u><\/a>.<\/p>\n<p>\u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435, \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 <code>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 - \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b - \u041c\u043e\u0434\u0443\u043b\u044c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439<\/code>. \u0422\u0430\u043c \u0432\u0441\u0435 \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e.\u00a0<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c <code>\u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0430<\/code>. \u0412\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432\u0430\u0448 \u0430\u0434\u0440\u0435\u0441 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b (\u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442 GMAIL). \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0442\u0435\u043c\u0435 \u043f\u0438\u0441\u044c\u043c\u0430.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d84\/398\/91a\/d8439891a703d05905d9e469e9a5027c.png\" width=\"314\" height=\"360\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d84\/398\/91a\/d8439891a703d05905d9e469e9a5027c.png\"\/><\/figure>\n<p>\u041c\u043e\u0436\u0435\u0442\u0435 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043a\u0438\u0445 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0438\u0434\u0443\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0430\u043c\u0438\u0445 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439 (\u0430\u043b\u0430\u0440\u043c\u043e\u0432). \u041d\u0443\u0436\u043d\u043e \u0434\u0430\u0442\u044c \u0432\u043d\u044f\u0442\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044e. \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0435\u0433\u043e \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 (<code>\u041d\u0435 \u0440\u0430\u0432\u043d\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443\/\u0411\u043e\u043b\u044c\u0448\u0435\/\u041c\u0435\u043d\u044c\u0448\u0435\/\u0412\u043d\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430<\/code>). \u0423\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u043e\u043f\u0438\u043a, \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0440\u0430\u0442\u044c \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0412\u0432\u0435\u0441\u0442\u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u0438 \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f. \u041c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/caa\/a2f\/29c\/caaa2f29c3f056ea5128ea9f71544b85.png\" width=\"647\" height=\"619\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/caa\/a2f\/29c\/caaa2f29c3f056ea5128ea9f71544b85.png\"\/><\/figure>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f, \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u044f\u0437\u043d\u0435\u043d\u0438\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430. \u042f \u044d\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e. \u0422\u043e\u043b\u044c\u043a\u043e \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u044e.<\/p>\n<h2>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>\u0420\u0430\u0437\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u0442\u044c \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 <code>\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/code> \u043d\u0435 \u0443\u0434\u043e\u0431\u043d\u043e. \u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044f \u0441\u043e\u0437\u0434\u0430\u043b \u043f\u0430\u043d\u0435\u043b\u044c <code>\u0412\u0435\u043d\u0442\u0438\u043b\u044f\u0446\u0438\u044f<\/code> \u0438 \u0437\u0430\u043d\u0435\u0441 \u0442\u0443\u0434\u0430 \u0432\u0438\u0434\u0436\u0435\u0442\u044b, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u0441 \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435. \u0422\u0435\u043f\u0435\u0440\u044c \u0438 \u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0435 \u0443\u0434\u043e\u0431\u043d\u043e.  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b83\/1b1\/53b\/b831b153ba3898122e245f11a95bba95.png\" width=\"801\" height=\"838\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b83\/1b1\/53b\/b831b153ba3898122e245f11a95bba95.png\"\/><\/figure>\n<p>\u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 30 \u043c\u0438\u043d\u0443\u0442, \u0442\u0430\u043c \u0432\u0441\u0435 \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u041e\u0434\u0438\u043d \u043d\u044e\u0430\u043d\u0441 \u2014 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u043a\u0430 \u043d\u0435\u043b\u044c\u0437\u044f, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0445 \u0441\u0440\u0430\u0437\u0443 \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435.\u00a0<\/p>\n<p>\u0412\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0430\u043b\u0430\u0440\u043c\u044b \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u043d\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u044b (\u043a\u043e\u0433\u0434\u0430 \u0430\u043b\u0430\u0440\u043c \u0430\u043a\u0442\u0438\u0432\u0435\u043d, \u0431\u0443\u0434\u0435\u0442 \u0431\u0435\u043b\u0430\u044f \u043d\u0430\u0434\u043f\u0438\u0441\u044c \u043d\u0430 \u043a\u0440\u0430\u0441\u043d\u043e\u043c \u0444\u043e\u043d\u0435). \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440 \u043d\u0435 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u2014 \u044d\u0442\u043e \u0441\u0442\u0435\u043d\u0434.<\/p>\n<p>\u0410 \u0432\u043e\u0442 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u044f \u0431\u044b \u0441\u0434\u0435\u043b\u0430\u043b SVG \u043f\u0430\u043d\u0435\u043b\u044c. \u0422\u0438\u043f\u0430 \u0442\u0430\u043a\u043e\u0439:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8d5\/da4\/ee2\/8d5da4ee2793d829e1716db8e227291e.png\" width=\"1138\" height=\"831\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8d5\/da4\/ee2\/8d5da4ee2793d829e1716db8e227291e.png\"\/><\/figure>\n<p>\u041a\u0430\u043a \u0435\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u2014 \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0432 <a href=\"https:\/\/wirenboard.com\/wiki\/SVG-Dashboards\"><u>\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/u><\/a>.\u00a0<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0435 \u0443\u0434\u043e\u0431\u043d\u043e \u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u043e. \u041f\u043e\u0434\u044b\u0442\u043e\u0436\u0438\u043c.<\/p>\n<ol>\n<li>\n<p>\u0412\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0442\u043e\u0447\u043d\u043e-\u0432\u044b\u0442\u044f\u0436\u043d\u043e\u0439 \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0432 \u043e\u0431\u0449\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043e\u043c\u0430 \u043d\u0430 \u0431\u0430\u0437\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 WIren Board \u043c\u043e\u0436\u043d\u043e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u0440\u0435\u043b\u0435\u0439\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0438 \u043f\u0430\u0440\u0443 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432. \u0421\u0442\u043e\u0438\u0442 \u044d\u0442\u043e \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0432 \u0440\u0435\u043b\u0435\u0439\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u044f\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u043a \u0441\u0430\u043c\u043e\u0439 \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u0442\u0430\u043a \u0438 \u0434\u043e\u043c\u0430, \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 WIren Board \u0432 \u0437\u0430\u0432\u043e\u0434\u0441\u043a\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0432\u0441\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432, \u0438\u0445 \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0438 \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e \u043d\u0435\u0448\u0442\u0430\u0442\u043d\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445.<\/p>\n<\/li>\n<\/ol>\n<p>\u0415\u0449\u0435 \u0440\u0430\u0437 \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443 \u2014 \u043d\u0435 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0439\u0442\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043a\u0430\u043a \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0442\u0438\u0440\u0430\u0436\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u043d\u0435\u0433\u043e \u043a\u0430\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u0442\u0432\u0430. \u0418 \u0442\u0432\u043e\u0440\u0438\u0442\u0435.<\/p>\n<p>\u0412\u0435\u0441\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u043a\u043e\u0434 \u0438 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430 \u0432\u044b \u043d\u0430\u0439\u0434\u0451\u0442\u0435 \u043d\u0430 GitHub \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 <a href=\"https:\/\/github.com\/wirenboard\/wb-community\/tree\/main\/scripts\/wb-ventilation\">wb-community<\/a>.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/715288\/\"> https:\/\/habr.com\/ru\/articles\/715288\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<blockquote>\n<p><a href=\"https:\/\/habr.com\/ru\/company\/wirenboard\/blog\/702444\/\">\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0446\u0438\u0435\u0439: \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c, \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u043c, \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043c<\/a><br \/><a href=\"https:\/\/habr.com\/ru\/company\/wirenboard\/blog\/705900\/\">\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0446\u0438\u0435\u0439. \u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u0430\u0433\u0440\u0435\u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0430. \u042d\u0441\u0441\u0435 \u043f\u0440\u043e \u0442\u0435\u0445\u043d\u0438\u043a\u0443 \u0438 \u0434\u0435\u043d\u044c\u0433\u0438<\/a><br \/>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0446\u0438\u0435\u0439. \u0422\u0438\u043f\u043e\u0432\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0438 \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 wb-rules<\/p>\n<\/blockquote>\n<p>\u0412 \u0444\u0438\u043d\u0430\u043b\u0435 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 <a href=\"https:\/\/habr.com\/ru\/company\/wirenboard\/blog\/705900\/\"><u>\u0441\u0442\u0430\u0442\u044c\u0438<\/u><\/a> \u044f \u0443\u0441\u0442\u0440\u043e\u0438\u043b \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043d\u0438\u0435, \u0434\u043b\u044f \u043a\u0430\u043a\u043e\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b: \u0441 \u0432\u043e\u0434\u044f\u043d\u044b\u043c \u043d\u0430\u0433\u0440\u0435\u0432\u043e\u043c \u0438\u043b\u0438 \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0431\u0435\u0434\u0443 \u043e\u0434\u0435\u0440\u0436\u0430\u043b \u0432\u043e\u0434\u044f\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0435\u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0430. \u041d\u0443, \u0437\u043d\u0430\u0447\u0438\u0442, \u0442\u0430\u043a \u0442\u043e\u043c\u0443 \u0438 \u0431\u044b\u0442\u044c.<\/p>\n<h2>\u0412\u0432\u043e\u0434\u043d\u044b\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h2>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043d\u0430\u0448\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438. \u0412\u043e\u0442 <a href=\"https:\/\/drive.google.com\/file\/d\/12nra5iexl4B8TnbWWTkATBR9NUvhbMPK\/view?usp=sharing\"><u>\u0441\u0445\u0435\u043c\u0430<\/u><\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u042f \u0435\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u2014 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c \u0441 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u0435\u0439 \u00ab\u041f\u0443\u0441\u043a\/\u0421\u0442\u043e\u043f\u00bb \u0438 \u0437\u0430\u0432\u0435\u043b \u0435\u0433\u043e \u043d\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0440\u0435\u043b\u0435\u0439\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f.\u00a0<\/p>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0445\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0434\u0438\u0442\u044c, \u0447\u0442\u043e \u044f \u043d\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442, \u0430 \u0438\u043d\u0436\u0435\u043d\u0435\u0440, \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0432\u0448\u0438\u0439\u0441\u044f. \u042f \u043c\u043e\u0433\u0443 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0442\u0435\u0440\u043c\u0438\u043d\u044b, \u043d\u0435 \u0437\u043d\u0430\u0442\u044c \u0442\u0438\u043f\u043e\u0432\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b\u2026 \u043e\u0442\u043d\u0435\u0441\u0438\u0442\u0435\u0441\u044c \u0441\u043d\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u0447\u0442\u043e. \u042f \u0441\u0440\u0430\u0437\u0443 \u0441\u043e\u0433\u043b\u0430\u0441\u0435\u043d \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443: \u0438 \u043b\u0443\u0447\u0448\u0435, \u0438 \u043f\u0440\u043e\u0449\u0435, \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u0435\u0435\u2026 \u041c\u043e\u044f \u0446\u0435\u043b\u044c \u2014 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 <a href=\"https:\/\/wirenboard.com\/ru\/product\/wiren-board-7\/\"><u>Wiren Board<\/u><\/a> \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0435 \u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443. \u0417\u043d\u0430\u043d\u0438\u044f \u044f \u0447\u0435\u0440\u043f\u0430\u043b \u0438\u0437 <a href=\"https:\/\/github.com\/wirenboard\/wb-rules\"><u>\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f<\/u><\/a> \u043d\u0430\u0448\u0435\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 \u043f\u0440\u0430\u0432\u0438\u043b wb-rules, <a href=\"https:\/\/wirenboard.com\/wiki\/Rule_Examples\"><u>\u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432<\/u><\/a> \u043f\u0440\u0430\u0432\u0438\u043b \u0438 <a href=\"https:\/\/262.ecma-international.org\/5.1\/#sec-4.2.1\"><u>\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/u><\/a> \u044f\u0437\u044b\u043a\u0430 ECMAScript.<\/p>\n<p>\u042f \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0432\u0441\u0451 \u043c\u043d\u043e\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u0441\u0442\u0435\u043d\u0434\u0435:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0433\u0443 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e \u0437\u0430\u044f\u0432\u0438\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (\u043d\u0430 \u0444\u043e\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u043b\u0438\u0448\u043d\u0435\u0433\u043e, \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0439\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f).\u00a0<\/p>\n<p>\u0414\u0430, \u0434\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f Production \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0435\u0449\u0435 \u043d\u0430\u0434\u043e \u00ab\u043e\u0442\u043b\u0438\u0437\u044b\u0432\u0430\u0442\u044c\u00bb, \u043d\u043e \u0432\u0435\u0441\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d.\u00a0<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0435\u0439, \u044f \u043f\u043e\u0448\u0435\u043b \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>\u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0442\u043e\u0447\u043d\u0430\u044f \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 (\u0434\u043b\u044f \u0432\u044b\u0442\u044f\u0436\u043d\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0442\u0435 \u0436\u0435, \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044f \u043d\u0430\u0433\u0440\u0435\u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0430);<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0433\u0440\u0435\u0432\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 \u0432 \u043b\u0435\u0442\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0435 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e (\u044d\u0442\u043e \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u043e\u0437\u0434\u0443\u0445 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0433\u0440\u0435\u0442, \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u0435\u043d\u0442\u0438\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0432 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043c\u0430\u043b\u043e\u0433\u043e \u043a\u0440\u0443\u0433\u0430 \u0438 \u0446\u0438\u0440\u043a\u0443\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043d\u0430\u0441\u043e\u0441 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0437\u0440\u044f).<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0435\u043d\u0438\u0439.<\/p>\n<h2>\u041f\u0440\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b<\/h2>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b (\u0442\u043e\u0447\u043d\u0435\u0435, \u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u044b) \u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u043b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0435\u0440\u0432\u0438\u0441 <a href=\"https:\/\/drakonhub.com\/\"><u>DrakonHub<\/u><\/a>, \u043d\u0430 \u00ab\u0434\u0440\u0430\u043a\u043e\u043d\u044c\u0435\u043c\u00bb <a href=\"https:\/\/drakonhub.com\/drakon-reference\"><u>\u044f\u0437\u044b\u043a\u0435<\/u><\/a>. \u041e\u043d \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u0435\u043d, \u0447\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u0434\u0430\u0432\u0430\u043b\u0438 \u043d\u0430 \u0443\u0440\u043e\u043a\u0430\u0445 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u043a\u0438. \u041d\u0430 \u044d\u0442\u043e\u043c \u0436\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0435\u0441\u0442\u044c <a href=\"https:\/\/drakonhub.com\/files\/pe_drakon_automata_mitkin_2019.pdf\"><u>\u0441\u0442\u0430\u0442\u044c\u044f<\/u><\/a>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b. \u0414\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u2014 \u043c\u043e\u0438\u0445 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 \u043a \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.  <\/p>\n<h2>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f<\/h2>\n<p>\u041d\u0430\u0447\u043d\u0443 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <a href=\"https:\/\/wirenboard.com\/wiki\/Wiren_Board_Web_Interface\"><u>\u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/u><\/a> \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430. \u0414\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e <a href=\"https:\/\/wirenboard.com\/wiki\/Wiren_Board_Web_Interface#%D0%A1%D0%BC%D0%B5%D0%BD%D0%B0_%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D1%8F_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0\"><u>\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0430<\/u><\/a> \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u00bb.<\/p>\n<h3>\u0414\u0430\u0442\u0447\u0438\u043a\u0438<\/h3>\n<p>\u0414\u0430\u0442\u0447\u0438\u043a\u0438 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 \u043a \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 1-Wire, \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u0414\u0440\u0430\u0439\u0432\u0435\u0440 wb-mqtt-w1 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u0435\u0434\u0435\u0442 \u043e\u043f\u0440\u043e\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u0442\u0447\u0438\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d, \u043e\u043d \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 <code>\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/code> \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430. \u0422\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0435\u0433\u043e \u0430\u0434\u0440\u0435\u0441 \u0438\u00a0  \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b.<\/p>\n<p>\u0412 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<figure class=\"\"><\/figure>\n<h3>\u0420\u0435\u043b\u0435\u0439\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c<\/h3>\n<p>\u0420\u0435\u043b\u0435\u0439\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c <a href=\"https:\/\/wirenboard.com\/ru\/product\/WB-MR6C_v3\/\">WB-MR6C v.3<\/a> \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u043f\u043e\u0440\u0442\u0443 RS-485 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 Wiren Board 7. \u041e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u0441 \u043c\u043e\u0434\u0443\u043b\u0435\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 <code>wb-mqtt-serial<\/code>. \u0412\u043e\u0442 \u0435\u0433\u043e \u043c\u043d\u0435 \u0438 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c. \u0412\u044b\u0431\u0438\u0440\u0430\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 <code>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b - \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 serial \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432<\/code>, \u0432\u0438\u0436\u0443 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0440\u0442\u043e\u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430. \u0412\u044b\u0431\u0438\u0440\u0430\u044e \u043f\u043e\u0440\u0442, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0438\u0437 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u044e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f. \u041d\u0430\u0436\u0438\u043c\u0430\u044e <code>\u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c<\/code>.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u2014 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0440\u0442\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0437\u0430\u0432\u043e\u0434\u0441\u043a\u0438\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u00a0 \u043a\u0430\u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430, \u0442\u0430\u043a \u0438 Modbus-\u043c\u043e\u0434\u0443\u043b\u0435\u0439. \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0432\u044b \u043b\u0435\u0433\u043a\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0445 <a href=\"https:\/\/wirenboard.com\/wiki\/UART_Communication_Settings\"><u>\u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c<\/u><\/a>.\u00a0<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0441\u0430\u043c \u0440\u0435\u043b\u0435\u0439\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c. \u041e\u043d, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u0438 \u0433\u043e\u0442\u043e\u0432 \u043a \u0440\u0430\u0431\u043e\u0442\u0435, \u043d\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043a\u043e\u0435-\u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c. \u0422\u043e, \u0447\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u043a \u0441\u0430\u043c\u043e\u0439 \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u0442\u0430\u043a \u0438 \u0434\u043e\u043c\u0430 \u0432 \u0446\u0435\u043b\u043e\u043c. <\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435 \u2014 \u044d\u0442\u043e \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432\u0435\u043d\u0442\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u0438\u0442\u0430\u043d\u0438\u044f. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0432\u0441\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u043a\u0443 \u0434\u043e\u043c\u0430 \u0432 \u0441\u0438\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0440\u043e\u0437. \u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443 \u043d\u0443\u0436\u043d\u0430 \u043f\u0430\u0440\u0430 \u043c\u0438\u043d\u0443\u0442 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u2014 \u0437\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0437\u0430\u043c\u043e\u0440\u043e\u0437\u0438\u0442\u044c \u043a\u0430\u043b\u043e\u0440\u0438\u0444\u0435\u0440. \u0421\u043a\u0430\u0436\u0443 \u043c\u043e\u0434\u0443\u043b\u044e, \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u0434\u0430\u0447\u0435 \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0438 \u0432\u044b\u0445\u043e\u0434\u044b \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u0418 \u0443\u043a\u0430\u0436\u0443, \u043a\u0430\u043a\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u044d\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u0432\u043e\u0437\u0434\u0443\u0448\u043d\u0430\u044f \u0437\u0430\u0441\u043b\u043e\u043d\u043a\u0430 (\u0432\u044b\u0445\u043e\u0434 1) \u0437\u0430\u043a\u0440\u044b\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u0441\u043e\u0441 (\u0432\u044b\u0445\u043e\u0434 2) \u0432\u043a\u043b\u044e\u0447\u0435\u043d;<\/p>\n<\/li>\n<li>\n<p>\u0432\u0435\u043d\u0442\u0438\u043b\u044c (\u0432\u044b\u0445\u043e\u0434 3) \u043e\u0442\u043a\u0440\u044b\u0442;<\/p>\n<\/li>\n<li>\n<p>\u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440 (\u0432\u044b\u0445\u043e\u0434 5) \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043d\u0430\u0440\u0443\u0436\u043d\u044b\u0439 \u0432\u043e\u0437\u0434\u0443\u0445 \u0447\u0435\u0440\u0435\u0437 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f, \u0433\u043e\u0440\u044f\u0447\u0430\u044f \u0432\u043e\u0434\u0430 \u0446\u0438\u0440\u043a\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u0432 \u043a\u0430\u043b\u043e\u0440\u0438\u0444\u0435\u0440\u0435 \u2014 \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e. \u0418 \u0434\u0430\u0436\u0435 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0436\u0430\u0440\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u043d\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u0412 \u0442\u0430\u043a\u043e\u0435 \u0436\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0438 \u0432\u044b\u0445\u043e\u0434\u044b \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0442\u0435\u0440\u0438 \u0441\u0432\u044f\u0437\u0438 \u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c. \u0418 \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043c\u043e\u0434\u0443\u043b\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0432\u043e\u0438\u0445 \u0432\u0445\u043e\u0434\u043e\u0432.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0412\u0441\u0451, \u043c\u043e\u0434\u0443\u043b\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d. \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u0439\u0442\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 <code>\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/code>, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u043f\u043e\u0449\u0435\u043b\u043a\u0430\u0442\u044c \u0432\u044b\u0445\u043e\u0434\u0430\u043c\u0438. \u0422\u0443\u0442 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c, \u0447\u0442\u043e \u043a \u0432\u044b\u0445\u043e\u0434\u0430\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435 (\u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0442\u0430\u043a), \u0438 \u0449\u0435\u043b\u043a\u0430\u0442\u044c \u0441\u043e \u0437\u043d\u0430\u043d\u0438\u0435\u043c \u0434\u0435\u043b\u0430.  <\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u044b, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.<\/p>\n<h2>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<h3>\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043a\u043e\u0434\u0430<\/h3>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 <code>\u041f\u0440\u0430\u0432\u0438\u043b\u0430<\/code> \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 <code>\u0421\u043e\u0437\u0434\u0430\u0442\u044c<\/code>, \u0432\u0432\u043e\u0434\u0438\u043c \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c js. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0446\u0432\u0435\u0442\u043e\u043c, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u041f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0434 \u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0438. \u0415\u0441\u043b\u0438 \u043e\u0448\u0438\u0431\u043b\u0438\u0441\u044c \u2014 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0433\u0434\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0438 \u0432 \u0447\u0435\u043c. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0438\u0436\u0435 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>makeSensorController<\/code> \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 59 \u0444\u0430\u0439\u043b\u0430 <code>ventilation.js<\/code>:<\/p>\n<figure class=\"\"><\/figure>\n<p>\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0443 \u043e\u0448\u0438\u0431\u043a\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0442\u043e\u0436\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442. \u0412\u0441\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b \u0434\u043b\u044f JS, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0433\u0443\u0433\u043b\u0438\u0442\u044c \u0438 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043d\u0435 \u0442\u0430\u043a.<\/p>\n<h3>MQTT<\/h3>\n<p>\u0412\u0441\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 <a href=\"https:\/\/wirenboard.com\/wiki\/MQTT\"><u>MQTT<\/u><\/a>, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0431\u0449\u0430\u044e\u0442\u0441\u044f \u043d\u0435 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0430 \u0447\u0435\u0440\u0435\u0437 MQTT \u0431\u0440\u043e\u043a\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u0430\u043a \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041c\u043e\u0436\u043d\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u0438\u0440\u043c\u0443, \u0433\u0434\u0435 \u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u0440\u044f (\u0431\u0440\u043e\u043a\u0435\u0440\u0430). <\/p>\n<p>\u0423 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u0440\u044f \u0435\u0441\u0442\u044c \u043f\u0430\u043f\u043a\u0438 (\u0442\u043e\u043f\u0438\u043a\u0438) \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c\u0438. \u0412 \u043f\u0430\u043f\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0438\u043c\u0435\u044e\u0449\u0435\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u043e\u0442\u043c\u0435\u0442\u043a\u0443 (retain \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435), \u043b\u0438\u0431\u043e \u043f\u0430\u043f\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0439.\u00a0<\/p>\n<p>\u0421\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0438 \u043f\u0438\u0448\u0443\u0442 \u0441\u0432\u043e\u0438 \u0444\u0430\u043c\u0438\u043b\u0438\u0438 \u043d\u0430 \u043d\u0443\u0436\u043d\u044b\u0445 \u0438\u043c \u043f\u0430\u043f\u043a\u0430\u0445 (\u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0442\u043e\u043f\u0438\u043a\u0438). \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 \u043d\u0435\u0442 &#8212; \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u0440\u044c \u0435\u0435 \u0437\u0430\u0432\u043e\u0434\u0438\u0442.\u00a0<\/p>\n<p>\u0412 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u0440\u044c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0445\u0440\u0430\u043d\u044f\u0449\u0435\u0435\u0441\u044f \u0432 \u043f\u0430\u043f\u043a\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0443, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u0442\u0430\u043c \u0435\u0441\u0442\u044c.\u00a0<\/p>\n<p>\u0421\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0438 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u043e\u0433\u0443\u0442\u00a0 \u043f\u0440\u0438\u043d\u0435\u0441\u0442\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0430\u043f\u043a\u0438 \u0441 \u0442\u0430\u043a\u0438\u043c-\u0442\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c (\u043f\u0443\u0431\u043b\u0438\u043a\u0443\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0442\u043e\u043f\u0438\u043a\u0438). \u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u0435\u0441\u043b\u0438 \u043f\u0430\u043f\u043a\u0438 \u043d\u0435\u0442 &#8212; \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u0440\u044c \u0435\u0435 \u0437\u0430\u0432\u0435\u0434\u0435\u0442. \u0414\u0430\u043b\u0435\u0435, \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u0440\u044c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u043c, \u0447\u044c\u0438 \u0444\u0430\u043c\u0438\u043b\u0438\u0438 \u0435\u0441\u0442\u044c \u043d\u0430 \u043f\u0430\u043f\u043a\u0435 (\u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430\u043c). \u0415\u0441\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u043a\u0443 retain &#8212; \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u0440\u044c \u043a\u043b\u0430\u0434\u0435\u0442 \u0435\u0433\u043e \u0432 \u043f\u0430\u043f\u043a\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u043b\u0435\u0436\u0430\u0449\u0435\u0433\u043e \u0442\u0430\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u043e\u0442\u043c\u0435\u0442\u043a\u0438 \u043d\u0435\u0442 &#8212; \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043a\u0430\u0437\u0430.<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0440\u0430\u0439\u0432\u0435\u0440\u044b, \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0442\u043e\u043f\u0438\u043a\u0438. \u0412\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u043d\u0430 \u0432\u0441\u0435 \u0442\u043e\u043f\u0438\u043a\u0438, \u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u0443\u0434\u0430 \u043d\u043e\u0432\u044b\u0435. \u0421\u0435\u0440\u0432\u0438\u0441 <code>wb-rules<\/code> \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u043e \u0432\u0441\u0435\u043c \u0442\u043e\u043f\u0438\u043a\u0430\u043c, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438 \u043c\u044b \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445 \u043c\u043e\u0436\u0435\u043c (\u0438 \u0431\u0443\u0434\u0435\u043c) \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.\u00a0<\/p>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0432\u0441\u0435\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0442\u043e\u043f\u0438\u043a\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 <code>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 - \u041a\u0430\u043d\u0430\u043b\u044b MQTT<\/code>.<\/p>\n<p>\u042f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b \u0434\u0430\u0442\u0447\u0438\u043a\u0438 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b, \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0440\u0435\u043b\u0435\u0439\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043c\u043d\u0435 \u0442\u043e\u043f\u0438\u043a\u0438:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"center\"><strong>\u0422\u043e\u043f\u0438\u043a<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"center\"><strong>\u0421\u0438\u043d\u043e\u043d\u0438\u043c<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044f<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-w1\/controls\/28-000009795bc2<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">ai_t_air<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-w1\/controls\/28-00000978ba32<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">ai_t_water<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0432\u043e\u0434\u044b \u0432 \u00ab\u043e\u0431\u0440\u0430\u0442\u043a\u0435\u00bb<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/Input 0<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">di_not_fire<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0438\u0433\u043d\u0430\u043b \u00ab\u041f\u043e\u0436\u0430\u0440\u00bb \u043e\u0442 \u0410\u0423\u041f\u0421<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0440\u0430\u0437\u043e\u043c\u043a\u043d\u0443\u0442\u043e = \u043f\u043e\u0436\u0430\u0440<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/Input 1<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">di_ps_filter<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0435\u043b\u0435 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0440\u0430\u0437\u043e\u043c\u043a\u043d\u0443\u0442\u043e = \u0447\u0438\u0441\u0442\u044b\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/Input 2<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">di_ps_fan<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0435\u043b\u0435 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0437\u0430\u043c\u043a\u043d\u0443\u0442\u043e = \u0440\u0430\u0441\u0447\u0435\u0442\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/Input 3<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">di_open<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u0430\u0441\u043b\u043e\u043d\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0437\u0430\u043c\u043a\u043d\u0443\u0442\u043e = \u043e\u0442\u043a\u0440\u044b\u0442\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/Input 4<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">di_closed<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u0430\u0441\u043b\u043e\u043d\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0437\u0430\u043c\u043a\u043d\u0443\u0442\u043e = \u0437\u0430\u043a\u0440\u044b\u0442\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/Input 5<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">di_ts_fan<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u0435\u0440\u043c\u043e\u043a\u043e\u043d\u0442\u0430\u043a\u0442\u044b \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0440\u0430\u0437\u043e\u043c\u043a\u043d\u0443\u0442\u043e = \u043f\u0435\u0440\u0435\u0433\u0440\u0435\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/Input 6<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">di_hs<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c \u0441 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u0435\u0439 \u00ab\u041f\u0443\u0441\u043a\/\u0421\u0442\u043e\u043f\u00bb<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0437\u0430\u043c\u043a\u043d\u0443\u0442\u043e = \u043f\u0443\u0441\u043a<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/K1<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">do_open<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0435\u043b\u0435 \u0437\u0430\u0441\u043b\u043e\u043d\u043a\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0437\u0430\u043c\u043a\u043d\u0443\u0442\u043e = \u043e\u0442\u043a\u0440\u044b\u0442\u044c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/K2<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">do_pump<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0435\u043b\u0435 \u043d\u0430\u0441\u043e\u0441\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/K3<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">do_more<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0435\u043b\u0435 \u0432\u0435\u043d\u0442\u0438\u043b\u044f \u00ab\u0431\u043e\u043b\u044c\u0448\u0435\u00bb<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/K4<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">do_less<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0435\u043b\u0435 \u0432\u0435\u043d\u0442\u0438\u043b\u044f \u00ab\u043c\u0435\u043d\u044c\u0448\u0435\u00bb<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"316\" width=\"316\">\n<p align=\"left\">\/devices\/wb-mr6cv3_111\/controls\/K5<\/p>\n<\/td>\n<td data-colwidth=\"95\" width=\"95\">\n<p align=\"left\">do_fan<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0435\u043b\u0435 \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0439\u0442\u0435, \u0447\u0442\u043e \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u0442\u043e\u043f\u0438\u043a\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0430\u0434\u0440\u0435\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u0432\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043c\u0435\u0441\u0442\u043e <code>28-000009795bc2<\/code>, <code>28-00000978ba32<\/code> \u0438 <code>111<\/code> \u0431\u0443\u0434\u0443\u0442 \u0430\u0434\u0440\u0435\u0441\u0430 \u0432\u0430\u0448\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432.<\/p>\n<p>\u0418\u043c\u0435\u043d\u0430 \u0442\u043e\u043f\u0438\u043a\u043e\u0432 \u043c\u0430\u043b\u043e\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u044b \u2014 \u0432 \u043a\u043e\u043b\u043e\u043d\u043a\u0435 <code>\u0421\u0438\u043d\u043e\u043d\u0438\u043c<\/code> \u044f \u043f\u0440\u0438\u0432\u0435\u043b \u0442\u043e \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445. \u0412 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0442\u0430\u043a\u0443\u044e \u043d\u043e\u0442\u0430\u0446\u0438\u044e: <code>[\u0432\u0438\u0434 \u0441\u0438\u0433\u043d\u0430\u043b\u0430]_[\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440]_[\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e]<\/code>. \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u2014 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e.<\/p>\n<p>\u0412 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0442\u043e\u043f\u0438\u043a\u0430\u043c MQTT \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u043e\u0431\u044a\u0435\u043a\u0442 <code>dev[\u0438\u043c\u044f_\u0442\u043e\u043f\u0438\u043a\u0430]<\/code>. \u0412 \u0438\u043c\u0435\u043d\u0438 \u0442\u043e\u043f\u0438\u043a\u0430 <code>\/devices<\/code> \u0438 <code>\/controls<\/code> \u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 x \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0432\u043e\u0437\u0434\u0443\u0445\u0430, \u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"javascript\">x =\u00a0 dev['wb-w1\/28-000009795bc2'];<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u0430\u0441\u043e\u0441:<\/p>\n<pre><code>dev['wb-mr6cv3_111\/K2'] = true;<\/code><\/pre>\n<p>\u041e\u0431\u044a\u0435\u043a\u0442 dev \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u043d\u0435\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"javascript\">var AI_T_AIR = 'wb-w1\/28-000009795bc2';  x = dev[AI_T_AIR];<\/code><\/pre>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043d\u0435 \u0438 \u043d\u0443\u0436\u043d\u044b \u0441\u0438\u043d\u043e\u043d\u0438\u043c\u044b. \u0412 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u043c\u0438 \u0431\u0443\u043a\u0432\u0430\u043c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0438\u043d\u043e\u043d\u0438\u043c \u0432 \u043a\u043e\u0434\u0435 \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043a\u0430\u043a \u043f\u0440\u043e\u043f\u0438\u0441\u043d\u044b\u043c\u0438, \u0442\u0430\u043a \u0438 \u0441\u0442\u0440\u043e\u0447\u043d\u044b\u043c\u0438 \u0431\u0443\u043a\u0432\u0430\u043c\u0438, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f.   <\/p>\n<h3>\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/h3>\n<p>\u0418\u0437 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043b\u043e\u0433-\u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0438\u043b\u0438 \u043e\u043a\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u043b\u043e, \u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435\u043a\u0430\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u043b\u0430\u0441\u044c \u0432 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u0414\u043b\u044f \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>defineVirtualDevice<\/code>.\u00a0<\/p>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0435\u0440\u0432\u0438\u0441 wb-rules \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0442\u043e\u043f\u0438\u043a\u0438, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c:<br \/><code>\/devices\/\u0438\u043c\u044f_\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\/controls\/\u0438\u043c\u044f_\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430<\/code><\/p>\n<p>\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u044f \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0443 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u0410 \u0432\u043e\u0442 \u0441\u0438\u043d\u043e\u043d\u0438\u043c\u044b \u0434\u043b\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-398026","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/398026","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=398026"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/398026\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=398026"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=398026"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=398026"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}