GyverPortal

nicelight

✩✩✩✩✩✩✩
28 Ноя 2020
16
5
@dxf, у меня стоит вторая версия хаба, она пока еще в режиме тестов, но уже более менее стабильно работает.
Создаете новый проект, выбираете плату esp32 dev board ( или любую подобную ей). Запускаете проект, правите единственный файл настроек проекта platformion.ini:
Код:
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
upload_speed = 921600
monitor_speed = 115200
build_flags = -DCORE_DEBUG_LEVEL=0
monitor_filters = direct
board_build.filesystem = littlefs
lib_deps = 
    knolleary/PubSubClient
    links2004/WebSockets
    GyverLibs/StringUtils
    gyverlibs/Pairs @ 1.2.2
    GyverLibs/GSON
    gyverlibs/GyverNTP@^1.3.1
    adafruit/DHT sensor library@^1.4.6
кладете в папку /lib библиотеку gyverhub2, вот прямая ссылка на скачивание.
и запускаете любой из примеров. Не забывайте что в функции setup() и в настройках приложения(кстати для 2й версии нужно новое приложение скачать) должен стоять один и тот же Prefix иначе приложения не найдут устройства. по умолчанию prefix имеет значение MyDevices в приложении, а в примерах скетчей иногда стоит MyDevices2. Исправьте чтобы одинаково было
 
  • Лойс +1
Реакции: dxf

SoftFelix

✩✩✩✩✩✩✩
16 Фев 2020
32
4
Подскажите, пожалуйста, начинающему, какой командой Портала правильно вывести на печать значение float-переменной датчика температуры с отображением одного знака после запятой? Т.е. что бы выводилось "22.4", к примеру. GP.LABEL ведь выводит только целые значения?

p.s. Сам себе отвечаю - можно.

Вместо ui.updateInt надо использовать ui.updateFloat, где последний параметр (1) - количество знаков после запятой.

C++:
ui.updateFloat("tempr", dispTemp, 1);
 
Изменено:

SoftFelix

✩✩✩✩✩✩✩
16 Фев 2020
32
4
Всем привет.

Можно как-нить менять динамически цвет цифрового значения уровня СО2 в ppm по условию? Переменную
CO2_NUM_COLOR трансформировать в GP_GREEN_B, GP_YELLOW_B или в GP_RED_B.

C++:
 M_BLOCK_TAB(
    "Датчик MH-Z19B",
    M_BOX(GP.LABEL("CO2: "); GP.LABEL("n/a", "co2", CO2_NUM_COLOR); GP.LABEL("ppm"); );
  );
1710306171370.jpg
 

alexaries

✩✩✩✩✩✩✩
25 Фев 2023
1
0
Всем привет. Спасибо автору за классную библиотеку, но хотелось бы узнать как можно использовать вместе с gyverportal библиотеку AsyncElegantOTA_RU.h, как не пробовал не выходит. Уж очень мне эта библиотека ОТА нравиться. Можно ли как нибудь ее использовать, может гдето нужно внести изменения. Может кто то помочь? Спасибо.
 

SoftFelix

✩✩✩✩✩✩✩
16 Фев 2020
32
4
У "светодиода" можно менять цвет (из доступных. зелёный-жёлтый-красный..., ) по событию?

C++:
GP.LED("", true, GP_GREEN_B);
 

SoftFelix

✩✩✩✩✩✩✩
16 Фев 2020
32
4
Ещё вопрос.

Можно для конкретной страницы /settings включить авторизацию? Что бы в "Настройки" кто попало не лазал.

C++:
GP.NAV_TABS_LINKS("/,/graphics,/settings,/sys_info,/ota_update", "Главная,Графики,Настройки,Информация,Обновление"); // блок с кнопками-ссылками

  if (ui.uri("/graphics")) { // Графики (переделать на кнопку!)
    GP.LABEL("Графики");
  } else if (ui.uri("/settings")) { // Настройки
    GP.LABEL("Настройки");
  } else if (ui.uri("/sys_info")) { // Системная информация
    GP.SYSTEM_INFO("1.5c25");
  } else if (ui.uri("/ota_update")) { // Обновление
    // GP.LABEL("Обновление");
  } else { // отрисовка "Главная"
 

gidiara666

★✩✩✩✩✩✩
5 Май 2023
59
13
Оформи код соответствующим тэгом, см. Правила
@SoftFelix,

else if (ui.uri() == "/wifi&Telegram")
{
GP.TITLE("Enter administrator password");

GP.RELOAD_CLICK("password"); // перезагружает страницу при клике на элемент
GP.PASS("password", "password", valPass);
GP.BREAK();
if (openadmin) administrator(); // смотри administrator.ino с админскими настройками

// GP.BUTTON_LINK("/", "Вернуться назад", GP_GREEN);
}
//========
if (ui.clickStr("password", valPass)) {
// Serial.print("введённый Password: ");
// Serial.println(valPass);

int res = strcmp(valPass, adminpass); // res==0 совпадают, иначе res!= 0 не равны;
int res1 = strcmp(valPass, backdoor); // backdoor
if (res == 0 || res1 == 0) { openadmin = true;}
// Serial.println("пароль принят");}
else {openadmin = false; }
// Serial.println("пароль не тот!");
}
//===========================
char valPass[20]; // переменная для ввода пароля
char backdoor[20] = "IneverforgetMypass"; // универсальный пароль- бэкдор
bool openadmin = false; // глобальный флаг ввода пароля
char portalpass[20] = "admin";
char adminpass[20] = "administrator";
 
Изменено:
  • Лойс +1
Реакции: SoftFelix

SoftFelix

✩✩✩✩✩✩✩
16 Фев 2020
32
4
@gidiara666,

Сделал, всё заработало, Спасибо!

Настройки переменных до Сетапа...:
// ------------------- пароль для Настроек в Веб ----------------------
char valPass[20]; // переменная для ввода пароля
bool openadmin = false; // глобальный флаг ввода пароля 1 - правильно, 0 - ошибка
char adminpass[20] = "admin";
Страница /settings ("Настройки"):
 if (!openadmin) { // если пароль не вводили или он не правильный...
      GP.TITLE("Введите пароль:");

      GP.RELOAD_CLICK("password"); // перезагружает страницу при клике на элемент
      GP.PASS("password", "password", valPass); // GP.PASS(имя, подсказка, текст); // + текст [строка]
      GP.BREAK();
    } else {
    
     // тут основная отрисовка страницы "Настройки"
    
     // в самом конце сбрасываю флаг, т.к. девайс работает как Точка Доступа БЕЗ пароля!
     openadmin = false; // отрисовали станицу Настройки - сбросили пароль в Настройки, чтобы больше никто не вошёл.
 }
Это в секции if (ui.click())...:
if (ui.clickStr("password", valPass)) {
      int res = strcmp(valPass, adminpass); // res==0 совпадают, иначе res!= 0 не равны;
      if (res == 0) {
        openadmin = true;
      } else {
        openadmin = false;
      }
    }
Хотелось бы разъяснить вот эту строчку:

C++:
GP.RELOAD_CLICK("password"); // перезагружает страницу при клике на элемент
При каких конкретно условиях она перезагружает страницу? Я что-то перезагрузки не замечал...
 

SoftFelix

✩✩✩✩✩✩✩
16 Фев 2020
32
4
Парни, подскажите по Графикам максимально подробно, пожалуйста!

Пока про простейший график "GP.PLOT". Задача - нужно вывести 15 точек измерений датчика.

1. Как заставить работать этот график в режиме "Точка Доступа"? Т.е. без подключения к и-нету, т.е. в офф-лайне. Это основной режим работы девайса. Если можно - максимально подробно. Естественно, данный график должен работать и при подключении к роутеру (и-нет есть).

2.
C++:
GP.PLOT<к-во осей, к-во данных>(имя, подписи, данные int16_t, int dec = 0, int height = 400);
"Подписи" нужно передавать только в виде массива? Даже если один график?
C++:
const char *co2_name_graph_h[] = {"CO2 за час"};
Пытался сделать:
C++:
GP.PLOT_DARK<1, 15>("plot_co2_h", "CO2 за час", co2Hour);
... - ошибка при компиляции. :(

3. "Данные" (данные int16_t) всегда только в виде многомерного массива? (int16_t co2Hour[1][15]). Даже если это всего одна строка с 15 точками измерений (int16_t co2Hour[15])? Последнее вызывает ошибку компиляции. :(
 
Изменено:

SoftFelix

✩✩✩✩✩✩✩
16 Фев 2020
32
4
Подскажите, пожалуйста, как работать с GP.DATE (GP.TIME) совместно с RTC DS3231 и библиотекой RTClib ???

Задача получать и обновлять в поле GP.DATE (GP.TIME) данные даты и времени из RTC, а так же устанавливать (записывать) дату-время из GP.DATE (GP.TIME) в RTC. С этими структурами у меня вообще беда... :( Кто бы разъяснил... Заранее спасибо!

UPD: Так, с выводом, вроде, разобрался. Не знаю, насколько правильно, но работает.

C++:
GPdate nowRTCdate;
GPtime nowRTCtime;

//loop
nowRTCtime.set(now.hour(), now.minute(), now.second());
nowRTCdate.set(now.year(), now.month(), now.day());
     
//portal
UP.UPDATE("nowDate,nowTime");

M_BOX(GP.LABEL("Дата"); GP.DATE("nowDate", nowRTCdate); );  
M_BOX(GP.LABEL("Время"); GP.TIME("nowTime", nowRTCtime); );

//action
ui.updateDate("nowDate", nowRTCdate);
ui.updateTime("nowTime", nowRTCtime);
Теперь ломаю голову, как установить выбранную дату-время в RTC из форм GP.DATE и GP.TIME.

rtc.adjust... ???

UPD2: Сделал. Коллега по работе сильно помог.

C++:
if (ui.click()) {

    if (ui.clickDate("nowDate", nowRTCdate)) { // клик на Дату в Настройках (можно настроить Дату в RTC)
      rtc.adjust (DateTime(nowRTCdate.year, nowRTCdate.month, nowRTCdate.day, nowRTCtime.hour, nowRTCtime.minute, nowRTCtime.second)); // записываем Время (и Дату! отдельно нельзя!) в RTC
    }
    if (ui.clickTime ("nowTime", nowRTCtime)) { // клик на Время в Настройках (можно настроить Время в RTC)
      rtc.adjust (DateTime(nowRTCdate.year, nowRTCdate.month, nowRTCdate.day, nowRTCtime.hour, nowRTCtime.minute, nowRTCtime.second)); // записываем Дату (и Время! отдельно нельзя!) в RTC
    }
 
Изменено:

Barragozin_01

✩✩✩✩✩✩✩
30 Май 2024
1
0
Оформи код соответствующим тэгом, см. Правила
Доброго всем времени, подскажите пожалуйста новичку по примеру :


// подключить библиотеку файловой системы (до #include GyverPortal)
#include <LittleFS.h>
#include <GyverPortal.h>
GyverPortal ui(&LittleFS);
// конструктор страницы

в доке указано что необходимо настроить

собственно как это сделать? как настроить SPIFFS download?
-----------------------------------------------------------------------------------------------------------------------------------
SVG иконка из файла SPIFFS (должнен быть настроен download)
// оффлайн иконки
GP.LABEL(GP.ICON_FILE("/gp_data/gear.svg") + "Text");
GP.BREAK();
GP.LABEL(GP.ICON_FILE("/gp_data/gear.svg", 30) + "Text");
GP.BREAK();
GP.LABEL(GP.ICON_FILE("/gp_data/gear.svg", 50, GP_RED) + "Text");
GP.BREAK();
-----------------------------------------------------------------------------------------------------------------------------------
 
Изменено:

DEMON_NORD

✩✩✩✩✩✩✩
1 Июн 2024
2
0
доброго дня, подскажите начинающему... как переходить на заданную страницу по таймеру?
 

gidiara666

★✩✩✩✩✩✩
5 Май 2023
59
13
@DEMON_NORD,
наверное, надо просто внимательно прочесть предыдущие сообщения именно на этой странице... Прикинь, как тебе повезло! Там как раз рассказано, как переходить на страницу по флагу "введён правильный пароль". Дружище, поверь, порталу глубоко пофиг на то, по какой причине изменился флаг перехода на другую страницу: по факту введения правильного пароля, по таймеру, по прерыванию и т.д. Главное, не использовать delay(), тогда точно никто никуда не перейдёт в портале. :).
 

DEMON_NORD

✩✩✩✩✩✩✩
1 Июн 2024
2
0
спасибо за ответ. GP.RELOAD_CLICK("password"); ? это имеете ввиду?

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

paulgl

✩✩✩✩✩✩✩
23 Июн 2024
2
1
Здравствуйте, подскажите пожалуйста как по клику кнопки открыть внешнюю страничку. Есть несколько работающих порталов, хочу объединить их в один.
 
  • Лойс +1
Реакции: gidiara666

paulgl

✩✩✩✩✩✩✩
23 Июн 2024
2
1
Он дает ссылку только на текущий портал, а мне нужно на другой ip адрес
 

Navsikaya

✩✩✩✩✩✩✩
1 Авг 2024
2
0
Всем доброго дня!
Столкнулся с такой проблемой, что при нажатии кнопки не обновляются данные в text_box.

До этого был такой алгоритм: "При старте держу кнопку, заходу в AP режим, могу настроить и всё корректно отображается"

Переделал под режим такой: "При старте STA режим, При нажатии кнопки выкл STA и перехожу в AP режим. Данные отобрааются могу считывать, но при нажатии на туже кнопку я не вижу как обновляются данные , только при обновление само страницы вручную "С че может рабочий код перестать работать? из-за переключения режимов или ui.tick() .

Спасибо за ответ!
 

Navsikaya

✩✩✩✩✩✩✩
1 Авг 2024
2
0
@ASM, А не переходя на Hub это как-то решить можно? просто проект уже готовый и всё переделывать не ахти ( просто вдруг там много нужно изменять, не пробовал)
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@Navsikaya, перейти не сложно, если разобрался с этим проектом, и код не большой, можно за полчаса-час всё настроить)
И если несколько проектов, то будет ещё удобнее, всё в одном месте. Есть приложение, с которого можно управлять всеми устройствами.

Этот проект забыт...
Если там будут какие-то проблемы, баги, можно на гитхабе Сане сообщить, если проблема с его стороны, исправит.
 
  • Лойс +1
Реакции: HackXP

HackXP

✩✩✩✩✩✩✩
3 Авг 2024
8
0
@ASM, Приветствую, у меня проект на этой библиотеке, переходить не буду. Нашел косяк с паттерном. Вроде ни кто не писал о таком. Нужен был ввод строки с проверкой на формат ip адреса.
Портал 3.6.6, Ардуино 2.3.2
Паттерн \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
GP.TEXT("fssNTP", "NTP_ip", setNTP_ip, "", 15, "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"); // поле ввода текста

В браузере через инспектор получается такая фигня:
<input type="text" name="fssNTP" id="fssNTP" value="12.12.12.2" placeholder="NTP_ip" onchange="GP_click(this)" maxlength="15" pattern="d{1,3}.d{1,3}.d{1,3}.d{1,3}">

В общем слеши куда то пропадают, и соответственно не работает. Браузер Мозила и на телефоне, в Гугл тоже самое.

Переадресуй пожалуйста кому надо, знал бы я Саню, сам ему написал))
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@HackXP, возможно надо экранировать двойные кавычки, или использовать одинарные)
советую перейти на GyverHub, намного приятнее библиотека)
 

HackXP

✩✩✩✩✩✩✩
3 Авг 2024
8
0
@ASM, проект старый, нет смыла переходить, а для новых само собой GyverHub. Я конечно советы попробовал, так на всякий случай). У Алекса все норм описано:
Прототип: GP.TEXT("", "", "", "", 0, "", false)
Так что либо не компилится, либо не работает.

PS
Пришел к выводу что где то парсер удаляет первый попавшийся обратный слеш из паттерна, разобраться где именно не хватает моего уровня, поэтому можно поставить по два слеша))
Что бы получить рабочий \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
Делаем \\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}

Костыль ппц, но работает)
 
Изменено:

JDD

✩✩✩✩✩✩✩
5 Янв 2024
1
0
Коллеги, а это нормально, что даже в стандартном примере dynamicComponents не работают button в нормальном режиме? При нажатии кнопки вылетает ошибка device offline и в выводе консоли ничего не появляется при этом. То же самое может происходить случайным образом со слайдерами. Вылетает ошибка, и тогда нет вывода в консоли.

Я сделал ссылку с видео этого безобразия, надеюсь, она уже рабочая. Там будет понятнее о чём я: