Последние статьи
- Твердотельный датчик направления и скорости ветра. Эксперимент
- iPhone на стене в качестве панели управления домом
- MegaD-16M-XT - подсветка выключателей и не только
- Переделка выключателей в кнопки и мини-обзор текущего рынка
- RadSens - модульный счетчик Гейгера с интерфейсом I2C
- "U" - значит универсальный. Обзор модуля MegaD-16U-XT
- SCD4x - современная альтернатива для измерения концентрации CO2
- HTU31D - новый датчик температуры и влажности с нагревательным элементом
- Измерение коэффициента пульсации ламп с помощью MegaD-2561
- Использование солнечных панелей в качестве датчика освещенности
- Согласование датчиков с выходом типа TTL со стандартными входами контроллера
- DPS368 - датчик атмосферного давления индустриального класса повышенной точности
- DS18B20 Waterpoof - импортзамещение
- TMP117 - высокоточный датчик температуры с интерфейсом I2C
- MegaD-16R-XT - расширитель на 16 релейных выходов
- MegaD-2561-RTC V3 - больше портов, зуммер и ИОН
Web-интерфейс своими руками для управления диммером X10
01/03/2011 21:13:38
Возможно, данная статья устарела.
Все новые статьи
"Всем выйти из сумрака!"
Когда у меня появились модули X10, ужасно захотелось ими поуправлять. Нет, не из терминала или с помощью скрипта, который отправляет команду "Выключить весь свет" в случае перехода сигнализации в режим "Охрана". Все это, конечно, здорово, но очевидно и понятно. У меня появилось желание дополнительно интегрировать управление модулями в Web-интерфейс. Но если с релейным модулем все более-менее понятно, то с диммерами сложнее, поскольку они требуют реализации плавной регулировки.
В качестве драйвера, интерфейса к X10 в Linux я оставил у себя программу с забавным и почти матерным названием heyu.
Напомню, что в отсутствии поддержки в моем модуле команд типа Preset Dim, управление диммером происходит с помощью запуска команды:
Уменьшаем яркость на 50% heyu dim a2 10 Увеличиваем яркость на 15% heyu bright a2 3
В приведенном примере a2 адрес модуля в сети.
Для начала я попробовал установить domus.Link - frontend к программе heyu.
Рубильничек как в светильниках 70-х годов порадовал...
Интерфейс простой, понятный, но без каких-либо изысков. Степеней диммирования, как хорошо видно на скриншоте только пять. Уверен, что в подавляющем большинстве случаев в жизни этого более чем достаточно, но не спортивно. Конечно, картинки можно поменять, но хотелось все же вписать управление в собственный Web-интерфейс. К слову, русские альясы к устройствам domus.Link не поддерживает. И причина здесь даже не в самом domus.Link, а в heyu, который такие альясы не принимает.
Напомню, мой Web-интерфейс Умного Дома строится по модульному принципу. За основу взят набор CSS и JS от Grid 960. Информация в блоках (дивах) обновляется с разной периодичность с помощью jQuery. Впрочем, монстроидальность конструкции определенно уже прослеживается и в планах разгрузить интерфейс, а точнее сделать его зависимым от пользователя. Для меня пусть остается таким какой есть, для детей жены попроще, с минимальным набором информации, но и повеселее или даже помоднее. Кому-то, кажется, нравится розовый, а кому-то хочется побольше черного.
Но вернемся к описанию диммера в базе данных. Я решил, что все исполнительные устройства будут у меня в единой таблице БД. К уже существующим полям: Адрес устройства (key_addr), Наименование (key_title), Метка/Альяс (key_label) я добавил два новых поля: Тип (key_type), которое может принимать значения (auto, key или dimmer) и Уровень (key_level) для сохранения текущего состояния диммера.
Теперь мне нужен был какой-нибудь простой и стандартный "ползунок", с помощью которого можно было бы изменять уровень яркости. Для этих целей я применил готовый модуль FC-TrackBar, который удачно вписывается в jQuery.
Вот этот компонент подойдет для управления диммером
Дело за малым - вписать все это хозяйство в существующий интерфейс.
Вот несложный PHP-код для вывода состояния ключей и управления ими (если их тип не авто, что означает, что они управляются программами автоматически).
<script type="text/javascript"> $(document).ready( function() { $('.key').click(function () { var label = $(this).attr("label"); var action = $(this).attr("action"); var key = $(this); key.text("подождите"); $.get("key.php?key_label=" +label + "&key_pio=" + action, function(data){ $.get("mod_keys.php", function(data){$("#mod_keys").html(data);}); }); }); $('.dim').click(function () { var label = $(this).attr("label"); var level = $('#dim_' + label).attr("value"); $.get("key.php?key_label=" +label + "&key_level=" + level, function(data){ }); }); }) </script> <? echo "<table border="1">"; echo "<tr><th>Устройство</th><th>Сост.</th><th>Посл. включ.</th></tr>"; $sql="SELECT key_title, tmpID, key_pio, key_label, key_addr, key_type, key_level FROM tmp_7"; if(!($result=mysql_query($sql,$conn))) echo "Error"; else { while(($data=mysql_fetch_row($result))) { echo "<tr>"; echo "<td>$data[0]</td>"; echo "<td>"; if ( $data[2] == 1 ) echo "<b>Вкл</b>"; else echo "Выкл"; if ( $data[5] != "auto" ) { if ( $data[2] == 0 ) echo " / <a href="javascript:void(0)" class="key" label="$data[3]" action="1">Вкл</a>"; else echo " / <a href="javascript:void(0)" class="key" label="$data[3]" action="0">Выкл</a>"; } if ( preg_match("/^x10./", $data[4]) ) { if ( $data[5] == "dimmer" && $data[2] == 1 ) { #echo "<br>"; echo "<input type="hidden" name="level" id="dim_$data[3]" value="$data[6]" size="2"> "; ?> <scripT> $(document).ready(function() { $('#dim_<? echo $data[1]; ?>').trackbar( { onMove : function() { $('#dim_<? echo $data[3]; ?>').attr("value", this.leftValue); }, dual : false, width : 50, leftLimit : 1, leftValue : <? echo $data[6]; ?>, rightLimit : 20, rightValue : 1 }); }); </script> <? echo "<div id="dim_$data[1]"></div>"; echo "<a href="javascript:void(0)" class="dim" label="$data[3]" action="0">изменить</a>"; } } echo "</td>"; echo "</tr>"; } } echo "</table>"; ?>
Здесь видно, что все управление передается скрипту key.php, который непосредственно и выполняет команды. Вот часть этого скрипта (с сокращениями по части работы с БД), которая отвечает за работу с X10 диммером.
$key_level_old = // Считываем из БД значение свойства key_level; if ( $key_level > $key_level_old ) { $bright_value = $key_level - $key_level_old; exec("heyu bright $key_addr $bright_value"); } elseif ( $key_level < $key_level_old ) { $dim_value = $key_level_old - $key_level; exec("heyu dim $key_addr $dim_value"); } // Обязателно записываем новое состояние в поле key_level
В результате получаем вот такую штуку.
Далеко до совершенства, зато в одном списке может быть неограниченное количество таких блоков, степеней регулировки 20, отправка команд X10 модулю происходит с помощью технологии Ajax без перезагрузки страницы. Вместо или вместе с наименованием можно вывести картинку или план этажа с пометкой включаемой комнаты. Последний столбец - дата последнего включения. Но главное, что это свой интерфейс, а значит делать в нем можно все, что угодно. И совсем не сложно. ;)
Автор: Andrey_B
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.
Добавить комментарий:
Сортировка комментариев: Последние сверху | Первые сверху