{"id":475299,"date":"2025-09-19T05:00:51","date_gmt":"2025-09-19T05:00:51","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=475299"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=475299","title":{"rendered":"\u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0443\u043c\u043d\u044b\u043c \u0434\u043e\u043c\u043e\u043c Home Assitant \u0447\u0435\u0440\u0435\u0437 \u0410\u043b\u0438\u0441\u0443 \u0438 \u0431\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430. \u0427\u0430\u0441\u0442\u044c 2"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/59f\/48d\/9d5\/59f48d9d59ad0b8881f1ccfec1cda7d8.png\" width=\"1560\" height=\"975\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/59f\/48d\/9d5\/59f48d9d59ad0b8881f1ccfec1cda7d8.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/59f\/48d\/9d5\/59f48d9d59ad0b8881f1ccfec1cda7d8.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0441\u043e\u0431\u0435\u0440\u0451\u043c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u0434\u043b\u044f ESP \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c\u0441\u044f \u043a \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438.<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/805821\/\" rel=\"noopener noreferrer nofollow\">\u0427\u0430\u0441\u0442\u044c 1. \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 <\/a><\/p>\n<\/li>\n<li>\n<p>\u0427\u0430\u0441\u0442\u044c 2. \u0410\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c (\u0432\u044b \u0437\u0434\u0435\u0441\u044c)<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/947942\/\" rel=\"noopener noreferrer nofollow\">\u0427\u0430\u0441\u0442\u044c 3. \u0422\u0435\u043e\u0440\u0438\u044f \u043f\u043e \u0430\u0434\u0434\u043e\u043d\u0430\u043c Home Assistant + \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 ZigBridge<\/a><\/p>\n<\/li>\n<\/ul>\n<h2>\u0410\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/h2>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 ESP32-C6, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u0435\u0435\u0442 \u043d\u0430 \u0431\u043e\u0440\u0442\u0443 \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Zigbee. \u0412 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u043e\u0438\u0442 \u0434\u043e 600 \u0440\u0443\u0431\u043b\u0435\u0439 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0430\u0445. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0432 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f ESP32-C6 Mini.<\/p>\n<details class=\"spoiler\">\n<summary>\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 \u043f\u043b\u0430\u0442\u044b<\/summary>\n<div class=\"spoiler__content\">\n<div class=\"floating-image\">\n<figure class=\"float \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1e6\/caf\/bb6\/1e6cafbb673b2561e99a7e4ac77271c1.png\" alt=\"ESP32-C6 Mini\" title=\"ESP32-C6 Mini\" width=\"389\" height=\"645\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/1e6\/caf\/bb6\/1e6cafbb673b2561e99a7e4ac77271c1.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1e6\/caf\/bb6\/1e6cafbb673b2561e99a7e4ac77271c1.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>ESP32-C6 Mini<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/div>\n<\/details>\n<h2>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/h2>\n<p>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 Home Assistant \u0431\u0443\u0434\u0435\u0442 \u0441\u0430\u043c\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0438 \u043e\u0431\u044a\u0435\u043c\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e. \u0412\u0441\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u0430 \u0432 Docker \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u044f\u0437\u044b\u043a \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d Python, \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Flask. \u0414\u043b\u044f ESP \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u044f\u0437\u044b\u043a \u0431\u0443\u0434\u0435\u0442 \u0421, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0437\u0430 \u0441\u0440\u0435\u0434\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u044b \u0431\u0435\u0440\u0451\u043c ESP-IDF.<\/p>\n<p>\u041c\u0435\u043d\u044c\u0448\u0435 \u0441\u043b\u043e\u0432, \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0435\u043b\u0430, \u0430 \u043f\u043e\u044d\u0442\u043e\u043c\u0443&#8230;<\/p>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/h2>\n<p>\u041d\u0443 \u0447\u0442\u043e \u0436\u0435, \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0441\u0440\u0435\u0434\u044b \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u043f\u043e\u0434 ESP, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 ESP-IDF. \u0412\u0441\u0435 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u044f \u0431\u0443\u0434\u0443 \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 Visual Studio Code. <\/p>\n<p>\u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 VS Code \u0438 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0441\u0451 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b Extensions \u0438 \u0432\u0431\u0438\u0442\u044c \u0432 \u043f\u043e\u0438\u0441\u043a &#171;ESP-IDF&#187; \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043f\u043e <a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=espressif.esp-idf-extension\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0438\u0437 <a href=\"https:\/\/gitverse.ru\/kallibr44\/zigbridge-esp\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f<\/a> \u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 VS Code, \u0436\u0434\u0435\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0432\u0438\u0434\u0438\u043c \u0442\u0430\u043a\u043e\u0435 \u043e\u043a\u043d\u043e (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e, \u0442\u043e\u0433\u0434\u0430 \u0432 \u043d\u0451\u043c \u043d\u0430\u0434\u043e \u043d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 &#171;Configure extension&#187;):<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/243\/ee7\/deb\/243ee7deb38bb66ea6ec3227f04e1485.png\" alt=\"\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\" title=\"\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\" width=\"1962\" height=\"696\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/243\/ee7\/deb\/243ee7deb38bb66ea6ec3227f04e1485.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/243\/ee7\/deb\/243ee7deb38bb66ea6ec3227f04e1485.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 Express, \u0441\u0442\u0430\u0432\u0438\u043c \u0433\u0430\u043b\u043e\u0447\u043a\u0443 &#171;Show all tags&#187; \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0440\u0435\u043b\u0438\u0437 \u0432\u0435\u0440\u0441\u0438\u0438 5.2.1, \u0434\u0430\u043b\u0435\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0443\u0442\u0438 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043e\u0432 \u0438 \u0436\u043c\u0451\u043c Install (\u041f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u043c\u0435\u0441\u0442\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u0438\u0442 \u0443\u0447\u0435\u0441\u0442\u044c, \u0447\u0442\u043e \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432 IDF \u0438\u043c\u0435\u0435\u0442 \u0432\u0435\u0441 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0413\u0431).<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ee8\/246\/16f\/ee824616f7a9be9946aa137d5bf749db.png\" alt=\"\u041c\u0435\u043d\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u0435\u0440\u0441\u0438\u0438 ESP-IDF\" title=\"\u041c\u0435\u043d\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u0435\u0440\u0441\u0438\u0438 ESP-IDF\" width=\"1758\" height=\"652\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/ee8\/246\/16f\/ee824616f7a9be9946aa137d5bf749db.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ee8\/246\/16f\/ee824616f7a9be9946aa137d5bf749db.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041c\u0435\u043d\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u0435\u0440\u0441\u0438\u0438 ESP-IDF<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0433\u043e\u0442\u043e\u0432\u043e \u043a \u0440\u0430\u0431\u043e\u0442\u0435.<\/p>\n<h2>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438<\/h2>\n<p>\u041d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u044e \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0438\u043d\u0430\u0447\u0435 \u044d\u0442\u043e \u0437\u0430\u0439\u043c\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u043a \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 ESP.<\/p>\n<p>\u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u043b\u043e\u0433\u0438\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b1d\/cb6\/526\/b1dcb65260570b339775066a17daa60c.png\" alt=\"\u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b ESP\" title=\"\u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b ESP\" width=\"1029\" height=\"436\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b1d\/cb6\/526\/b1dcb65260570b339775066a17daa60c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b1d\/cb6\/526\/b1dcb65260570b339775066a17daa60c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b ESP<\/figcaption><\/div>\n<\/figure>\n<h4>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/h4>\n<details class=\"spoiler\">\n<summary>\u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">void app_main(void){    esp_zb_platform_config_t config = {        .radio_config = ESP_ZB_DEFAULT_RADIO_CONFIG(),        .host_config = ESP_ZB_DEFAULT_HOST_CONFIG(),    };    esp_console_repl_t *repl = NULL;    esp_console_repl_config_t repl_config = ESP_CONSOLE_REPL_CONFIG_DEFAULT();    \/* Prompt to be printed before each line.     * This can be customized, made dynamic, etc.     *\/    repl_config.prompt = PROMPT_STR \"&gt;\";    repl_config.max_cmdline_length = 128;    esp_console_dev_usb_serial_jtag_config_t hw_config = ESP_CONSOLE_DEV_USB_SERIAL_JTAG_CONFIG_DEFAULT();    ESP_ERROR_CHECK(esp_console_new_repl_usb_serial_jtag(&amp;hw_config, &amp;repl_config, &amp;repl));    \/\/hw_config.tx_gpio_num = 12;    \/\/hw_config.rx_gpio_num = 13;    \/\/ESP_ERROR_CHECK(esp_console_new_repl_uart(&amp;hw_config, &amp;repl_config, &amp;repl));    \/\/ \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \"init\"    esp_console_cmd_t initCommand = {        .command = \"init\",        .help = \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u0430 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a\",        .hint = \"&lt;\u0447\u0438\u0441\u043b\u043e1&gt; &lt;\u0447\u0438\u0441\u043b\u043e2&gt; ...\",        .func = &amp;initCommandHandler,    };    esp_console_cmd_t restartCommand = {        .command = \"rst\",        .help = \"\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\",        .hint = NULL,        .func = &amp;restartCommandHandler,    };    ESP_ERROR_CHECK(esp_console_cmd_register(&amp;restartCommand));    ESP_ERROR_CHECK(esp_console_cmd_register(&amp;initCommand));    ESP_ERROR_CHECK(nvs_flash_init());    ESP_ERROR_CHECK(esp_zb_platform_config(&amp;config));    light_driver_init(LIGHT_DEFAULT_OFF);    xTaskCreate(esp_zb_task, \"Zigbee_main\", 4096, NULL, 5, NULL);    ESP_ERROR_CHECK(esp_console_start_repl(repl));    vTaskDelay(pdMS_TO_TICKS(1000));  \/\/ \u041f\u0430\u0443\u0437\u0430 \u0432 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0443}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0443 \u043d\u0430\u0441 \u0440\u0430\u0437\u043c\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u044b \u0438 \u0431\u0443\u0434\u0435\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430\u0448\u0435\u0439 ESP, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430 rst \u0438 init. \u0412 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 .func \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e.<\/p>\n<pre><code class=\"cpp\">    esp_console_cmd_t initCommand = {        .command = \"init\",        .help = \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u0430 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a\",        .hint = \"&lt;\u0447\u0438\u0441\u043b\u043e1&gt; &lt;\u0447\u0438\u0441\u043b\u043e2&gt; ...\",        .func = &amp;initCommandHandler,    };    esp_console_cmd_t restartCommand = {        .command = \"rst\",        .help = \"\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\",        .hint = NULL,        .func = &amp;restartCommandHandler,    };    ESP_ERROR_CHECK(esp_console_cmd_register(&amp;restartCommand));    ESP_ERROR_CHECK(esp_console_cmd_register(&amp;initCommand));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u0442\u044b, \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0435\u0440\u0438\u0439\u043d\u043e\u043c\u0443 \u0432\u044b\u0432\u043e\u0434\u0443 USB \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u043f\u043b\u0430\u0442\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443, \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 Mini \u043f\u043e\u0440\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0447\u0435\u0440\u0435\u0437 JTAG.<\/p>\n<pre><code class=\"cpp\">    esp_console_dev_usb_serial_jtag_config_t hw_config = ESP_CONSOLE_DEV_USB_SERIAL_JTAG_CONFIG_DEFAULT(); \/\/\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u043a\u0430\u043a JTAG, \u0442\u0430\u043a \u0438 UART    ESP_ERROR_CHECK(esp_console_new_repl_usb_serial_jtag(&amp;hw_config, &amp;repl_config, &amp;repl));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0430\u043a \u0436\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0434\u043b\u0438\u043d\u0443 \u0432\u0432\u043e\u0434\u0438\u043c\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u042f \u0443\u043a\u0430\u0437\u0430\u043b 256, \u043d\u043e \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043a\u0430\u043d\u0430\u043b\u044b, \u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0438 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c.<\/p>\n<pre><code class=\"cpp\">repl_config.max_cmdline_length = 256;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430.<\/p>\n<pre><code class=\"cpp\">    light_driver_init(LIGHT_DEFAULT_OFF); \/\/\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0431\u043e\u0440\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430, \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443-\u0442\u043e \u043d\u0430\u0434\u043e (:    xTaskCreate(esp_zb_task, \"Zigbee_main\", 4096, NULL, 5, NULL);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0417\u0430\u043f\u0443\u0441\u043a \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/h4>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c\u0438 \u0436\u0435 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 esp_zb_task() \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0435\u043c\u0430\u0444\u043e\u0440 \u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b init, \u0438\u043d\u0430\u0447\u0435 ESP \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0435\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u043a\u0430\u043d\u0430\u043b\u0430\u0445. clustersSemaphore \u044d\u0442\u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0438 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0438\u0437 \u043b\u044e\u0431\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<pre><code class=\"cpp\">    clustersSemaphore = xSemaphoreCreateBinary();    if (clustersSemaphore == NULL) {        ESP_LOGE(\"APP\", \"\u041e\u0448\u0438\u0431\u043a\u0430: \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0435\u043c\u0430\u0444\u043e\u0440\");        \/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043a\u0438        return;    }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c, \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 init \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043c\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f init \u0438 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0442\u0443 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u043a\u0430\u043d\u0430\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f. \u0424\u0443\u043d\u043a\u0446\u0438\u044f addCluster \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 Zigbee \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0430).<\/p>\n<pre><code class=\"cpp\">static int initCommandHandler(int argc, char **argv) {    for (int i = 1; i &lt; argc; i++) {        \/\/ \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0447\u0438\u0441\u043b\u043e \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a        int val = atoi(argv[i]);        addCluster(val);    }    \/\/ \u0412\u044b\u0432\u043e\u0434 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c (\u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f)    clusters_t *current = head;    while (current != NULL) {        printf(\"%d\", current-&gt;val);        if (current-&gt;next != NULL) {            printf(\", \");        }        current = current-&gt;next;    }    printf(\"\\n\");    if (head != NULL) {        xSemaphoreGive(clustersSemaphore);    }    return ESP_OK;}static void addCluster(int val) {    clusters_t *newCluster = (clusters_t *)malloc(sizeof(clusters_t));    if (newCluster == NULL) {        ESP_LOGE(\"APP\", \"\u041e\u0448\u0438\u0431\u043a\u0430: \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043f\u0438\u0441\u043a\u0430\");        return;    }    newCluster-&gt;val = val;    newCluster-&gt;next = NULL;    if (head == NULL) {        \/\/ \u0415\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0441\u0442, \u043d\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0433\u043e\u043b\u043e\u0432\u043e\u0439 \u0438 \u0445\u0432\u043e\u0441\u0442\u043e\u043c        head = newCluster;        tail = newCluster;    } else {        \/\/ \u0418\u043d\u0430\u0447\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u043e\u043d\u0435\u0446 \u0441\u043f\u0438\u0441\u043a\u0430        tail-&gt;next = newCluster;        tail = newCluster;    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u043a\u0430\u043d\u0430\u043b\u043e\u0432, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u043c\u0430\u0444\u043e\u0440 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u043e \u043a\u0430\u043d\u0430\u043b\u0430\u043c. \u0412\u0441\u044e \u043f\u043e\u0440\u0442\u044f\u043d\u043a\u0443 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u0431\u0443\u0434\u0435\u043c, \u0432\u00a0\u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u0432\u0430\u0445\u00a0\u2014 \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c Zigbee \u0441\u0442\u0435\u043a, \u0437\u0430\u0434\u0430\u0432\u0430\u044f \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432\u00a0\u044d\u0444\u0438\u0440 \u043d\u0430\u0448\u0430 \u043f\u043b\u0430\u0442\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0430 \u00ab\u042f \u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0430 \u0441\u00a0\u0442\u0430\u043a\u0438\u043c\u0438\u2011\u0442\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u043c\u0438, \u0443\u00a0\u043c\u0435\u043d\u044f \u0442\u0430\u043a\u043e\u0439\u2011\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c, \u043c\u043e\u0434\u0435\u043b\u044c \u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u00bb.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">\/\/ \u0415\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a clusters \u043f\u0443\u0441\u0442, \u0436\u0434\u0435\u043c \u0435\u0433\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f            if (xSemaphoreTake(clustersSemaphore, portMAX_DELAY) == pdTRUE) {                                \/* initialize Zigbee stack *\/                esp_zb_cfg_t zb_nwk_cfg = ESP_ZB_ZED_CONFIG();                esp_zb_init(&amp;zb_nwk_cfg);                \/* basic cluster create with fully customized *\/                set_zcl_string(manufacturer, \"kallibr44\");                set_zcl_string(model, \"emulated_light\");                set_zcl_string(firmware_version, \"0.0.1\");                uint8_t dc_power_source;                dc_power_source = 4;                uint16_t undefined_value;                undefined_value = 0x8000;                                \/* identify cluster create with fully customized *\/                uint8_t identyfi_id;                identyfi_id = 0;                esp_zb_cluster_list_t *esp_zb_cluster_list = esp_zb_zcl_cluster_list_create();                \/\/esp_zb_cluster_list_t *esp_zb_cluster_switch = esp_zb_zcl_cluster_list_create();                esp_zb_attribute_list_t *esp_zb_identify_cluster = esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_IDENTIFY);                esp_zb_identify_cluster_add_attr(esp_zb_identify_cluster, ESP_ZB_ZCL_CMD_IDENTIFY_IDENTIFY_ID, &amp;identyfi_id);                \/* Basic cluster data*\/                esp_zb_attribute_list_t *esp_zb_basic_cluster = esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_BASIC);                esp_zb_basic_cluster_add_attr(esp_zb_basic_cluster, ESP_ZB_ZCL_ATTR_BASIC_MANUFACTURER_NAME_ID, manufacturer);                esp_zb_basic_cluster_add_attr(esp_zb_basic_cluster, ESP_ZB_ZCL_ATTR_BASIC_MODEL_IDENTIFIER_ID, model);                esp_zb_basic_cluster_add_attr(esp_zb_basic_cluster, ESP_ZB_ZCL_ATTR_BASIC_SW_BUILD_ID, firmware_version);                esp_zb_basic_cluster_add_attr(esp_zb_basic_cluster, ESP_ZB_ZCL_ATTR_BASIC_POWER_SOURCE_ID, &amp;dc_power_source);  \/** \u0432\u0430\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u043e\u043c\u0435\u0440 4, \u0442\u043e\u0433\u0434\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043e\u0440 \u0441\u043c\u043e\u0436\u0435\u0442 \u0447\u0430\u0449\u0435 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u043e\u0442 \u043d\u0435\u0433\u043e \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u0441\u043d\u0430*\/                            esp_zb_on_off_light_cfg_t light_cfg = ESP_ZB_DEFAULT_ON_OFF_LIGHT_CONFIG();                \/\/esp_zb_ep_list_t *esp_zb_on_off_light_ep = esp_zb_on_off_light_ep_create(HA_ESP_LIGHT_ENDPOINT, &amp;light_cfg);                esp_zb_attribute_list_t *zb_light_cfg = esp_zb_on_off_cluster_create(&amp;light_cfg);                                esp_zb_cluster_list_add_basic_cluster(esp_zb_cluster_list,esp_zb_basic_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE);                esp_zb_cluster_list_add_identify_cluster(esp_zb_cluster_list,esp_zb_identify_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE);                esp_zb_cluster_list_add_on_off_cluster(esp_zb_cluster_list,zb_light_cfg,ESP_ZB_ZCL_CLUSTER_SERVER_ROLE);                \/\/esp_zb_ep_list_update_ep(esp_zb_on_off_light_ep, esp_zb_cluster_list, 1, ESP_ZB_AF_HA_PROFILE_ID, ESP_ZB_HA_ON_OFF_LIGHT_DEVICE_ID);                esp_zb_ep_list_t *esp_zb_ep_list = esp_zb_ep_list_create();                clusters_t *current = head;                while (current != NULL) {                    esp_zb_endpoint_config_t ep_config = {                        .endpoint = current-&gt;val,                        .app_device_id = ESP_ZB_HA_ON_OFF_LIGHT_DEVICE_ID,                        .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID                    };                    esp_zb_ep_list_add_ep(esp_zb_ep_list, esp_zb_cluster_list,ep_config);                    \/\/printf(\"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: %d\\n\", current-&gt;val);                    current = current-&gt;next;                }                \/\/ \u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b                clusters_t *current_free = head;                while (current_free != NULL) {                    clusters_t *next = current_free-&gt;next;                    free(current_free);                    current_free = next;                }                esp_zb_device_register(esp_zb_ep_list);                esp_zb_core_action_handler_register(zb_action_handler);                esp_zb_set_primary_network_channel_set(ESP_ZB_PRIMARY_CHANNEL_MASK);                ESP_ERROR_CHECK(esp_zb_start(false));                esp_zb_main_loop_iteration();            }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u0412\u0441\u044f \u043c\u0430\u0433\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043a\u043e\u043d\u0446\u0435 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u0437\u043e\u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439: \u043c\u044b \u0431\u0435\u0440\u0451\u043c \u043d\u0430\u0448 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u043d\u0430\u043b\u043e\u0432 (\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f head) \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0448\u0442\u0430\u043c\u043f\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0434 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u043a \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432.<\/p>\n<pre><code class=\"cpp\">                \/\/esp_zb_ep_list_update_ep(esp_zb_on_off_light_ep, esp_zb_cluster_list, 1, ESP_ZB_AF_HA_PROFILE_ID, ESP_ZB_HA_ON_OFF_LIGHT_DEVICE_ID);                esp_zb_ep_list_t *esp_zb_ep_list = esp_zb_ep_list_create();                clusters_t *current = head;                while (current != NULL) {                    esp_zb_endpoint_config_t ep_config = {                        .endpoint = current-&gt;val,                        .app_device_id = ESP_ZB_HA_ON_OFF_LIGHT_DEVICE_ID,                        .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID                    };                    esp_zb_ep_list_add_ep(esp_zb_ep_list, esp_zb_cluster_list,ep_config);                    \/\/printf(\"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: %d\\n\", current-&gt;val);                    current = current-&gt;next;                }                \/\/ \u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b                clusters_t *current_free = head;                while (current_free != NULL) {                    clusters_t *next = current_free-&gt;next;                    free(current_free);                    current_free = next;                }                esp_zb_device_register(esp_zb_ep_list);                esp_zb_core_action_handler_register(zb_action_handler);                esp_zb_set_primary_network_channel_set(ESP_ZB_PRIMARY_CHANNEL_MASK);                ESP_ERROR_CHECK(esp_zb_start(false));                esp_zb_main_loop_iteration();<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439, \u0432 \u0441\u0435\u0442\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u0435\u0432\u0430\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u044f \u0432 \u0441\u0435\u0431\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0443 \u0435\u0449\u0435 (\u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u044b init) \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432-\u043b\u0430\u043c\u043f\u043e\u0447\u0435\u043a. \u0414\u043b\u044f zigbee \u0441\u0435\u0442\u0438, \u044d\u0442\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 &#171;\u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0438&#187; \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438 \u0434\u0435\u0432\u0430\u0439\u0441\u0430\u043c\u0438. <\/p>\n<h4>\u0417\u0430\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438<\/h4>\n<p>\u0418 \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043e\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043e\u0440\u0430. \u0417\u0430 \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f zb_action_handler, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0432\u044b\u0448\u0435 \u0432 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432.<\/p>\n<pre><code class=\"cpp\">static esp_err_t zb_attribute_handler(const esp_zb_zcl_set_attr_value_message_t *message){    esp_err_t ret = ESP_OK;    bool light_state = 0;    ESP_RETURN_ON_FALSE(message, ESP_FAIL, TAG, \"Empty message\");    ESP_RETURN_ON_FALSE(message-&gt;info.status == ESP_ZB_ZCL_STATUS_SUCCESS, ESP_ERR_INVALID_ARG, TAG,                        \"Received message: error status(%d)\", message-&gt;info.status);    ESP_LOGI(TAG, \"Received message: endpoint(%d), cluster(0x%x), attribute(0x%x), data size(%d)\",             message-&gt;info.dst_endpoint, message-&gt;info.cluster, message-&gt;attribute.id, message-&gt;attribute.data.size);        if (message-&gt;info.cluster == ESP_ZB_ZCL_CLUSTER_ID_ON_OFF) {            if (message-&gt;attribute.id == ESP_ZB_ZCL_ATTR_ON_OFF_ON_OFF_ID &amp;&amp;                message-&gt;attribute.data.type == ESP_ZB_ZCL_ATTR_TYPE_BOOL) {                light_state = message-&gt;attribute.data.value ? *(bool *)message-&gt;attribute.data.value : light_state;                ESP_LOGI(TAG, \"|{'cl':%d,'st':%d}|\",message-&gt;info.dst_endpoint, *(bool *)message-&gt;attribute.data.value);                light_driver_set_power(light_state);            }        }    return ret;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0430\u0436\u0434\u043e\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 message, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u0441\u0447\u0435\u0440\u043f\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0447\u0435\u0440\u0435\u0437 ESP_RETURN_ON_FALSE(), \u0430 \u0434\u0430\u043b\u0435\u0435 \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043c\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u0441\u0435\u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 ON_OFF (message-&gt;info.cluster == ESP_ZB_ZCL_CLUSTER_ID_ON_OFF), \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u0441\u0435\u0438\u0432\u0430\u0435\u043c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 ON_OFF \u0438 \u0442\u043e, \u0447\u0442\u043e \u043e\u043d \u0438\u043c\u0435\u0435\u0442 \u0431\u0443\u043b\u0435\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (message-&gt;<a href=\"http:\/\/attribute.id\" rel=\"noopener noreferrer nofollow\">attribute.id<\/a> == ESP_ZB_ZCL_ATTR_ON_OFF_ON_OFF_ID &amp;&amp;<br \/> message-&gt;<a href=\"http:\/\/attribute.data\" rel=\"noopener noreferrer nofollow\">attribute.data<\/a>.type == ESP_ZB_ZCL_ATTR_TYPE_BOOL) \u0438 \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0443\u0431\u0435\u0434\u0438\u043b\u0438\u0441\u044c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u0445\u043e\u0442\u0435\u043b\u0438, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 JSON \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u043d\u0430 \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 (ESP_LOGI(TAG, &#171;|{&#8216;cl&#8217;:%d,&#8217;st&#8217;:%d}|&#187;,message-&gt;info.dst_endpoint, <em>(bool <\/em>)message-&gt;<a href=\"http:\/\/attribute.data\" rel=\"noopener noreferrer nofollow\">attribute.data<\/a>.value);)<\/p>\n<h3>\u0421\u0431\u043e\u0440\u043a\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0432\u044b \u0438\u0437\u0443\u0447\u0438\u043b\u0438 \u0438, \u0435\u0441\u043b\u0438 \u0431\u044b\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438 \u043a\u043e\u0434, \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043f\u043b\u0430\u0442\u043e\u0439.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/648\/524\/113\/648524113c6cbd60376755273dcebb6d.png\" width=\"836\" height=\"107\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/648\/524\/113\/648524113c6cbd60376755273dcebb6d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/648\/524\/113\/648524113c6cbd60376755273dcebb6d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u0440\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u043f\u043e \u043f\u0443\u043d\u043a\u0442\u0430\u043c \u043c\u0435\u043d\u044e:<\/p>\n<ol>\n<li>\n<p>\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f ESP-IDF<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 ESP. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c UART, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0448\u0438\u0432\u0430\u0435\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 usb.<\/p>\n<\/li>\n<li>\n<p>COM \u043f\u043e\u0440\u0442 \u0441 \u043f\u043b\u0430\u0442\u043e\u0439. \u0414\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u044d\u0442\u0443 \u043a\u043d\u043e\u043f\u043a\u0443 \u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043d\u0443\u0436\u043d\u044b\u0439 \u043f\u043e\u0440\u0442.<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0434\u0435\u043b\u044c ESP, \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u043a\u044d\u0448\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041f\u043e\u043b\u0435\u0437\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f &#171;\u0437\u0430\u043b\u0438\u043f\u0430\u044e\u0442&#187;, \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0438\u0441\u0442\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443<\/p>\n<\/li>\n<li>\n<p>\u0421\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. <\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0448\u0438\u0432\u043a\u0430 ESP.<\/p>\n<\/li>\n<li>\n<p>&#171;\u0412\u0441\u0451 \u0432 \u043e\u0434\u043d\u043e\u043c&#187; &#8212; \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438, \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c ESP \u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043e\u043a\u043d\u0430 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u0443\u043c\u0430\u044e \u0442\u0443\u0442 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043d\u0430 \u0447\u0435\u043c-\u0442\u043e \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0438\u0448\u044c \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 ESP \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e\u0434 \u0446\u0438\u0444\u0440\u043e\u0439 8, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0432 \u043d\u0443\u0436\u043d\u044b\u0439 COM \u043f\u043e\u0440\u0442. \u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0433\u043e\u0442\u043e\u0432\u0430.<\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0441 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0435\u0439, \u0435\u0451 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u0438 \u0440\u0435\u043b\u0438\u0437\u043e\u043c, \u0434\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0435\u0451 \u0432 Home Assistant.<\/p>\n<\/div>\n<p>\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\/947514\/\">https:\/\/habr.com\/ru\/articles\/947514\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0441\u043e\u0431\u0435\u0440\u0451\u043c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u0434\u043b\u044f ESP \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c\u0441\u044f \u043a \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438.\u0427\u0430\u0441\u0442\u044c 1. \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0427\u0430\u0441\u0442\u044c 2. \u0410\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c (\u0432\u044b \u0437\u0434\u0435\u0441\u044c)\u0427\u0430\u0441\u0442\u044c 3. \u0422\u0435\u043e\u0440\u0438\u044f \u043f\u043e \u0430\u0434\u0434\u043e\u043d\u0430\u043c Home Assistant + \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 ZigBridge\u0410\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 ESP32-C6, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u0435\u0435\u0442 \u043d\u0430 \u0431\u043e\u0440\u0442\u0443 \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Zigbee. \u0412 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u043e\u0438\u0442 \u0434\u043e 600 \u0440\u0443\u0431\u043b\u0435\u0439 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0430\u0445. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0432 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f ESP32-C6 Mini.\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 \u043f\u043b\u0430\u0442\u044bESP32-C6 Mini\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 Home Assistant \u0431\u0443\u0434\u0435\u0442 \u0441\u0430\u043c\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0438 \u043e\u0431\u044a\u0435\u043c\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e. \u0412\u0441\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u0430 \u0432 Docker \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u044f\u0437\u044b\u043a \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d Python, \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Flask. \u0414\u043b\u044f ESP \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u044f\u0437\u044b\u043a \u0431\u0443\u0434\u0435\u0442 \u0421, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0437\u0430 \u0441\u0440\u0435\u0434\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u044b \u0431\u0435\u0440\u0451\u043c ESP-IDF.\u041c\u0435\u043d\u044c\u0448\u0435 \u0441\u043b\u043e\u0432, \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0435\u043b\u0430, \u0430 \u043f\u043e\u044d\u0442\u043e\u043c\u0443&#8230;\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u041d\u0443 \u0447\u0442\u043e \u0436\u0435, \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0441\u0440\u0435\u0434\u044b \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u043f\u043e\u0434 ESP, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 ESP-IDF. \u0412\u0441\u0435 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u044f \u0431\u0443\u0434\u0443 \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 Visual Studio Code. \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 VS Code \u0438 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0441\u0451 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b Extensions \u0438 \u0432\u0431\u0438\u0442\u044c \u0432 \u043f\u043e\u0438\u0441\u043a &#171;ESP-IDF&#187; \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 VS Code, \u0436\u0434\u0435\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0432\u0438\u0434\u0438\u043c \u0442\u0430\u043a\u043e\u0435 \u043e\u043a\u043d\u043e (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e, \u0442\u043e\u0433\u0434\u0430 \u0432 \u043d\u0451\u043c \u043d\u0430\u0434\u043e \u043d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 &#171;Configure extension&#187;):\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 Express, \u0441\u0442\u0430\u0432\u0438\u043c \u0433\u0430\u043b\u043e\u0447\u043a\u0443 &#171;Show all tags&#187; \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0440\u0435\u043b\u0438\u0437 \u0432\u0435\u0440\u0441\u0438\u0438 5.2.1, \u0434\u0430\u043b\u0435\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0443\u0442\u0438 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043e\u0432 \u0438 \u0436\u043c\u0451\u043c Install (\u041f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u043c\u0435\u0441\u0442\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u0438\u0442 \u0443\u0447\u0435\u0441\u0442\u044c, \u0447\u0442\u043e \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432 IDF \u0438\u043c\u0435\u0435\u0442 \u0432\u0435\u0441 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0413\u0431).\u041c\u0435\u043d\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u0435\u0440\u0441\u0438\u0438 ESP-IDF\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0433\u043e\u0442\u043e\u0432\u043e \u043a \u0440\u0430\u0431\u043e\u0442\u0435.\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438\u041d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u044e \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0438\u043d\u0430\u0447\u0435 \u044d\u0442\u043e \u0437\u0430\u0439\u043c\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u043a \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 ESP.\u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u043b\u043e\u0433\u0438\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c\u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b ESP\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\u043a\u043e\u0434void app_main(void){    esp_zb_platform_config_t config = {        .radio_config = ESP_ZB_DEFAULT_RADIO_CONFIG(),        .host_config = ESP_ZB_DEFAULT_HOST_CONFIG(),    };    esp_console_repl_t *repl = NULL;    esp_console_repl_config_t repl_config = ESP_CONSOLE_REPL_CONFIG_DEFAULT();    \/* Prompt to be printed before each line.     * This can be customized, made dynamic, etc.     *\/    repl_config.prompt = PROMPT_STR &#171;&gt;&#187;;    repl_config.max_cmdline_length = 128;    esp_console_dev_usb_serial_jtag_config_t hw_config = ESP_CONSOLE_DEV_USB_SERIAL_JTAG_CONFIG_DEFAULT();    ESP_ERROR_CHECK(esp_console_new_repl_usb_serial_jtag(&amp;hw_config, &amp;repl_config, &amp;repl));    \/\/hw_config.tx_gpio_num = 12;    \/\/hw_config.rx_gpio_num = 13;    \/\/ESP_ERROR_CHECK(esp_console_new_repl_uart(&amp;hw_config, &amp;repl_config, &amp;repl));    \/\/ \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b &#171;init&#187;    esp_console_cmd_t initCommand = {        .command = &#171;init&#187;,        .help = &#171;\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u0430 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a&#187;,        .hint = &#171;&lt;\u0447\u0438\u0441\u043b\u043e1&gt; &lt;\u0447\u0438\u0441\u043b\u043e2&gt; &#8230;&#187;,        .func = &amp;initCommandHandler,    };    esp_console_cmd_t restartCommand = {        .command = &#171;rst&#187;,        .help = &#171;\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430&#187;,        .hint = NULL,        .func = &amp;restartCommandHandler,    };    ESP_ERROR_CHECK(esp_console_cmd_register(&amp;restartCommand));    ESP_ERROR_CHECK(esp_console_cmd_register(&amp;initCommand));    ESP_ERROR_CHECK(nvs_flash_init());    ESP_ERROR_CHECK(esp_zb_platform_config(&amp;config));    light_driver_init(LIGHT_DEFAULT_OFF);    xTaskCreate(esp_zb_task, &#171;Zigbee_main&#187;, 4096, NULL, 5, NULL);    ESP_ERROR_CHECK(esp_console_start_repl(repl));    vTaskDelay(pdMS_TO_TICKS(1000));  \/\/ \u041f\u0430\u0443\u0437\u0430 \u0432 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0443}\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0443 \u043d\u0430\u0441 \u0440\u0430\u0437\u043c\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u044b \u0438 \u0431\u0443\u0434\u0435\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430\u0448\u0435\u0439 ESP, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430 rst \u0438 init. \u0412 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 .func \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e.    esp_console_cmd_t initCommand = {        .command = &#171;init&#187;,        .help = &#171;\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u0430 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a&#187;,        .hint = &#171;&lt;\u0447\u0438\u0441\u043b\u043e1&gt; &lt;\u0447\u0438\u0441\u043b\u043e2&gt; &#8230;&#187;,        .func = &amp;initCommandHandler,    };    esp_console_cmd_t restartCommand = {        .command = &#171;rst&#187;,        .help = &#171;\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430&#187;,        .hint = NULL,        .func = &amp;restartCommandHandler,    };    ESP_ERROR_CHECK(esp_console_cmd_register(&amp;restartCommand));    ESP_ERROR_CHECK(esp_console_cmd_register(&amp;initCommand));\u0421\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u0442\u044b, \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0435\u0440\u0438\u0439\u043d\u043e\u043c\u0443 \u0432\u044b\u0432\u043e\u0434\u0443 USB \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u043f\u043b\u0430\u0442\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443, \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 Mini \u043f\u043e\u0440\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0447\u0435\u0440\u0435\u0437 JTAG.    esp_console_dev_usb_serial_jtag_config_t hw_config = ESP_CONSOLE_DEV_USB_SERIAL_JTAG_CONFIG_DEFAULT(); \/\/\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u043a\u0430\u043a JTAG, \u0442\u0430\u043a \u0438 UART    ESP_ERROR_CHECK(esp_console_new_repl_usb_serial_jtag(&amp;hw_config, &amp;repl_config, &amp;repl));\u0422\u0430\u043a \u0436\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0434\u043b\u0438\u043d\u0443 \u0432\u0432\u043e\u0434\u0438\u043c\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u042f \u0443\u043a\u0430\u0437\u0430\u043b 256, \u043d\u043e \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043a\u0430\u043d\u0430\u043b\u044b, \u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0438 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c.repl_config.max_cmdline_length = 256;\u0418 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430.    light_driver_init(LIGHT_DEFAULT_OFF); \/\/\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0431\u043e\u0440\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430, \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443-\u0442\u043e \u043d\u0430\u0434\u043e (:    xTaskCreate(esp_zb_task, &#171;Zigbee_main&#187;, 4096, NULL, 5, NULL);\u0417\u0430\u043f\u0443\u0441\u043a \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438\u041f\u0435\u0440\u0432\u044b\u043c\u0438 \u0436\u0435 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 esp_zb_task() \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0435\u043c\u0430\u0444\u043e\u0440 \u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b init, \u0438\u043d\u0430\u0447\u0435 ESP \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0435\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u043a\u0430\u043d\u0430\u043b\u0430\u0445. clustersSemaphore \u044d\u0442\u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0438 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0438\u0437 \u043b\u044e\u0431\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.    clustersSemaphore = xSemaphoreCreateBinary();    if (clustersSemaphore == NULL) {        ESP_LOGE(&#171;APP&#187;, &#171;\u041e\u0448\u0438\u0431\u043a\u0430: \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0435\u043c\u0430\u0444\u043e\u0440&#187;);        \/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043a\u0438        return;    }\u0422\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c, \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 init \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043c\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f init \u0438 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0442\u0443 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u043a\u0430\u043d\u0430\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f. \u0424\u0443\u043d\u043a\u0446\u0438\u044f addCluster \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 Zigbee \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0430).static int initCommandHandler(int argc, char **argv) {    for (int i = 1; i &lt; argc; i++) {        \/\/ \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0447\u0438\u0441\u043b\u043e \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a        int val = atoi(argv[i]);        addCluster(val);    }    \/\/ \u0412\u044b\u0432\u043e\u0434 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c (\u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f)    clusters_t *current = head;    while (current != NULL) {        printf(&#171;%d&#187;, current-&gt;val);        if (current-&gt;next != NULL) {            printf(&#171;, &#171;);        }        current = current-&gt;next;    }    printf(&#171;\\n&#187;);    if (head != NULL) {        xSemaphoreGive(clustersSemaphore);    }    return ESP_OK;}static void addCluster(int val) {    clusters_t *newCluster = (clusters_t *)malloc(sizeof(clusters_t));    if (newCluster == NULL) {        ESP_LOGE(&#171;APP&#187;, &#171;\u041e\u0448\u0438\u0431\u043a\u0430: \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043f\u0438\u0441\u043a\u0430&#187;);        return;    }    newCluster-&gt;val = val;    newCluster-&gt;next = NULL;    if (head == NULL) {        \/\/ \u0415\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0441\u0442, \u043d\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0433\u043e\u043b\u043e\u0432\u043e\u0439 \u0438 \u0445\u0432\u043e\u0441\u0442\u043e\u043c        head = newCluster;        tail = newCluster;    } else {        \/\/ \u0418\u043d\u0430\u0447\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u043e\u043d\u0435\u0446 \u0441\u043f\u0438\u0441\u043a\u0430        tail-&gt;next = newCluster;        tail = newCluster;    }}\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u043a\u0430\u043d\u0430\u043b\u043e\u0432, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u043c\u0430\u0444\u043e\u0440 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u043e \u043a\u0430\u043d\u0430\u043b\u0430\u043c. \u0412\u0441\u044e \u043f\u043e\u0440\u0442\u044f\u043d\u043a\u0443 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u0431\u0443\u0434\u0435\u043c, \u0432\u00a0\u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u0432\u0430\u0445\u00a0\u2014 \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c Zigbee \u0441\u0442\u0435\u043a, \u0437\u0430\u0434\u0430\u0432\u0430\u044f \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432\u00a0\u044d\u0444\u0438\u0440 \u043d\u0430\u0448\u0430 \u043f\u043b\u0430\u0442\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0430 \u00ab\u042f \u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0430 \u0441\u00a0\u0442\u0430\u043a\u0438\u043c\u0438\u2011\u0442\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u043c\u0438, \u0443\u00a0\u043c\u0435\u043d\u044f \u0442\u0430\u043a\u043e\u0439\u2011\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c, \u043c\u043e\u0434\u0435\u043b\u044c \u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u00bb.\u041a\u043e\u0434 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\/\/ \u0415\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a clusters \u043f\u0443\u0441\u0442, \u0436\u0434\u0435\u043c \u0435\u0433\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f            if (xSemaphoreTake(clustersSemaphore, portMAX_DELAY) == pdTRUE) {                                \/* initialize Zigbee stack *\/                esp_zb_cfg_t zb_nwk_cfg = ESP_ZB_ZED_CONFIG();                esp_zb_init(&amp;zb_nwk_cfg);                \/* basic cluster create with fully customized *\/                set_zcl_string(manufacturer, &#171;kallibr44&#187;);                set_zcl_string(model, &#171;emulated_light&#187;);                set_zcl_string(firmware_version, &#171;0.0.1&#187;);                uint8_t dc_power_source;                dc_power_source = 4;                uint16_t undefined_value;                undefined_value = 0x8000;                                \/* identify cluster create with fully customized *\/                uint8_t identyfi_id;                identyfi_id = 0;                esp_zb_cluster_list_t *esp_zb_cluster_list = esp_zb_zcl_cluster_list_create();                \/\/esp_zb_cluster_list_t *esp_zb_cluster_switch = esp_zb_zcl_cluster_list_create();                esp_zb_attribute_list_t *esp_zb_identify_cluster = esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_IDENTIFY);                esp_zb_identify_cluster_add_attr(esp_zb_identify_cluster, ESP_ZB_ZCL_CMD_IDENTIFY_IDENTIFY_ID, &amp;identyfi_id);                \/* Basic cluster data*\/                esp_zb_attribute_list_t *esp_zb_basic_cluster = esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_BASIC);                esp_zb_basic_cluster_add_attr(esp_zb_basic_cluster, ESP_ZB_ZCL_ATTR_BASIC_MANUFACTURER_NAME_ID, manufacturer);                esp_zb_basic_cluster_add_attr(esp_zb_basic_cluster, ESP_ZB_ZCL_ATTR_BASIC_MODEL_IDENTIFIER_ID, model);                esp_zb_basic_cluster_add_attr(esp_zb_basic_cluster, ESP_ZB_ZCL_ATTR_BASIC_SW_BUILD_ID, firmware_version);                esp_zb_basic_cluster_add_attr(esp_zb_basic_cluster, ESP_ZB_ZCL_ATTR_BASIC_POWER_SOURCE_ID, &amp;dc_power_source);  \/** \u0432\u0430\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u043e\u043c\u0435\u0440 4, \u0442\u043e\u0433\u0434\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043e\u0440 \u0441\u043c\u043e\u0436\u0435\u0442 \u0447\u0430\u0449\u0435 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u043e\u0442 \u043d\u0435\u0433\u043e \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u0441\u043d\u0430*\/                            esp_zb_on_off_light_cfg_t light_cfg = ESP_ZB_DEFAULT_ON_OFF_LIGHT_CONFIG();                \/\/esp_zb_ep_list_t *esp_zb_on_off_light_ep = esp_zb_on_off_light_ep_create(HA_ESP_LIGHT_ENDPOINT, &amp;light_cfg);         &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-475299","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/475299","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=475299"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/475299\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=475299"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=475299"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=475299"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}