Wifi лампа ESP8266/ESP32 (Home Assistant, MQTT, DMX/Art-Net)

coderus

★✩✩✩✩✩✩
14 Июл 2019
29
44
Моя версия прошивки для "Огненной лампы"

Прошивка была написана для себя с целью реализовать недостающий функционал. Как разработчик ПО на C++ я решил воспользоваться знакомыми и удобными инструментами для написания прошивки, в итоге полностью переписал с нуля на C++. Напряг на работе коллегу фронтендера "написать сайт".
Реализовано около 50 эффектов. Эффекты в основном украдены из других прошивок с сохранением авторства в комментариях или в тексте коммита.

Основные отличия:
  • Web интерфейс лампы на реакте, фронтенд хранится в SPIFFS. Не требует установки приложений.
  • Web интерфейс подключения к wifi на реакте.
  • Может подключаться к WPA-E корпоративным точкам доступа.
  • MQTT автоматическая интеграция в Home Assistant.
  • Поддержка DMX / Art-Net протокола для управления матрицей по сети с использованием специального ПО.
Чего в этой прошивке нет:
  • Нет поддержки мобильных приложений
  • Нет эффекта рассвета, будильника
Прошивка собирается только в PlatformIO
Поддерживаются платы:
  • ESP8266
  • ESP32
  • Дополнительная поддержка для платы Sonoff Basic с возможностью управления встроенной кнопкой
Для сборки нужно установить PlatformIO для любой IDE которой вы привыкли пользоваться (Atom, VS Code, Visual Studio и другие)
Никакие библиотеки скачивать и копировать не нужно, все само скачается и установится при сборке.

Настройка прошивки.

src/MyMatrix.cpp - можно сменить пин подключения ленты для своей платы. Из-за особенностей сборки библиотеки FastLED нет возможности вынести этот параметр в конфиг без использования кодогенерации при сборке.
src/EffectsManager.cpp - в самом конце можно закомментировать ненужные эффекты, освободив память и повысив стабильность работы.

data/effects.json - хранятся стандартные параметры эффектов.
  • i - идентификатор эффекта, должен соответствовать имени эффекта из файла src/EffectsManager.cpp
  • n - имя эффекта, отображаемое на странице управления и в Home Assistant
  • s - скорость эффекта
  • l - масштаб эффекта
  • b - яркость эффекта
data/settings.json - хранятся настройки модулей лампы
после изменения проверяйте правильность json на всякий случай в каком-нибудь сервисе в интернете
matrix - настройки матрицы.
  • type - соответствует сумме значений из библиотеки Framebuffer GFX: https://github.com/marcmerlin/Framebuffer_GFX/blob/master/Framebuffer_GFX.h#L43
    надо сложить нужные значения. Например: NEO_MATRIX_ZIGZAG + NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT + NEO_MATRIX_ROWS (или NEO_MATRIX_COLUMNS смотря куда идет лента). Получается 11 или 15 в зависимости от расположения строчек матрицы. На анимации включения можно посмотреть как расположены строки. Должно быть так: пиксели бегут из нижнего левого угла. Красный пиксель бежит по горизонтали вправо, зеленый по вертикали вверх. Значит параметры матрицы указаны верно.
  • rotation - значение поворота матрицы. От 0 до 3, каждое значение - поворот на угол +90 градусов.
connection - настройка подключений
  • mdns - имя, по которому лампа будет доступна в сети под доменом .local (работает не во всех операционных системах и может зависеть от браузера)
  • apName - имя первоначальной точки доступа, к которой нужно подключиться по wifi со смартфона или ноутбука для выбора точки доступа wifi
  • ntpServer - сервер для обновления времени
  • ntpOffset - смещение в секундах для часового пояса
  • hostname - сетевое имя лампы, которое можно будет увидеть в настройках wifi роутера
mqtt - настройка mqtt подключения
  • host - адрес сервера
  • port - порт сервера
  • username - имя пользователя, если требуется
  • password - пароль, если требуется
  • uniqueId - идентификатор entity light для Home Assistant
  • name - идентификатор устройства для Home Assistant
  • model - модель устройства для Home Assistant
button - режим работы кнопки
  • pin - номер GPIO пина, к которому подключена кнопка
  • type - 0 для PullTypeHigh или 1 для PullTypeLow
  • state - 0 для DefaultStateOpen и 1 для DefaultStateClose
Сборка состоит из двух этапов:
  1. Собрать прошивку
  2. Собрать файловую систему
Для сборки файловой системы вручную нужно установить npm и собрать два проекта фронтенда:
Затем скопировать артефакты сборки из папки gzipped в папку data проекта

В репозитории настроен Travis CI, поэтому можно воспользоваться простым способом и скачать уже собранные артефакты со страницы Github Releases. Нужно скачать файл data.zip и распаковать содержимое в папку data.

На всякий случай команды для сборки прошивки и файловой системы в командной строке:
  • pio run -e nodemcu
  • pio run --target buildfs -e nodemcu
И для заливки в плату:
  • pio run --target upload -e nodemcu
  • pio run --target uploadfs -e nodemcu

Где после -e идет название цели для сборки. Поддерживаются следующие цели:
  • sonoff-r1 - обычная плата Sonoff Basic с 1М памяти
  • sonoff-r1-4m - плата Sonoff Basic с 4М памяти
  • nodemcu - платы на esp8266
  • esp32dev - платы на esp32
После загрузки лампы и подключения к ней по wifi можно управлять параметрами эффектов.

Разная полезная информация:

В веб интерфейсе есть возможность заливать OTA обновления, поддерживается загрузка прошивки в bin, файловой системы в bin или файла settings.json.
Изменения автоматически сохраняются в SPIFFS. Можно получить текущие настройки перейдя по адресу лампы /settings.json либо /effects.json.
По адресу /effectJson отдаются настройки текущего эффекта.

Через MQTT можно задавать отдельные параметры для ткущего эффекта. Для этого в топик homeassistant/light/devlamp/set (где devlamp это значение поля name из mqtt конфига) нужно передать строку json вида: {"s": 10, "b": 200}. Названия полей json соответствуют полям из /effectJson, можно присылать любое количество полей для текущего эффекта за раз.

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

Пишите вопросы по доработке и сборке прошивки тут или в телеграм @icoderus. Во втором сообщении скришшоты.
 
Изменено:
  • Лойс +1
Реакции: bort707 и stepko

ROMANOFF174

✩✩✩✩✩✩✩
12 Июл 2020
3
2
Добрый день! Большое спасибо за реализацию проекта. Получилось круто. Прошил, вроде все работает. За исключением смены эффекта из HomeAssistant. Лента просто моргает при попытке смены, но эффект не меняется. Из веб-интерфейса при этом все шикарно работает и эффекты меняются без проблем. Так же в HA прилетает текущий эффект внизу в поле "effect". Так же интересно - планируется ли реализация вывода текста бегущей строкой в будущих релизах?
 
  • Вау +0
Реакции: coderus

coderus

★✩✩✩✩✩✩
14 Июл 2019
29
44
Добрый день! Большое спасибо за реализацию проекта. Получилось круто. Прошил, вроде все работает. За исключением смены эффекта из HomeAssistant. Лента просто моргает при попытке смены, но эффект не меняется. Из веб-интерфейса при этом все шикарно работает и эффекты меняются без проблем. Так же в HA прилетает текущий эффект внизу в поле "effect". Так же интересно - планируется ли реализация вывода текста бегущей строкой в будущих релизах?
Пофикшено! Спасибо, что пользуетесь нашей прошивкой. Удачного залипания на лампу))
 

ROMANOFF174

✩✩✩✩✩✩✩
12 Июл 2020
3
2
Большое спасибо! Теперь работает!
Пофикшено! Спасибо, что пользуетесь нашей прошивкой. Удачного залипания на лампу))
Большое спасибо! Теперь работает как надо!

Немного не ясно (не нашел описания), как включить ленту определенным цветом/яркостью, БЕЗ эффекта, используя данные из примера: Снимок экрана 2020-07-12 в 20.15.45.png

P.S. В веб-версии так же не нашел такой возможности
 
  • Лойс +1
Реакции: coderus

coderus

★✩✩✩✩✩✩
14 Июл 2019
29
44
цвет из ha сейчас не поддерживается, можно прикрутить в принципе...

в вебе это делается эффектом Single Color
 
Изменено:

ROMANOFF174

✩✩✩✩✩✩✩
12 Июл 2020
3
2
цвет из ha сейчас не поддерживается, можно прикрутить в принципе...
Было бы здорово, т.к. иногда хочется использовать подсветку как ночник/освещение/что угодно, без всяких там эффектов) Еще немного не ясно с параметром Matrix Type, как правильно его высчитать, при "первом пикселе" - нижний правый угол матрицы
 
  • Лойс +1
Реакции: coderus

coderus

★✩✩✩✩✩✩
14 Июл 2019
29
44
добавил поддержку rgb режима в HA

по matrixType - там надо сложить нужные значения.NEO_MATRIX_ZIGZAG + NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT + NEO_MATRIX_ROWS (или NEO_MATRIX_COLUMNS смотря куда идет лента). Получается 11 или 15 в зависимости от расположения строчек матрицы. На анимации включения можно посмотреть как расположены строки.Должно быть так: пиксели бегут из нижнего левого угла. Красный пиксель бежит по горизонтали вправо, зеленый по вертикали вверх. Значит параметры матрицы указаны верно.
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
как раз недавно интересовался, как сделать вебморду, только не на реакте, а на вуе
вроде реакт сложней осилить
 
  • Лойс +1
Реакции: coderus

coderus

★✩✩✩✩✩✩
14 Июл 2019
29
44
Ну я в веб технологиях вообще не шарю.. я на плюсах могу написать сервис, драйвер..
На работе подошел к колеге, который пишет веб морды для наших энтерпрайз платформ управления, и говорю ему - дружище, ты же сайты пишешь, напиши и мне сайт. А он мне отвечает - Андрюха, какой нафиг сайт!? А я ему говорю - ты не понимаешь, сайт для умной лампы, аналогов которой нет в мире, чтобы управлять ей без приложений! Сайт будет отдавать сама лампа на вот этой микросхеме! Показал что к чему, договорились какое нужно апи, и сделали!
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
это не сайт называется
это single page application

тоже хочу научиться клепать их, но как-то уж больно гиморно это все
 
  • Лойс +1
Реакции: coderus

coderus

★✩✩✩✩✩✩
14 Июл 2019
29
44
ну я так, в шутку, чтобы заинтересовать человека))

все новое гемморно, надо только начать и не останавливаться))
 

kDn

★★★★★✩✩
18 Ноя 2019
1,103
437
@coderus, а наш вариант видели? Опенсорс, может чего будет полезно :)

 
  • Лойс +1
Реакции: coderus

coderus

★✩✩✩✩✩✩
14 Июл 2019
29
44
@coderus, а наш вариант видели? Опенсорс, может чего будет полезно :)

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

kDn

★★★★★✩✩
18 Ноя 2019
1,103
437
нет этой прошивки не видел, свою начал писать задоолго до появления вашей :) гляну что можно потырить и как прикручен FFT, спасибо!
Да без проблем, будет желание присоединиться к разработке - присоединяйтесь. У нас сейчас 3 разработчика ядра и еще один человек по эффектам. Командой проще делать ;) .
 
  • Лойс +1
Реакции: coderus

coderus

★✩✩✩✩✩✩
14 Июл 2019
29
44
@kDn, спасибо, но мне свое ядро и своя чистенькая кодовая база больше по душе))

я ж свое начал писать, потому что проще разобраться во всем было и заново переписать, чем по тысячи строк исходников в одном файле ворочать.
 
  • Лойс +1
Реакции: kDn

enemy_krs

★✩✩✩✩✩✩
28 Май 2019
104
37
спасибо за работу :)
только у меня почему то кнопка не работает, только на включение, больше не реагирует
в main указан: btnPin = D2, в settings: "pin": 0
в каком месте изменить?
и еще, настройка скорости эффекта чем больше тем медленнее, обратная зависимость получается, не логично :)
 
  • Лойс +1
Реакции: coderus

coderus

★✩✩✩✩✩✩
14 Июл 2019
29
44
@enemy_krs, type: 1 у кнопки нужен наверное, попробуй.

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

enemy_krs

★✩✩✩✩✩✩
28 Май 2019
104
37
если бы был неверный тип кнопки она бы и не включалась с нее?
зависимость не напрягает совершенно, сделать ее прямой наверное не сложно: 1000/speed
пока листал эффекты, заметил баг, на одном из них изменились настройки матрицы, тесть вместо того чтобы снег падал сверху, его поднимало снизу
 
  • Лойс +1
Реакции: coderus

coderus

★✩✩✩✩✩✩
14 Июл 2019
29
44
@enemy_krs, нет, тип кнопки определяет есть ли внутренняя подтяжка. отсутствие ее как раз приводит к такого рода залипаниям.

по скорости гляну

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

enemy_krs

★✩✩✩✩✩✩
28 Май 2019
104
37
Я смотрел эффекты с часами, после них матрицу отзеркалило
 
  • Лойс +1
Реакции: coderus

coderus

★✩✩✩✩✩✩
14 Июл 2019
29
44
@enemy_krs, ага были такие предположения, у часов свой поворот определен.окей, гляну как время будет
 

coderus

★✩✩✩✩✩✩
14 Июл 2019
29
44
@enemy_krs, как кнопка настроена? на землю замыкается при нажатии или на питание? если не нажатая кнопка отдает 3.3в то ставь type: 0, если на не нажатой 0в то ставь type: 1
еще обрати внимание, что номер пина GPIO используется, например D2 это пин 4.
1595169371441.png
 
  • Лойс +1
Реакции: kostyamat