GyverPortal

poty

★★★★★★✩
19 Фев 2020
3,222
937

@gidiara666, портал работает поверх SDK микропроцессора (RTOS или callback) и я упоминал, что переключение сетевого соединения - не его задача, хотя для Wi-Fi предусмотрено переключение между AP и router.
 

gorlanovmax

✩✩✩✩✩✩✩
26 Окт 2022
69
6
@gidiara666,
Соглашусь, по коду я имел ввиду именно кусок работы с ethernet.
с Wi-Fi у меня проблем нет
 

c470ip

✩✩✩✩✩✩✩
9 Янв 2020
9
4
Кто-нибудь знает, как перезапустить mDNS при смене режима WiFi с AP на STA?
Ситуация собсно такая: запускаемся в режиме AP, MDNS прекрасно работает, затем сохраняем в EEPROM SSID и пароль от роутера, переподключаемся (без полной перезагрузки). По новому IP адресу железка по-прежнему доступна, но MDNS соответственно больше не работает.

Что пробовал:
C++:
MDNS.notifyAPChange();
C++:
MDNS.update();
C++:
portal.stop();
portal.start("name");
и даже

C++:
MDNS.begin("name", WiFi.localIP(), 10)
(при запуске выдаёт 0, т.е. ошибку).

Подозреваю, проблема в уже запущенном экземпляре MDNS, т.е. в необходимости корректного перезапуска службы MDNS. Однако метода stop, disable или restart я не обнаружил.
Кто-то сталкивался уже с таким?
 
  • Лойс +1
Реакции: gidiara666

gidiara666

★✩✩✩✩✩✩
5 Май 2023
59
13
Мой опыт подключения eth shild. Писал по памяти и напутал, извиняюсь, у меня получилось с W5500, а вот LAN8720 утомил меня своей глюкавостью. Этот код, разумеется, я где-то спёр, уже не найду хозяина, код рабочий и подключается к роутеру, получая по DHCP адрес.
Итак:
ESP32W5500
GPIO18SCK
GPIO19MISO
GPIO23MOSI
GPIO5CS
ENABLERST
5V5V
GNDGND

eth shield W5500 +esp32:
#include <Arduino.h>
#include <SPI.h>
#include <Ethernet.h>
#include <NTPClient.h>

#define ETHERNET_CS_PIN 5

uint8_t mac_ethernet[6] = {'\0'};
const long utcOffsetInSeconds = 7200 + 3600;  //  UTC +2    літній час +1

EthernetUDP ethClient;

NTPClient timeClient(ethClient, "pool.ntp.org", utcOffsetInSeconds);

void ethernet_mac(uint8_t *_mac)
{
    uint8_t mac_this[6];
    if (esp_base_mac_addr_get(mac_this) != ESP_OK)
    {
        esp_efuse_mac_get_default(mac_this);
        for (int i = 0; i < 6; i++)
        {
            _mac[i] = mac_this[i];
            if (i == 5)
            {
                _mac[i] = mac_this[i] + 1;
            }
        }
    }
}

void setup()
{
    Serial.begin(115200);
    ethernet_mac(mac_ethernet);
    Ethernet.init(ETHERNET_CS_PIN);
    Ethernet.begin(mac_ethernet, 1000, 1000);
    Serial.println(Ethernet.localIP());
    timeClient.begin();
}

void print_time()
{
    if (!timeClient.update())
    {
        Serial.println("Error get time !");
        return;
    }

    Serial.print(timeClient.getHours());
    Serial.print(":");
    Serial.print(timeClient.getMinutes());
    Serial.print(":");
    Serial.println(timeClient.getSeconds());
}

void loop()
{
    static unsigned int timer = 0;

    if ((millis() - timer) > 1000)
    {
        timer = millis();
        print_time();
    }

    Ethernet.maintain();
}
 
Изменено:

gidiara666

★✩✩✩✩✩✩
5 Май 2023
59
13
@c470ip,
Всё в GP хорошо, кроме mDNS и отсутствия кнопки, изменяющей цвет и состояние по нажатию :).

Рекомендую использовать #include <DNSServer.h>
вызываем из voidsetup эту ерунду командой: wifi_connected();
сам код помещаем в... ну, допустим: wifi.ino
Сам сервер вызывается по адресу www.myesp32.com

wifi по заявкам публики:
//////////// wifi
void wifi_connected() {
  WiFi.mode(WIFI_STA);
//  WiFi.mode(WIFI_MODE_APSTA); //Поддерживается только прекрасным ESP32!!!
  byte tries = 60; //60 сек ожидаем подключения к wifi, пытаясь к нему...
  WiFi.begin(wifi-ssid, wifi-pass);

  while (--tries && WiFi.status() != WL_CONNECTED) {
    Serial.print (".");
    delay(1000);
    //____________

     if(WiFi.status() == WL_CONNECTED) //If WiFi connected to hot spot then start DNSServer
  {
    Serial.println (WiFi.localIP());

  
      //+++++++++++++++++++++

  const char *server_name = "www.myesp32.com";
     DNSServer dnsServer;
     IPAddress apIP(192, 168, 88, 100); // ; прибит железным гвоздём адрес из pool mikrotik

     WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
    const byte DNS_PORT = 53;
        Serial.println ("ESP_WIFI_PORTAL, IP : ");
    Serial.println  (apIP);
    dnsServer.start(DNS_PORT, server_name, apIP);
      Serial.println ("DNS name: www.myesp32.com.local"); 

     }
    }


  if (WiFi.status() != WL_CONNECTED) {
    // Если не удалось подключиться запускаем в режиме AP
    IPAddress apIP(10, 10, 10, 1); //обозначил постоянный адрес AP
    IPAddress subnet(255, 255, 255, 0);
    Serial.println ("WiFi up ACCESS POINT: ");
    Serial.println (ssidAP);
    Serial.println ("Start Settings IP: ");
    Serial.println (apIP);
    // Отключаем WIFI
    WiFi.disconnect();
    // Меняем режим на режим точки доступа
    WiFi.mode(WIFI_AP);
    // Задаем настройки сети
    WiFi.softAPConfig(apIP, apIP, subnet);
    // Включаем WIFI в режиме точки доступа с именем и паролем
    // хранящихся в переменных _ssidAP _passwordAP
    WiFi.softAP(ssidAP, passAP);

    //_______________
    DNSServer dnsServer;
    WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
    const byte DNS_PORT = 53;
    const char [I]server_name = "www.myesp32.com";  // Can be "[/I]" to all DNS requests
    dnsServer.start(DNS_PORT, server_name, apIP);
      Serial.println ("DNS name: www.myesp32.com.local");
    //_______________
    ui.attachBuild(build);
    ui.attach(action);
    ui.start();
    ui.enableOTA(ota_name, ota_pass);
        ui.start(web_start);
    // включить авторизацию
  ui.enableAuth("admin", "admin");
  } else {
    Serial.println ("");
    Serial.println ("WiFi запущен");
    Serial.println (WiFi.SSID());
    Serial.print ("IP адрес: ");
    Serial.println (WiFi.localIP());
    ui.attachBuild(build);
    ui.attach(action);
    ui.start(web_start);
    // включить авторизацию, она в GP конченая и работает не на пункт меню, а на всё...
  ui.enableAuth("admin", "admin");
    ui.enableOTA(ota_name, ota_pass);
  }
}
 
Изменено:
  • Лойс +1
Реакции: c470ip

gidiara666

★✩✩✩✩✩✩
5 Май 2023
59
13
@gorlanovmax,
а Вы гляньте в сообщение 758, как он должен вызываться вручную при подключении. Эту радость надо дополнительными заклинаниями вызывать.
 

c470ip

✩✩✩✩✩✩✩
9 Янв 2020
9
4
Всё в GP хорошо, кроме mDNS и отсутствия кнопки, изменяющей цвет и состояние по нажатию :).
Да mDNS-то работает отлично, только после первого запуска раз и навсегда) Пока решил эту проблему программной перезагрузкой. Некрасиво, зато работает. А то юзеру никак не объяснишь, что после перенастройки wifi и до перезапуска девайс будет доступен только по IP, который вдобавок непонятно где искать.

Рекомендую использовать #include <DNSServer.h>
А с GP оно точно нормально уживается? :unsure:
 

glevkin

✩✩✩✩✩✩✩
19 Июн 2023
1
0
Добрый вечер, как обновить значения слайдеров, свичей и текста при изменении значения одного из слайдера не обновляя страницу и не обновляя раз в секунду посредством jQuery, т.е. обновить, когда попросят
 

александр т

✩✩✩✩✩✩✩
30 Июл 2019
5
1
подскажите ,пожалуйста .
"exit status 1
Ошибка компиляции для платы Generic ESP8266 Module."
при компиляции gyverhub выдает . плата node MCU . что я не сделал?
примеры из gyverportalзаходят без проблем.
 

gidiara666

★✩✩✩✩✩✩
5 Май 2023
59
13
Уж поверьте моему печальному опыту, это может быть что угодно... Ищите свою ошибку. "IDE arduino- очень плохая среда разработки', - это я в мягкой форме передал мнение авторитетного Алекса Гайвера . Юзайте platformio, там глюки более разнообразны :).
 

c470ip

✩✩✩✩✩✩✩
9 Янв 2020
9
4
Скорее всего, из-за несоответствия указанного в IDE типа платы реальному. Для некоторых скетчей (типа помигать диодиком) это может быть и некритично, а на более сложных вылезает.
Я так долго мучился, подбирая правильный тип для безродного Wemos D1)
 

SannyBoy

✩✩✩✩✩✩✩
9 Авг 2023
1
0
Здравствуйте !

Есть функция GP.EMBED("DATA_LOG.txt"); котороя встраивает содержания файла в сайт. Файл должен существовать во flash памяти ESP.
В моем проекте испульзуеться SD карта, и у меня этот файл лежит там.

Возможно ли , и как, скормить этой функции ссылку на файл SD карты? Для работы SD карты использую библиотеки FS.h и SD.h

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

aidar_i

✩✩✩✩✩✩✩
1 Май 2021
64
8
Как правильно пользоваться с выполнить JS код?

C++:
GP.EVAL(имя);                       // выполнит код, отправленный в update
GP.EVAL(имя, код);                  // выполнить указанный код при ответе (любым текстом) на update
 

Владлэн

✩✩✩✩✩✩✩
28 Авг 2023
20
4
Чёт движения тут никакого, но попробую спросить...
Есть переменная, которая в прошивке выглядит так
tempData = doc["devices"][0]["sensors"][3]["value"];
Это десериализация JSON данных.
Есть ли способ из портала передать такую конструкцию программе? Чтоб можно было из веб интерфейса настраивать какие именно данные из JSON требуются.
 

Владлэн

✩✩✩✩✩✩✩
28 Авг 2023
20
4
@ASM, Я с GP кое как разобрался. Пытался вникнуть в хаб и сразу мозг сломал... А как это там сделать?
Структура предвидится жёсткой (это JSON, передаваемый на "народный мониторинг"), но может разнится порядок данных, так что будет возможность только номера в массиве менять. В GP пока что выкрутился так:
doc["devices"][var1]["sensors"][var2]["value"]
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311

Владлэн

✩✩✩✩✩✩✩
28 Авг 2023
20
4
Не, с передачей всё ок, устройство давным давно работает. Цель - другим устройством в сети тоже читать это buf, который на народмон уходит. Ну и хотел оставить место для манёвра, чтоб не зашивать адрес и элементы структуры во втором устройстве. В общем, проблему решил.
******************
Дополню немного.
Данные для народмона выглядят так
JSON:
{
  "devices": [
    {
      "mac": "*********",
      "name": "*********",
      "owner": "*******",
      "lat": "**********",
      "lon": "*********",
      "alt": "25",
      "sensors": [
        {
          "id": "**********",
          "name": "*********",
          "value": 0,
          "unit": "******" ,
          "time": 1693292854
       },
        {
          "id": "********,
          "name": "********",
          "value": 0.00,
          "unit": "*******" ,
          "time": 1693292854
       },
        {
          "id": "heap",
          "name": "Память",
          "value": 36184,
          "unit": "byte" ,
          "time": 1693292854
       },
        {
          "id": "volts",
          "name": "Напряжение питания",
          "value": 0.02,
          "unit": "V" ,
          "time": 1693292854
       },
        {
          "id": "volume",
          "name": "Показания водосчётчика",
          "value": 35.86,
          "unit": "m3" ,
          "time": 1693292854
       }
      ]
    }
  ]
}
Второе устройство в сети может получать эти данные. Десериализирует с помощью библиотеки arduinojson. Если вдруг у первого устройства поменяется количество и/или порядок выводимых данных, то у второго надо предусмотреть какие-то настройки. Чтоб получить данные volts после десериализации пишешь
float volts = doc["devices"][0]["sensors"][3]["value"]
Чтоб получить данные о памяти
int heap = doc["devices"][0]["sensors"][2]["value"]
И так далее.
У второго устройства предусмотрел в веб-морде такие поля.
 
Изменено:
  • Лойс +1
Реакции: Maxx1200

krepton85

✩✩✩✩✩✩✩
23 Окт 2021
3
2
Вопрос как сделать удаление файлов из LittleFS не GET запросом, а POST. А то в стандартном примере функция String displayFS() это делает GET - ом и у меня в адресной строке появляется http://192.168.1.146/?delete=/test.txt, после чего все время удаляется этот файл если не обращать внимания на адресную строку в браузере. Или может редиректом как то пофиксить это недоразумение?
 

igorich

✩✩✩✩✩✩✩
20 Сен 2023
1
0
Подскажите что нужно собрать по железу для начального развёртывания Портала? Нигде в документации не нахожу описания аппаратной части.
Имею плату Ардуино, но ведь для ПОртала требуется доступ в интернет.
Помогите новичку со стартом.
 

wow4an

✩✩✩✩✩✩✩
12 Окт 2019
5
0
Подскажите пожалуйста, как сделать навигацию по сайту без использования меню, блока навигации или кнопки-ссылки, а переходить на другую страничку по клику на кнопку-иконку. Не пойму что прописать в action, в if (ui.click("название кнопки-иконки")) {что тут сделать?};
 
Изменено: