GyverLibs/GyverHub

Бета версия

GyverLibs opened this issue · 359 comments

Чат в телеге https://t.me/AlexGyverChat/441438

Планируется очередное крупное обновление! Обновлённая библиотека будет несовместима с необновлённым приложением и наоборот. Нужно перекомпилировать прошивку с новой версией библиотеки.

Изменения, требующие исправлений в программе

  1. Упрощён Canvas, функции BeginCanvas и EndCanvas упразднены, объект canvas больше не нужно передавать в b.Canvas, но нужно передать b в объект Canvas:
    b.Canvas();
    gh::Canvas cv(b);
    cv.line(0, 0, -1, -1);
    cv.line(0, -1, -1, 0);
    
  2. Из Canvas убран весь HTML API, оставлен только Processing. Улучшен, протестирован и полностью совпадает с обычным Processing по результату на экране
  3. Подключение Serial связи переделано, см. пример manual/stream_serial
  4. У виджета Space ширина и высота теперь указываются в самой функции: b.Space(4, 3);. Оба параметра необязательные
  5. Ширину 1 теперь задавать необязательно: если ширина не указана - она считается 1

Изменения и добавления

В библиотеке:

  • Добавлена связь между устройствами (в т.ч. широковещательные запросы) по всем доступным способам связи (+ UDP и любые кастомные)
  • Добавлены удобные статические функции для Color
  • Добавлены возможности в таймер Timer
  • Добавлен виджет "карта" и инструменты для работы с геолокацией (запрос и получение координат приложения, рисование на карте)
  • В контейнер col/row добавлен заголовок и цвет заголовка
  • Добавлен контейнер Spoiler
  • Добавлен обработчик Ping для отправки апдейтов даже по http связи (без ws)
  • Множество мелких улучшений и исправлений

В приложении:

  • Добавилась поддержка "плагинов" - кастомных виджетов и контейнеров
  • Добавилась публичная база плагинов, можно устанавливать плагины в приложение
  • Множество мелких улучшений и исправлений

Пощупать dev версию

Всем привет! Версия библиотеки v0.1b. Arduino IDE 1.8.19. WEMOS D1 mini.
Не получилось задать свою иконку:
GyverHub hub("MyDevices", "ESP", ""); - что ни ставь 3м параметром (пусто, глиф или код с сайта) - ничего не меняется в браузере - остается иконка "домик".
В скетче задан #define GH_INCLUDE_PORTAL
На кнопках также методом icon() не удалось получить картинку: по умолчанию жирный круг, если задать какое-то значение в icon - пустой виджет...
Пока с этим не получилось разобраться. Пример fulltest с иконками тоже не работает.
И не нашел, как кнопку сделать обычной прямоугольной кнопкой...

В есп версии вырезаны все иконки кроме системных. Кнопка - иконка, обычных прямоугольных нет. Пока что

В есп версии вырезаны все иконки кроме системных. Кнопка - иконка, обычных прямоугольных нет. Пока что

А текст на кнопку можно поместить или нет?

Идея для виджета - поле Input, но переменная - число, все проверки и валидация внутри класса

Это обычный input + regex на only numbers, в библиотеке есть макрос готовый

Это обычный input + regex на only numbers, в библиотеке есть макрос готовый

Все таки не совсем, насколько я понял у инпута переменная привязанная - это строка должна быть и если мы хотим привязать интовое значение, то нам нужна переменная прокладка, через которую будет происходить конвертация, но это не очень удобно, особенно, если использовать постоянную память, приходится ее инициализировать отдельно

Возможно я неправ и в инпут можно засунуть инт?

Внимательнее к документации. К любому виджету можно привязать можно любой стандартный тип данных, строки, массивы, целые и дробные числа

В есп версии вырезаны все иконки кроме системных. Кнопка - иконка, обычных прямоугольных нет. Пока что

а системные иконки можно на кнопку указать?
если да, то где бы посмотреть список системных?

вообще хотелось бы на кнопку просто текст вывести без иконки, думаю это будет вполне презентабельно

Системные это те, которые встречаются в основном интерфейсе. Есть возможность собрать себе версию со всеми иконками или загрузить файл с конкретной иконкой, но это пока тестируется и не задокументировано. Обычные кнопки просто с текстом будут позже, текущий набор виджетов не окончательный

Еще заметил такую штуку, что при добавлении слайдера на дашборд при обновлении через b.refresh() интерфейса возникает неприятное "подергивание" всего интерфейса, быть может это можно как-то исправить...

Отличные новости, ждем...
Сижу вот перепиливаю с первой беты на текущую весьма жирный интерфейс.
Медленно движусь, но пока все нравится в новой версии.
Из пожеланий: при удалении модуля ModOtaUrl было бы неплохо скрывать его из вкладки OTA окончательно, а то сейчас там заголовок остается висеть, а ссылки изчезают, как и в первой бете.
Снимок

А, и подсветку текста цветом бы в виджете Text

@d347h4ck возможно уже исправлено в рабочей версии приложения, там очень много доработок

@SpiritSP ну это спорный вопрос. Модуль отключен, но обозначено что он существует в приложении, чтобы юзер не думал что что то что сломалось

Тут тоже, чем меньше у юзера возможностей покрасить всё в вырвиглазные цвета - тем лучше :) если это текст, значит это текст, системного цвета текста приложения

Wrong packet (JSON): SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON in: <!DOCTYPE html>\r\n<html lang="en">\r\n<head>\r\n <meta charset="UTF-8">\r\n <title>GyverHub v0.50b</title>\r\n <meta name="description" content="Arduino/ESP8266/ESP32 Web Control Panel">\r\n <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">\r\n <script src="script.js?0.50b="></script>\r\n <link href="style.css?0.50b=" rel="stylesheet">\r\n</head>\r\n<body onresize="resize_h()">\r\n <div id="notice" class="notice"></div>\r\n <div class="head" id="head_cont"></div>\r\n <div class="test" id="test_cont"></div>\r\n <div class="projects" id="projects_cont"></div>\r\n <div class="main" id="main_cont"></div>\r\n <div class="cli" id="cli_cont"></div>\r\n <div class="footer" id="footer_cont"></div>\r\n</body>\r\n</html>

эта ошибка так и осталась)
хотя новую версию залил, откуда он это выискивает?)

Серёг за.бал, не смешно уже. У тебя где то в сети устройство со старой версией, или где то в кэшах

Серёг за.бал, не смешно уже. У тебя где то в сети устройство со старой версией, или где то в кэшах

Саня, не могу найти причину, не ругайся.
С любого браузера такое выдает, и с телефона, устройства точно нет.

Попробую виртуальную машину, больше вариантов нет.

по IP адресу открылась страница)

В GyverPortal была возможность в браузере выгрузить файл с SD-карты (ESP на карту пишет логи и эти логи нужно просматривать и выгружать). Что-то типа повесить на кнопку: p.sendFile(SD.open(curfilename, FILE_READ));
В GH не нашел пока ничего такого. Может для такой задачи Fetch нужно использовать? Не подскажете: есть такой механизм? Если нет - будет?

@aleta2020 нативная поддержка SD карты будет позже. Сейчас можно через fetch, передать в fetchFile(sd.open) или как то так

глиф или код с сайта) - ничего не меняется

вот и у меня иконки не загружаются, @aleta2020 решил вопрос с fontawesome?

эта ошибка так и осталась) хотя новую версию залил, откуда он это выискивает?)

А в другой файфай точке пробовали? Допустим с телефона запустить точку доступа и проверить? Может что-то с роутэром? Либо настройками вайфай?

@Serega88kos ещё раз - из есп-версии приложения вырезаны все иконки кроме системных. Позже будет гайд как сбилдить себе версию с полными иконками, также можно подключить иконку по url к файлу

Сейчас с телефона и апк заработало.
Иконки тоже все загрузились.

@Serega88kos в есп версии вырезаны все иконки кроме системных

@Serega88kos в есп версии вырезаны все иконки кроме системных

Это я понял, я про сторонние с сайта, прописаны через код.

Вопрос по Widget& Image(AnyText text); - должен ли виджет показывать картинку по url ? Типа:
b.Image("https://openweathermap.org/img/w/01d.png");
У меня в браузере и приложении крутятся стрелки и пишет IMAGE [ERROR].
Если нет, то предполагается ли такая функциональность или как по-другому грузить картинку в виджет?
И вопрос по ERROR: как можно посмотреть детали ошибки?

@aleta2020 на данный момент image качает по url файл из памяти еспшки. Позже будет больше возможностей и описание к каждому виджету. Error это ошибка загрузки, других ошибок нет

На сайте fontawesome по четыре иконки, а код у них один и тот же. В приложении показывается первая иконка (Solid).

  1. Можно ли (будет) использовать другие из представленных видов? - типа еще один параметр...
  2. Виджету Icon(AnyPtr ptr), если в качестве параметра передать "f185" или другой код, в приложении все равно показывает "лампочку". Сообщения Error нету. Это баг или фича?
  3. Механизмы использования кода иконок с сайта fontawesome в hub.config() и b.Icon() отличаются?

@aleta2020

  1. Нет, в приложение вшит бесплатный пак solid иконок. Но можно использовать любые svg файлы (сейчас частично, позже полностью)
  2. Внимательнее к документации, AnyPtr - это подключение переменной для чтения и изменения. Виджету icon иконка задаётся через параметр text, в документации должно быть указано
  3. Всё что называется иконкой - имеет одинаковый механизм. Иконка из списка иконок, вставляется глиф либо юникод строка

Саня, вопрос странный, но...
После перехода на свежую версию хаба наблюдаются баги у FastLED.
Не подбирается версия библиотеки и ядро ESP.
Либо косяк с первым светодиодом, либо проблема вообще с цветами...
Проблему подтвердили, не только у меня, поэтому и спрашиваю)
Сейчас рассматриваю NeoPixel, но переделок много...

@Serega88kos fastled и 8266 вообще несовместимые вещи начиная с каких то версий. В новой версии хаба на низком уровне ничего не изменялось, проблемы с fastled были и на старой версии, я тоже с ними сталкивался

2.7.4 рекомендуемая была, но даже с ней теперь проблемы, даже исправленная версия Сотнег от лампы, также себя ведет.

Ну, попробую. Но у меня и на старой версии нормально не работало, так что отличия вряд-ли какие то будут. Возможно кстати внутри билдера нельзя вызывать FastLED.show(), потому что билдер вызывается внутри ответа серверу. Поэтому надо делать себе внешний флажок на обновление ленты, и делать это в лупе

У меня не в билдере, и вызывается один раз с функции управления режимами, по таймеру в 500мс

А если закомментировать тикер хаба

Либо задефайнить GH_NO_WS чтобы отключить вебсокет из системы

вот эта ошибка из этого пути из лога что-то даст?
esp8266\2.7.4\libraries\SoftwareSerial\src/circular_queue/Delegate.h

Это не ошибка, это путь к библиотеке софтсериал

просто изначально ошибки идут на хаб, а потом на ядро.
сейчас залью лог на гитхаб, может что-то проясним

Версия ядра 2.7.4? Не будет работать

В описании у тебя смотрел 2.7+

Ну вот сейчас и узнали, что работать не будет

c 3.0.0 компилируется

теперь главный вопрос, будешь ли понижать версию С++ ?
надо понять дальнейшую ситуацию)

уже адаптировал, тестирую, сегодня выпущу апдейт

всё работает, надо обновить StringUtils, возможно в реестре она пока не появилась, надо использовать https://github.com/GyverLibs/StringUtils.git

Отлично, все работает)

fastled и 8266 вообще несовместимые вещи начиная с каких то версий

По поводу FastLED и ESP я смог решить проблему на ESP32 эту давно. На 8266 может тоже поможет.

  1. Надо вызов show() в лупе ограничывать таймером (я обычно делаю на 2мс и лента ведет себя полностю нормально)
  2. Все вызови show() должни быть только на одном из 2 ядер (я обычно на 1м стандартном для ардуино, незнаю будет ли 0м). Для возовов из другого ядра делаю флажки которые проверяються на 1м и выполняют показ.

В иных случиях лента ведёт себя неадекватно.

Если в слайдере выставить disabled(true)
b.Slider_("state_val").label("Текущее значение").disabled(true);
то при наведении на него мышкой и повороте колесиком, значение все равно меняется, хотя по идее не должно

@srs-rus известная проблема, в следующем обновлении исправится. Приложение сильно переписано, пока тестируем

Саня, вот проект в новый GyverHub-projects не добавлен, но при редактировании project.json выводит окно об обновлении, которое завершается ошибкой)

@Serega88kos ничего не понял

всё работает, надо обновить StringUtils, возможно в реестре она пока не появилась, надо использовать https://github.com/GyverLibs/StringUtils.git

Я правильно понял, что если обновить StringUtils, то хаб должен работать на esp8266 v2.7.x ?
Я обновил, но на 2.7.4 не работает. При компиляции стандартных примеров выдает ошибку:

c:\Users\dkovr\Documents\Arduino\libraries\arduinoWebSockets-master\src\WebSocketsServer.cpp: In member function 'void WebSocketsServer::handleNewClients()':
c:\Users\dkovr\Documents\Arduino\libraries\arduinoWebSockets-master\src\WebSocketsServer.cpp:658:86: error: 'class WiFiServer' has no member named 'accept'
WEBSOCKETS_NETWORK_CLASS * tcpClient = new WEBSOCKETS_NETWORK_CLASS(_server->accept());
^
exit status 1
Compilation error: exit status 1

На версии 3.1.2 все работает отлично, использовал бы ее, если б не проблемы с fastled

@Ingeniger01 ну тут уже проблема в библиотеке websocket и изменениях в ядре есп (available -> accept). Понижать версию вебсокет пока не заработает

@Serega88kos ничего не понял

https://github.com/GyverLibs/GyverHub-projects/edit/main/projects.txt
список пустой, но если я отредактирую свой project.json и версия будет отличаться от прошивки, сработает уведомление о новой версии, но загрузка не пройдет, выдаст ошибку.

Это не баг? Свой проект не добавил.

отредактирую свой project.json

Приложение не видит твой project.json. Дальше не понял

Должен ли хаб реагировать на автообновление, если скетч не прописан в [GyverHub-projects] ?
Номер версии в прошивке и в файле project.json различаются?

Нет, не понимаю что ты хочешь донести)

Давай так попробуем)
Для чего задуман GyverHub-projects для каталога проектов или для автообновления новых версий прошивок?)

Это только каталог

Вот, тогда более понятнее стало...
Значит буду проверять правильность ссылки на bin а то вчера после теста выдавало ошибку.

я думал он прямо завязан с этим каталогом...

п.с. теперь все ок)

Обновил GSON и StringUtils и посыпались ошибки)

...\GSON\src/utils/parser.h: In member function 'void gsutil::ParserCore<capacity>::_stringify(Print&, gson::parent_t&, gson::parent_t, uint8_t&)':
...\GSON\src/utils/parser.h:301:30: error: no match for 'operator==' (operand types are 'unsigned char:3' and 'gson::Type')
                 if (ent.type == gson::Type::String) p.print('\"');
                              ^
...\GSON\src/utils/parser.h:314:30: error: no match for 'operator==' (operand types are 'unsigned char:3' and 'gson::Type')
                 if (ent.type == gson::Type::String) p.print('\"');
                              ^
...\GSON\src/utils/parser.h: In member function 'gson::Error gsutil::ParserCore<capacity>::_parse(gson::parent_t)':
...\GSON\src/utils/parser.h:437:42: error: no match for 'operator==' (operand types are 'unsigned char:3' and 'gson::Type')
                             if (buf.type == gson::Type::Int) buf.type = gson::Type::Float;
                                          ^
...\GSON\src/utils/parser.h:459:34: error: no match for 'operator==' (operand types are 'unsigned char:3' and 'gson::Type')
                     if (buf.type == gson::Type::Bool) {

на какой платформе и версии ядра?

ESP8266 2.7.4

о боги

пофиксил, скоро выпущу обновку

В Platformio [env:esp32dev] выдает ошибку
не удается открыть источник файл "Pairs.h" (dependency of "GyverHub.h")C/C++(1696)
#include "GyverHub.h" подчеркивает волнистой линией

ну и с Colors color (0x00FFFF); непонятно, как работать)

@Serega88kos

  1. удали всё и скачай свежее
  2. Colors это стандартные цвета схемы хаба - enum константы, их нельзя создать и задать

создать можно Color

gh::Color color(0xffffff, HEX);

дока тут

  1. удали всё и скачай свежее

странно, я только создал проект и установил через репозиторий все библиотеки

скопировал hub и Pairs из ардуины, не помогло)

gh::Color color(0xffffff, HEX);

не работает

Color color(0xffffff, HEX);

так тоже

вот так уже лучше uint16_t color = 0x00FFFF;

@Serega88kos что значит не работает? Удали всё и скачай заново как в доке

uint16_t color = 0x00FFFF;

чушь и бред) и куда оно дальше

вот чистый проект, platformio ini из вики
image

чушь и бред) и куда оно дальше

struct Color {
  uint16_t col1 = 0x0000FF;
  uint16_t col2 = 0x00FFFF;
};

мы про разное общаемся)

с хабом решил вопрос, не установился Adafruit...

Ты спросил как работать с Colors, я показал. Это далеко не то же самое что uint16 тип

раньше было так GHcolor color{ 0, 255, 255 }; поэтому я и запутался))
скомпилировал, только пока с warning: можно будет тестировать...

раньше было так GHcolor color{ 0, 255, 255 };

Так оно никуда не уходило gh::Color color{0, 255, 255};

в структуре было, а сейчас там не собирается)
переделал, там будет видно, что заменить, проект адаптирован под новый хаб, заодно и PlatformIO затестю на ESP32...
в IDE пока с Warning, в PlatformIO все в порядке.

всё собирается
image

Саня, какой второй параметр у b.Color_("txt", ?);
В примерах ты забыл про него упомянуть.
Platformio тоже не может подсказать.

п.с. вчерашние наши записи выводят пустой виджет в web

Дока
image

PIO
image

вчерашние наши записи выводят

вчерашние записи ничего не выводят, это создание переменной. Компилятор это вырежет

Это я все видел, с текстом вот понятно, а дальше...
я чего только не пробовал засунуть, и переменную и код цвета, и готовый цвет, и из структуры переменную, ничего не принимает...
кажется сообразил, b.Color_("txt", &color); амперсанд я упустил...

Приветствую... вопрос такой...а виджет на стрим ESP32 cam есть? В портале вроде есть такая возможность, а в хабе нет информации...

@Khronos666 привет, после обновления всё ещё не протестирован и не документирован, позже появится

Саш, доброго.
Пробую новую версию, подскажи, это вот почему в сериал сыплется?

[ 2155][E][WebServer.cpp:649] _handleRequest(): request handler not found
[ 5108][E][WebServer.cpp:649] _handleRequest(): request handler not found
[ 5135][E][WiFiClient.cpp:422] write(): fail on fd 51, errno: 104, "Connection reset by peer"
[ 5141][E][WebServer.cpp:649] _handleRequest(): request handler not found

Привет, потому что так решил разработчик библиотеки вебсервера

Убрать это можно как то?

У меня этих логов нет, возможно зависит от версии ядра и/или настроек компиляции. У меня свежая версия и никаких дополнительных настроек

Ок, пока не сильно мешает.
platformio.ini скопипастил из Вики, всё остальное не уверен.

Саш, доброго!
Снова вопрос, на этот раз по цветам.
Ситуация такая: Мне нужно менять цвет какого-либо виджета на время исполнения команды к примеру. А потом вернуть к дефолтному значению. Ок. Если у нас цветовая тема скажем зеленая, то мы и возвращаем цвет к зеленому как к дефолтному. При этом мы прописываем .color(0x37A93C).
ОК.
А потом я взял и сменил тему на Aqua.
А виджеты у нас возвращаются к зеленому цвету. Вот и закончилась и Аква и стала кваква какая то.
Можно написать .color(DEFAULT), но тогда виджет становится вообще черным.
Вопрос или просьба:
Можно ли сделать чтоб Default был именно дефолтным цветом установленной в данный момент темы?

@Roxer00 так и задумано, что default должен стать цветом темы. Плотно протестирую в следующем обновлении приложения, там уже много исправлений и улучшений сделано, работаем

{
gh::Row r(b);
sel1=cfg.ParamWarn[sel][5];
if (b.Select(&sel1).text(wrn_list).label(F("Warn type")).disabled(disabled[0]).size(3).click()){ 
	cfg.ParamWarn[sel][5]=sel1;
	if (cfg.ParamWarn[sel][5]>0 && cfg.ParamWarn[sel][5]<5){disabled[1]=false;}
	else{disabled[1]=true;}
	hub.update("wrnID").disabled(disabled[1]);
	hub.update("wrnButton").disabled(disabled[1]);
	hub.update("wrnTimeout").disabled(disabled[1]);
}
b.Spinner_("wrnID",&cfg.ParamWarn[sel][6]).label(F("ID")).range(0,65536,1).hint(F("Lamps:\nCEL 34/581\nDSC 36/184/755\nDSC2 215/707\nSeatbelt 77\nAirbag 181\nRPA 336")).disabled(disabled[1]).size(2);
b.Spinner_("wrnTimeout",&cfg.ParamWarn[sel][7]).label(F("Timeout")).suffix(F("s")).range(0,60,1).disabled(disabled[1]).size(2);
}

если из билдера по событию Click поменять виджету статус disabled, например, сделать его активным если был неактивен - кнопки +/- не работают. и наоборот, если был активен и затем деактивировать - кнопки инкремента/декремента продолжать функционировать.
как костыль пока отправляю вместе с апдейтом range, но думаю стоит этот мелкий баг пофиксить все же

@SpiritSP в dev версии баг не наблюдается, значт ждём обновления

@SpiritSP в dev версии баг не наблюдается, значт ждём обновления

на всякий случай: запускаю web версию из памяти ESP, если это важно

Не, неважно)

@Serega88kos я понял откуда берется твоя ошибка с html кодом в консоли. Это происходит, когда делается запрос на устройство, у которого стоит другой префикс (отличный от приложения)

Добрый день
планируется ли на ряду с void sendNotice() и void sendAlert() реализовать bool sendConfirm() ?
Спасибо.

@kolabse привет, это бессмысленно. Notice и alert не имеют обратной связи, поэтому их и можно отправлять в приложение

@GyverLibs я хотел запрашивать у пользователя подтверждение сохранения новых настроек точки доступа, в замен ранее сохраненных, как спрашивает при нажатии на кнопку форматирования файловой системы :)

Ну, prompt и confirm работают как обычные виджеты, вызываются по update action. В примере фуллтест это должно быть