From 8579397beb9c7e9e3a5fa976c9e73a3309347be7 Mon Sep 17 00:00:00 2001 From: Michale Date: Tue, 29 Nov 2022 15:45:13 +0100 Subject: [PATCH] new chip id generation --- README_ru.md | 128 ------------------------------------- src/Helpers/MqttHelper.cpp | 13 +++- src/Helpers/MqttHelper.h | 1 + src/main.cpp | 10 ++- 4 files changed, 20 insertions(+), 132 deletions(-) delete mode 100644 README_ru.md diff --git a/README_ru.md b/README_ru.md deleted file mode 100644 index e0eb82a..0000000 --- a/README_ru.md +++ /dev/null @@ -1,128 +0,0 @@ -Всем привет! - -Это проект, посвященный управлению моторизированными шторами, и их интеграции в системы умного дома (напр. [Home Assistant](https://www.home-assistant.io/) или [OpenHab](https://www.openhab.org/)). - -Проект развивается в основном в двух областях: -1. Программная часть (прошивка для контроллера на базе ESP8266 / ESP32) -2. Механическая часть (3д-модели для превращения обычных рулонных штор в моторизованные). - -А теперь немного подробнее... - -# Прошивка для ESP8266 / ESP32 -Я стараюсь поддерживать работоспособность всех функций на обеих платформах. -Основные отличия между ними: -- На ESP8266 доступно меньше пинов. Тут можно подключить только 2 шаговых двигателя к одному контроллеру (используя 8 пинов). -- ESP32 даёт возможность подключить 4 (или даже больше?) шаговых двигателя к одному контроллеру (используя 16 пинов). - -Если вам нужно подключить 1-2 мотора - можете смело брать плату на основе более дешевого и простого ESP8266 (Wemos D1 mini, Node MCU и т.д.). - -## Основные возможности моей прошивки -- Поддержка доступных шаговых двигателей 28BYJ-48 (лучше использовать 12 вольтовые версии) -- Управление неограниченным кол-вом шаговых двигателей (ограничение в 4 мотора стоит по-умолчанию для более удобного UI). Фактически ограничены только аппаратно - кол-вом пинов. -- Возможность задать скорость вращения (моторы на 12 вольт могут обеспечить бОльшую скорость) -- Возможность задать все основные настройки на этапе запуска системы через Captive WiFi Portal (используемые моторы, пины, скорость моторов, настройки MQTT и т.д.) -- Веб-интерфейс для выставления крайних точек и управления шторами (в том числе адаптирован под мобильные устройства) -- Возможность подключения внешнего механического выключателя для управления шторами (с возможностью остановки штор в нужной позиции). -- Поддержка MQTT (как для управления шторами, так и для настроек крайних положений - полная замена Web UI) -- Простая интеграция с популярными системами умного дома вроде [Home Assistant](https://www.home-assistant.io/) или [OpenHab](https://www.openhab.org/) (через MQTT) -- "Обновления по воздуху" (OTA updates). Не нужно снимать и разбирать контроллер для обновления прошивки. Веб-интерфейс уведомляет о наличии новых обновлений. -- Сохранение положения каждой шторы в энергонезависимой ПЗУ (после отключения питания не нужно заново калиброваться или выставлять позицию) -- Управлением всеми подключенными моторами в параллель (асинхронная работа с шаговыми двигателями) -- Watchdog (автоматический рестарт контроллера в случае зависания) -- Автоматическое поддержание подключения к MQTT серверу и переподключение в случае проблем с сетью -- Низкое энергопотребление в режиме простоя (обмотки двигателя не держатся под напряжением во время остановки) -- Поддержка DHCP по WiFi - -## Web-интерфейс -Управление: - - - -Калибровка крайних позиций: - - - -## Captive Portal -После соединения с сетью "esp-xxxx" автоматически откроется Captive Portal: - - - -Настройте тут пины для нужных двигателей и для механических кнопок Вверх/вниз (или выключите, если не используется). - -## MQTT -*Если не хотите использовать MQTT, просто не вводите адрес MQTT сервера при конфигурации в Captive Portal.* - -Принцип работы: -- Команды для управления шторами контроллер слушает в топике `ESP_Blinds//in` (JSON) -- Обновления о позиции и своём состоянии контроллер отправляет в `ESP_Blinds//out` (JSON) -- Отдельные топики для моторов (`/outN`) отключены в целях оптимизации MQTT общения, но если в вашей интеграции они нужны - их можно включить. - -## Интеграция с HomeAssistant -В контроллере реализована функция MQTT auto-discovery с префиксом по-умолчанию (требует как минимум версии HA v2021.11). Она поможет автоматически обнаружить контроллер штор и настроить все объекты с правильной конфигурацией. - -В случае, если этот вариант вам не подходит, вы можете настроить всё вручную. Смотрите примеры конфигураций ниже. - - - -Пример конфига для интеграции 2х штор в Home Assistant (замените "_chip_Id_" Chip id вашего контроллера - его можно подглядеть в сообщении о регистрации - `/ESP_Blinds/register`): -```yaml -cover: - - platform: mqtt - name: "Штора 1" - device_class: "blind" - command_topic: "ESP_Blinds/_chip_Id_/in" - set_position_topic: "ESP_Blinds/_chip_Id_/in" - set_position_template: '{"num": 1, "action": "auto", "value": {{ 100 - position }} }' - position_topic: "ESP_Blinds/_chip_Id_/out" - position_template: '{{ value_json.position1 }}' - payload_open: '{"num": 1, "action": "auto", "value": 0}' - payload_close: '{"num": 1, "action": "auto", "value": 100}' - payload_stop: '{"num": 1, "action": "stop", "value": 0}' - position_open: 0 - position_closed: 100 - optimistic: false - - - platform: mqtt - name: "Штора 2" - device_class: "blind" - command_topic: "ESP_Blinds/_chip_Id_/in" - set_position_topic: "ESP_Blinds/_chip_Id_/in" - set_position_template: '{"num": 2, "action": "auto", "value": {{ 100 - position }} }' - position_topic: "ESP_Blinds/_chip_Id_/out" - position_template: '{{ value_json.position2 }}' - payload_open: '{"num": 2, "action": "auto", "value": 0}' - payload_close: '{"num": 2, "action": "auto", "value": 100}' - payload_stop: '{"num": 2, "action": "stop", "value": 0}' - position_open: 0 - position_closed: 100 - optimistic: false -``` - -Аналогично добавляются все остальные шторы. - -# Механическая часть - -Наиболее распространённый вариант использует двигатели 28BYJ-48, но фактически вы можете использовать любые шаговые двигатели с управлением по 4м контактам (двигатели с двумя обмотками). -28BYJ-48 чаще всего используют вместе с драйвером ULN2003 (лучше на 12 вольт, он даёт бОльший крутящий момент). - -Я разработал 2 варианта переделки рулонных штор из Леруа Мерлен в моторизованные: -1. для старого образца крепления. Похоже их почти уже не продают. -2. для нового образца (скоро опубликую). Крепёжные отверстия совпадают с оригинальными деталями, поэтому шторы могут быть легко превращены в моторизованные и обратно. - -Модели для 3д печати доступны каталоге `3d_parts` или напрямую на [Thingiverse](https://www.thingiverse.com/thing:4093205/) - -# Планы развития -* Добавить поддержку других шаговиков и драйверов (предлагайте в issues каких) -* Добавить больше возможностей по конфигурации в Web UI (чтобы не приходилось сбрасывать все настройки, чтобы попасть в Captive Portal) -* Подготовить универсальные печатные платы для более простой сборки самого контроллера -* Есть идея? добавляйте тут в issues - -# История проекта -Этот проект изначально был основан на работе товарища @nidayand - как форк от его [репозитория](https://github.com/nidayand/motor-on-roller-blind-ws). - -К сожалению проект поддерживал только ESP8266 и управление 1 двигателем, плюс давно не обновлялся. Я добавил поддержку Platformio (для более удобной разработки), нескольких моторов, а позже и ESP32 (чтобы можно было подключить более 2х моторов к одному контроллеру). Это было опубликовало под версией 1.4.x. - -Вскоре захотелось более удобного управления двигателями, простой конфигурации контроллера без правки прошивки, но изначальный код был малопригоден для поддержания, хотя и работал. -В результате произошёл большой рефакторинг прошивки - были выделены новые классы, зоны ответственности. - -Фактически стало понятно, что от старого проекта почти ничего не осталось (непереработанным остался только лишь Web UI). Этот проект был выделен в свою отдельную ветку и теперь развивается самостоятельно. diff --git a/src/Helpers/MqttHelper.cpp b/src/Helpers/MqttHelper.cpp index 96a0f95..c008001 100644 --- a/src/Helpers/MqttHelper.cpp +++ b/src/Helpers/MqttHelper.cpp @@ -1,4 +1,11 @@ #include "MqttHelper.h" +uint32_t MqttHelper::getChipID(){ + uint32_t chipId = 0; + for(int i=0; i<17; i=i+8) { + chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i; + } + return chipId; +} boolean MqttHelper::reconnect() { boolean isLoginNeeded = false; @@ -7,7 +14,7 @@ boolean MqttHelper::reconnect() { isLoginNeeded = true; } if (!getClient().connected()) { - String clientId = "ESP-Blinds-" + String(ESP_getChipId()); + String clientId = "ESP-Blinds-" + String(getChipID()); Serial.printf("MQTT connecting (login: '%s', pass: '%s')...\r\n", mqttUser.c_str(), mqttPwd.c_str()); // Attempt to connect if ((isLoginNeeded ? getClient().connect(clientId.c_str(), mqttUser.c_str(), mqttPwd.c_str()) @@ -36,7 +43,7 @@ boolean MqttHelper::reconnect() { } void MqttHelper::sendAvailabilityMessage() { - publishMsg(prefix + "/" + String(ESP_getChipId()) + "/available", "online"); + publishMsg(prefix + "/" + String(getChipID()) + "/available", "online"); } void MqttHelper::loop() { @@ -88,7 +95,7 @@ PubSubClient &MqttHelper::getClient() { } String MqttHelper::getTopicPath(const String &suffix) { - return prefix + "/" + String(ESP_getChipId()) + "/" + suffix; + return prefix + "/" + String(getChipID()) + "/" + suffix; } void MqttHelper::publishMsg(String topic, String payload, bool isRetained) { diff --git a/src/Helpers/MqttHelper.h b/src/Helpers/MqttHelper.h index b93cb69..5fb62ab 100644 --- a/src/Helpers/MqttHelper.h +++ b/src/Helpers/MqttHelper.h @@ -25,6 +25,7 @@ class MqttHelper { unsigned long mqttLastConnectAttempt = 0; PubSubClient* client = nullptr; unsigned long lastAvailableMsgTime = 0; + uint32_t getChipID(); public: typedef std::function TCallback; diff --git a/src/main.cpp b/src/main.cpp index 2a663a6..ffc9ca9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -55,6 +55,14 @@ ESP8266WebServer server(80); // TCP server at port 80 will respond WebSocketsServer webSocket = WebSocketsServer(81); // WebSockets will respond on port 81 +uint32_t getChipID(){ + uint32_t chipId = 0; + for(int i=0; i<17; i=i+8) { + chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i; + } + return chipId; +} + bool loadConfig() { if (!helper.loadconfig()) { return false; @@ -382,7 +390,7 @@ void sendHADiscovery() { isHADiscoveryWasSent = true; String haConfig; - uint32_t chipId = ESP_getChipId(); + uint32_t chipId = getChipID(); uint8_t num = 0; for (StepperHelper stepperHelper : stepperHelpers) {