GyverPortal

Sam_jakson

✩✩✩✩✩✩✩
13 Май 2020
19
0
@ASM,
error: expected ';' before 'digitalWrite'
86 | portal.click("btn_onkond") digitalWrite(IRsend, uint16_t rawData_on);
неа не помогло

C++:
void action() {
  portal.click("btn_onkond") digitalWrite(IRsend, uint16_t rawData_on);
  tempSensor1 = sensors.getTempC(sensor1); // Получить значение температуры
  if (portal.update("val")) portal.answer(tempSensor1);
  // был клик по компоненту
  if (portal.click()) {
    // проверяем компоненты и обновляем переменные
    if (portal.click("btn_on")) digitalWrite(Led_Pin, 0);
    if (portal.click("btn_off")) digitalWrite(Led_Pin, 1);
    if (portal.click("btn_offkond")) digitalWrite(Led_Pin, 1);
    }

}


То есть вот так код долен был выглядеть ?
 

Sam_jakson

✩✩✩✩✩✩✩
13 Май 2020
19
0
@DAK, вот да, в ней тоде сомневаюсь и не пойму как правильно закинуть туда массив данных и заставить работать
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
у меня была похожая проблема)

C++:
void action() {
  tempSensor1 = sensors.getTempC(sensor1); // Получить значение температуры
  if (portal.update("val")) portal.answer(tempSensor1);

  // проверяем компоненты и обновляем переменные
  if (portal.click("btn_on")) digitalWrite(Led_Pin, 0);
  if (portal.click("btn_off")) digitalWrite(Led_Pin, 1);
  if (portal.click("btn_onkond")) digitalWrite(IRsend, uint16_t rawData_on);
  if (portal.click("btn_offkond")) digitalWrite(Led_Pin, 1);
}
 
Изменено:

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
@ASM, ну и зачем лишние проверки делать, тем более актион будет отрабатывать регулярно, так как аджакс будет срабатывать раз в секунду. Хотя мне всё равно, но условие portal.click глючит в этой библиотеки, только если клики приходят с страниц, отличных от корневой. Тут всё в корне, проблема не в портале. Думаю светодиод идеально отрабатывает при нажатие на другие кнопки. так что Вам копать в сторону irsend, судя по всему Вы не правильно его вызываете.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
@ASM, дело не в этом, я даже знаю в каком символе проблема в библиотеки, которая вызывает глюк, описанный Вами, это ни как не должно влиять на логику конкретно этого кода.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Должен покатить, это надо вместо
digitalWrite(IRsend, uint16_t rawData_on);

Только надо ещё добавить длинну, и вроде частоту.. (не уверен за частоту, но можно попробовать)
irsend.sendRaw(rawData_on, 243, 38);

Особенность пультом кондиционера в том, что при каждом нажатии на любую кнопку он передаёт все параметры, то есть температуру, режим работы, обороты вентилятора. Так что тут будьте аккуратнее.
 

Sam_jakson

✩✩✩✩✩✩✩
13 Май 2020
19
0
@DAK,
Только надо ещё добавить длинну, и вроде частоту.. (не уверен за частоту, но можно попробовать)
irsend.sendRaw(rawData_on, 243, 38); компиляция прошла, сейчас проверю работает или нет.

UPDATE:
Все работает)
 
Изменено:

Alexusaty

✩✩✩✩✩✩✩
7 Сен 2022
5
1
Уважаемые коллеги. Подскажите пожалуйста как реализовать следующую задачу с использованием функционала портала?
Если в двух словах, то:
1. ESP ждет импульса на одной из ног GPIO.
2. При приходе импульса запоминает время и дату "точки" в массив.
3. Клиенту через wifi нужно видеть список зарегистрированных "точек" в браузере.
То есть на страничке, генерируемой порталом должен быть список с возможностью скроллинга и кнопка "Обновить".

С кнопкой проблем нету - инструмент такой реализован. А вот список точек подразумевается что должен выводиться в каком-то элементе типа text. Но, как мне видится, элемент text - однострочный, а мне строк надо много в пределах одного элемента.
Кто подскажет решение?
 

aidar_i

✩✩✩✩✩✩✩
1 Май 2021
64
8
Текст ссылка:
В GyverPortal.h

void TXT_LINK(const char* link,const char* name,const char* clas) {
*_GP += F("<a href=\"");
*_GP += link;
*_GP += F("\" class=\"");
*_GP += clas;
*_GP += F("\">");
*_GP += name;
*_GP += F("<a>");
}

В void build()
GP.TXT_LINK(Ссылка, Текст, Настройки);
Если настройки (классы) по умолчанию то "" 2 кавычки без символов внутри.
Если нет у вас классов(как в оригинальной библиотеке), то удалите ,const char* clas и строки
*_GP += F("\" class=\"");
*_GP += clas;
Снял видео.
 
Изменено:

oleg.vresh

✩✩✩✩✩✩✩
12 Мар 2022
10
0
Привет парни.
попробовал перейти на VS Code + Platformio и возникла такая проблема:
При компиляции ругается на multiple definition всех методов библиотеки связанных с GPdate и GPtime.
на каждй метод выдает такое :
./../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\src\schedule\schedule.cpp.o: in function `_Z10encodeDate6GPdate':
schedule.cpp:(.text._Z10encodeDate6GPdate+0x30): multiple definition of `_Z10encodeDate6GPdate'; .pio\build\esp12e\src\main.cpp.o:main.cpp:(.text._Z10encodeDate6GPdate+0x30): first defined here
../../../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe

schedule.h:
#pragma once
#include <GyverPortal.h>

class Schedule
{
public:
  GPdate startDate;
  GPtime startTime;
  GPdate endDate; 
  endTime; 
};
schedule.cpp:
#include <Arduino.h>
#include "schedule/schedule.h"
если в файле schedule.cpp закоментить подключение (#include "schedule/schedule.h") все собирается.
или же отключаю Gyver Portal и все объявления с ним связанные и тоже все работает

пока писал, проверил с Gyver NTC та же история... multiple definition ...
Может библиотеки надо подключать как-то хитро?
 
Изменено:

aidar_i

✩✩✩✩✩✩✩
1 Май 2021
64
8
В графике выводится по оси Х время без зонирования, например, у меня разница 5 часов.
Как можно исправить это? Сам пытался но не смог.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
@aidar_i,
может попытаться подменять время на +5 часов в момент записи данных? Было бы поще посоветовать, если увидеть код добавления точек в массив
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
@Alexusaty, есть же GP.Label, почему бы в конструкторе не пройтись проствм циклом по массиву и на каждую точку не сделать GP.LABEL(),GP.BREAK(); тогда у вас будет несколько текстовых строк. Так же Вы можете собрать строку из "точек" массива через зяпятую и запихать его в GP.SELECT(), тогда вы сможете выбирать между точками массива.
 

aidar_i

✩✩✩✩✩✩✩
1 Май 2021
64
8
Разобрался, заработал. Автоматически определяет зону и выводит местное время.
Вот весь код, замените в файле GyverPortal.h
C++:
    void AJAX_PLOT(const char* name, int axes, int xamount = 20, int prd = 1000) {
        *_GP += F(""
        "<script src=\"https://code.highcharts.com/highcharts.js\"></script>\n"
        "<div id=\"");
        *_GP += name;
        *_GP += F("\" class=\"chartBlock\"></div><script>\n"
        "var ");
        *_GP += name;
        *_GP += F("=new Highcharts.Chart({\n"
        "chart:{borderRadius:10,renderTo:'");
        *_GP += name;
        *_GP += F("',style:{fontFamily:\"sans-serif\"}},\n"
        "title:{text:''},"
        "series:[");
        for (int i = 0; i < axes; i++) {
            *_GP += F("{data:[]}");
            if (i != axes - 1) *_GP += ',';
        }
        *_GP += F("],\n"
        "xAxis:{type:'datetime',dateTimeLabelFormats:{second:'%H:%M:%S'}},\n"
        "yAxis:{title:{enabled:false}},"
        "credits:{enabled:false}});\n"
        "setInterval(function(){var xhttp=new XMLHttpRequest();var ch=");
        *_GP += name;
        *_GP += F("\n"
        "xhttp.onreadystatechange=function(){if(this.readyState==4&&this.status==200){\n"
        "var x=new Date().getTime()- new Date().getTimezoneOffset()*60000;"
        "var arr=this.responseText.split(',');"
        "var move=(ch.series[0].data.length>");
        *_GP += xamount;
        *_GP += F(");\n"
        "for(let i=0;i<arr.length;i++)ch.series[i].addPoint([x,Number(arr[i])],true,move,true);\n"
        "}};xhttp.open(\"GET\",\"GP_update?");
        *_GP += name;
        *_GP += F("=\",true);xhttp.send();},\n");
        *_GP += prd;
        *_GP += F(");</script>\n");
    }
   
    void AJAX_PLOT_DARK(const char* name, int axes, int xamount = 20, int prd = 1000) {
        *_GP += F(""
        "<script src=\"https://code.highcharts.com/highcharts.js\"></script>\n"
        "<script src=\"https://code.highcharts.com/themes/dark-unica.js\"></script>\n"
        "<div id=\"");
        *_GP += name;
        *_GP += F("\" class=\"chartBlock\"></div><script>\n"
        "var ");
        *_GP += name;
        *_GP += F("=new Highcharts.Chart({\n"
        "chart:{borderRadius:10,renderTo:'");
        *_GP += name;
        *_GP += F("',style:{fontFamily:\"sans-serif\"}},\n"
        "title:{text:''},"
        "series:[");
        for (int i = 0; i < axes; i++) {
            *_GP += F("{data:[]}");
            if (i != axes - 1) *_GP += ',';
        }
        *_GP += F("],\n"
        "xAxis:{type:'datetime',dateTimeLabelFormats:{second:'%H:%M:%S'}},\n"
        "yAxis:{title:{enabled:false}},"
        "credits:{enabled:false}});\n"
        "setInterval(function(){var xhttp=new XMLHttpRequest();var ch=");
        *_GP += name;
        *_GP += F("\n"
        "xhttp.onreadystatechange=function(){if(this.readyState==4&&this.status==200){\n"
        "var x=new Date().getTime()- new Date().getTimezoneOffset()*60000;"
        "var arr=this.responseText.split(',');"
        "var move=(ch.series[0].data.length>");
        *_GP += xamount;
        *_GP += F(");\n"
        "for(let i=0;i<arr.length;i++)ch.series[i].addPoint([x,Number(arr[i])],true,move,true);\n"
        "}};xhttp.open(\"GET\",\"GP_update?");
        *_GP += name;
        *_GP += F("=\",true);xhttp.send();},\n");
        *_GP += prd;
        *_GP += F(");</script>\n");
    }
 
Изменено:

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
так всё непривычно в коде, скоро всё будет обновляться, и всё что сделано надо будет переносить на новую библиотеку. Но там реально всё круче будет. я поднял вопрос по тайм зоне, авось и допилится штатно, чтобы в конструктор не переписывать под отдельные задачи.
 

aidar_i

✩✩✩✩✩✩✩
1 Май 2021
64
8
Отлично!
Возник еще один вопрос: сейчас идет построение графика с указанным периодом независимо данные изменились или нет, нужно, чтобы график строился по обновлению данных.
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
573
Вопрос по таймзоне должен решаться чтением документации)
C++:
uint32_t GPunix(год, месяц, день, час, минута, секунда, gmt);
// gmt - часовой пояс, по умолч. 0 (пример: Москва gmt = 3)
// месяц и день начинаются с 1, не с 0!
 

aidar_i

✩✩✩✩✩✩✩
1 Май 2021
64
8
Избыточное цитирование. Отредактируй или сообщение будет удалено
Вопрос по таймзоне должен решаться чтением документации)
C++:
uint32_t GPunix(год, месяц, день, час, минута, секунда, gmt);
// gmt - часовой пояс, по умолч. 0 (пример: Москва gmt = 3)
// месяц и день начинаются с 1, не с 0!
Лучше, мне кажется, для графика как я предложил, решается автоматически :)
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
573
@aidar_i, увидел, пофиксил, речь шла о другом графике. Спасибо! Я так понял браузер показывал время по гринвичу
 
Изменено:

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
573
Обновление отвечаю просто пушка будет, велосипед изобретён заново и улучшен до мопеда)
 
  • Ахах! +1
Реакции: dizzel

aidar_i

✩✩✩✩✩✩✩
1 Май 2021
64
8
@AlexGyver,
Я у себя изменил компоненты, чтобы можно было настроить их легче , не трогая библиотеку
Вот пример Кнопка:
C++:
void BUTTON(const char* name, const char* value, const char* width, const char* height, const char* border_radius, const char* background_color, const char* font, const char* font_size, const char* color) {
        *_GP += F("<input type=\"button\" value=\"");
        *_GP += value;
        *_GP += "\" name=\"";
        *_GP += name;
        *_GP += F("\" style=\"width:");
        *_GP += width;
        *_GP += F("; height:");
        *_GP += height;
        *_GP += F("; border-radius:");
        *_GP += border_radius;
        *_GP += F("; background-color:");
        *_GP += background_color;
        *_GP += F("; font-family:");
        *_GP += font;
        *_GP += F(",sans-serif; font-size:");
        *_GP += font_size;
        *_GP += F("; color:");
        *_GP += color;
        *_GP += F(";\" onclick=\"GP_click(this)\">\n");
      }
Я могу создавать кнопку, меняя параметры, размеры, цвет кнопки и шрифта, тип шрифта, его размер. Изменяя border_radius меняю форму кнопок(если поставить 50% при одинаковой ширине и длине кнопки получается круглая кнопка).
Очень удобно, мне нравится так. Вот эллипс.
И я ушел от Темы, цвет фона тоже настраивается, можно картинку по ссылке вставить.
C++:
    void BODY_(const char* col) {
        *_GP += F("<body style=\"color:");  
        *_GP += col;
        *_GP += F("\">");      
        *_GP += F("<body>\n");
    } 
    void BODY(const char* clas) {
        *_GP += F("<body class=\"");    
        *_GP += clas;
        *_GP += F("\">");        
        *_GP += F("<body>\n");
    }
But.pngФон картинкой.png
 
Изменено: