Статьи на сайте о том как подключить электрокарнизы, жалюзи и рулонные шторы с электроприводом к контролеру для автоматизации Wiren Board:
Беспроводное подключение штор Akko и Dooya к контроллеру Wiren Board.
Материал можно посмотреть как видео:
Способ подключения, описанный в предыдущих статьях для устройств Akko, Dooya и Somfy, имеет недостаток. Если отправлять команды в RF-Blinds по одной, с интервалами в несколько секунд — всё будет хорошо. Но если интервалы малы, то гарантированно выполнится только первая команда. Последующие могут быть проигнорированы. Это особенно заметно на устройствах Somfy.
Сегодня мы посмотрим почему так происходит и это исправим.
Начнем с того, что подключимся к контролеру Wiren Board:
Напомню, что у меня Wiren Board в локальной сети имеет адрес IP 192.168.31.79.
Если будете копировать команды не забывайте менять его на свой.
Мне потребуется пара пакетов, которые изначально не были установлены.
Устанавливаем:
apt install socat git -y
Подключимся к RF-Blinds:
socat - /dev/ttyUSB0,cr,echo=0
И отправим команду:
smf_up 1,d
Видим, что ответ ‘OK’ появляется не сразу, а спустя пару секунд.
Это особенность радиопротокола Somfy. Жалюзи и реле Somfy по-разному реагируют на кратковременную и длительную отправку той же команды. На время больше двух секунд. Если во время передачи команды отправить ещё одну, не дождавшись ответа ‘OK’, команда будет потеряна. Это не так заметно, но справедливо и для радиопротокола Dooya. Обмен по радиоканалу происходит медленнее обмена через консоль.
Чтобы это исправить на python3 я написал пару скриптов. И для автозапуска скрипта сервера под linux, создал конфигурационный файл. Всё это разместил на gitlab.
Со скриптом сервера команды моторам и реле можно отправлять через сокет.
Это позволит управлять устройствами очень гибко. Можно будет отправлять команды из нескольких независимых источников. В том числе по сети. Команды при этом будут сохраняться в буфер и отправляться в RF-Blinds одна за одной, по мере их выполнения. Это позволит отправлять команды по несколько штук разом — пакетами. И команды при этом не будут теряться. Вы столкнетесь с необходимостью отправки команд пакетами сразу же, как только начнете создавать скрипты автоматизации для своего умного дома.
Копируем репо:
git clone https://gitlab.com/breelek/rf_blinds_socket.git
Появилась новая папка — rf_blinds_socket
Перейдём в неё и посмотрим содержимое:
cd rf_blinds_socket/ && ls -la
Файл bl_srv – это скрипт нашего сервера. Написан на python3. Его код можно изучить и изменить, если будет необходимость.
Для того, чтобы было не нужно вводить полный путь к скрипту при его запуске, перенесем файл bl_srv в /usr/bin:
mv bl_srv /usr/bin
Убедимся в том, что скрипт доступен для запуска (заодно начинаем знакомство с тем, как он работает):
bl_srv --help
Запустим сервер в режиме вывода отладочных сообщений. Не забудьте подключить радиомодуль RF-Blinds если вдруг он был не подключен:
bl_srv -v=True &
По ответу видим, что RF-Blinds найден. Нам не надо проходить квест с поиском порта, к которому подключен RF-Blinds:
rf-blinds found on port /dev/ttyUSB0
Чтобы окончательно убедиться в том, что всё работает дадим несколько команд.
Для DOOYA:
socat - tcp:localhost:8124 <<< "dy_open 1,1"
socat - tcp:localhost:8124 <<< "dy_stop 1,1"
Для SOMFY:
socat - tcp:localhost:8124 <<< "smf_down 1,d"
Команды можно отправлять сразу по несколько штук, разделяя их символом “;”. Сервер сохранит их в очереди и передаст так, чтобы они не потерялись.
Как пример, можем передать сигнал бедствия (морзянка SOS):
socat - tcp:localhost:8124 <<< 'smf_up 1;smf_up 1;smf_up 1;smf_up 1,6;smf_up 1,6;smf_up 1,6;smf_up 1;smf_up 1;smf_up 1'
Все остальные команды, разумеется тоже работают.
Выполните:
socat - tcp:localhost:8124 <<< "help"
Можно посмотреть полный перечень доступных команд:
socat - tcp:localhost:8124 <<< "cmd_list"
Скрипт bl_srv запускает сокет на машине. И теперь команды можно отправлять не только с устройства, на котором запущен bl_srv, но и с любого другого, который имеет доступ к вашей локальной сети. С планшета, телефона, роутера, обычного компьютера. C микроконтроллеров вроде ESP8266 или ESP32. И интеграция в системы умного дома получилась тоже очень простой — можно интегрироваться в любую т.к. поддержка сокетов есть везде. При этом система умного дома может быть запущена на другом устройстве. Нужно только чтобы устройства могли связываться между собой по сети.
Я покажу как это можно сделать под windows.
Чтобы у вас тоже получилось – должен быть установлен python3.
В windows, в любом удобном месте создадим папку с именем, например, forDel.
Перейдём в неё.
Дальше я открою терминал в этой папке.
Копирую репо (мы уже это делали на wiren board):
git clone https://gitlab.com/breelek/rf_blinds_socket.git
Перейду в созданную папку:
cd .\rf_blinds_socket\
И убежусь в том, что всё работает, что я могу управлять шторами, отправляя команды через сеть:
python3 .\bl_client -ip 192.168.31.79 'dy_open 1,1'
python3 .\bl_client -ip 192.168.31.79 'dy_stop 1,1'
Теперь есть возможность управлять шторами с любого устройства в сети.
Я написал небольшой скрипт и снял короткое видео о том, как это может выглядеть:
Это окно терминала закрываем.
Папку forDel можно удалить, если она не нужна.
Возвращаемся в окно терминала с ssh подключением к Waren Board.
Нам осталось только сделать так, чтобы сервер bl_srv автоматически запускался при старте системы.
Для этого в каталог /etc/systemd/system/ переместим файл rf-blinds@rfblinds.service:
mv ~/rf_blinds_socket/rf-blinds@rfblinds.service /etc/systemd/system/
Добавляем скрипт в автозагрузку с помощью следующей команды:
systemctl enable rf-blinds@rfblinds
Вы должны увидеть сообщение:
Created symlink /etc/systemd/system/multi-user.target.wants/rf-blinds@rfblinds.service → /etc/systemd/system/rf-blinds@rfblinds.service.
Нужно перезагрузить систему и убедиться, что bl_srv запускается при старте системы:
reboot
После переподключения убедимся, что всё в порядке, отправив:
Для Dooya:
socat - tcp:localhost:8124 <<< "dy_open 1,1"
socat - tcp:localhost:8124 <<< "dy_stop 1,1"
Для Somfy:
socat - tcp:localhost:8124 <<< "smf_up 1"
Папку, куда скопировали репозиторий можно удалить:
rm -r ~/rf_blinds_socket
В консоли мы закончили.
Переходим к настойке веб-интерфейса Wiren Board.
Эта процедура уже должна быть вам знакома по предыдущим статьям. Поэтому я постараюсь показать всё по-короче.
На вкладке «Правила» веб-панели WirenBoard я создам два файла.
Один — dooya_socket.js, для мотора Dooya.
Содержимое файла dooya_socket.js:
//-------- Параметры: --------
tname = 'Dooya DM35' // Имя устройства в веб-интерфейсе.
channel = '1' // Номер канала, заданный при привязке устройства к rf-blinds.
group = '1' // Номер группы каналов, заданный при привязке к rf-blinds.
port = '8124' // Номер порта, на котором поднят сокет.
host = 'localhost' // Если сокет поднят на удаленном хосте, укажите IP
//----------- Код: -----------
/* Создаём виртуальное устройство к которому будем обращаться
** по имени 'rf_blinds_dy_'+group+'_'+channel,
** которое будет отображаться в веб-интерфейсе как значение, указанное в tname,
** с тремя кнопками:
** 1 - open;
** 2 - stop;
** 3 - close;
*/
defineVirtualDevice('rf_blinds_dy_'+group+'_'+channel, {
title: tname,
cells: {
open: {
type: 'pushbutton',
order: 1
},
stop: {
type: 'pushbutton',
order: 2
},
close: {
type: 'pushbutton',
order: 3
}
}
});
// Каждой кнопоке виртуального устройства зададим действие:
defineRule('dooya_open_'+group+'_'+channel, {
whenChanged: 'rf_blinds_dy_'+group+'_'+channel+'/open',
then: function () {
runShellCommand ('echo "dy_open '+group+','+channel+'"|socat - TCP:'+host+':'+port);
}
});
defineRule('dooya_stop_'+group+'_'+channel, {
whenChanged: 'rf_blinds_dy_'+group+'_'+channel+'/stop',
then: function () {
runShellCommand ('echo "dy_stop '+group+','+channel+'"|socat - TCP:'+host+':'+port);
}
});
defineRule('dooya_close_'+group+'_'+channel, {
whenChanged: 'rf_blinds_dy_'+group+'_'+channel+'/close',
then: function () {
runShellCommand ('echo "dy_close '+group+','+channel+'"|socat - TCP:'+host+':'+port);
}
});
Второй — somfy_socket.js, для радиореле Somfy Centralis Indoor RTS VB.
Содержимое файла somfy_socket.js:
//-------- Параметры: --------
tname = 'Somfy Relay' // Имя устройства в веб-интерфейсе.
id = '1' // Номер, заданный при привязке устройства к rf-blinds.
port = '8124' // Номер порта, на котором поднят сокет.
host = 'localhost' // Если сокет поднят на удаленном хосте, укажите IP
//----------- Код: -----------
/* Создаём виртуальное устройство к которому будем обращаться
** по имени 'rf_blinds_smf_'+id,
** которое будет отображаться в веб-интерфейсе как значение, указанное в tname,
** с пятью кнопками:
** 1 - open;
** 2 - open step;
** 3 - stop;
** 4 - close step;
** 5 - close;
*/
defineVirtualDevice('rf_blinds_smf_'+id, {
title: tname,
cells: {
open: {
type: 'pushbutton',
order: 1
},
open_step: {
type: 'pushbutton',
order: 2
},
stop: {
type: 'pushbutton',
order: 3
},
close_step: {
type: 'pushbutton',
order: 4
},
close: {
type: 'pushbutton',
order: 5
}
}
});
// Каждой кнопоке виртуального устройства зададим действие:
defineRule('somfy_open'+id, {
whenChanged: 'rf_blinds_smf_'+id+'/open',
then: function () {
runShellCommand ('echo "smf_up '+id+',10"|socat - TCP:'+host+':'+port);
}
});
defineRule('somfy_open_step'+id, {
whenChanged: 'rf_blinds_smf_'+id+'/open_step',
then: function () {
runShellCommand ('echo "smf_up '+id+'"|socat - TCP:'+host+':'+port);
}
});
defineRule('somfy_stop'+id, {
whenChanged: 'rf_blinds_smf_'+id+'/stop',
then: function () {
runShellCommand ('echo "smf_my '+id+'"|socat - TCP:'+host+':'+port);
}
});
defineRule('somfy_close_step'+id, {
whenChanged: 'rf_blinds_smf_'+id+'/close_step',
then: function () {
runShellCommand ('echo "smf_down '+id+'"|socat - TCP:'+host+':'+port);
}
});
defineRule('somfy_close'+id, {
whenChanged: 'rf_blinds_smf_'+id+'/close',
then: function () {
runShellCommand ('echo "smf_down '+id+',10"|socat - TCP:'+host+':'+port);
}
});
Переходим на вкладку «Устройства», видим, что появилось два новых:
Убеждаемся, что всё работает и команды не теряются. Теперь можно управлять шторами с wiren board по радиоканалу.