Arduino Mega Server
Модератор: Alex
-
- Сообщения: 2575
- Зарегистрирован: Пт ноя 06, 2015 10:22 am
- Откуда: Кишинёв
- Благодарил (а): 303 раза
- Поблагодарили: 282 раза
Re: Arduino Mega Server
Нет , не накладываются. Так исторически получилось , что логирование и графики на одной странице. Просто разрабатывали одновременно и параллельно )) По уму эту страницу надо разделить на две.
Так библа amcharts и так локально лежит. Быстрее не получится обработать. Может , конечно , и новее есть. Три года всё таки прошло.
Кстати , если гафкнуть на название графика на странице - он исчезнет. Вот с полосой прокрутки глюк вышел - там картинка лежит во вложенной папке , а АМС я так и не научил работать с новой библиотекой SD/ карты. Хотя ser009 вроде бы её заменил на новую.
Сам дистрибутив АМС - по сути это и есть движек для рисования сайтов. 98 % кода только этим и занимается.
Далласы работают на всех платформах - и библиотека тут ни причём. Просто надо их ID правильно вписать в код - в сериале при старте они видны.
С библиотекой для FTP не понятный глюк - Отдельно на ESP32 работает прекрасно. Скорость приличная. 20 метров файл влетает за несколько секунд. А вот в составе сервера не хочет работать. Как только устанавливаю соединение - сервер сбрасывается. Почему - я не знаю. Это Егорку пытать надо.
К тому же сейчас заливка файлов по воздуху нативно работает очень шустро. ( на есп32 ))
Так библа amcharts и так локально лежит. Быстрее не получится обработать. Может , конечно , и новее есть. Три года всё таки прошло.
Кстати , если гафкнуть на название графика на странице - он исчезнет. Вот с полосой прокрутки глюк вышел - там картинка лежит во вложенной папке , а АМС я так и не научил работать с новой библиотекой SD/ карты. Хотя ser009 вроде бы её заменил на новую.
Сам дистрибутив АМС - по сути это и есть движек для рисования сайтов. 98 % кода только этим и занимается.
Далласы работают на всех платформах - и библиотека тут ни причём. Просто надо их ID правильно вписать в код - в сериале при старте они видны.
С библиотекой для FTP не понятный глюк - Отдельно на ESP32 работает прекрасно. Скорость приличная. 20 метров файл влетает за несколько секунд. А вот в составе сервера не хочет работать. Как только устанавливаю соединение - сервер сбрасывается. Почему - я не знаю. Это Егорку пытать надо.
К тому же сейчас заливка файлов по воздуху нативно работает очень шустро. ( на есп32 ))
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
-
- Сообщения: 12
- Зарегистрирован: Сб мар 21, 2020 9:28 am
- Благодарил (а): 6 раз
- Поблагодарили: 0
Re: Arduino Mega Server
Все получилось, графики увидел, архив сообщений тоже. Даже свой лог сегодняшний подредактировал под нужный формат, подсунул, увидел отрисованные графики. Благодарствую ))
Там сейчас красота ваще... Последняя версия текущая, amCharts 4, такое позволяет рисовать и так круто выглядит, прям руки чешутся..serghei писал(а): ↑Вт апр 28, 2020 11:14 pmНет , не накладываются. Так исторически получилось , что логирование и графики на одной странице. Просто разрабатывали одновременно и параллельно )) По уму эту страницу надо разделить на две.
Так библа amcharts и так локально лежит. Быстрее не получится обработать. Может , конечно , и новее есть. Три года всё таки прошло.
Угу, обратил внимание. Еще и картинка какая-то необычная, *.svg расширение, первый раз такое вижу.
Ну не знаю.. Вроде обращался по адресам, помню что в момент инициализации они находились, и на этом все заканчивалось. Установка разрешения уже не работала, и дальше по ходу работы АМС стабильно -127 выдавали показания.
Это же или сама прошивка, или файлы в SPIFFS. А если на SD карту надо?
-
- Сообщения: 182
- Зарегистрирован: Чт ноя 24, 2016 10:47 am
- Благодарил (а): 5 раз
- Поблагодарили: 25 раз
Re: Arduino Mega Server
ESP8266
SD --> libraries/ESP8266WebServer/examples/SDWebServer
Прошивка --> libraries/ESP8266WebServer/examples/WebUpdate
SPIFFS --> libraries/ESP8266WebServer/examples/FSBrowser
ESP32
SD --> libraries/WebServer/examples/SDWebServer
Прошивка --> libraries/WebServer/examples/WebUpdate
SPIFFS --> libraries/WebServer/examples/FSBrowser
Очень шустро!?, да ладно, для сравнения.
СпойлерПоказать
Код: Выделить всё
19:53:28.248 -> *** Test upload WebServer.h ***
19:53:28.248 -> Upload Start: update_test_ESP32.ino.esp32.bin
19:53:39.855 -> SDK: v3.3.1-61-g367c3c09c
19:53:39.855 -> Time UPLOAD: 11.62 sec.
19:53:39.855 -> Speed UPLOAD: 536.85 Kbit/s
19:53:39.855 -> Upload Success: 798768 bytes
19:53:39.855 ->
19:54:03.161 -> *** Test upload ESPAsyncWebServer.h ***
19:54:03.161 -> Upload Start: update_test_ESP32.ino.esp32.bin
19:54:04.050 -> SDK: v3.3.1-61-g367c3c09c
19:54:04.050 -> Time UPLOAD: 0.92 sec.
19:54:04.050 -> Speed UPLOAD: 6775.65 Kbit/s
19:54:04.050 -> Upload Success: 798768 bytes
-
- Сообщения: 2575
- Зарегистрирован: Пт ноя 06, 2015 10:22 am
- Откуда: Кишинёв
- Благодарил (а): 303 раза
- Поблагодарили: 282 раза
Re: Arduino Mega Server
Заливать по воздуху можно как саму прошивку , так и файлы. К тому же файлы можно редактировать прямо в браузере. Но осторожно! , после такого редактирования не будет файла в исходнике!
Для ESP32 c SD картой забрось на карту 5 файлов именно АРХИВАМИ! Так же страницу edit.htm с заменой старой Так же сам код в ЕСП32 с картой
Код: Выделить всё
/*
Modul HTTP
part of Arduino Mega Server project
*/
#ifdef HTTP_FEATURE
#include "WebServer.h"
#include "Update.h"
#define HTTP_PORT 8080
WebServer HTTP(HTTP_PORT);
File fsUploadFile;
String getContentType(String filename){
if(HTTP.hasArg("download")) return "application/octet-stream";
else if(filename.endsWith(".htm")) return "text/html";
else if(filename.endsWith(".html")) return "text/html";
else if(filename.endsWith(".css")) return "text/css";
else if(filename.endsWith(".csv")) return "text/plain";
else if(filename.endsWith(".cfg")) return "text/plain";
else if(filename.endsWith(".js")) return "application/javascript";
else if(filename.endsWith(".png")) return "image/png";
else if(filename.endsWith(".gif")) return "image/gif";
else if(filename.endsWith(".jpg")) return "image/jpeg";
else if(filename.endsWith(".ico")) return "image/x-icon";
else if(filename.endsWith(".xml")) return "text/xml";
else if(filename.endsWith(".pdf")) return "application/x-pdf";
else if(filename.endsWith(".zip")) return "application/x-zip";
else if(filename.endsWith(".gz")) return "application/x-gzip";
return "text/plain";
}
bool handleFileRead(String path){
Serial.println("handleFileRead: " + path);
if(path.endsWith("/")) path += "index.htm";
String contentType = getContentType(path);
String pathWithGz = path + ".gz";
if(SD.exists(pathWithGz) || SD.exists(path)){
if(SD.exists(pathWithGz))
path += ".gz";
File file = SD.open(path, "r");
HTTP.streamFile(file, contentType);
file.close();
return true;
}
return false;
}
void handleFileUpload() {
if(HTTP.uri() != "/edit") return;
HTTPUpload& upload = HTTP.upload();
if(upload.status == UPLOAD_FILE_START){
String filename = upload.filename;
if(!filename.startsWith("/")) filename = "/"+filename;
fsUploadFile = SD.open(filename, "w");
filename = String();
} else if(upload.status == UPLOAD_FILE_WRITE){
if(fsUploadFile)
fsUploadFile.write(upload.buf, upload.currentSize);
} else if(upload.status == UPLOAD_FILE_END){
if(fsUploadFile)
fsUploadFile.close();
}
} // handleFileUpload()
void handleFileDelete() {
if(HTTP.args() == 0) return HTTP.send(500, "text/plain", "BAD ARGS");
String path = HTTP.arg(0);
if(path == "/")
return HTTP.send(500, "text/plain", "BAD PATH");
if(!SD.exists(path))
return HTTP.send(404, "text/plain", "FileNotFound");
SD.remove(path);
HTTP.send(200, "text/plain", "");
path = String();
} // handleFileDelete()
void handleFileCreate() {
if(HTTP.args() == 0)
return HTTP.send(500, "text/plain", "BAD ARGS");
String path = HTTP.arg(0);
if(path == "/")
return HTTP.send(500, "text/plain", "BAD PATH");
if(SD.exists(path))
return HTTP.send(500, "text/plain", "FILE EXISTS");
File file = SD.open(path, "w");
if(file)
file.close();
else
return HTTP.send(500, "text/plain", "CREATE FAILED");
HTTP.send(200, "text/plain", "");
path = String();
} // handleFileCreate();
void handleFileList() {
if(!HTTP.hasArg("dir")) {HTTP.send(500, "text/plain", "BAD ARGS"); return;}
String path = HTTP.arg("dir");
if(path != "/" && !SD.exists((char *)path.c_str())) {HTTP.send(500, "text/plain", "BAD PATH"); return;}
File dir = SD.open((char *)path.c_str());
path = String();
if(!dir.isDirectory()){
dir.close();
HTTP.send(500, "text/plain", "BAD DIR");
return;
}
dir.rewindDirectory();
HTTP.setContentLength(CONTENT_LENGTH_UNKNOWN);
HTTP.send(200, "text/json", "");
HTTP.sendContent("[");
for (int cnt = 0; true; ++cnt) {
File entry = dir.openNextFile();
if (!entry)
break;
String output;
if (cnt > 0)
output = ',';
output += "{\"type\":\"";
output += (entry.isDirectory()) ? "dir" : "file";
output += "\",\"name\":\"";
output += String(entry.name()).substring(1);
output += "\"";
output += "}";
HTTP.sendContent(output);
entry.close();
Serial.println(output);//============== вывод в сериал
}
HTTP.sendContent("]");
dir.close();
} // handleFileList()
String Fail = "<!DOCTYPE html><html><head><meta http-equiv='Content-type' content='text/html; charset=utf-8'><meta name='viewport' content='width=device-width, initial-scale=1'></head><style>body{background:#FFA07A;}</style><body><h3>Firmware update:</h3><h2>  FAIL</h2><h3>  Restart ESP</h3></body></html>";
String Ok = "<!DOCTYPE html><html><head><meta http-equiv='Content-type' content='text/html; charset=utf-8'><meta name='viewport' content='width=device-width, initial-scale=1'><meta http-equiv='refresh' content='15;update.htm'></head><style>body{background:#E0EEE0;}</style><body><h3>Firmware update:</h3><h2>  OK!</h2></body></html>";
void updateInit() {
HTTP.on("/update", HTTP_POST, [](){
HTTP.sendHeader("Connection", "close");
HTTP.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
ESP.restart();
},[](){
HTTPUpload& upload = HTTP.upload();
if(upload.status == UPLOAD_FILE_START){
uint32_t maxSketchSpace = 0x140000;
if(!Update.begin(maxSketchSpace)){
Update.printError(Serial);
}
} else if(upload.status == UPLOAD_FILE_WRITE){
if(Update.write(upload.buf, upload.currentSize) != upload.currentSize){
Update.printError(Serial);
}
} else if(upload.status == UPLOAD_FILE_END){
if(Update.end(true)){
Serial.printf("Update Success: %u B\nDownload time: %d sec.\nRebooting...\n", upload.totalSize);
} else {
Update.printError(Serial);
}
}
yield();
});
} // updateInit()
void initHttp() {
HTTP.on("/list", HTTP_GET, handleFileList);
HTTP.on("/edit", HTTP_GET, []() { if (!handleFileRead("edit.htm")) HTTP.send(404, "text/plain", "FileNotFound"); });
HTTP.on("/edit", HTTP_PUT, handleFileCreate);
HTTP.on("/edit", HTTP_DELETE, handleFileDelete);
HTTP.on("/edit", HTTP_POST, []() { HTTP.send(200, "text/plain", ""); }, handleFileUpload);
HTTP.onNotFound([]() { if (!handleFileRead(HTTP.uri())) HTTP.send(404, "text/plain", "FileNotFound"); });
updateInit();
HTTP.begin();
timeStamp();
printValue("HTTP port", String(HTTP_PORT));
moduleHTTP = ENABLE;
started(F("Http"), true);
} // initHttp()
void httpWork() {
HTTP.handleClient();
}
#endif // HTTP_FEATURE
Для ESP32 с SPIFFS системой скетч выше )
PS / В хроме может не корректно открываться страница edit ( не будет списка файлов в левой части). Попробуй фаер фокс или оперу
- Вложения
-
- worker-html.js.gz
- (48.85 КБ) 215 скачиваний
- Рейтинг: 1.16%
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
-
- Сообщения: 12
- Зарегистрирован: Сб мар 21, 2020 9:28 am
- Благодарил (а): 6 раз
- Поблагодарили: 0
Re: Arduino Mega Server
SDWebServer - да, вроде как позволяет заливать файлы на флешку. Даже что-то вроде дерева файлов и текстового редактора в браузере в примере есть, правда я так до конца и не разобрался, как оно работает. Но хотелось бы все же фтп - я привык открывать файл, скажем, .htm или .jss в текстовом редакторе прямо с сервера через фтп-соединение, и с ним работать. Внес изменения, нажал кнопку сохранить, в браузере нажал кнопку перегрузить страницу - и вуаля, результат налицо.
Попутно вопрос - а почему асинхронный этот веб-сервер, ESPAsyncWebServer.h на порядок быстрее? Просто в силу особенностей кода самой библиотеки? Пробовал я тут погуглить на счет связи двух и более есп32 по http, и в первой же статье наткнулся именно на пример с этой асинхронной библиотекой.
Попутно еще вопрос - а есть на примете пример реализации связи двух и более есп32 по http? Глянул мельком на примеры в MySensors, там есть все что угодно, кажись, но не вайфай и хттп. Может не особо внимательно смотрел, конечно, боюсь увлекшись далеко в сторону забрести..
Попутно вопрос - а почему асинхронный этот веб-сервер, ESPAsyncWebServer.h на порядок быстрее? Просто в силу особенностей кода самой библиотеки? Пробовал я тут погуглить на счет связи двух и более есп32 по http, и в первой же статье наткнулся именно на пример с этой асинхронной библиотекой.
Попутно еще вопрос - а есть на примете пример реализации связи двух и более есп32 по http? Глянул мельком на примеры в MySensors, там есть все что угодно, кажись, но не вайфай и хттп. Может не особо внимательно смотрел, конечно, боюсь увлекшись далеко в сторону забрести..
-
- Сообщения: 2575
- Зарегистрирован: Пт ноя 06, 2015 10:22 am
- Откуда: Кишинёв
- Благодарил (а): 303 раза
- Поблагодарили: 282 раза
Re: Arduino Mega Server
Сумбурно , но по порядку.
Когда то , когда небо было синее и трава зеленее Alexsis_76 показывал тут на форуме весь вред HTTP реквеста - пакеты размером 118 байт имеют полезную нагрузку 1 байт. То есть чтобы загрузить страницу в 1 кило надо прокачать 118 кило по сети. Это особенность протокола. Подробности надо спрашивать у него. Как костыль - в каком то коде встречал такую реализацию - сначала набиваем буфер в 60 байт и затем его передаём.
По FTP я уже говорил - взял первую попавшуюся библу с гита , залил и всё заработало. НО в составе АМС нет.
По поводу связи двух ЕСП. На форуме есть пример реализации Тут. Но если честно - у меня не получилось с ним разобраться.
Если есть MQTT брокер , то можно связать любое количество ЕСР . писать сценарии прямо в браузере и видеть результат в приложении. Реализация в телеге https://t.me/esp_zigbee
MySensors - это отдельная песня. Главный смысл - собрать данные с кучи ардуин на радио модулях и куда нибудь отправить. там есть и ESP8266 и 32 . HTTP там нет .
Когда то , когда небо было синее и трава зеленее Alexsis_76 показывал тут на форуме весь вред HTTP реквеста - пакеты размером 118 байт имеют полезную нагрузку 1 байт. То есть чтобы загрузить страницу в 1 кило надо прокачать 118 кило по сети. Это особенность протокола. Подробности надо спрашивать у него. Как костыль - в каком то коде встречал такую реализацию - сначала набиваем буфер в 60 байт и затем его передаём.
По FTP я уже говорил - взял первую попавшуюся библу с гита , залил и всё заработало. НО в составе АМС нет.
По поводу связи двух ЕСП. На форуме есть пример реализации Тут. Но если честно - у меня не получилось с ним разобраться.
Если есть MQTT брокер , то можно связать любое количество ЕСР . писать сценарии прямо в браузере и видеть результат в приложении. Реализация в телеге https://t.me/esp_zigbee
MySensors - это отдельная песня. Главный смысл - собрать данные с кучи ардуин на радио модулях и куда нибудь отправить. там есть и ESP8266 и 32 . HTTP там нет .
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
-
- Сообщения: 182
- Зарегистрирован: Чт ноя 24, 2016 10:47 am
- Благодарил (а): 5 раз
- Поблагодарили: 25 раз
Re: Arduino Mega Server
ESPAsyncWebServer писал человек знающий протоколы обмена на уровне разработчика, и кстати благодаря ему же WebServer начал загружать файлы на адекватной скорости.
-
- Сообщения: 791
- Зарегистрирован: Пт янв 22, 2016 10:08 am
- Благодарил (а): 6 раз
- Поблагодарили: 63 раза
Re: Arduino Mega Server
Добрый день друзья!!!
Очень рад услышать голоса идущих вперед последователей славной АМС )))
Например браузер будет клиентом, ардуина тоже может быть клиентом и отправлять запросы вида GET/script?val1=value&val2=value, есть класс
HTTPClient собсвенно им и надо воспользоваться, примеры там-же.
Вот в принципе все вводные данные что бы построить модель Клиент-Сервер
Очень рад услышать голоса идущих вперед последователей славной АМС )))
Это не особенности протокола, это написанный кем то и повторенный последователями корявый код))). Что бы увеличить эффективность передачи нужно набить буфер пакета максимально возможным количеством данных.Когда то , когда небо было синее и трава зеленее Alexsis_76 показывал тут на форуме весь вред HTTP реквеста - пакеты размером 118 байт имеют полезную нагрузку 1 байт. То есть чтобы загрузить страницу в 1 кило надо прокачать 118 кило по сети. Это особенность протокола
Это не костыль, просто у меги очень сильно мало оперативной памяти, так что это скорее компромисс))).Как костыль - в каком то коде встречал такую реализацию - сначала набиваем буфер в 60 байт и затем его передаём.
Примеры можно черпать из практически неограниченного источника- Интернета и папки Ардуино с примерами, смысл в том что в контексте сетевого взаимодействия существует два субъекта- Клиент и Сервер. Cервер это тот кто слушает порт и может отвечать на входящие соединения, в сети играет пассивную роль. Клиент- более интересная реализация, выступает инициатором соединения(передает запросы).Попутно еще вопрос - а есть на примете пример реализации связи двух и более есп32 по http?
Например браузер будет клиентом, ардуина тоже может быть клиентом и отправлять запросы вида GET/script?val1=value&val2=value, есть класс
HTTPClient собсвенно им и надо воспользоваться, примеры там-же.
Вот в принципе все вводные данные что бы построить модель Клиент-Сервер
- Coolblaster
- Сообщения: 12
- Зарегистрирован: Вс июн 07, 2020 9:26 am
- Благодарил (а): 14 раз
- Поблагодарили: 5 раз
Re: Arduino Mega Server
Всем привет!!!
Осилил таки все 324 страницы за 3 дня. Хочу сказать огромное СПАСИБО Alex и всем кто принимал участие в данном проекте.
Я так понимаю что до полноценной версии 1.0 (если до нее дойдет) пройдет еще много времени, но то что уже сделано достойно уважения.
От себя отмечу установил всё "с коробки", поменял IP, часовой пояс, подключил самодельный шилд с DS3231 и nRF24 на борту рядом с Ethernet шилдом. Работает Processing, файлы заливаются нормально. AMS контроллер на nano с nRF24 и далласами на борту заработал после правки переменной и обнулением EEPROM. Посносил кучу не нужных мне модулей, расширил стандартную диагностику портов почти на максимум (для личных нужд).
Все бы ничего, но судя по форуму, велась работа по изменению и улучшению кода самого AMS, но остановилась из-за коммерческой составляющей как я понял, возможно ошибаюсь. Понимаю Алекса, времени потрачено колоссально много и оно должно быть оплачено. Правда не понимаю почему весь код совсем без комментарий. Было бы больше пользы, меньше вопросов как оно работает как для "новичков" так и гуру и удобство поиска по комментариям. А так приходится весь код для себя комментировать.
На сайте http://startingelectronics.org/tutorial ... -tutorial/ написана крутая инструкция, на основе которой был реализован AMS, и я еще лет 6 назад остановил свой выбор на связке MEGA + ETHERNET для реализации сервера "умного дома" по той инструкции. Скажу только что этот сервер работал у меня как часы!!! Но чтобы так заморочиться и сделать полноценный сайт с кучей нужных, продуманных функций у меня просто не было времени.
За прошедшие несколько лет, научился читать и писать код в IDE.
Сейчас наконец взялся за дело и меня радует, что начинаю уже не с нуля!!!
Осилил таки все 324 страницы за 3 дня. Хочу сказать огромное СПАСИБО Alex и всем кто принимал участие в данном проекте.
Я так понимаю что до полноценной версии 1.0 (если до нее дойдет) пройдет еще много времени, но то что уже сделано достойно уважения.
От себя отмечу установил всё "с коробки", поменял IP, часовой пояс, подключил самодельный шилд с DS3231 и nRF24 на борту рядом с Ethernet шилдом. Работает Processing, файлы заливаются нормально. AMS контроллер на nano с nRF24 и далласами на борту заработал после правки переменной и обнулением EEPROM. Посносил кучу не нужных мне модулей, расширил стандартную диагностику портов почти на максимум (для личных нужд).
Все бы ничего, но судя по форуму, велась работа по изменению и улучшению кода самого AMS, но остановилась из-за коммерческой составляющей как я понял, возможно ошибаюсь. Понимаю Алекса, времени потрачено колоссально много и оно должно быть оплачено. Правда не понимаю почему весь код совсем без комментарий. Было бы больше пользы, меньше вопросов как оно работает как для "новичков" так и гуру и удобство поиска по комментариям. А так приходится весь код для себя комментировать.
На сайте http://startingelectronics.org/tutorial ... -tutorial/ написана крутая инструкция, на основе которой был реализован AMS, и я еще лет 6 назад остановил свой выбор на связке MEGA + ETHERNET для реализации сервера "умного дома" по той инструкции. Скажу только что этот сервер работал у меня как часы!!! Но чтобы так заморочиться и сделать полноценный сайт с кучей нужных, продуманных функций у меня просто не было времени.
За прошедшие несколько лет, научился читать и писать код в IDE.
Сейчас наконец взялся за дело и меня радует, что начинаю уже не с нуля!!!
- nick7zmail
- Сообщения: 7573
- Зарегистрирован: Пн окт 28, 2013 8:14 am
- Откуда: Екатеринбург
- Благодарил (а): 121 раз
- Поблагодарили: 2010 раз
Re: Arduino Mega Server
Ну...проект скорее не дойдёт до 1.0)) Алекса давно не видно...либо частные проекты делает, либо уже забил на эту тему)) хотя сайт его вродь по прежнему жив. А так АМС - да, действительно хороший старт для мультифункциональной системы...хотя в последнее время топлю за зигби-гейты типа sls или zesp, и активно принимаю участие, т.к. девайсы промышленного качества в свободной продаже, придумывать ничего не надо, покупай да подключай...
Отправлено с моего Xperia XZ1 Compact через Tapatalk
Отправлено с моего Xperia XZ1 Compact через Tapatalk
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<