В прошлой статье мы прикрутили к нашей системе «умный дом» небольшой веб-интерфейс. Самое время обратиться к той части дела, ради которой все это и затевается — управление нагрузкой. Под нагрузкой подразумевается любое электроустройство, которым есть смысл управлять.
За подробностями реализации прошу под кат.
Небольшое вступление или что-же такое Х10
Протокол связи Х10 и основанный на нем стандарт известны миру достаточно давно. Стандарт был разработан в 1975 году компанией Pico Electronics для управления домашними электроприборами. Так в чем же его преимущество, по сравнению с протоколом 1-wire? Все дело в том, что для связи с приемниками, контроллер Х10 использует обычную электропроводку, что позволяет избежать лишних проводов и добраться до труднодоступных мест (например, кому-то не захочется портить ремонт ;)
Что внутри?
Для передачи сигналов Х10 используются «пакеты» колебаний на частоте 120 кГц длительностью 1 мс. Передача сигнала в Х10 синхронизирована с нулевым напряжением в цепи переменного тока. Когда напряжение достигает нулевого значения, приемник сигнала Х10 (например, встроенный в патрон лампочки) «слушает» сеть в течение 6 мс. Если в это время передатчик сигнала х10 посылает «пакет», приемник воспринимает его как единицу. Отсутствие «пакета» воспринимается как ноль. Каждое устройство, управляемое посредством х10, имеет свой адрес, состоящий из двух символов. Первый – код дома, второй – код устройства. Каждый из них может иметь 16 значений, а общее число различных адресов достигает 256. Код дома обозначают латинской буквой (от A до P), а код устройства – числом от 1 до 16. По электропроводке каждый код дома и устройства передается своей последовательностью нулей и единиц – двоичным кодом.
Каждая команда х10 также имеет свой двоичный код. Последний бит в двоичных кодах устройства и команды служит для различия типа кодов: 0 соответствует коду устройства, 1 – коду команды. Для того чтобы приемник знал, когда начинается передача полезного сигнала, передатчик сначала посылает так называемый стартовый код – ему соответствует последовательность 1110. За ним следует код дома, а потом – код устройства или команда. Последовательность стартового кода, кода дома и кода устройства или команды называется кадром (или фреймом) Х10. Каждый кадр передается два раза подряд – для большей надежности. Каждый информационный бит кадра, за исключением битов стартового кода, сопровождается комплементарным (дополняющим) битом – после 1 идет комплементарный 0, после 0 – единица. Таким образом, для передачи одного кадра необходимо 11 циклов переменного напряжения.
Для передачи команды Х10 нужно сначала отправить кадр с кодом устройства, которому предназначена команда, а за ним – кадр с самой командой. Исключение составляют групповые команды, например «All Units Off» – они отправляются всем устройствам, поэтому код устройства перед ними передавать не нужно.
При передаче последовательности адресов и/или команд между каждой парой кадров должен быть промежуток в три цикла переменного напряжения – то есть последовательность 000000. Например, адрес устройства и команда для него передаются двумя парами кадров с указанным промежутком. Для передачи такой последовательности необходимо 22+3+22=47 циклов напряжения. При частоте 50 Гц такая операция занимает примерно одну секунду. Пожалуй, в этом и заключается самый большой минус данной технологии по сравнению с 1-wire, где команды передаются практически мгновенно. Отмечу, что команды «Bright» («Ярче») и «Dim» («Темнее») следуют друг за другом без промежутка между кодами. Это пример передачи сигналов в однофазной сети. В трехфазных сетях передача сигнала происходит аналогично, но «приурочена» к нулю каждой фазы. X10 команды, как правило, не проходят между разными фазами. Это означает, что необходимо либо подключать все устройства на какую-то определенную фазу, либо использовать специальные устройства — репитеры, которые далеко не всегда доступны в продаже. Кроме того, репитеры вносят свою лепту в задержки, связанные с передачей команд, фактически удваивая их. Это на самом деле большая проблема, так как обычно при 3-х фазном электроснабжении стараются развести фазы так, чтобы нагрузка на них была равномерна, а значит велика вероятнось того, что одна группа розеток или комната будет запитана от первой фазы, а другая от второй.
Оборудование
Что же нужно для организации умного дома на такой технологии? Для начала, прежде всего — контроллер. Это голова всей сети Х10. Именно он посылает в сеть управляющие команды.
Контроллеры X10 различаются от чрезвычайно простых до весьма «сообразительных».
Самые простые контроллеры могут управлять четырьмя устройствами X10 с четырьмя последовательными адресами (1-4 или 5-8). Такие контроллеры обычно содержат следующие кнопки:
- Устройство 1 On/Off
- Устройство 2 On/Off
- Устройство 3 On/Off
- Устройство 4 On/Off
- Ярче(Brighten) / Темнее(Dim) (последнее выбранное устройство)
- Включить весь свет / Выключить все
Более «умные» контроллеры могут управлять большим количеством устройств и/или включать в себя таймеры, которые выполняют предварительно настроенные команды каждый день в заданное время. Также доступны устройства, которые используют пассивные инфракрасные датчики движения или фотоэлементы, чтобы включать и выключать освещение и другие модули.
Наконец, существуют устройства, которые можно программировать или они могут использоваться программой, работающей на компьютере. Эти системы могут выполнить различные синхронизированные события, реагировать на внешние датчики и команды, выполнять, сценарии, включать и выключать освещение, выравнивать его яркость и так далее.
Именно последний тип контроллеров нас и интересует. Небольшой сеанс гугла подсказал, что наиболее адекватной моделью в моем случае является CM11A. Выглядит сие чудо примерно так:
Как можно видеть, с одной стороны вставляется в обычную розетку (лучше не в фильтр), с другой — в COM-порт нашего компьютера. Для тех у кого нет COM, есть вариант контроллера с переходником USB-COM — CM11USB.
Поставляется с программкой ActiveHome, которая, впрочем, нас не интересует ;)
С контроллером разобрались, теперь перейдем к тому, чем он управляет.
Технология Х10 помогает решить самые разные задачи домашней автоматизации. Например, можно включать и выключать в заданное время свет, дистанционно изменять яркость освещения, управлять электроприборами с помощью компьютера, раздвигать шторы, включать охранную и пожарную сигнализацию и делать много других полезных вещей. Для этого разработаны различные виды устройств, поддерживающих х10. Перечислю их:
- Исполнительные модули (приемники) – принимают и выполняют команды x10. Каждый приемник имеет адрес, состоящий из кода дома и кода устройства, например A10. Несколько приемников могут иметь тот же адрес – в этом случае они управляются одновременно. Приемниками могут быть, например, ламповые и приборные розеточные модули, настенные выключатели, светорегуляторы в ламповом патроне, приводы жалюзи, диммерные модули для управления резистивной нагрузкой
- Трансиверы – принимают сигналы от пультов дистанционного управления (ИК или радио), преобразуют в формат x10 и передают в электросеть
- Пульты ДУ – обеспечивают дистанционное управление устройствами X10 по ИК- или радиоканалам. Есть и универсальные пульты ДУ для управления устройствами x10 и аудио/видеоаппаратурой
- Оборудование для повышения качества и надежности работы систем X10 – усилители и ретрансляторы сигналов, фильтры для подавления электромагнитных помех. В простых системах часто можно обойтись и без этих устройств
- Измерительное оборудование – предназначено для измерения затухания сигналов X10
В системах на основе стандарта X10 используется также вспомогательное оборудование, которое само не передает и не принимает сигналы по протоколу X10. Это, например, датчики движения, освещенности, разбития стекла, открывания дверей или окон. Они передают информацию по радио или ИК-каналам на трансиверы, а те пересылают ее исполнительным модулям по протоколу X10.
Стоит заметить, что на рынке есть множество исполнительных модулей, используя которые, можно решить практически любую задачу по автоматизации дома. Я же, для пробы, я взял исполнительный модуль в виде лампового патрона под названием LM15S. Модуль подкупил простотой монтажа (вкрутить, как обычную лампочку), так и относительной дешевизной. Модуль стал дополнительным отдельным источником освещения в моей люстре, когда хочется приглушенного света. Стоит отметить, что им достаточно неудобно управлять с помощью обычного выключателя.
Софт
Что же нам нужно сделать, чтобы получить возможность управления нашим модулем с помощью компьютера? Для начала, установить необходимый софт. Есть несколько систем для общения с контроллером под Linux. Я остановился на HEYU (офсайт).
Установка проста и назамысловата: скачиваем исходники, смотрим содержимое INSTALL, выполняем по инструкциям ;)
Попробуем в действии! Для начала, нам нужно задать адрес нашему модулю. Сделам это: ввернем модуль вместе с управляемой лампой в патрон. Для присвоения LM15S кода дома и кода модуля необходимо подать напряжение на модуль LM15S выключателем. Затем, в течении 30 секунд, подадим 3 команды на включение нашим контроллером на адрес, который хотим присвоить модулю:
nix@nix-boss:~$ heyu on a1
nix@nix-boss:~$ heyu on a1
nix@nix-boss:~$ heyu on a1
После этого нашему модулю присваивается адрес А1 в сети Х10. Достаточно просто.
На некоторых устройствах адрес можно выставлять с помощью джамперов. Например, на устройствах, производимых фирмой Marmitek.
Теперь мы можем управлять нашей лампой нехитрыми командами:
nix@nix-boss:~$ heyu on a1
nix@nix-boss:~$ heyu off a1
Соответственно, первая — включение лампы, вторая — выключение. Некоторые модули позволяют плавно менять освещенность:
heyu dim a5 10
Что выставит яркость лампы на 10 ступеней из 22.
С управлением разобрались, перейдем к интеграции в наше ПО.
Интегрируем Х10
Добавим в подпрограмму checkcmd() скрипта srv.pl после строк:
201 if($text =~ /врем/)
202 {
203 my $up = `uptime`;
204 $up =~ /(.*?) up/;
205 sayText("Сейчас $1");
206 return;
207 }
Следующее:
208 if($text =~ /вкл/)
209 {
210 system('heyu on a1');
211 sayText("Лампа включена");
212 return;
213 }
214
215 if($text =~ /выкл/)
216 {
217 system('heyu off a1');
218 sayText("Лампа выключена");
219 return;
220 }
Все просто ;) Теперь, если вы можете сказать: «Система, включить лампу» или «Система, выключить лампу» и увидеть результат. Тут конечно не хватает проверки, если ламп будет много или включить можно будет не только лампу. Просто добавим еще одно условие:
208 if($text =~ /вкл/)
209 {
210 system('heya on a1') if $text =~ /гостин/;
211 system('heyu on a2') if $text =~ /зал/;
212 sayText("Лампа включена");
213 return;
214 }
215
216 if($text =~ /выкл/)
217 {
218 system('heya off a1') if $text =~ /гостин/;
219 system('heyu off a2') if $text =~ /зал/;
220 sayText("Лампа выключена");
221 return;
220 }
Тут можно добавлять и экспериментировать бесконечно. Дальше все зависит только от вашей фантазии и возможностей.
Я же хочу выразить благодарность тем, кто интересовался данными постами. Пожалуй, я описал, все что хотел. Если у кого-то возникнуть вопросы — милости прошу, постараюсь ответить всем.
Спасибо за внимание ;)