визуализация данных

Модератор: Alex

Nakhodka
Сообщения: 9
Зарегистрирован: Вт ноя 20, 2018 7:04 am
Благодарил (а): 2 раза
Поблагодарили: 0

Re: визуализация данных

Сообщение Nakhodka » Вт ноя 20, 2018 7:34 am

nick7zmail писал(а):
Вт ноя 20, 2018 7:18 am
Nakhodka писал(а):
Вт ноя 20, 2018 7:13 am
Доброго всем времени суток!

Перелистал всю ветку и очень заинтересовало рисование графиков http://majordomo.smartliving.ru/forum/v ... 120#p51264
Прочитал всю ветку, но видать что-то упустил и ни как не могу понять, как это сделать у себя. Может кто поделится?
Хочу запустить на MEGA+DS18B20 2шт.
1. Качаете библиотеку графиков (или можно подключить с инета её). Судя по скрину - amCharts https://www.amcharts.com/.
2. Прописываете её в хедере страницы.
3. Формируете в ардуине массив данных, чтобы он был понятен библиотеке. Как я понял - это при помощи логгирования надо собирать данные в файлик...
4. Всовываете библиотеке массив, на выходе получаете график.

Примерно так. Может что то упустил - поправьте))
Так вот в том то и вопрос, как этот массив сформировать и подсунуть библиотеке.
Я пока еще слабоват в этом.
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: визуализация данных

Сообщение serghei » Вт ноя 20, 2018 7:44 am

Приветствую. Вечером доберусь до компа, покажу как. Посмотри тему готовых решений. Вроде выкладывал. Правда на Меге не пробовал, но вроде так же.
Мне надо знать как называются твои градусники и версия AMS. И покажи вывод в сериале.
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
Nakhodka
Сообщения: 9
Зарегистрирован: Вт ноя 20, 2018 7:04 am
Благодарил (а): 2 раза
Поблагодарили: 0

Re: визуализация данных

Сообщение Nakhodka » Вт ноя 20, 2018 8:16 am

Хм... потерял тему готовых решений, или её убрали ?

датчики DS18B20 называются temp1, temp2
AMS версии 0.17
СпойлерПоказать
15:04:17.348 -> Name: Arduino Mega Se
15:04:17.348 -> Address: 4
15:04:17.348 -> ============
15:04:17.348 -> Module Ethernet...
MAC: 0 2A F5 12 67 37
15:04:17.655 -> IP: 192.168.11.200
15:04:17.655 -> ============
15:04:17.655 -> Module SD...
15:04:17.655 -> SD init... OK
index.htm... found
15:04:17.689 -> Check...............
15:04:20.028 -> Files: 153
15:04:20.028 -> Size: 2950269
15:04:20.028 -> ============
15:04:20.028 -> Module SD Info...
SD type: SDHC
15:04:20.063 -> Filesystem: FAT32
15:04:20.063 -> Cluster: 8192
15:04:20.063 -> SD size: 15913 MB
15:04:20.063 -> ============
15:04:20.063 -> Module NTP...
15:04:20.063 -> Local port: 123
15:04:20.063 -> ============
15:04:20.063 -> Module Time...
15:04:20.063 -> NTP sync...
15:04:20.063 -> Transmit NTP request (88.147.254.235:123) Receive NTP response
15:04:20.201 -> ============
2018-11-20 15:04:19 Module Server... started
15:04:20.409 -> 2018-11-20 15:04:19 Module Upload... started
15:04:20.409 -> 2018-11-20 15:04:19 Module Send...
15:04:20.409 -> 2018-11-20 15:04:19 ============
15:04:20.409 -> 2018-11-20 15:04:19 Module Temperature...
2018-11-20 15:04:19 Parasite power OFF
15:04:20.514 -> 2018-11-20 15:04:19 Found 2 devices
2018-11-20 15:04:19 #0: 40 112 20 67 152 11 0 163 temp1
15:04:20.583 -> 2018-11-20 15:04:19 #1: 40 88 5 67 152 1 0 226 temp2
15:04:20.583 -> 2018-11-20 15:04:19 ============
15:04:20.583 -> 2018-11-20 15:04:19 Module Keys... started
15:04:20.583 -> 2018-11-20 15:04:19 Module Abstract... started
15:04:20.583 -> 2018-11-20 15:04:19 GLOBAL Init DONE (4s)
15:04:20.583 ->
15:04:20.583 -> 2018-11-20 15:04:19 AMS WORK 4315 (53%)
2018-11-20 15:05:19 temp1: 24.37
15:05:20.321 -> 2018-11-20 15:05:19 temp2: 25.44
15:05:20.321 -> 2018-11-20 15:05:19 4227 (52%)
2018-11-20 15:06:19 temp1: 23.87
15:06:20.362 -> 2018-11-20 15:06:19 temp2: 25.44
15:06:20.362 -> 2018-11-20 15:06:19 4227 (52%)
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: визуализация данных

Сообщение serghei » Вт ноя 20, 2018 8:39 am

Начало обсуждения Тут. Для начала надо научиться логировать данные. Каждый день создается новый файл. Потом его скармливаешь на страницу. Дальше по теме то же должна быть реализация. Подробно только вечером после 20.00

PS. Отлично. Сначала разберись как вообще создать файл на Меге. Дальше будет проще.
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: визуализация данных

Сообщение serghei » Вт ноя 20, 2018 11:03 pm

Исторически :D сложилось , что на странице графиков отображается и история событий в системе.

Для начала надо создать файлы на карте. Для этого на главной вкладке в самом начале добавляем два модуля

Код: Выделить всё

#define SD_MESSAGE_FEATURE
#define TLOG_FEATURE
Затем переменные для сообщений

Код: Выделить всё

// Durations
time_t prevEventElectroCycle;
time_t prevEventMegaLive;
time_t prevEventRequest;

//Alarm text
String AlarmLog = "";
//Log text
String DataLog = "";
// Переменная для текста сообщения
String MessText = "";
// Переменная для текста chart
String MesText = "";
// Переменная для типа сообщения
String Info =  "информационное";
String Alarm = "аварийное"; 
Для отображения модуля в Dash панели

Код: Выделить всё

byte moduleMt1132   = NOT_COMPILLED;
byte moduleNrf24    = NOT_COMPILLED;
byte moduleTlog     = NOT_COMPILLED;
В Setup инициализируем новые вкладки

Код: Выделить всё

  #ifdef TLOG_FEATURE
    TlogInit();
  #endif
В Loop

Код: Выделить всё

    #ifdef TLOG_FEATURE
      TlogWorks();
    #endif
Во вкладке Abstract добавить

Код: Выделить всё

void printInitDone() {
  timeStamp(); Serial.print(F("GLOBAL Init DONE (")); Serial.print(millis() / 1000); Serial.println(F("s)"));
  Serial.println();
  timeStamp(); Serial.print(F("AMS WORK ")); printFreeMem(); Serial.println();

  
  MessText = "Перезапуск AMS";
  MessLoger(String (MessText), String(Info));
}

// Abstract Works
теперь добавим новые вкладки в код
sd_message
СпойлерПоказать

Код: Выделить всё

/*
  Modul Message ver 0.1
  part of Arduino Mega Server project
  Модуль архивных сообщений
  для Ардуино Мега Сервер
*/

/* Создает запись в файле *.msg 
 * Необходимо передать функции:
 * MessText - название сообщения
 * MessType - тип сообщения
*/

void MessLoger(String MessText, String MessType){
  
// собираем Имя путь и имя файла
String MessName;
     //MessName+="/Alarm/";
     if(day()<10)
       MessName+="0"+String(day(),DEC);
     else
       MessName+=String(day(),DEC);
     if(month()<10)
       MessName+="-0"+String(month(),DEC);
     else
       MessName+="-"+String(month(),DEC);
       MessName+="-"+String(year()-2000,DEC);
       //MessName+=".csv";

       MessName+=".msg";


 //   File logfile = SD.open("/gotdata.css", "a", FILE_WRITE);

    File file = SD.open(String (MessName), FILE_WRITE);
        if(file){
        if(day() < 10) {file.print('0');}
        file.print(String (day()));
        file.print("-");  
        if(month() < 10) {file.print('0');}
        file.print(String (month()));
        file.print("-");
        file.print( String (year()));
        file.print(",");
        if(hour() < 10) {file.print('0');}
        file.print( String (hour()));
        file.print(":");
        if(minute() < 10) {file.print('0');}
        file.print(String (minute()));
        file.print(":");
        if(second() < 10) {file.print('0');}
        file.print(String (second()));
        file.print(",");
        file.print( String (MessText));
        file.print(",");
        file.println( String (MessType));
        file.close();
        }
        else{}
}
tlog
СпойлерПоказать

Код: Выделить всё

/*
  Module TLOG DUE
  part of Arduino Mega Server project
*/
/*
  Модуль создаёт два файла :
   1 "Gotdata.css" для страницы "Chart.htm". Автор идеи и кода Ledmax.
   2 "/день-месяц-год/.log" для страницы "Graf.htm". Автор кода Ser009.

  Страницу "Graf_1.htm" создал  Alexsis_76.
  
 */
 
#ifdef TLOG_FEATURE
void TlogInit() {                                        // Инициализируем модуль

   moduleTlog = MODULE_ENABLE;                           // Если модуль активен
  started("TLog");                                       // Старт модуля
 
}
void TlogWorks(){

    if(cycle5m){                                         // Каждые 5 минут записываем данные
 
// собираем Имя путь и имя файла
String Mess1Name;
     //MessName+="/Alarm/";
     if(day()<10)
       Mess1Name+="0"+String(day(),DEC);
     else
       Mess1Name+=String(day(),DEC);
     if(month()<10)
       Mess1Name+="-0"+String(month(),DEC);
     else
       Mess1Name+="-"+String(month(),DEC);
       Mess1Name+="-"+String(year()-2000,DEC);
       Mess1Name+=".log";    
       
        File dataFile = SD.open(String (Mess1Name), FILE_WRITE); // Открываем файл для записи логов страницы "Graf.htm"

if (dataFile) {                                                // Если удалось открыть файл
  dataFile.println(logString());                               // Записываем строку логов в файл
  dataFile.close();                                            // Закрываем файл
}else                                                          // Если не удалось открыть файл
Serial.println("Can't open file");                             // Выводим сообщение об ошибке
    }
//================================================================================================
        if(cycle5m){                                           // Каждые 5 минут записываем данные

      File dataFile = SD.open("gotdata.css", FILE_WRITE);      // Открываем файл для записи логов для страницы "Chart.htm"



if (dataFile) {                                                // Если удалось открыть файл
  dataFile.println(logString());                               // Записываем строку логов в файл
  dataFile.close();                                            // Закрываем файл
}else                                                          // Если не удалось открыть файл
Serial.println("Can't open file");                             // Выводим сообщение об ошибке

    }

  }

String logString() {                                           // Функция для генерации логов

String dataString = String (year()) + "-" + String (month()) + "-" + String (day()) + " " + String (hour()) + ":" + String (minute()) + ":" + String (second())+ " " + ","
+ String (current_temp[0]) + "," + String (current_temp[1]) + "," + String (current_temp[2]) + "," + String (dht.readHumidity()) + "," + String (dht.readTemperature())+ " " + ","                                    
+ String (temp) + "," + String (hum) + "," + String (pres);            // Помещаем дату и температуру в новую строку логов ( можно добавить еще данных. 6 штук работают уверенно )
  Serial.println(dataString);                                  // Выводим строку логов на монитор серийного порта

  return(dataString);                                          // Возвращаем полученные значения в место вызова функции 
}
#endif // DATALOG_FEATURE 
После этого в сериал порту должна появиться запись о создании файла и добавлении данных каждые 5 минут.

Код: Выделить всё

2018-11-20 21:16:12 ,0.00,0.00,0.00, nan, nan , nan, nan, nan
Так как датчики не подключены, записываются нулевые или пустые данные.

Если это увидели, поздравляю - файл создан и пошла запись в лог.

Теперь браузеру надо объяснить, что у нас появились новые типы файлов. За это отвечает вкладка server_ajax . Добавляем по смыслу

Код: Выделить всё

void sendCssAnswer (EthernetClient cl) {cl.println(makeAnswer(F("text/css")));}

void sendCsvAnswer (EthernetClient cl) {cl.println(makeAnswer(F("text/csv")));}
void sendLogAnswer (EthernetClient cl) {cl.println(makeAnswer(F("text/log")));}
void sendMsgAnswer (EthernetClient cl) {cl.println(makeAnswer(F("text/msg")));}
void sendTxtAnswer (EthernetClient cl) {cl.println(makeAnswer(F("text/plain")));}
void sendSvgAnswer (EthernetClient cl) {cl.println(makeAnswer(F("image/svg")));}
и чтобы не было ошибки

Код: Выделить всё

    else if (StrContains(HTTP_req, ".xml"))  {if (openWebFile()) {sendXmlAnswer(cl);}  else {sendErrorAnswer("", cl);}}
    
    else if (StrContains(HTTP_req, ".csv"))  {if (openWebFile()) {sendCsvAnswer(cl);}  else {sendErrorAnswer("", cl);}}
    else if (StrContains(HTTP_req, ".log"))  {if (openWebFile()) {sendLogAnswer(cl);}  else {sendErrorAnswer("", cl);}}
    else if (StrContains(HTTP_req, ".msg"))  {if (openWebFile()) {sendMsgAnswer(cl);}  else {sendErrorAnswer("", cl);}}
    else if (StrContains(HTTP_req, ".svg"))  {if (openWebFile()) {sendSvgAnswer(cl);}  else {sendErrorAnswer("", cl);}}
новый модуль

Код: Выделить всё

  s += makeTag(F("mNrf24"),   "", String(moduleNrf24));
---------------------------------------------------------------------------
  s += makeTag(F("mTlog"),    "", String(moduleTlog));
На этом со скетчем вроде бы всё :o ( если ничего не забыл ). Можно перейти непосредственно к файлам.

Первым делом в текстовом редакторе создаем файл DESCR.TXT , где через запятую перечисляем названия наших графиков так , как потом на странице они будут называться . Пишите свои названия.
  • Серверная,Кухня,Улица,Влажность DHT,Температура DHT,Температура BME,Влажность BME,Давление BME
Файлы из архива просто закиньте на SD карту. Во избежание ошибок записи лучше это сделать руками.
Files.zip
(136.83 КБ) 237 скачиваний
PS/ Уфф...Все это я делал на Due и ESP32. На Меге это работает , но очень долго загружается библиотека.

Огромное спасибо всем принимавшим участие в создании этого чуда !
За это сообщение автора serghei поблагодарил:
Nakhodka (Ср ноя 21, 2018 1:49 am)
Рейтинг: 1.16%
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: визуализация данных

Сообщение serghei » Ср ноя 21, 2018 12:11 am

Сама страница
graf_1.zip
(2.79 КБ) 218 скачиваний
За это сообщение автора serghei поблагодарил:
Nakhodka (Ср ноя 21, 2018 1:49 am)
Рейтинг: 1.16%
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
Nakhodka
Сообщения: 9
Зарегистрирован: Вт ноя 20, 2018 7:04 am
Благодарил (а): 2 раза
Поблагодарили: 0

Re: визуализация данных

Сообщение Nakhodka » Ср ноя 21, 2018 7:01 am

Сергей, спасибо за помощь !!!!!

Все вроде сделал, как написано, но при проверке куча ошибок вылезает, вижу, что не хватает чего-то, но чего не могу понять.
СпойлерПоказать
G:\ARDUINO\ams_017\ams\Arduino\arduino_mega_server\server_ajax.ino: In function 'String makeModules()':

server_ajax:215:42: error: 'moduleTlog' was not declared in this scope

s += makeTag(F("mTlog"), "", String(moduleTlog));

^

G:\ARDUINO\ams_017\ams\Arduino\arduino_mega_server\tlog.ino: In function 'void TlogInit()':

tlog:17:3: error: 'moduleTlog' was not declared in this scope

moduleTlog = MODULE_ENABLE; // Если модуль активен

^

G:\ARDUINO\ams_017\ams\Arduino\arduino_mega_server\tlog.ino: In function 'String logString()':

tlog:68:11: error: 'temp' was not declared in this scope

+ String (temp) + "," + String (hum) + "," + String (pres); // Помещаем дату и температуру в новую строку логов ( можно добавить еще данных. 6 штук работают уверенно )

^

tlog:68:33: error: 'hum' was not declared in this scope

+ String (temp) + "," + String (hum) + "," + String (pres); // Помещаем дату и температуру в новую строку логов ( можно добавить еще данных. 6 штук работают уверенно )

^

tlog:68:54: error: 'pres' was not declared in this scope

+ String (temp) + "," + String (hum) + "," + String (pres); // Помещаем дату и температуру в новую строку логов ( можно добавить еще данных. 6 штук работают уверенно )

^

Несколько библиотек найдено для "Ethernet.h"
Используется: G:\ARDUINO\ams_017\ams\Arduino\libraries\Ethernet
Не используется: C:\Program Files (x86)\Arduino\libraries\Ethernet
Несколько библиотек найдено для "TimeLib.h"
Используется: G:\ARDUINO\ams_017\ams\Arduino\libraries\TimeLib
Не используется: G:\ARDUINO\ams_017\ams\Arduino\libraries\Time
exit status 1
'moduleTlog' was not declared in this scope
Nakhodka
Сообщения: 9
Зарегистрирован: Вт ноя 20, 2018 7:04 am
Благодарил (а): 2 раза
Поблагодарили: 0

Re: визуализация данных

Сообщение Nakhodka » Ср ноя 21, 2018 7:31 am

Возник вот еще вопрос, может не по теме, но хочу задать его знатокам.
К МЕГЕ подключены два датчика температуры DS18B20, лежат рядом, в сантиметре друг от друга, но показания у них разнятся в 1 градус. Как можно их откалибровать или в скетче добавить корректировку показаний?
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: визуализация данных

Сообщение serghei » Ср ноя 21, 2018 7:44 am

Что то с кодировками не то. Вот новую вкладку не видит, это плохо. Влажности нет это понятно - нет вкладки. Там надо оставить только далласы. Могу посмотреть но аьюаеру, но только в четверг вечером.

Калибровку добавить не проблема. По факту такого быть не должно. Датчик то цифровой. Подключи по трехпроводной схеме. Десятые доли еще поверю. И попробуй уменьшить резистор до 1 ком.
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
Nakhodka
Сообщения: 9
Зарегистрирован: Вт ноя 20, 2018 7:04 am
Благодарил (а): 2 раза
Поблагодарили: 0

Re: визуализация данных

Сообщение Nakhodka » Ср ноя 21, 2018 7:55 am

Похоже нашел проблему,
убрал часть кода, на который ошибки были и ошибки пропали
было

Код: Выделить всё

String dataString = String (year()) + "-" + String (month()) + "-" + String (day()) + " " + String (hour()) + ":" + String (minute()) + ":" + String (second())+ " " + ","
+ String (current_temp[0]) + "," + String (current_temp[1]) + "," + String (current_temp[2]) + "," + ","                                    
+ String (temp) + "," + String (hum) + "," + String (pres);            // Помещаем дату и температуру в новую строку логов ( можно добавить еще данных. 6 штук работают уверенно )
после изменения

Код: Выделить всё

String dataString = String (year()) + "-" + String (month()) + "-" + String (day()) + " " + String (hour()) + ":" + String (minute()) + ":" + String (second())+ " " + "," + String (current_temp[0]) + "," + String (current_temp[1]) + "," + String (current_temp[2]);            // Помещаем дату и температуру в новую строку логов ( можно добавить еще данных. 6 штук работают уверенно )
Ответить