GyverHUB, обсуждение библиотеки

krepton85

✩✩✩✩✩✩✩
23 Окт 2021
3
2
Помогите разобраться с этой библиотекой, прошил пример "full_demo" и MQTT работает только на половину - отправляет сообщения устройство на esp8266 в "PREFIX/hub/ID/get/NAME ", но не получает, такое ощущение что не подписано не на один топик. Пробовал с умного дома отправлять в топик"PREFIX/ID/set/NAME " - в сериал порт тишина и в WS ничего на меняется. Но ведь здесь написано, что "
  • Библиотека GyverHub сама подписывается на топики для установки значений
"
 
  • Лойс +1
Реакции: Teh-nick и Galex-pro

MotorART

✩✩✩✩✩✩✩
5 Авг 2023
1
1
А у меня вообще пока ничего не получается. Прошиваю из папки с примерами full_demo светодиод на плате Wemosa даже не загорается. Полагаю, какие то файлы должны лежать рядом с фулл_демо не могу понять какие. GyverLanp2 работает без проблем.
 
  • Лойс +1
Реакции: krepton85

Борман

✩✩✩✩✩✩✩
15 Сен 2023
2
0
В примере canvas рисование линий выполняется командой
C++:
    cv2.line(random(0, 300), random(0, 300), random(0, 300), random(0, 300));
с ней все понятно.
Но также применяется конструкция для рисования креста
C++:
  cv1.line(0, 0, -1, -1);
  cv1.line(0, -1, -1, 0);
и вот с этим ничего непонятно. Это какие то относительные координаты или что ?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,197
1,282
Москва
@Борман, не знаю, возможно это такой хак, когда -1 становится максимальной координатой, ведь если взять целую 8-мибитную переменную и задать ей значение-1, то получим 255.
 
  • Лойс +1
Реакции: Борман

poty

★★★★★★✩
19 Фев 2020
2,989
895
Это какие то относительные координаты или что ?
Читаем документацию:
  • Отрицательные числа при задании координат графики через функции GHcanvas (не через кастомный js код) вычитаются из ширины холста, таким образом point(-1, -1) установит точку в правый нижний угол
 

N0rdling

★✩✩✩✩✩✩
15 Янв 2020
154
18
Всех приветствую!
Приложение на андроиде (и веб-приложение тоже пробовал) не подключается к MQTT HOST: srv2.clusterfly.ru, порт wss: 9994 (пробовал и другие: 9991, 9992, 9993), причем wemos, прошитый примером из библиотеки "FULL DEMO" подключился благополучно по tcp:9991. Логин и пароль введен из профиля clusterfly.ru, Prefix = логин, Client ID - придумал свой.
По локалке wemos благополучно управляется, как из веб-приложения, так и с андройд - приложения, но если отключить на телефоне wi-fi, то всё...
Что-то делаю не так?
 

Захар3434

✩✩✩✩✩✩✩
19 Июн 2023
3
0
Доброго времени суток! Пришла идея собрать экое умное реле на WeMos D1 и соответственно обычном реле. Не очень силён в программировании, к сожалению, но азы освоил. Как управлять пином вемоса через Дом с Алисой, что и где нужно настроить?
 

Захар3434

✩✩✩✩✩✩✩
19 Июн 2023
3
0

погуглил и мягко говоря понял, что не хочу собирать это именно на gyverHub. Где можно найти гайды именно по гайверхабу?
 

Jon2023

✩✩✩✩✩✩✩
28 Сен 2023
6
4
Все хорошо работает, девайсы крутятся в локальной сети.
Вот только через ОТА обновляется один раз и все! Второй раз всегда выдает при загрузке ERROR.
Приходится опять тащить девайс к компу и через СОМ-порт обновлять прошивку.
Бинарный файл создаю в Arduino IDE версии 1.8.19
Платка на чипе ESP8266 LOLIN(WeMos) D1 R2& mini. Библиотека версии 3.1.2

В чем может быть проблема? Вроде документацию внимательно читал.
 

Jon2023

✩✩✩✩✩✩✩
28 Сен 2023
6
4
У кого нибудь работает команда PREFIX/ID/set/NAME ?
WQTT честно передает команду на устройство, однако библиотека gyverhub ни как не реагирует на это.
 
  • Лойс +1
Реакции: Teh-nick и Galex-pro

Galex-pro

✩✩✩✩✩✩✩
8 Ноя 2023
1
0
Проблема аналогичная описанной выше. Не могу обновить топик из умного дома. Публикация работает.
Если есть у кого пример скетча, где переменная обновляется в соответствии с PREFIX/ID/set/NAME буду признателен.
 

Jon2023

✩✩✩✩✩✩✩
28 Сен 2023
6
4
у меня все заработало (орф.ошибка была).
В WQTT настроил тумблер
Снимок.PNG

а в скетче где build() рисует интерфейс вставил команду:

Снимок1.PNG
теперь я могу щелкать этим тумблером как с телефона, так и из браузера через MQTT.
 
  • Лойс +1
Реакции: Galex-pro

Teh-nick

✩✩✩✩✩✩✩
9 Ноя 2023
7
1
@Jon2023,
Пытаюсь победить такую же проблему: могу публиковать топики, но не получается подписаться. Сделал как у вас, но с устройства я двигаю переключателем на сервере, а если двигаю переключатель, на сервере, то он тут же возвращается в исходное состояние, так и не переключив устройство.
Если это возможно, выложите полный код вашего скетча, возможно я как то неправильно провожу опрос на подписаные топики.
Вот мой скетч, возможно вы найдете где ошибка:
протечка:
// быстрый старт

#include <Arduino.h>
#include <EEPROM.h>
struct LoginPass {
  char ssid[20];
  char pass[20];
};

LoginPass lp;

bool flag = false;
uint32_t btnTimer = 0;
bool hold = 0;
bool valve = 0;


// подключаем библиотеку и настраиваем устройство
#include <GyverHub.h>
GyverHub hub("MyDevices", "ESP8266", "");
// иконки
// https://fontawesome.com/v5/cheatsheet/free/solid
// https://fontawesome.com/v5/search?o=r&m=free&s=solid

// переменные для интерфейса
//GH_BOOL button=0;
bool button = 0;
GHbutton b2;
GHbutton open;   //переменная для программной кнопки открыть
GHbutton close;  //переменная для программной кнопки закрыть
GHbutton save;   //переменная для программной кнопки сохранить настройки сети
bool start;      //переменная-флаг для запуска настройки сети если при старте нажата кнопка
uint8_t sld_i;
float sld_f;


String inp_str;
char inp_cstr[11];  // строка на 10 символов (+1 нулевой)
int16_t inp_int;

// это наш билдер. Он будет вызываться библиотекой
// для сборки интерфейса, чтения значений и проч.
void build() {
  if (start) {                                              //если при запуске была нажата кнопка, запускаем настройщик сети
    hub.Input(lp.ssid, GH_CSTR, F("название сети"));        //поле с назаванием сети, после ввода, нужно нажать стрелочку в конце поля
    hub.Input(lp.pass, GH_CSTR, F("пароль сети"), GH_RED);  //поле для ввода пароля, после ввода, нужно нажать стрелочку в конце поля
    hub.Button(&save, F("сохранить"), GH_RED);              //кнока сохранить настройки
    if (save) {                                             //если кнопку таки надавили...
      EEPROM.put(0, lp);                                    // сохраняем
      EEPROM.commit();                                      // записываем
      Serial.println();
      Serial.println(lp.ssid);
      Serial.println(lp.pass);
      WiFi.softAPdisconnect();  // отключаем AP
      start = 0;                //убираем флаг
    }
  } else {  //если кнопку при старте не давили, то запускаем основную морду
    // сделаем интерфейс в виде стильных виджетов
    // BeginWidgets() начинает новую горизонтальную строку виджетов
    hub.BeginWidgets();

    // ширина следующих виджетов задаётся в %
    hub.WidgetSize(50);

    // это кнопка без настроек
    // Кнопка - активный компонент: вернёт 1 если нажата
    if (hub.Button(&open, F("Открыть"), GH_GREEN)) valve = 1;

    // ко второй кнопке подключим переменную b2
    // она будет true, пока кнопка удерживается. Опросим её ниже в loop
    // добавим название и цвет
    if (hub.Button(&close, F("Закрыть"), GH_PINK)) valve = 0;
    hub.WidgetSize(50);
    hub.LED_(F("valveopen"), 0, "Открыто");
    hub.LED_(F("valveclose"), 0, "Закрыто");
    hub.WidgetSize(50);

    hub.LED_(F("btnState"), 0, "кнопка");  //индикатор нажатой кнопки
    hub.LED_(F("valve1"), 0, "сервер");    //индикатор ответа сервера

    hub.EndWidgets();
  }
}
void setup() {
  // hub.setupMQTT("m6.wqtt.ru", 15143); что то не заработало
  // читаем логин пароль из памяти
  EEPROM.begin(100);
  EEPROM.get(0, lp);
  Serial.begin(115200);
  pinMode(D1, INPUT_PULLUP);      //кнопка сидит тут
  pinMode(D4, OUTPUT);            // реле сидит тут
  if (digitalRead(D1)) {          //если кнопка нажата...
    start = 1;                    //поворачиваем флаг для выбора морды конфигурации сети
    WiFi.mode(WIFI_AP);           // сеть как точка доступа
    WiFi.softAP("Vankin_Wi-FI");  //название сети
    Serial.println();
    Serial.println("Точка доступа создана");
    Serial.println(WiFi.localIP());
  } else {  //если кнопка не нажата...


// если это ESP - подключаемся к WiFI
#ifdef GH_ESP_BUILD

    start = 0;                     //флаг для выбора морды основной программы
    WiFi.mode(WIFI_STA);           //сеть как клиент
    WiFi.begin(lp.ssid, lp.pass);  //параметры сети берем из памяти
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }
    Serial.println();
    Serial.println(lp.ssid);
    Serial.println(lp.pass);
    Serial.println(WiFi.localIP());
    const char* login = "***";
    const char* pass = "***";
    hub.setupMQTT("m6.wqtt.ru", 15140, "[B][I]", "[/I][/B]", 0, 0);
    if (hub.online()) Serial.println("MQTT подключен");  // MQTT подключен)
#endif
  }
  // можно подключить обработчик веб-консоли
  // зайди в info/cli в приложении
  // или нажми ~ при открытом устройстве
  hub.onCLI([](String& s) {
    Serial.println(s);
    hub.print(s);  // отправить обратно
    // вдогонку отправим строку из Input inp_str
    hub.print(inp_str, GH_BLUE);
  });

  hub.onBuild(build);  // подключаем билдер
  hub.begin();         // запускаем систему
}

void loop() {
  hub.tick();                       // обязательно тикаем тут
  bool btnState = digitalRead(D1);  //читаем состояние кнопки
  //button = digitalRead(D1);
  // Serial.println(button);
  static GHtimer tmr(1000);  //таймер обновления состояния 1 сек
  if (tmr) {
    hub.sendUpdate("btnState", String(btnState));  //отправляем на морду состояние кноки
    hub.sendUpdate("valveopen", String(valve));
    hub.sendUpdate("valveclose", String(!valve));
    // hub.sendGet("valve", String(valve));
    //Serial.println(
   hub.sendGet("valve1", String(valve));

    // hub.sendGetAuto(valve);
    //hub.sendUpdate("valve1", String(valve));
  }

  if (open) valve = 1;
  if (close) valve = 0;
  // читаем инвертированное значение для удобства

  if (btnState && !flag && millis() - btnTimer > 100) {
    flag = 1;
    valve = !valve;
    btnTimer = millis();
    Serial.println(valve);
    hub.sendGet("btnState", String(btnState));
  }
  if (!btnState && flag && millis() - btnTimer > 100) {
    flag = false;
    btnTimer = millis();
    hub.sendGet("btnState", String(btnState));
  }
  if (valve) digitalWrite(D4, 1);
  else digitalWrite(D4, 0);
}
79 строчка - этот индикатор я пытаюсь зажечь через MQTT
148 строчка - обновляю состояние переменной индикатора
 

Jon2023

✩✩✩✩✩✩✩
28 Сен 2023
6
4
@Teh-nick,
Переменная valve в строке 79 все время переписывается в строчках 154,155 поэтому ни чего и не происходит.
Эти строчки (154,155) надо закомментировать потому как переменная уже давно определена в билдере или MQTT.
P.S. Если надо просто вкл/выкл лучше все сделать через переключатель hub.Switch, а не через кнопки
 
Изменено:

Teh-nick

✩✩✩✩✩✩✩
9 Ноя 2023
7
1
@Jon2023,
Все равно не работает. Решил упростить задачу, что бы разобраться как формировать запросы:
протечка:
// быстрый старт

#include <Arduino.h>
#include <EEPROM.h>
struct LoginPass {
  char ssid[20];
  char pass[20];
};

LoginPass lp;

bool flag = false;
uint32_t btnTimer = 0;
bool hold = 0;
bool valve = 0;
bool valve1 = 0;

// подключаем библиотеку и настраиваем устройство
#include <GyverHub.h>
GyverHub hub("MyDevices", "ESP8266", "");

bool button = 0;
GHbutton b2;
GHbutton open;   //переменная для программной кнопки открыть
GHbutton close;  //переменная для программной кнопки закрыть
GHbutton save;   //переменная для программной кнопки сохранить настройки сети
bool start;      //переменная-флаг для запуска настройки сети если при старте нажата кнопка
uint8_t sld_i;
float sld_f;
String inp_str;
char inp_cstr[11];  // строка на 10 символов (+1 нулевой)
int16_t inp_int;

void build() {
  if (start) {                                              //если при запуске была нажата кнопка, запускаем настройщик сети
    hub.Input(lp.ssid, GH_CSTR, F("название сети"));        //поле с назаванием сети, после ввода, нужно нажать стрелочку в конце поля
    hub.Input(lp.pass, GH_CSTR, F("пароль сети"), GH_RED);  //поле для ввода пароля, после ввода, нужно нажать стрелочку в конце поля
    hub.Button(&save, F("сохранить"), GH_RED);              //кнока сохранить настройки
    if (save) {                                             //если кнопку таки надавили...
      EEPROM.put(0, lp);                                    // сохраняем
      EEPROM.commit();                                      // записываем
      Serial.println();
      Serial.println(lp.ssid);
      Serial.println(lp.pass);
      WiFi.softAPdisconnect();  // отключаем AP
      start = 0;                //убираем флаг
    }
  } else {  //если кнопку при старте не давили, то запускаем основную морду

    hub.BeginWidgets();
    hub.WidgetSize(50);
    hub.WidgetSize(50);
    hub.Switch_(F("valve"), &valve, F("Клапан"), GH_PINK);
    hub.LED_(F("btnState"), 0, "кнопка");  //индикатор нажатой кнопки
    hub.WidgetSize(50);
    hub.LED_(F("valveopen"), 0, "Открыто");
    hub.LED_(F("valveclose"), 0, "Закрыто");
    hub.LED_(F("valve1"), 0, "сервер");  //индикатор ответа сервера
    hub.EndWidgets();
  }
}

void setup() {
  // hub.setupMQTT("m6.wqtt.ru", 15143); что то не заработало
  // читаем логин пароль из памяти
  EEPROM.begin(100);
  EEPROM.get(0, lp);
  Serial.begin(115200);
  pinMode(D1, INPUT_PULLUP);      //кнопка сидит тут
  pinMode(D4, OUTPUT);            // реле сидит тут
  if (digitalRead(D1)) {          //если кнопка нажата...
    start = 1;                    //поворачиваем флаг для выбора морды конфигурации сети
    WiFi.mode(WIFI_AP);           // сеть как точка доступа
    WiFi.softAP("Vankin_Wi-FI");  //название сети
    Serial.println();
    Serial.println("Точка доступа создана");
    Serial.println(WiFi.localIP());
  } else {  //если кнопка не нажата...


// если это ESP - подключаемся к WiFI
#ifdef GH_ESP_BUILD

    start = 0;                     //флаг для выбора морды основной программы
    WiFi.mode(WIFI_STA);           //сеть как клиент
    WiFi.begin(lp.ssid, lp.pass);  //параметры сети берем из памяти
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }
    Serial.println();
    Serial.println(lp.ssid);
    Serial.println(lp.pass);
    Serial.println(WiFi.localIP());
    const char* login = "u_Z2CUP8";
    const char* pass = "hjsDQD7g";
    hub.setupMQTT("m6.wqtt.ru", 15140, "u_Z2CUP8", "hjsDQD7g", 0, 0);
    if (hub.online()) Serial.println("MQTT подключен");  // MQTT подключен)
#endif
  }
  // можно подключить обработчик веб-консоли
  // зайди в info/cli в приложении
  // или нажми ~ при открытом устройстве
  hub.onCLI([](String& s) {
    Serial.println(s);
    hub.print(s);  // отправить обратно
    // вдогонку отправим строку из Input inp_str
    hub.print(inp_str, GH_BLUE);
  });

  hub.onBuild(build);  // подключаем билдер
  hub.begin();         // запускаем систему
}

void loop() {
  hub.tick();                       // обязательно тикаем тут
  bool btnState = digitalRead(D1);  //читаем состояние кнопки
  static GHtimer tmr(1000);  //таймер обновления состояния 1 сек
  if (tmr) {
    hub.sendUpdate("btnState", String(btnState));  //отправляем на морду состояние кноки
    hub.sendGet("valve", String(valve));
    hub.sendGet("valve1", String(valve1));
  }
  if (btnState && !flag && millis() - btnTimer > 100) {
    flag = 1;
    valve = !valve;
    btnTimer = millis();
    Serial.println(valve);
    hub.sendGet("btnState", String(btnState));
  }
  if (!btnState && flag && millis() - btnTimer > 100) {
    flag = false;
    btnTimer = millis();
    hub.sendGet("btnState", String(btnState));
  }

  if (valve) digitalWrite(D4, 1);
  else digitalWrite(D4, 0);
}
58 строчка - пытаюсь поморгать этим индикатором через MQTT
122 строчка - слушаем, что скажет MQTT

То что прописано на сервере:
Топик управления
MyDevices/hub/db15d8c0/set/valve1
Топик состояния
MyDevices/hub/db15d8c0/get/valve1

Напишите, пожалуйста, вашу строчку с функцией запроса get! Может у меня форма записи не верная?
 
Изменено:

Jon2023

✩✩✩✩✩✩✩
28 Сен 2023
6
4
Привет, упростил код для своего понимания. Все работает и от физич. кнопки и с телефона и из брокера MQTT.
топик управления MyDevices/4b******/set/btnState
топик состояния MyDevices/hub/4b*****/get/btnState


C++:
char Name[] = "ESP8266";
//плата LOLIN(WEMOS)D1 R2 & mini

#include <WiFiManager.h>         //https://github.com/tzapu/WiFiManager
//менеджер при первой заливке скетча создает точку доступа "ESP8266".
//Подключаемся к ней. По адресу 192.168.4.1 подключаемся к модулю.
//выбираем домашнюю сеть,  вводим пароль, сохраняем. Все!
//Теперь еспшка автоматически будет подключаться к дом.сети.

#include <GyverHub.h>
GyverHub hub("MyDevices", "ESP8266", "");

bool valve = 0;
bool flag = false;
uint32_t btnTimer = 0;

void build() {
  hub.BeginWidgets();
  hub.WidgetSize(25);

  hub.Switch_(F("btnState"), &valve, F("Клапан"), GH_PINK);

  hub.EndWidgets();
}
void setup() {
  Serial.begin(115200);

  WiFiManager wifi;
  wifi.setTimeout(180);//in seconds
  if (!wifi.autoConnect(Name)) {
    Serial.println("failed to connect and hit timeout");
    delay(3000);
    ESP.reset();
    delay(5000);
  }
  Serial.println("connected...yes!");

  pinMode(D1, INPUT_PULLUP);      //кнопка сидит тут
  pinMode(D4, OUTPUT);            // реле сидит тут

  //подключаем MQTT (адрес, пользователь, пароль в кавычках, порт без кавычек)
  hub.setupMQTT("m6.wqtt.ru", 15143, "пользователь", "пароль");
  hub.onBuild(build);     // подключаем билдер
  hub.begin();            // запускаем систему
}

void loop() {
  hub.tick();  // обязательно тикаем тут

  bool btnState = digitalRead(D1);  //читаем состояние кнопки
  if (btnState && !flag && millis() - btnTimer > 100) {
    flag = true;
    valve = !valve;
    btnTimer = millis();
  }
  if (!btnState && flag && millis() - btnTimer > 100) {
    flag = false;
    btnTimer = millis();
  }

  static GHtimer tmr(1000);  //таймер обновления состояния 1 сек
  if (tmr) {
    hub.sendUpdate("btnState");  //отправляем на морду состояние кноки
    hub.sendGet("btnState");//отправляем на MQTT состояние кноки
    //(информация о ID топика MQTT создается в разделе info для каждой еспишки своя)

    digitalWrite(D4, valve);
  }

}
 

Teh-nick

✩✩✩✩✩✩✩
9 Ноя 2023
7
1
@Jon2023, Спасибо большое! Действительно помогло! В следующий раз постараюсь быть внимательней:)
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
567
Пс, по вопросам пишите лучше на гитхаб или в телегу, оперативно отвечаю. Также крупное обновление скоро будет внедряться, информация тут https://github.com/GyverLibs/GyverHub/issues/43
 

krepton85

✩✩✩✩✩✩✩
23 Окт 2021
3
2
@Teh-nick, ошибка в MyDevices/hub/db15d8c0/set/valve1
Должно быть без hub
MyDevices/db15d8c0/set/valve1
нет, у меня и так не работает, походу в wiki нас обманули, у меня заработало только так: led_settings/126fe299/hub/set/_n2, так как в wiki - выдает ошибку в сериал: "MQTT: UNKNOWN".