Главная » Статьи » Сервис open-monitoring.online

Мониторинг инверторов семейства SILA стал еще проще и дешевле. Отказываемся от Arduino. Пошаговая инструкция

Новая платформа

Прошло уже без малого пол года с момента написания первой статьи по бюджетному мониторингу инверторов SILA. Все, кто не поленился и собрал себе контроллеры, находят сервис очень полезным, а если одним словом - то довольны. Да, были замечания, предложения, баги... Но благодаря всем Вам сервис становится стабильнее и функциональнее.

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

Как оказалось, основные причины медленного роста пользователей это - сложность или, как сейчас принято говорить: "высокий входной порог". Я конечно так не считаю, но во-первых глупо было бы не прислушиваться к мнению пользователей, а во-вторых за пол года работы над ошибками родилось более простое и технически "красивое" решение для реализации той же самой задачи.


"Отказываемся от arduino, оставив только ESP8266 и RS232-TTL конвертор"- основное отличие новой "версии" для построения мониторинга Вашего инвертора.

Пошаговая инструкция сборки контроллера

Что понадобится из "Железа"

Для работы нам понадобятся 2 вещи:
  • Плата ESP8266 с загрузчиком, например Wemos D1 mini либо ESP8266 nodemcu V3 Lua, лично мне нравится первая, т.к. самая дешевая и на борту есть выход 5 Вольт.

  • Конвертер уровней RS232 tot TTL, как правило продается вместе с 4 перемычками, которые нам как раз и понадобятся. Обратите внимание, что конвертера могут быть с разъемом DB9 "мамой" и "папой", нам нужен "папа" или Male, т.к. провод от инвертора имеет разъем Female (мама).
    Подавляющее большинство тех, что мне попадались имеют не тот разъем, что нам нужен.
    "Папа" мне попался только у одного продавца: RS232 to TTL
На этом все :)

Что понадобится - Софт

Для успешного выполнения нашей задачи, скачайте с официального сайта и установите последнюю версию Arduino IDE. Никаких сложностей возникнуть не должно, но если возникнут, то в сети полно статей, где все расписано от и до.

Поскольку скачанная программа "из коробки" предназначается для плат Arduino, а мы с ее помощью собираемся программировать ESP8266, то поддержку этой нашей ESP нужно подключить, в этом Вам поможет эта статья.

После того, как будут подключена поддержка всех плат и шилдов на основе ESP8266, для создания нашего проекта нужно выбрать и "нашу" плату, если у Вас одна из рекомендуемых мной ваше плат выбираем - "WeMos D1 R1" как изображено ниже, если у Вас другая плата - найдите ее в списке и выберете.


Итак, у нас есть все, что бы через 15-20 минут увидеть всю информацию по нашему инвертору в облаке, приступим!

Регистрация в сервисе open-monitoring.online и базовая настройка

Заходим на сервис мониторинга Вашей СЭС: http://open-monitoring.online
Проходим простую процедуру регистрации


Далее заходим на сервис уже со своим логином и паролем и создаем новый контроллер


Открывшееся окно предлагает создать контроллер либо вручную, либо импортировать уже кем-то созданную "сцену". Для первого раза предлагаю пойти вторым путем и импортировать уже созданную мной "сцену" (в дальнейшем Вы самостоятельно сможете ее адаптировать под свою СЭС), жмем :"Импортировать"


Система предложит выбрать файл для импорта, скачиваем и сохраняем на своем компьютере: open_monitoring_hibrid_V2.controller. После этого указываем системе путь до скаченного файла


Опускаемся вниз страницы и жмем: "Создать"


На этом шаге необходимая подготовка Вашего контроллера закончена, сервис полностью готов для приема и обработки данных.
Мы переадресованы на страницу "О контроллере" - здесь находятся параметры доступа к Вашему контроллеру, их два:
  • ID - порядковый номер вашего контроллера в системе;
  • Код доступа - уникальный код, который должно передавать ваше устройство, для идентификации его как "свой".
Запишите эти два параметра в блокнот, они нам еще понадобятся


Можно покликать по менюшкам в левой колонке, например зайти в настройки и изменить название контроллера (только буквы и цифры), так же у Вас уже настроена "Главная сцена" - основная вкладка, на которой будет вся информация по Вашей СЭС в реальном времени


Сервис мы настроили, осталось совсем немного, идем дальше!

Собираем схему (4 провода)

Схем проще не бывает, для проверки лучше сделать монтажными перемычками, убедившись что все работает, рекомендую сделать посредством пайки, втычные перемычки рано или поздно подведут, тем более гнезда, которые идут в комплекте с Wemos D1 Mini полное г...


Если Вы были очень внимательны и ничего не перепутали, должно получиться подобное тому, как изображено в самом начале этой статьи...
Сверились? Ок! Поехали дальше!

Прошивка - это просто!

Такой подзаголовок у блока - не спроста, при слове прошивка, многие начинают представлять какие-то программаторы, специальные шнуры и т.д. Нет, все гораздо проще!
Даже если Вы никогда не занимались программированием Arduino или ESP8266, это не страшно, при наличии готовой программы - это сделает любая домохозяйка...
Кстати о программе, она конечно же понадобится, >СКАЧИВАЙТЕ ЗДЕСЬ<

Скачав архив программы (прошивку или по другому скетч), его нужно распаковать на Ваш компьютер и запустить любой из 4 файлов в папке


Весь код здесь комментировать я не буду, для этого понадобится отдельная статья не меньше этой, за исключением нескольких строк, которые Вы найдете на первой вкладке, в самом начале, вот они:

// Строки требующие редактирования в комментариях отмечены (!)
#include <ESP8266WiFi.h>
#include <string.h>
//*-- Индивидуальные настройки
const char* ssid     = "******";                 // Название точки доступа     (!)
const char* password = "******";                 // Пароль                     (!)
//*-- Параметры полученные при регистрации на http://open-monitoring.online
const char* host = "open-monitoring.online";     // Адрес сервера (не менять)
const char* streamId   = "***";                  // ID                         (!)
const char* privateKey = "******";               // Код доступа                (!)
unsigned long send_interval = 61000;             // Периодичность отправки пакетов на сервер
                                                 // (не менее 60 сек)

В 4 строках, отмеченных в конце символом (!), вместо ******* нужно вписать свои параметры:
const char* ssid — название Вашей точки доступа WiFi;
const char* password — пароль для подключения к Вашей точки доступа WiFi;
const char* streamId — ID, который Вы получили при регистрации в сервисе open-monitoring.online, помните немного выше я просил вас записать два параметра в блокнот, это один из них ;
const char* privateKey — а это код доступа, который так же есть в Вашем блокноте.

Больше менять ничего не нужно.

Запись программы в контроллер

Подключаете контроллер к вашему ПК, ждете когда он определится как какой-либо COM-порт.

Идем в "Инструменты" - > "Порт" и убеждаемся, что выбран тот порт, на который система назначила наш контроллер, если не выбран никакой - выбираем.
Убеждаемся, что в "Инструменты" - > "Плата" выбрана "WeMos D1 R1"
После этого идем в "Скетч" - > "Загрузка", после этого среда Arduino IDE основательно задумается, сначала проверит скетч на наличие ошибок, потом может написать о каких-нибудь устаревших или не существующих библиотеках, но закончится все должно загрузкой программы. Об успешной загрузке свидетельствует сообщение 100% внизу программы


Результат или что делать если его нет

Если все прошло "гладко", то примерно через минуту, зайдя в Ваш профиль на сервис мониторинга - должны появиться первые данные:


Скорее всего у Вас все получилось и на мониторинге появились все основные параметры работы системы. Дальше я бы рекомендовал организовать девайсу какой-нибудь корпус и познакомиться с некоторыми дополнительными функциями сервиса, много инфы в этом плей-листе: www.youtube.com

Если данные так и не появились

Программа контроллера поделена на определенные этапы, после которых она выдает комментарии. Это облегчает отладку в случае если есть какие-то проблемы.

Что бы увидеть комментарии, нам нужно открыть монитор порта, для этого идем: "Инструменты" - > "Монитор порта". Внизу открывшегося окна выбираем скорость: "2400 бод", "NL & CR" и ставим галочку на авто прокрутке, если Вы видите такую картину:


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

Если в ответе инвертора сообщение: "Data incorrect"


Значит контроллер подключен к точке доступа, но не может получить данные от инвертора. Вероятной причиной может быть: плохой контакт между шилдом ESP8266 и TTL конвертором, перепутаны Rx и Tx, проблема с TTL конвертором (они бывают "капризны" в одной партии могут оказаться как стабильные, так и работающие "через раз"), часто помогает следующая операция: от TTL конвертора отключаются все провода, все 4 вывода закорачиваются например металлической линейкой, после этого вновь подается питание.

При корректной работе, картина в мониторе порта должна быть примерно такой:


На этом все дорогие Друзья! Я уверен, что у Вас все получилось, либо это произойдет в ближайшее время!
Буду признателен конструктивной обратной связи, ничто так не мотивирует меня на дальнейшее развитие проекта, как Ваше участие и поддержка!

Пишите в комментариях!
Подписывайтесь на канал в YouTube;
Конечно же, Вы можете приобрести у нас и инвертора: интернет-магазин NSK-Electro.ru!

Спасибо, что дочитали до конца!

Открыть код ESP8266 для Arduino IDE (Тело программы)
/*
   Версия: 20E от 16.01.2019
   Железо: wemos d1 mini + RS232 to TTL converter (MAX3232)
   Подключение: TX ESP <-> TX TTL
                RX ESP <-> RX TTL
                GND ESP <-> GND TTL
                3.3V ESP <-> VCC TTL напряжение в зависимости от чипа TTL конвертора
                3,3V - MAX3232
                5V - MAX232
   Мониторинг параметров и статуса инвертора. Передача на сервис аналитики http://open-monitoring.online
   Nikolay Semerkov, https://nsk-electro.ru/
   Для связи с автором: semerkov@mail.ru
*/
// Строки требующие редактирования в комментариях отмечены (!)
#include <ESP8266WiFi.h>
#include <string.h>
//*-- Индивидуальные настройки
const char* ssid     = "******";                 // Название точки доступа     (!)
const char* password = "******";                 // Пароль                     (!)
//*-- Параметры полученные при регистрации на http://open-monitoring.online
const char* host = "open-monitoring.online";     // Адрес сервера (не менять)
const char* streamId   = "***";                  // ID                         (!)
const char* privateKey = "******";               // Код доступа                (!)
unsigned long send_interval = 61000;             // Периодичность отправки пакетов на сервер
                                                 // (не менее 60 сек)

// Служебные перемнные
String Inv_param = "";     //Строка с текущими параметрами инвертора
String Inv_status = "";    //Строка с текущим статусом инвертора
// Текущие параметры инвертора
char U_grid [6] ;        // Напряжение входной сети
char F_grid [6] ;        // Частота входной сети
char U_out [6] ;         // Выходное напряжение
int S_out ;              // Выходня мощность полная (ВА)
int P_out ;              // Выходная мощность активная (Вт)
int Load ;               // Нагрузка инвертора, (%)
char U_bat [6] ;         // Напряжение АКБ
double U_bat_dec;        // Напряжение АКБ в десятичной форме
int I_charge ;           // Ток заряда АКБ
int C_bat ;              // Уровень заряда АКБ (%)
int T_inv ;              // Температура инвертора (NTC)
int I_pv_bat ;           // Ток заряда АКБ от СБ
char U_pv [6] ;          // Напряжение СБ
int I_discharge ;        // Ток разряда АКБ
float Psolar = 0 ;       // Мощность снимаемая с панелей
float Power_sum = 0 ;    // Переменная, хранящая энергию до ее отправки на сервер и
                         // получения подтверждения о ее принятии
float Power_count = 0 ;  // Количество энергии за последнюю итерацию
int delta_T = 0 ;
unsigned long preT = 0 ;
unsigned long previousMillis = 0;
// Команды запроса в инвертор
char RECUEST_PARAM[8] = {81, 80, 73, 71, 83, 183, 169, 13};  // Запрос текущих параметров
char RECUEST_STATUS[7] = {81, 77, 79, 68, 73, 193, 13};      // Запрос статуса устройства
//*---------------- INICIALIZATION ------------------*//
void setup() {
  Serial.begin(2400); // Скорость UART для работы с инвертором
  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}
//*------------------ MAIN CYCLE --------------------*//
void loop() {
  request_param(); // Запрашиваем параметры инвертора
  calc_Watt();     // Рссчитываем выработанную энергию
  unsigned long currentMillis = millis();
  if ( currentMillis - previousMillis >= send_interval ) {
    previousMillis = currentMillis;
    request_status();  // Запрос статуса
    data_send();      // Отправка данных на сервер
  }
}
Открыть код ESP8266 для Arduino IDE (Расчет энергии)
void calc_Watt() {
  //*-- Расчет энергии --*//
  Psolar = U_bat_dec * I_pv_bat ;                // Текущая мощность в Вт
  delta_T = millis() - preT ;                    // Время предыдущей итерации
  if ( abs(delta_T) > 2600000000 ) {             // Проверка на переполнение millis
    delta_T = 0;
  }
  Power_count = Psolar * delta_T * .0000002778 ; // Количество энергии за 1 итерацию в Вт*час
  Power_sum += Power_count ;
  preT = millis() ;
}
String summ_Watt() {
  String Power = "&p13=";
  Power += String(Power_sum);
  return Power;
}
Открыть код ESP8266 для Arduino IDE (Функция отправки данных на сервер)
void data_send() {
  while (Serial.available()) Serial.read();
  Serial.print("connecting to ");
  Serial.println(host);
  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
  // We now create a URI for the request
  String url = "/get?cid=";
  url += streamId;
  url += "&key=";
  url += privateKey;
  url += Inv_param;
  url += summ_Watt();
  url += Inv_status;
  Serial.print("Requesting URL: ");
  Serial.println(url);
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  unsigned long timeout = millis();
  while (client.available() == 0) {
    if (millis() - timeout > 5000) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }
  // Read all the lines of the reply from server and print them to Serial
  while (client.available()) {
    String line = client.readStringUntil('\r');
    if (line == "\n1") {
      Serial.println("Сбрасываем Power_sum");
      Power_sum = 0 ; // Обнуляем накопленную энергию
    }
    if (line.length() < 16 ) {
      Serial.print(line);
    }
    yield();
  }
  Serial.println();
  Serial.println("closing connection");
  Serial.println();
}
Открыть код ESP8266 для Arduino IDE (Обмен данными с инвертором)
void request_param() {
  //*-- Запрос текущих параметров инвертора
  delay(3000);
  while (Serial.available()) Serial.read();
  Serial.print(RECUEST_PARAM);
  delay(2000);
  int i = 0;
  char buffer[120];
  if (Serial.available()) {
    while ( Serial.available() && i < 119) {
      buffer[i++] = Serial.read();
      yield();
    }
    buffer[i++] = '\0';  //закрываем массив
  }
  if (i == 111) {
    Serial.println("Ответ инвертора: Data OK");
    //Serial.println(buffer);                           // Раскомментировать при отладке
    sscanf(buffer, "(%s%s%s%*s%d%d%d%*d%s%d%d%d%d%s%*s%d", &U_grid, &F_grid, &U_out, &S_out, &P_out, &Load, &U_bat, &I_charge, &C_bat, &T_inv, &I_pv_bat, &U_pv, &I_discharge );
    // U_bat в десятичном виде (для подсчета энергии)
    U_bat_dec = strtod (U_bat, NULL);
    //*-- Подготовка строки для отправки на сервер
    // Переводим целые в строку
    String Sout = String(S_out);
    String Pout = String(P_out);
    String L = String(Load);
    String Icharge = String(I_charge);
    String Cbat = String(C_bat);
    String Ipvbat = String(I_pv_bat);
    String Idischarge = String(I_discharge);
    Inv_param = "&p1=";
    Inv_param += U_grid;
    Inv_param += "&p2=";
    Inv_param += F_grid;
    Inv_param += "&p3=";
    Inv_param += U_out;
    Inv_param += "&p4=";
    Inv_param += Sout;
    Inv_param += "&p5=";
    Inv_param += Pout;
    Inv_param += "&p6=";
    Inv_param += L;
    Inv_param += "&p7=";
    Inv_param += U_bat;
    Inv_param += "&p8=";
    Inv_param += Icharge;
    Inv_param += "&p9=";
    Inv_param += Cbat;
    Inv_param += "&p10=";
    Inv_param += Ipvbat;
    Inv_param += "&p11=";
    Inv_param += U_pv;
    Inv_param += "&p12=";
    Inv_param += Idischarge;
  }
  else {
    Serial.println("Ответ инвертора: Data Incorrect");
    Inv_param = "";          // Высвечиваем "Нет данных", если инвертор не отвечает или пакет не корректный
  }
}
void request_status() {
  //*-- Запрос текущего статуса инвертора
  delay(2000);
  while (Serial.available()) Serial.read();
  Serial.print(RECUEST_STATUS);
  delay(1000);
  String inData = Serial.readStringUntil('\r');
  String Status = inData.substring(1, 2);
  String result;
  switch (Status[0])
  {
    case 'P': result = "Power_On_Mode";     break;
    case 'S': result = "Standby_Mode";      break;
    case 'L': result = "Line_Mode";         break;
    case 'B': result = "Battery_Mode";      break;
    case 'F': result = "Fault_Mode";        break;
    case 'H': result = "Power_Saving_Mode"; break;
    default:  result = "Unknown";           break;
  }
  Serial.print("Статус инвертора: ");
  Serial.println(result);
  //*-- Подготовка строки для отправки на сервер
  Inv_status = "&p14=";
  Inv_status += result;
}

Полное или частичное копирование материалов данной статьи разрешено только при обязательном указании прямой гиперссылки на сайт вида: https://nsk-electro.ru. (Не редирект и не закрыта от индексации поисковиками)
Категория: Сервис open-monitoring.online | Добавил: Администратор (20.10.2018)
Просмотров: 527 | Рейтинг: 5.0/2
Всего комментариев: 0
avatar
  • Нажимая на кнопку, вы даете согласие на обработку своих персональных данных в соответствии с