Jump to content
iT4iT.CLUB

Recommended Posts

Хочу подвязать через MQTT к Domoticz, на данный момент не могу понять, какие параметры выставлять в обоих веб интерфейсах, у кого-нибудь уже был такой опыт?

 

Скрытый текст

Domoticz

image.png.fc99181170c2cb0168cd58192b50f67b.png

ESP

image.png.8ad4270c627ec725f3410dec98a84785.png

 

Share this post


Link to post
Share on other sites

@ololonly Если я правильно понимаю, то в документации по Domoticz говорится, что данные должны передаваться в формате json в соответствии с установленной структурой сообщения. Сама метеостанция передают непосредственно сами значение полученные от датчиков (тип float). Данные с каждого сенсора кладутся в соответствующие им топики. Путь топика выстраивается исходя из логики "Корневой путь" + "идентификатор датчика". Таким образом если в поле корневого пути указать myhome, а датчики имеют идентификаторы: out_temperatureout_humidity и out_pressure, то соответствующие данные будут отправлены в топики:

  • myhome/out_temperature
  • myhome/out_humidity
  • myhome/out_pressure

Для связи с Domoticz необходимо доработать код метеостанции. По сути просто добавить дополнительный сервис в services.h где будет производиться упаковка данных с сенсоров в json приемлемая для Domoticz. Далее сервис добавляем в планировщик задач. Все необходимое для этого уже реализовано.

Share this post


Link to post
Share on other sites
В 18.05.2018 в 22:57, EndWar сказал:

28042018128.jpg.a0a0f85e83ab8a622339956cc430e0d7.jpg

  Скрыть содержимое

 

 

Шикарно! А можно подробнее про реализацию, желательно с кодом?

Share this post


Link to post
Share on other sites

@Dark FeniX , спасибо...

5 часов назад, Dark FeniX сказал:

... про реализацию ...

К сожалению сейчас нет столько времени, что-бы подробно описывать проект, к тому же он основан на прошлой версии данной метеостанции... Для подключения OLED дисплея на драйвере SSD1306 я использовал вот эту библиотеку (там тоже уже вышла новая версия 1.4.0), но Вам придётся самому подумать как совместить два этих кода... Ну а будут вопросы подскажу...

  • Thanks 1

Share this post


Link to post
Share on other sites
В 01.05.2018 в 01:28, EndWar сказал:

Привет, друзья! Кто нибудь опробовал уже вот такое "чудо" для метеостанции

"Nodemcu V3 Lua Wi-Fi модуль интегрированный esp8266 + Дополнительная память 32 м вспышка"

 

В 01.05.2018 в 16:01, pasha413 сказал:

я использую, уже пару таких прикупил, очень удобны для меня

 

В 01.05.2018 в 23:49, EndWar сказал:

тоже так считаю... и что там действительно +32МБ память..?!

Парни не ведитесь, хоть в описании у продавца и написано  "WiFi modern ESP8266 + 32MB, compatible with nodemcu board." на самом деле это +32 не MB (мегабайта), а +32 Mbit (мега Бита) = 4МБ мошенники вводят в заблуждение!

Share this post


Link to post
Share on other sites

Привет. Кто-нибудь кроме меня замечал разницу в показаниях температуры датчиков BME280 и DS18.?

Share this post


Link to post
Share on other sites
2 часа назад, EndWar сказал:

@Вадим, вот есть ещё такой вариант с прогнозом погоды...

2114612854_2018-06-0815-27-00-GoogleChrome.jpg.f3abab1047c650c8cf687a62a6e718de.jpg

Очень интересно взглянуть на код)

Share this post


Link to post
Share on other sites
В 05.06.2018 в 12:36, EndWar сказал:

Привет. Кто-нибудь кроме меня замечал разницу в показаниях температуры датчиков BME280 и DS18.?

Заметил, что при отрицательных температурах разница может доходит до 2-3 градусов, чем ниже температура, тем больше разница. От ноля и выше всё вроде нормально. Сейчас +9 градусов от BME и 9 градусов от DS18b20.

  • Thanks 1

Share this post


Link to post
Share on other sites
В 08.06.2018 в 17:43, pasha413 сказал:

интересно взглянуть на код)

Вот тут настраиваешь, и вставляешь в index.htm... мой выглядит так 

<a class="weatherwidget-io" href="https://forecast7.com/ru/51d3037d84/stary-oskol/" data-label_1="СТАРЫЙ ОСКОЛ" data-label_2="прогноз" data-font="Arial" data-icons="Climacons" data-theme="original" data-basecolor="" data-shadow="rgba(0, 0, 0, 0.65)" data-accent="rgba(255, 255, 255, 0.03)" data-highcolor="#febc2f" data-lowcolor="#0200ff" data-mooncolor="#c7c7c7" data-cloudcolor="#ffffff" data-cloudfill="#0003ff" data-raincolor="#0200ff" data-snowcolor="#000000" >СТАРЫЙ ОСКОЛ прогноз</a>

<script>
!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src='https://weatherwidget.io/js/widget.min.js';fjs.parentNode.insertBefore(js,fjs);}}(document,'script','weatherwidget-io-js');
</script>

 

  • Thanks 3

Share this post


Link to post
Share on other sites

А я часики добавил.

Спасибо за виджет погоды, там и солнышко анимированное) только погода не точная, подвирает. На смарте пользуюсь "foreca" по СПб там более точно показывает прогноз

Скрин делал с телефона, не все влезло)

Screenshot_2018-06-10-18-45-05-185_com.yandex.browser.png

Edited by pasha413
  • Like 1
  • Thanks 1

Share this post


Link to post
Share on other sites
В 16.04.2018 в 07:51, Dark FeniX сказал:

Вчера пытался разобраться, почему передаются только 3 параметра. Особого результата не добился. Понял только все 5 параметров передаются - добавил вывод в монитор порта после передачи каждого параметра. Но соединение с брокером рвётся после передачи 3-го. От того, какой именно параметр - не зависит, менял порядок местами.

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

какая версия esp8266/Arduino: ESP8266 core for Arduino используется при компиляции?

Заметил, что 2.4.0 и 2.4.1  некорректно работают с mqtt, в частности после старта с какого-то момента рвется соединение и потом можно возобновить его спустя 15 секунд. Казалось бы это стандартный таймаут, в #define MQTT_KEEPALIVE. Но меняя его значение ничего не менялось. При этом микроконтроллер по переменным рапортует, что соединения все время устанавливает успешно и что данные успешно ушли, но при этом они до брокера не доходят. Да и от размера передаваемых данных тоже зависит. Еслиуменьшать количество передаваемых данных при первом коннекте, при втором начальные данные начинают проходить. Если же поставить искусственный delay(15000) между передачами информации брокеру, то данные без проблем уходят.

Однако, если перекомпилировать код без каких-либо изменений  с версией 2.3.0, то  MQTT начинает работать так как и задумано, то есть оба раза данные до него успешно доходят, если коннекты происходят ранее чем через 15 секунд.

Edited by Alex_DIY

Share this post


Link to post
Share on other sites

@Alex_DIY Используем 2.4.0 в системе мониторинга и сушки подвала гаража. За раз передаем 11 параметров по протоколу MQTT на сервер mqtt.it4it.club и никаких проблем не испытываем. Также параллельно передаем схожее количество параметров на "народный мониторинг" и "ThingSpeak".

image.png

Share this post


Link to post
Share on other sites

@Kitsum

чтобы не быть голословным, решил сделать тестовый скетч, чтобы выложить его здесь для демонстрации проблемы, но в процессе его подготовки тестового скетча всё само собой заработало на 2.4.0 в тестовом . Откомпилировал "боевой" скетч, над которым бился пару недель, чтобы он работал в 2.4.0 как в 2.3.0 - и он тоже заработал. Чудеса да и только. Из того, что сегодня изменилось - так обновил ядро, удалив из

%USER%\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\

все версии и установив их заново. Но это я проделывал и раньше - положительного эффекта это не имело. НУ и arduino IDE обновил библиотеку MQTT by Joel Gaehwiler, но я ее не использовал.

Получается, выше я зря обозначил 2.4.0 виновником некорректности работы MQTT.

Ну а тестовый скетч таков

Скрытый текст

#include <Wire.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>

#include <PubSubClient.h>
#include <WiFiUdp.h>


IPAddress ip(10, 10, 0, 5);
IPAddress gatewayIP(10, 10, 0, 1);
IPAddress subnetMask(255, 255, 255, 0);
IPAddress dns1(10, 10, 0, 1);
IPAddress dns2(8, 8, 8, 8);

char * wifi_ssid = "SSID";
char * wifi_pass = "PASS";

String mqtt_server1 = "10.10.0.1";
String mqtt_login1 = "";
String mqtt_pass1 = "";
String mqtt_path1 = "ESPWeatherStation";

float Vcc = 0;
unsigned long work_time = 0;
unsigned long start_time = 0;
/*
   MQTT
*/
WiFiClient espMqttClient;
PubSubClient mqtt(espMqttClient);

extern "C" {
#include "user_interface.h"
#include "espconn.h"
}
/*
    Функция отвечает за отправку данных на MQTT сервер
*/
bool mqttSendData() {
  mqtt.setServer(mqtt_server1.c_str(), 1883);
  
  if (mqtt_login1.length()) mqtt.connect("weather station", mqtt_login1.c_str(), mqtt_pass1.c_str());
  else mqtt.connect("weather station");
  if (mqtt.connected()) {    
    mqttPublish("/T2", 10, mqtt_path1);
    mqttPublish("/P1", 15, mqtt_path1);
    mqttPublish("/T1", 20, mqtt_path1);
    mqttPublish("/H1", 25, mqtt_path1);    
    mqttPublish("/Vcc", 3.334, mqtt_path1);
    work_time=millis() - start_time;    
    mqttPublish("/work_time", work_time * 0.001, mqtt_path1);
    mqtt.disconnect();
    return true;
  }
  return false;
}
bool mqttPublish(String topic, float data, String path) {
topic = path + topic;
  String val = String(data);
  return mqtt.publish(topic.c_str(), val.c_str(), true);
}

void setup() {  
  start_time = millis();

  espconn_tcp_set_max_con(5);
/*
Подключаемся к WiFi Режим клиента
*/
WiFi.config(ip, gatewayIP, subnetMask, dns1, dns2);
WiFi.begin( wifi_ssid , wifi_pass );
unsigned long time = millis();
 while (!WiFi.isConnected()) {
    delay(5);
    if (millis() - time > 8000) {
      WiFi.disconnect();
      delay(5);
      break;
    } 
}
  if (WiFi.isConnected()) {
//отправляем на локальный mqtt broker
  mqttSendData();
  mqttSendData();
  }
   // спим 10 минут или 600 микросекунд
  //ESP.deepSleep(600e6);
}

void loop() {
  // put your main code here, to run repeatedly:

}

 

Собственно, что было: по первой   mqttSendData();  все доходило до брокера, по второй ничего. Если убрать один параметр из передачи на mqtt брокер, то от второй   mqttSendData(); начинал приходить 1 параметр. И т.д. И это было на 2.4.0 и 2.4.1. При этом, компилировал в 2.3.0 и всё работало как часики.

Но, повторюсь, сегодня пока вычищал скетч, делая тестовый пример, всё само собой заработало в 2.4.0. Такие вот чудеса.

Edited by Alex_DIY
оформление сообщения
  • Thanks 1

Share this post


Link to post
Share on other sites

Привет добрые люди!Можно ли изменить диапазон отображения в графиках, к примеру давление не от 0 до 800, а от 700 до 800? Иначе отображается малоинформативная ,практически прямая линия.

Share this post


Link to post
Share on other sites

@Maikl9999 доброе время суток.

График масштабируется автоматически и после суток работы приделы значений (в данном случае давления) будут скорректированы. Выглядеть это будет следующим образом.

espws.local_mm2.pngespws.local_mm1.png

Вы можете попробовать задать нижний придел указав значение параметра min для нужной шкалы у объекта yAxis в функции chart (см index.htm). Но помните, что изначально массив с данными графика наполнен нулями и как отреагирует плагин на поднятие нижней границы я, в данный момент, проверить не могу. Попробуйте поэкспериментировать.

Вот ссылка на интересующий Вас раздел в документации к API плагина highchartshttps://api.highcharts.com/highcharts/yAxis.min

  • Thanks 1

Share this post


Link to post
Share on other sites

Всем привет. Датчик bme280 начал выпендриваться еще в марте, а недавно ураганным ветром сорвало корпус, в котором был датчик и залило. Теперь показывает неверные данные по температуре и влажности. Я так понимаю, что теперь только на выброс. Что можете посоветовать из неприхотливых и точных датчиков для внешнего размещения? BMP280 или есть что то лучше? Мне, в принципе, влажность и не нужна.

Share this post


Link to post
Share on other sites

@RusD На мой взгляд BME самый удачный вариант, пока ни разу не испытывал с ними проблем, но если данные по влажности не нужны, то экономически выгодно брать BMP.

  • Thanks 1

Share this post


Link to post
Share on other sites
В 10.06.2018 в 04:56, EndWar сказал:

и вставляешь в index.htm...

А для "новичка" можно по-подробнее: где файл index.htm... , как открыть?

Из видео на https://weatherwidget.io не совсем понял...

Share this post


Link to post
Share on other sites
6 часов назад, PulFred сказал:

А для "новичка" можно по-подробнее: где файл index.htm... , как открыть?

Из видео на https://weatherwidget.io не совсем понял...

файл index.html находится в архиве проекта : ESP8266_WS_V2.0_iT4IT.CLUB.7z , который надо извлечь в папку проектов.
по пути  ..\ESP8266_WS_V2.0_iT4IT.CLUB\data\index.htm.gz  лежит архив и в нем содержится  index.html.

извлекаешь его оттуда, куда-нибудь, работаешь с ним, затем надо добавить его обратно в архив index.htm.gz.
index.html можно открыть в обычном виндовом "блокноте" и работать с ним.

в общем внимательно читать первый пост этой темы.
удачи !

Share this post


Link to post
Share on other sites
6 часов назад, EVG сказал:

извлекаешь его оттуда, куда-нибудь, работаешь с ним, затем надо добавить его обратно в архив index.htm.gz.
index.html можно открыть в обычном виндовом "блокноте" и работать с ним.

Пока отлаживаешь index.html, архивировать его не обязательно, он зальётся и так, только места больше будет занимать. Кстати не всякий архиватор правильно архивирует  в  расширение  .gz,   винраром у меня не получалось, а вот 7-zip само то. Редактировать лучше программой Notepad++.

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

  • Similar Content

    • By Kitsum
      Хотите помочь проекту или спонсировать новый?
      Yandex.Money PayPal.me Тема проекта
      Arduino IDE + Project + Libraries + tools: https://yadi.sk/d/jseefFB50NMhAg
    • By Kitsum
      Просмотреть файл [esp8266] Библиотека CMD, реализует настройку микроконтроллера и управление вашей программой через терминал.
      Основная задача библиотеки, это прием пользовательских команд через UART интерфейс, их обработка и выполнение пользовательского кода, связанного с той или иной командой.
      Данная библиотека позволяет реализовать:
      Управление микроконтроллером Любую настройку, будь то WiFi, другие библиотеки или часть Вашей программы Вызывать Ваши задачи (функции) из терминала по команде и передавать им требуемые параметры Использовать контроллер в качестве шлюза между датчиками и программами на PC Внимание: любая команда, передаваемая в терминал обязана заканчиваться символом перевода строки "\n".
      Подключение библиотеки
      #include <cmd.h> Инициализация объекта, к которому мы будем обращаться для добавления команд. В качестве параметра объекту необходимо передать указатель на объект Serial или любой другой схожий по типу интерфейс.
      cmd command(&Serial); В функции Setup описываем какие команды требуется обрабатывать. Например, по команде "test" вызывать пользовательскую функцию с именем "myFunctionName". Имя пользовательской функции может быть абсолютно любым.
      void Setup() { Serial.begin(115200); command.add("test", myFunctionName); } Пользовательская функция будет вызываться каждый раз, когда по интерфейсу Serial поступит команда "test". Если команда будет передана с параметрами, то эти параметры будут переданы в качестве аргументов пользовательской функции.
      В функции loop должна находится команда вызова обработчика.
      void loop() { command.handleEvents(); } Пользовательская функция обязана соответствовать ряду требований:
      Не возвращать никакого результата (быть объявленной с типом void) Принимать в качестве первого аргумента переменную с типом byte в которой будет храниться число равное количеству переданных параметров Принимать в качестве второго параметра переменную с типом char** в которой будет храниться указатель на массив со всеми указателями (char*) на переданные параметры void myFunctionName(byte argc, char** argv) { /* ... */ } Функция всегда должна иметь такой вид, даже если не подразумевается, что ей будут передаваться какие-либо параметры.
      Чтобы перебрать все переданные параметры и вывести их в консоль, можно воспользоваться следующим примером
      void myFunctionName(byte argc, char** argv) { if (0 < argc) { for (uint8_t i = 0; i < argc; i++) { Serial.printf("%i. %s\n", i, argv[i]); } } } Пример вызова пользовательской функции без параметров и с ними
      # test No parameter was passed # test p1 p2 p3 p4 p5 0. p1 1. p2 2. p3 3. p4 4. p5 Помните, что параметры представлены в виде указателей и работать с ними нужно как с обычными переменными не получится т.к указатель содержит не значение переменной (переданный параметр), а указатель на ту область памяти микроконтроллера в которой это значение находится.
      Чтобы сравнить два значения, например, параметр под индексом 0 (идет первым в списке) с каким-либо значением в программе, воспользуйтесь функцией strcmp, которая возвращает целочисленное значение, указывающее на лексическое расхождение строк. Если строки равны, то возвращаемое значение равно 0.
      if (!strcmp(argv[0], "wifi")) { Serial.println(F("Первый аргумент WiFi")); } else { Serial.println(F("Первый аргумент НЕ WiFi!!!")); } Для копирования значения указателя в другую переменную с типом char можно воспользоваться функцией strcpy
      char myVar[20]; strcpy(myVar, argv[0]); if (myVar == "123456") { Serial.prinln(F("ok")); } Также можно обернуть указатель объектом String и получить весь функционал этого объекта, который будет содержать значение параметра
      String param1(argv[0]); // String param1 = argv[0]; Serial.printf("argv[0] length: %i\n", param1.length()); Serial.printf("argv[0] is integer?: %s\n", param1.toInt() ? "YES" : "NO"); if (param1 == "qwerty") { Serial.println(F("Hello QWERTY!")); } С библиотекой идут несколько примеров, в том числе и пример конфигурации WiFi в режиме STA.
      Автор Kitsum Добавлен 05.12.2018 Категория Библиотеки  
    • By Kitsum
      Просмотреть файл [esp8266] Библиотека smartBlink, реализует умное управление штатным светодиодом, что позволяет добавить индикацию состояния вашей программы или микроконтроллера.
      Основная задача библиотеки, это добавление индикации состояния Вашей программы или микроконтроллера. Отображение состояния производится посредством светодиода. Что самое важное, работа библиотеки через прерывание, это позволяет ей поддерживать индикацию даже в то время, когда выполняется длительный код основной программы. Например, Вы можете использовать её для отображения в каком режиме сейчас работает WiFi микроконтроллера, STA или AP и т.д. Или ход выполнения какой-либо операции, например, передача данных на внешний сервер.
      Подключение библиотеки
      #include <smartBlink.h> Чтобы инициализировать управление светодиодом необходимо создать объект, через который мы буем задавать режимы работы индикации.
      smartBlink::smartBlink(byte gpio, bool on = LOW); Объекту необходимо передать два параметра, первый это номер порта, на котором находится светодиод, а второй это уровень логического сигнала, который заставит светодиод работать. Сигнал может быть низким (LOW) или высоким (HIGH), это зависит от схемотехники подключения светодиода.
      Например, штатный светодиод модуля ESP12, использующий GPIO2 (порт 2) можно объявить следующим образом.
      #define led2_pin 2 #define led2_on_signal LOW smartBlink led2(led2_pin, led2_on_signal); Теперь можно в основной программе использовать метод устанавливающий какой режим индикации использовать.
      smartBlink::setMode(mode_t mode); Например, зададим режим светодиода led2 в котором светодиод будет давать одну короткую вспышку раз в секунду.
      led2.setMode(smartBlink::mode_flash1); Режимов работы может быть несколько.
      led2.setMode(smartBlink::mode_off); led2.setMode(smartBlink::mode_flash1); led2.setMode(smartBlink::mode_flash2); led2.setMode(smartBlink::mode_flash3); led2.setMode(smartBlink::mode_flash4); led2.setMode(smartBlink::mode_burn); led2.setMode(smartBlink::mode_inhalf); Чтобы вернуть предыдущий режим индикации для ранее объявленного светодиода led2 используйте следующий метод
      led2.previous(); Благодаря работе библиотеки через прерывания по таймеру, индикация будет работать даже в тех случаях, когда выполняется долгий код.
      С библиотекой идут несколько примеров.
      Автор Kitsum Добавлен 10.12.2018 Категория Библиотеки  
    • By Kitsum
      Основная задача библиотеки, это добавление индикации состояния Вашей программы или микроконтроллера. Отображение состояния производится посредством светодиода. Что самое важное, работа библиотеки через прерывание, это позволяет ей поддерживать индикацию даже в то время, когда выполняется длительный код основной программы. Например, Вы можете использовать её для отображения в каком режиме сейчас работает WiFi микроконтроллера, STA или AP и т.д. Или ход выполнения какой-либо операции, например, передача данных на внешний сервер.
      Подключение библиотеки
      #include <smartBlink.h> Чтобы инициализировать управление светодиодом необходимо создать объект, через который мы буем задавать режимы работы индикации.
      smartBlink::smartBlink(byte gpio, bool on = LOW); Объекту необходимо передать два параметра, первый это номер порта, на котором находится светодиод, а второй это уровень логического сигнала, который заставит светодиод работать. Сигнал может быть низким (LOW) или высоким (HIGH), это зависит от схемотехники подключения светодиода.
      Например, штатный светодиод модуля ESP12, использующий GPIO2 (порт 2) можно объявить следующим образом.
      #define led2_pin 2 #define led2_on_signal LOW smartBlink led2(led2_pin, led2_on_signal); Теперь можно в основной программе использовать метод устанавливающий какой режим индикации использовать.
      smartBlink::setMode(mode_t mode); Например, зададим режим светодиода led2 в котором светодиод будет давать одну короткую вспышку раз в секунду.
      led2.setMode(smartBlink::mode_flash1); Режимов работы может быть несколько.
      led2.setMode(smartBlink::mode_off); led2.setMode(smartBlink::mode_flash1); led2.setMode(smartBlink::mode_flash2); led2.setMode(smartBlink::mode_flash3); led2.setMode(smartBlink::mode_flash4); led2.setMode(smartBlink::mode_burn); led2.setMode(smartBlink::mode_inhalf); Чтобы вернуть предыдущий режим индикации для ранее объявленного светодиода led2 используйте следующий метод
      led2.previous(); Благодаря работе библиотеки через прерывания по таймеру, индикация будет работать даже в тех случаях, когда выполняется долгий код.
      С библиотекой идут несколько примеров.
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...