RU   EN
Прошивка Синхронизация по MQTT Внешний датчик REST API Исправление проблем

Примечание :

Интерфейс в прошивке оптимизирован под дисплеи 4.2' с разрешением 400х300, реализация поддержки других разрешений возможна, но требует оптимизации интерфейса и написания драйвера под конкретный дисплей.

Прошивка совместима с дисплеями 1.5' - реализован вывод интерфейса адаптированного под разрешение 200х200, можно выводить свою графику, но такие дисплеи были не в приоритете и часть виджетов могут быть не оптимизированы (фото интерфейса по умолчанию)

см. также Список поддеживаемых дисплеев

Краткая инструкция

Установка среды разработки (IDE)

Для прошивки потребуется установить Microsoft Visual Studio и расширение к нему Platform IO

Настройка окружения

Конфигурация, компиляция и заливка прошивки

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

Это необязательная настройка интеграции. В этом разделе информация о том как подключить метеостанцию к системе умного дома, чтобы она передавала туда свои данные с датчика BME280. Предполагается что у вас уже настроен сервер с MQTT брокером и системой контроля умного дома - Domoticz или Home Assistant

Отправляем данные сенсоров метеостанции в Home Assistant

  • Открыть панель управления Home Assistant (обычно доступна по http://[адрес сервера]:8123)
  • Перейти в раздел "Настройки" -> "Устройства и службы" (config/integrations/dashboard)
  • Если отсутствует интеграция с MQTT брокером, необходимо сперва ее настроить через "Добавить интеграцию" -> MQTT
  • В настройках интеграции должен быть активирован пункт "Добавлять новые объекты (Home Assistant будет автоматическ...)" для автоматического обнаружения устройства
  • Заходим на страницу веб-интерфейса метеостанции - MQTT сервер -> клик по "Настройки по умолчанию для Home Assistant". Переопределите при необходимости Device id, Device name (постарайтесь сохранить ту же длинну названий и идентификаторов т.к. возможности отправки длинных строк ограничены)
  • Указываем адрес и порт MQTT брокера (обычно по умолчанию логин и пароль не требуется, а порт 1883)
  • Нажимаем "Сохранить изменения" -> "Управление устройством" -> "Перезагрузить"
  • После перезагрузки если не было ошибок статус MQTT должен поменятся на "подключено", а в панели управления Home Assistant в списке устройств MQTT добавится новое устройство в соответствии с Device Name

Отправляем данные сенсоров метеостанции в Domoticz

  • Открыть панель управления Domoticz (обычно доступна по http://[адрес сервера]:8080)
  • Перейти в раздел "Настройка" -> "Оборудование"
  • Если отсутствует "устройство" в списке оборудования с типом "MQTT Client Gateway", необходимо сперва его добавить (это подключение к MQTT брокеру самого Domoticz).
  • При добавлении "MQTT Client Gateway" проверьте соответствие вашим настройкам. Еслу у вас Domoticz и MQTT брокер размещены на одном сервере, то скорее всего настройки можно оставить без изменений
  • Если отсутствует в списке оборудования устройство с типом "Dummy (Does nothing ...)", добавляем и его
  • После добавления устройства "Dummy", нажимаем "Создать виртуальный датчик"
  • Добавляем три виртуальных датчика с типом датчика "Темература + Влажность + Давление", "Темература + Влажность", "Темература"
  • Выписываем их идентификаторы (Idx) со страницы - "Настройка" -> "Устройства"
  • Заходим на страницу веб-интерфейса метеостанции - MQTT сервер -> клик по "Настройки по умолчанию для Dmoticz"
  • Вносим идентификаторы по порядку через запятую в поле "Id устройств (T&H&B, T&H, T)" в соответствии с типом (1 - "Темература + Влажность + Давление", 2 - "Темература + Влажность", 3 - "Темература")
  • Указываем адрес и порт MQTT брокера (обычно по умолчанию логин и пароль не требуется, а порт 1883)
  • Нажимаем "Сохранить изменения" -> "Управление устройством" -> "Перезагрузить"
  • После перезагрузки если не было ошибок статус MQTT должен поменятся на "подключено", а в панели управления Domoticz будут поступать данные от метеостанции и ее датчиков

Чтение данных о погоде с сервиса OpenWeather через API 2.5

  • Доступно с версии прошивки >= 0.92
  • Завести аккаунт на сервисе OpenWeather
  • Перейти в раздел "Maps" и найти интересующее место
  • Клик на наиболее близком к нужному вам месту и скопировать строку вида "lat=23.5556&lon=33.2797"
  • Перейдите в раздел кючей API, вашего аккаунта и скопируйте ключ доступа
  • После регистрации нового аккаунта, доступ к API может быть недоступен в течении нескольких часов - особенность сервиса OpenWeather для новых пользователей
  • Подставьте ключ доступа и координаты места в строку http://api.openweathermap.org/data/2.5/weather?[координаты доступа]&APPID=[ключ]&units=metric должна получится строка вида
    http://api.openweathermap.org/data/2.5/weather?lat=23.5556&lon=33.2797&APPID=a52afa5sdfsdfddf569&units=metric
  • Заходим на страницу веб-интерфейса метеостанции - "Внешний датчик (Domoticz & Home Assistant)"
  • В строку Url-адрес копируем получившуюся строку
  • Поле "Логин" и "Пароль или Token" оставляем пустыми
  • Нажимаем "Сохранить изменения" -> "Управление устройством" -> "Перезагрузить" или "Управление устройством" -> "Обновить экран"
  • После перезагрузки, если все прошло успешно, то статус "Внешний датчик" должен поменятся на "подключено" и указана дата последней успешной синхронизации данных. Если что-то не удалось то в блоке оповещений и логах будет видна ошибка

Чтение данных внешнего датчика из системы Home Assistant на метеостанции

  • Открыть панель управления Home Assistant (обычно доступна по http://[адрес сервера]:8123)
  • Перейти в раздел "Настройки" -> "Устройства и службы" (config/integrations/dashboard)
  • Клик на "Устройства" под интеграцией "MQTT"
  • Находим интересуюищий нас датчик в списке устройств
  • Заходим на его страницу конфигурации, кликаем по блоку сенсоров. В открывшемся всплывающем окне кликаем на иконку шестеренки в правом верхнем углу
  • Из открывшейся формы редактирования "Идентификатор объекта" вида sensor.0xa4c1387jbj1a5dfgd1b_temperature
  • Если у вас нет авторизационного токена для удаленных подключений к Home Assistant, то заходим на страницу вашего аккаунта в HA -> "Безопасность" (/profile/security) и добавляем новый токен в разделе "Долгосрочные токены доступа" и сохраняем полученый ключ
  • Заходим на страницу веб-интерфейса метеостанции - "Внешний датчик (Domoticz & Home Assistant)"
  • В строку Url-адрес вписываем адрес
    http://[IP или домен сервера]:8123/api/states/[Идентификатор объекта]
  • Поле "Логин" оставляем пустым, а в поле "Пароль или Token" вносим "Долгосрочный токен доступа"
  • Нажимаем "Сохранить изменения" -> "Управление устройством" -> "Перезагрузить"
  • После перезагрузки, если все прошло успешно, то статус "Внешний датчик" должен поменятся на "подключено" и указана дата последней успешной синхронизации данных. Если что-то не удалось то в блоке оповещений и логах будет видна ошибка

Чтение данных внешнего датчика из системы Domoticz на метеостанции

  • Открыть панель управления Domoticz (обычно доступна по http://[адрес сервера]:8080)
  • Перейти в раздел "Настройка" -> "Устройства"
  • Найти интересующий датчик температуры и запомнить [ID устройства] в поле Idx
  • Добавить пользователя для чтения данных с датчиков в разделе "Настройки" -> "Users" (выставить ему права "Зритель")
  • Заходим на страницу веб-интерфейса метеостанции - "Внешний датчик (Domoticz & Home Assistant)"
  • В строку Url-адрес вписываем адрес
    http://[IP или домен сервера]:8080/json.htm?type=devices&rid=[ID устройства]
  • В поля "Логин" и "Пароль или Token" указываем данные в соответствии с созданным пользователем в системе Domoticz
  • Нажимаем "Сохранить изменения" -> "Управление устройством" -> "Перезагрузить"
  • После перезагрузки, если все прошло успешно, то статус "Внешний датчик" должен поменятся на "подключено" и указана дата последней успешной синхронизации данных. Если что-то не удалось то в блоке оповещений и логах будет видна ошибка

Доступные методы REST API

Все запросы выполнять относительно корневого пути URL

Пример запроса. Перезагрузка устройства

// Если вы выполняете код из браузера, чтобы не было ошибок выполнения CORS
// нужно запускать исполнение со страницы веб-интерфейса устройства

var formData = new FormData();
formData.append("reboot", '1');

fetch("http://192.168.1.123/api/reboot", {method: 'POST', responseType : 'json', body : formData}).then(function(response) { console.log(response); });

Сменить картинку по названию сохраненного стиля оформления

GET /api/cui/select?filename=fairy

Ответ {"status":"fail","error":"name not specifed"} или {"status":"ok"}

Если в ответе присутствует reboot_required = true, то для инициализации перезагрузки выполнить
http://[адрес устройства]/api/update (GET) или http://[адрес устройства]/api/reboot?reboot=1 (POST)

Пауза & Очистка экрана

GET /api/clear

Очищает экран и ставит все события на паузу (частичное и полное обновление экрана) до обновления экрана через панель управления вручную или до полной перезагрузки

Ответ {"status":"no"} или {"status":"ok"}

Обновить экран

GET /api/update

Ответ {"status":"no"} или {"status":"ok"}

Перезагрузить устройство

POST /api/reboot?reboot=1

Ответ {"status":"no"} или {"status":"ok"}

Очистить память кастомных стилей

POST /api/cui/format?confirm-format=1

Ответ {"status":"fail"} или {"status":"ok"}

Сброс настроек системы

POST /api/reset?reset=1&reset-wifi=1

Ответ {"status":"no"} или {"status":"ok"}

Очистить память EEPROM (Factory reset)

POST /api/clearrom?confirm-clear=1

Полностью вычистить память EEPROM (там где хранятся все настройки, авторизационные данные от WiFi) и заменить данные на нулевые значения.

Ответ {"status":"fail"} или {"status":"ok"}

Принудительное частичное обновление области часов экрана

POST /api/partialtest

Принудительно обновляет область часов для тестирования функционала

Ответ {"status":"fail"} или {"status":"ok"}

ESP8266 не выходит из режима сна

Некоторые неофициальные клоны плат D1 Mini могут иметь подобную проблему. Предварительно проверьте корректно ли подлкючен пин D0 к пину RST (для корректной перепрошивки должен быть подключен через резистор 510 Ом, но для тестов режима сна достаточно просто перемычки)

В прошивке предусмотрено несколько режимов выхода из сна на случай "плат клонов", метод выхода из сна можно поменять в файле UserDefines.h параметром FIX_DEEPSLEEP (если параметра нет, скачайте актуальную прошивку с основной ветки проекта на GitHub

Попробуйте выставить значение параметра FIX_DEEPSLEEP в 1 или 2 и проверить снова. Если проблема сохранится, скорее всего микроконтроллер поврежден или имеет более серьезные проблемы

Неправильные дата и время

По умолчанию метеостанция пытается синхронизировать время по NTP-серверу. Устройство должно быть подключено к точке доступа WiFi с разрешенным интернет-соединением.

Если вы уверены, что нет никаких проблем с подключением к интернету, попробуйте перезагрузить устройство, чтобы переинициализировать синхронизацию по NTP, или измените NTP-сервер в настройках.

Для переинециализации времени без перезагрузки, можно перейти в панель управления устройства и кликнуть пункт меня (далее после информации что команда выполнена - "Управление экраном" -> "Обновить экран")

Если у вас нет подключения к Интернету, вы можете установить время вручную, настроив параметры "Дата и время" в разделе "Общие параметры". Можно очистить опцию "Часовой пояс", чтобы она дополнительно не влияла на вывод.

Не получается залить прошивку

Актуально для ESP8266

Актуально для ESP32

Дисплей ничего не выводит

Если есть уверенность что выбран правильный тип дисплея в UserDefines.h (а вариантов по сути всего два - либо дисплеи с префиксом SSD1683 либо с UC8176 - вывода совсем не будет в случае если неправильно указан контроллер), то скорее всего неправильно подключены пины или где-то нет контакта. Нужно перепроверить что все пины подключены правильно. Если нет уверенности что и сама плата esp рабочая, можно попробовать подключить к другой плате ESP. Предварительно минимально проверить работоспособность еспшки \ отдельных выводов можно например написав простой скетч реализующий кнопку или моргание светодиодом. Но обычно если плата esp оказывалась бракованной то проблемы начинались еще на этапе прошивки (либо прошивалась через раз, либо вообще не прошивалась). У меня обычно проблема решалась именно перепроверкой всех пинов и запуском каких-то минимальных примеров от производителя для подтверждения что ошибка точно не в моем коде.

Дисплей выводит информацию через раз или добавляет в вывод непредсказуемый мусор \ артефакты

Возможно нарушен контакт пина BUSY или неправильно установлено его значение в UserDefines.h -> EPD_BUSY_PIN (например перепутан с EPD_RST_PIN)

Дисплей не работает в режиме частичного обновления экрана

Производитель обычно указывает сам точно ли поддерживается такой режим работы или нет. Даже если контроллер дисплея частичное обновление поддерживает, оно все равно может фактически не работать тк не заявлено производителем платы. Можно проверить по примерам предоставляемым самим производителем, есть ли там методы частичного вывода или нет.

После перепрошивки ESP уходит в бесконечную перезагрузку

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

Я пробовал использовать оставшиеся пины например для переключателей и это приводило к подобной проблеме т.к. у ESP8266 всего несколько GPIO пинов безопасны GPIO14, GPIO12, GPIO13, GPIO4, GPIO5, все остальные не должны быть в определенном логическом состоянии при старте.

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

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

#define EPD_BUSY_PIN 2 // D4 - GPIO - 2 (+20кОм резистор на VCC) или опционально D8 - GPIO - 15 (если освободился пин CS - подключен к GND - постоянно в SLAVE режиме)
#define EPD_RST_PIN 12 // D6 - GPIO - 12 (MISO)
#define EPD_DC_PIN 0 // D3 - GPIO - 0
#define EPD_CS_PIN -1 // GND (-1)

ESP рандомно не выходит из глубокого сна

Такое было с одним esp контроллером, возможно был бракованный, но после замены самой еспшки на другую, проблема пропала. В случае с ESP8266 можно так же попробовать поменять метод выхода из сна в файле UserDefines.h выставив его через параметр FIX_DEEPSLEEP

X