Dorfl – управление жалюзи – настройка MajorDoMo

Ранее

Объекты

Класс CBlinds:

Здесь posMax – это вручную задаваемое максимальное значение положения в модуле. Его следует уставновить равным MaxPos в конфигурации модуля. Используется в методах setOpen и setClose.
Также свойства posPresetX – тоже вручную задаваемые параметры воможных положений. Например у меня posPreset1 – это везде закрытие не до упора, для вечера, чтобы можно было видеть улицу в щель. posPreset2 – чуть более плотное закрытие без щели, но ролеты не до конца сомкнуты. Итп.
pos/isManuallyLocked – это свойства автоматически обновляемые mqtt и методами класса – для последующего использования в интерфейсе и скриптах
cmd – команда привязанная к mqtt

Пример метода setOpen:

$posMax = $this->getProperty('posMax');
if (empty($posMax)) {
 $posMax = 60;
}
// send to MQTT, to the 'cmd' topic
setGlobal($this->object_title.'.'.'cmd','mva-'.$posMax);

Здесь вместо mva0, шлем mva-xx для того чтобы компенсировать проблему дрейфа: последовательное mvr10 и mvr-10 не вернет вточности в исходное положение, т.к. опускать легче и за 10 секунд ролета сместится на большее расстояние чем при подъеме на 10 секунд. Поэтому setOpen – это своего рода гарантированый возврат в полностью открытое положение, которое выполняется минимум раз в сутки.

Пример метода setPreset1:

if (!empty($this->getProperty('posPreset1'))) {
  if (intval($this->getProperty('posPreset1')) != intval($this->getProperty('pos'))) {
	// send to MQTT, to the 'cmd' topic
	setGlobal($this->object_title.'.'.'cmd','mva'.$this->getProperty('posPreset1'));
  }
}

Соответственно определены объекты данного класса с соответсвующими значениями в posMax/posPresetX:

Конфигурация MQTT

Каждая пара cmd/pos имеет соответсвующую привязку к свойствам cmd/pos каждого из объектов:

Использование

Собственно использование заключается в вызове методов setOpen, setClose, setPresetX, toggleState при желаемых событиях, а также отображение статуса из свойств pos и isManuallyLocked.

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

В зале скрипт еще более запутанный – тут уже две ролеты, одна на окне, вторая на двери на террасу. Также в правила добавлен телевизор – при включённом телике прикрывается окно чтобы солнце не мешало. Отложенное закрытие и posPreset3 для предварительного “уведомления” о том что дверь будет заблокирована через 2 минуты.

Также в планы добавлено управление и отображение статуса из pos/isManuallyLocked:

Detritus – двухканальный выключатель света – прошивка

Аппаратная часть

Аппаратная часть и конфигурация для прошивки описана в следующей статье:

Особености моей прошивки

  • Управление посредством MQTT брокера.
  • Рапорт о состоянии содержит информацию о положении выключателя – таким образом сервер может узнать положение переключателя.
  • Активирован Light-Sleep режим, что позволяет снизить потребление без ущерба в реакции на выключатели (потребелние снижено с 0.8w до 0.5w).
  • Имеет ряд настроек, которые позволяют достаточно гибко конфигурировать поведение модуля: можно независимо инвертировать релешки и выключатели.
  • Возможность изменения настроек без необходимости разбирать и перепрошивать.

Рабочие режимы

  • Светодиод моргает – модуль в режиме конфигурации. В этот момент открыта точка доступа с именем Detritus-xxxxx. Страница конфигурации доступна по IP 192.168.4.1. Либо, если модуль не терял связь с настроенной сетью, можно открыть эту же страницу по IP модуля.
  • Светодиод горит – модуль подключен к сети и нормально работает.

Управление ручным выключателем

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

Конфигурация

  • SSID/password – подключение к домашней WiFi сети
  • mqtt server/port/client name/user/password – подключение к MQTT брокеру. Важно! Client name должен быть уникальным. Этот же client name используется в качестве имени точки доступа и имени хоста.
  • mqtt output topic 1 – топик для вывода статуса реде L1. Значения 0, 1 соответсвуют выключено, включено соответсвенно. Дополнительно может содержать точку в конце для обозначения положения переключателя.
    Примеры:
    ‘0.’ – реле открыто, соответсвующий переключатель нажат.
    ‘1’ – реле закрыто, переключатель не нажат.
    ‘1.’ – реле закрыто и переключатель нажат.
  • mqtt commands 1 topic – топик для команд реле L1.
  • mqtt output topic 2 – топик для вывода статуса реде L2.
  • mqtt commands 2 topic – топик для команд реле L2.
  • swap relays – инвертирует привязку реле L1/L2 к переключателям S1/S2.
  • respect switch states – если установлено – нажатие переключателя включает свет. Если свет уже горел – то ничего не происходит. Выключение аналогично.
    Если флаг сброшен – каждая смена положения переключателя меняет состояние реле.
  • invert switch keys – меняет направление переключателей. Также влияет на вывод точки в выводе статуса.

Команды управления

  • 1 – включить свет (закрыть реле).
  • 0 – выключить свет (открыть реле).
  • set – перейти в режим конфигурации. Аналогично нажатию на кнопку ‘pairing’ на корпусе, либо быстрому включение/выключению переключателя более 5 раз.

Исходники

См GitHub:

Хотелось бы отметить что используется development ветка WiFiManager’а. Данная ветка позволяет запускать конфигуратор в неблокирующем режиме – ручной переключатель остается функциональным даже если сеть пропала/не настроена и модуль постоянно в режиме точки доступа. Мастер-ветка WiFiManager’а не умеет такого.

Более

Для примера конфигурации MajorDoMo смотри xxx

Dorfl – управление жалюзи – прошивка

Аппаратная часть

Аппаратная часть и конфигурация для прошивки описана в следующей статье:

Особености моей прошивки

  • Управление посредством MQTT брокера.
  • Приблизительно знает состояние/положение жалюзи (ролеты). Полностью открытые жалюзи – это условный 0. Если нажать кнопку закрытия и держать одну секунду – это 1. Каждый раз когда вы вручную нажимаете выключатель для открытия или закрытия – модуль считает время и автоматически обновляет свое состояние (и рапортует в MQTT). Т.е. сервер может узнать текущее положение (полностью открыты, закрыты на треть, либо полностью) и посылать команды для более точного позиционирования. Можно послать команду относительного положения (типа “включи реле закрытия на 3 секунды”), либо абсолютного (“перемести в положение 6 секунд от полностью открытого”. При этом модуль не будет полностью открывать чтобы начать осчет 6 секунд, а переместит в нужном направлении на необходимое количество секунд относительно текущего положения). Т.к. положение считает модуль, а не сервер, то исключена неточность позиционирования из-за сетевых задержек (потеряна связь, либо mqtt-брокер лагает, итп).
  • Также рапорт о состоянии содержит информацию о положении выключателя – таким образом сервер может узнать нажата ли кнопка.
  • Активирован Light-Sleep режим, что позволяет снизить потребление без ущерба в реакции на выключатели (потребелние снижено с 0.8w до 0.5w).
  • Имеет ряд настроек, которые позволяют достаточно гибко конфигурировать поведение модуля: можно инвертировать координаты отсчета (“0” будет полностью закрытые), можно независимо инвертировать релешки и выключатели.
  • Возможность изменения настроек без необходимости разбирать и перепрошивать.

Рабочие режимы

  • Светодиод моргает – модуль в режиме конфигурации. В этот момент открыта точка доступа с именем Dorfl-xxxxx. Страница конфигурации доступна по IP 192.168.4.1. Либо, если модуль не терял связь с настроенной сетью, можно открыть эту же страницу по IP модуля.
  • Светодиод горит – модуль подключен к сети и нормально работает.

Управление ручным выключателем

  • Заблокировать дистанционное управление в полностью открытом/закрытом положении: если оставить ручной выключатель в нажатом положении, то управление по сети заблокировано.
  • Заблокировать дистанционное управление в произвольном положении: для блокировки в промежуточном состоянии, необходимо из выключеного состояния быстро включить-выключить-включить любой из переключателей. При этом переключатель остается включеным и управление по сети заблокировано (но реле не срабатывает).
  • Перейти в режим конфигурирования: для этого необходимо быстро включить/выключить любой переключатель 5 или более раз.
  • Даже если переключатель оставить в нажатом положении, то реле автоматически откроется через MaxPos секунд.

Конфигурация

  • SSID/password – подключение к домашней WiFi сети
  • mqtt server/port/client name/user/password – подключение к MQTT брокеру. Важно! Client name должен быть уникальным. Этот же client name используется в качестве имени точки доступа и имени хоста.
  • mqtt position output topic – топик для вывода текущей позиции. Значение в диапазоне [0, maxPos]. Значение – целочисленое количество секунд от полностью открытых жалюзи. Значение посылается при открытии реле (не важно каким образом было сработано – дистанционно, либо переключателем) и при нажатии на переключатель. Если запись была инициирована переключателем, значение содержит точку в конце.
    Примеры:
    ‘0’ – жалюзи полностю открыты
    ’30’ – положение 30 секунд (означает что закрывались как минимум 30 секунд, но может и больше если MaxPos = 30)
    ’30.’ – положение 30 секунд и переключатель нажат.
  • mqtt commands topic – топик для команд.
  • blinds max pos – максимальная позиция жалюзи.
  • invert zero-position – инвертирует реле для открытия/закрытия. По-умолчанию L1 для открытия, L2 для закрытия.
  • invert switch keys – инвертирует клавиши переключателя. По-умолчанию S1 для открытия, S2 для закрытия.
  • disable manual lock – если блокировка от быстрого включения/отключения/включения мешает, можно её отключить установив этот флаг.

Команды управления

  • mvr<XXX> – переместить жалюзи в относительное положение XXX. Где XXX может быть отрицательным. Если XXX отрицательное – жалюзи открываются. Если положительное – закрываются. Абсолютное значение XXX – это количество секунд закрытия реле.
    Примеры:
    mvr5 – замкнуть реле L2 на 5 секунд (закрытие)
    mvr-60 – замкнуть реле L1 на 60 секунд (открытие)
    mvr0 – разомкнуть оба реле. Т.е. фактически остановка.
    Внимание: модуль берет на себя разрешение конфликтов и гарантирует невозможность одновременного закрытия обоих реле. Т.е. последовательное mvr5 mvr-5 не сожгёт двигатель, а всего-лишь прервёт/отменит первую команду.
  • mva<XXX> – переместить жалюзи в абсолютное положение XXX. Где XXX может быть отрицательным либо положительным. Если XXX вне диапазона [0, MaxPos], то после XXX секунд внутреннее значение положения будет установлено в 0 либо MaxPos.
    Примеры:
    mva0 – полностью открыть жалюзи.
    mva5 – доведет жалюзи от текущего положение до 5 секунд относительно полностью открытого. Если текущее положение 3, то будет держать L2 замкнутым в течении 2 секунд. Если текущее положение 9, то будет держать L1 замкнутым в течении 4 секунд.
    mva60 – полностью закрыть жалюзи. Будет держать замкнутым L2 в течении 60 секунд, и по истечении 60 секунд установит положение в MaxPos.
    mva-60 – полностью открыть жалюзи. Будет держать замкнутим L1 в течении 60 секунд и по истечении установит положение в 0.
  • set – перейти в режим конфигурации. Аналогично нажатию на кнопку ‘pairing’ на корпусе, либо быстрому включение/выключению переключателя более 5 раз.

Исходники

См GitHub:

Хотелось бы отметить что используется development ветка WiFiManager’а. Данная ветка позволяет запускать конфигуратор в неблокирующем режиме – ручной переключатель остается функциональным даже если сеть пропала/не настроена и модуль постоянно в режиме точки доступа. Мастер-ветка WiFiManager’а не умеет такого.

Более

Для примера конфигурации MajorDoMo смотри:

Dorfl/Detritus – аппаратная часть двухканального реле

Аппаратная основа – китайский модуль для управления жалюзи/ролетами от LoraTop.

Мозг модуля – TYWE2S, основывающийся на ESP8285.

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

В официальном магазине модуль представлен в двух версиях: V1 и V2. Я заказал оба и после инспекции могу отметить следующую разницу: качество производства и пайки в V2 выше. Тем не менее, с точки зрения схемотехники и компонентов – обе версии идентичны. Основное различие – в прошивке. V2 поддерживает переключатели с фиксацией положения, а V1 возвратные. Учитывая эту разницу и нижеследующее – смысла в переплате за V2 я особо не вижу.

Оригинальная прошивка нас не интересует. Она работает через облако tuya. Во-первых это зависимость от доступа в интернет. Во-вторых возможные лаги. В-третьих доступ к управлению из своего софта затруднен (хоть энтузиасты и активно реверсят). Ну и в-четверых внутренний параноик не доверяет свой уют для доступа из наружи. Поэтому будем “ломать”. 🙂

Для прошивки необходим rs232 интерфейс с 3.3v. Я использовал FTDI.

Для подключения нам нужны 5 контактов.

TYWE2SFTDI
VCCVCC
GNDGND
RXTX
TXRX
IO0GND

Подключение тривиально. Но не забываем выставить 3.3v на FTDI модуле. Для загрузки модуля в режиме прошивки, необходимо при подаче питания замкнуть IO0 на землю.

В модуле используются следующие GPIO:

GPIOРежимОписание
3outLED (1 – off, 0 – on)
4inswitch S1 (1 – released, 0 – pressed)
5inswitch S2 (1 – released, 0 – pressed)
12outrelay L1 (0 – open, 1 – close)
13inpairing button (1 – released, 0 – pressed)
14outrelay L2 (0 – open, 1 – close)

Подпаиваться весьма удобно. Во время разработки/тестирования я собрал следующий макет (во время подачи питания 220v, не забывайте отключать FTDI от комьютера! На фото он отключен.)

В Arduino Studio необходимо выставить следующие параметры:
Generic ESP8285 Module, CPU 80MHz, Crystal 26MHz, Flash Size 1MB

Шить будем два варианта: