Создание дизайна интерфейса умного дома и его интеграция. Управление с мобильных устройств

Это система управления домом по сценариям. Она позволяет навешивать произвольную логику (сценарии) на различные события в доме (срабатывание датчиков, нажатия кнопок, события от внешних сервисов, например, получнеие email или сообщения в twitter). Система имеет модульную архитектуру, весь функционал находится в плагинах. Если нужно добавить новый тип события или новые команды «домашнего API», нужно просто добавить плагин для этого.

В феврале у нас был первый релиз . Первая версия включала фреймворк для домашней автоматизации: систему плагинов и инфраструктуру для них (чтобы плагины могли описывать свой API и события, а также использовать API и подписываться на события друг друга). Сейчас близится релиз второй версии, основная фича которого - новый веб-интерфейс.

UI теперь - модульное одностраничное приложение . Плагины могут описывать свой UI в виде html/js/css файлов, расположенных в ресурсах DLL. Клиентская часть UI основана на backbone.js и marionette.js , модули загружаются через require.js . В целом получилось довольно удобно для авторов плагинов - даже не имея глубоких знаний java script, можно, смотря в примеры, описать полноценный UI, который будет автоматически подключен в интерфейс управления домом.


Интерфейс управления домом состоит из «разделов», каждый плагин может содержать несколько разделов (а может содержать только один или может вообще не иметь интерфейса). Разделы поделены на 2 группы: системные (различные настройки, например, раздел домашних сценариев) и пользовательские (разделы, с которыми пользователи работают в повседневной жизни, например, «прогноз погоды» и «будильники»).

Также есть специальная страничка - «рабочий стол» (он же «стартовая страничка»). Там находятся «элементы стартовой страницы» - небольшие панели, которые отображают полезную информацию, а при клике на них открывается какая-нибудь страница или выполняется какое-либо действие.

стартовая страничка

раздел с будильниками (в нужное время проиграет музыку или запускает выполнение сценария)

раздел с прогнозом погоды (загружается из интернета)

редактор сценариев (на скриншоте сценарий, который фотографирует посетителей, нажавших кнопку дверного звонка)

страничка подписки на события: первый выпадающий список - события в системе (они описаны в плагинах), второй список - сценарии

Интерфейс адаптируется под маленькие экраны мобильных устройств.

стартовая страничка на маленьком экране

страничка с погодой на маленьком экране

Сейчас, как я уже писал, система быстро приближается к релизу 2-й версии, исходный код лежит на github . Пока еще есть возможность что-то поменять. Очень хотелось бы получить конструктивную критику и предложения по улучшению (а если кто-то пришлет pull request, я буду просто счастлив).

Если кто-то захочет попробовать вживую, как все работает, напишите мне личное сообщение - соберу для вас свежий дистрибутив.

PS.
Кстати, я пробовал работать над этим проектом каждый день и это дало удивительные результаты. Сейчас идет 8-ая неделя работы в таком режиме (Longest streak 49 days). За это время проект продвинулся вперед больше, чем за предыдущие пол года. Я очень доволен результатом и планирую продолжать работать в таком режиме, сколько это будет возможно.

В очередной раз бродя по просторам интернета в поисках Веб интерфейса для управления электроприборами по протоколу Х10, я естественно попал на сайт компании Melloware. В поддержку выпускаемого ими оборудования Х10 компания предлагает (бесплатно) программный продукт под названием X10 commander . Это сервер, устанавливаемый на компьютер с ОС Windows к которому подключен USB Х10 контроллер типа СМ15 или ему подобный. На сервере прописываются все имеющиеся в доме Х10 устройства их адреса и типы. X10 Commander позволяет управлять описанными устройствами непосредственно с компьютера, где он установлен или удаленно, через HTTP (GET) запросы типа (это в частности команда включить устройство по адресу А1) Кроме того эта же компания (Уже за небольшие деньги) предлагает программки устанавливаемые на планшет или телефон iOS/Android, которые работают через этот же сервер и позволяют весьма комфортно управлять устройствами Х10.

Моя идея заключалась в следующем. На компьютер который у меня дома выполняет роль домашнего медиа сервера, торент качалки, Скайпера, ит.д. и т.п. Я устанавливаю Веб и ФТП серверы,X10 commander и подключаю контроллер СМ15. Рисуем сайт и публикуем его через веб сервер в локалке, и при желании пробрасываем в глобальную сеть для совсем удаленного управления. (Кстати позже на этот компе я установил и сервер HomeSapiens и в результате получил еще и голосовое управление.

Для того что бы реализовать эту идею пришлось немного почитать погуглить и поработать головой и ручками. Не буду в рамках этой статьи описывать как устанавливается веб сервер и как он работает (Гугл и умные книжки Вам в помощь). Поделюсь тем что нагуглил непосредственно для цели управления Х10 через контроллер СМ15 и применение X10 Commander.
Подробно про синтаксис X10commander можно . Загрузить пакет ActiveHomePro SDK с сайта производителя x10 будет тоже не лишним там подробно описан протокол обмена с СМ15, хотя основные выжимки вот (переведенный гуглом кусочек описания):

Давайте разберем синтаксис.... http://localhost:8086 = сервер и порт, где командиром X10 работает? x10command = = параметр сигнализации, какую команду вы хотите выполнить DEVICE ~ ~ sendplc "А1 OFF" , разделенных тильдой в первым всегда устройство, а затем sendplc / sendrf в зависимости от того, хотите линии электропередачи или радио Frequence (RS работает еще команда queryplc - запрос состояния) , а затем "A1 OFF" в кавычки, устройства и код дома, а также команда. несколько примеров....

// Включить A1 ON
http://localhost:8086/?x10command=DEVICE~sendplc~"A1 ON"
// Увеличить яркость A1 на 50%
http://localhost:8086/?x10command=DEVICE~sendplc~"A1 BRIGHT 50"
// Диммировать A1 на 30%

http://localhost:8086/?x10command=DEVICE~sendplc~"A1 DIM 30"

На форуме Melloware Forums в разделе Web Interface To X10 Commander я нашел весьма любопытный пример на Javascript который позволяет создать на странице удобное поле кнопок, нажимая на которые можно управлять своими приборами по протоколу Х10 через сервер Х10commander. Вот , что бы долго не искать. Желающие повторить адаптируйте его под параметры своего дома прописав соответствующие названия адреса и команды, указав адрес сервера логин и пароль которые установлены на X10 Commander. Далее вставляйте этот скрипт в свою HTML страничку..... и собственно все! Будет вам счастье:-)

Я тоже решил попробовать создать свою страничку с использованием этого скрипта. Поскольку я не программист и с HTML знаком на уровне чайника, я взялся создать страничку с помощью какого нибудь конструктора сайтов. Попался под руку программа для быстрого создания сайтов WebSite X5, выбрал шаблон внешнего вида сайта настроил меню вставил картинку и адаптированный под мои настройки скрипт. и получилось как то вот так:

Потом мне захотелось организовать интерактивное управление что бы на сайте было видно чем я управляю и какое состояние светильников в комнате сейчас. Покопавшись в синтаксисе обмена с сервером X10 Commander и языка HTML я в той же программе на создавал нужные мне странички с соответствующим внешним видом и вставил в них немного кода ручками для формирования запросов к серверу X10 Commander. (Истинно сказано - Благословенны трудности! Ими растем!)

Вот что получилось в результате:




По щелчку по картинке изменяется состояние светильников в комнате и соответственно на картинке.

Таким образом цель была достигнута буквально за 3-4 вечера плотного сидения за компом.

Хотя стоит отметить, что не смотря на то, что интерфейс управления на веб странице весьма простой и интуитивно понятный, пользуюсь им я один. Домочадцы предпочитают, по привычке, щелкать выключателями. Похоже что бы этот сервис был востребован на месте выключателей должен висеть какой нить планшет с загруженной страничкой управления конкре тно этой комнаты. Но и бесполезным этот сервис не назовешь! Я сидя за своим компом, что называется, не отрывая точки опоры с удобного кресла, включаю/выключаю себе верхний свет, когда нужно. И конечно могу управлять своими электроприборами через интернет, когда в этом возникнет необходимость. (если возникнет конечно:-))

Система B-Tune® работает под управлением контроллера BT-4000/6000, который представляет собой мини WEB сервер, контролируемый через браузер мобильного телефона, компьютера, планшета типа iPad или нетбука. BT-4000/6000 в разных модификациях может работать сетях: Ethernet, GSM, ADSL и WiMax (через USB модемы), что позволяет оптимизировать расходы на связь.

К BT-4000/6000 можно подключить счетчики энергии, проводные и беспроводные датчики, кондиционеры, бытовые приборы..., контролировать их и управлять ими.

Контроллер работает под управлением ОС Linux, что позволяет использовать огромное количество программ и протоколов. В частности, возможна организация связи без необходимости выделения для каждого абонента фиксированного IP адреса. Также есть возможность применения данного решения для: домового учета ресурсов (АСКУЭ), учета рабочего времени сотрудников, наблюдения за погодой, и т.п.

Решения на базе BT-4000/6000 являются полнофункциональными системами «Умный дом», позволяющими контролировать и управлять всеми параметрами домовладения с использованием удобного и понятного графического интерфейса. Управление может производиться как изнутри дома (обычно через внутреннюю WiFi сеть), так и извне - через Интернет, с использованием сервера оператора связи. При этом цена базового абонентского комплекта Системы не превысит стоимость бюджетной GSM сигнализации.

Локальное управление домом (изнутри дома)

На рис. 1 показан план типовой квартиры, в которой установлена система B‑Tune®. Для обеспечения функций охраны: на части дверей установлены датчики открытия, а также инфракрасные датчики, контролирующие движение в коридоре и гостиной. Для защиты от протечек в ванной и туалете установлены датчики протечки воды. На кухне установлен датчик задымления. Для дистанционного контроля за квартирой в коридоре и детской устанавливаются видео-камеры, «картинка» с которых может передаваться на компьютер или КПК владельца квартиры, подключенного к Интернет любым способом. Для контроля температуры внутри и снаружи помещений используются датчики температуры.

В электрощите устанавливается тревожная сирена, блок управляемых реле для дистанционного включения и выключения нагрузок и счетчик электроэнергии. Эти устройства подключаются к контроллеру Системы. Владелец квартиры может постоянно контролировать суммарное и текущее потребление энергии. Например, владелец квартиры может легко проверить не оставил ли он включенным утюг на гладильной доске: это так, если потребление (данные с электро-счетчика) составляет 1-2кВт. Однако, если соответствующая группа розеток заведена на управляемое реле, то оставленный утюг можно обесточить, выключив реле. В зоне входной двери, вне прямой видимости, также устанавливается контрольная панель iButton® для постановки и снятия квартиры на охрану.

Система, установленная в типовой квартире

Находясь внутри дома, абонент со своего компьютера, КПК, ноутбука или планшета, с использованием WEB браузера, сможет:

  • Управлять светом
  • Управлять открыванием штор и жалюзи
  • Контролировать состояние датчиков (температуры, влажности, дыма, переменного напряжения, движения и т.п.)
  • Управлять кондиционерами, ТВ и аудио техникой
  • Просматривать «картинки» с видео-камер
  • Пользоваться услугами телемедицины удаленного медицинского центра (при наличии дополнительного оборудования)

Перед использованием абонент локально (из квартиры) должен настроить Систему через Ethernet сеть с использованием WEB браузера. Работа через графический и простой интерфейс напоминает игру с современными «гаджетами», а для настройки не надо вчитываться в описание и отправлять «SMS шифровки». Для настройки потребуется подключить компьютер к контроллеру напрямую, либо через Ethernet концентратор. При наличии внешнего Wi-Fi маршрутизатора возможна настройка контроллера с мобильного телефона, PDA, планшетного компьютера или ноутбука. (Для корректной работы на управляющем устройстве должен быть установлен современный браузер, поддерживающий технологию WEB 2.0).

Настройка состоит из следующих шагов, которые абонент сможет выполнить самостоятельно:

  • Нарисовать и загрузить план дома (опционально)
  • Подключить датчики (тип некоторых датчиков определяться контроллером автоматически)
  • Расставить датчики на плане
  • Задать параметры, по которым контроллер должен рассылать тревожные сообщения (SMS, Call …) или выполнять определенные действия (включить свет, закрыть шторы …)

Удаленное управление из любой точки Internet через «Личный кабинет» оператора

Для удаленного доступа к контроллеру используется выделенный Internet сервер (далее Сервер) на стороне оператора связи, имеющий символьное имя и статический IP адрес.

Контроллер, подключившись к Internet любым способом, автоматически открывает защищенное VPN соединение с Сервером. Сервер периодически проверяет доступность контроллера и информировать абонента в случае пропадания связи с ним (E-Mail, SMS, Call).

Для связи с контроллером абонент, подключенный к Internet, должен будет соединиться с Сервером и ввести свои данные для входа в «личный кабинет» оператора связи. Сервер аутентифицирует Абонента и проверяет открыт ли канал связи с его Контроллером. Если канал связи открыт, то Сервер производит пересылку данных между абонентом и Контроллером. Через интерфейс «личного кабинета» абоненту доступны:

  • WEB интерфейс управления «Умным домом», аналогичный локальному интерфейсу
  • Журнал событий
  • Графики изменения значений температуры, влажности и т.п.
  • Программирование событий, при которых сервер должен отправлять SMS/Mail/Skype/ICQ сообщения
  • Фотографии или видео, сделанные контроллером и переданные на сервер

В случае возникновения экстренных ситуаций Контроллер будет посылать SMS абоненту. Для управления наиболее важными функциями может потребоваться реализация обработки команд, приходящих в SMS сообщениях.

Мониторинг и групповое управление с использованием «группового кабинета» оператора

Стоит отдельно отметить, что Сервер можно использовать для организации систем мониторинга за коттеджными поселками и многоквартирными домами. В этом случае для диспетчера/оператора группы потребуется «групповой кабинет», через который доступны:

  • База данных с показаниями значений счетчиков энергоресурсов.
  • База данных определенных событий на стороне абонента (например, вскрытие счетчика или открывание двери в режиме охраны)
  • Графическая карта - с привязкой контроллеров к географическому расположению объектов (рабочее место диспетчера).
  • Групповая смена ПО на устройствах
  • Дополнительные функции. Например, функция live-контроля потребления электроэнергии: каждые 15 минут сумма показаний со всех квартирных счетчиков сравнивается с показанием домового (суммарного) счетчика. При детектировании расхождения, большего заданного порога выдается сигнал на обследование участка на предмет несанкционированного отбора электричества.

Также на Сервере предусмотрена функция интеграции (API интерфейс) со службами третьих компаний. Например, провайдеров телемедицины, охранными агентствами и т.п.

Мы смогли научить нашу систему «умный дом» распознавать сказанное нами и синтезировать голосовые ответы при помощи Google.
Сегодня я хочу рассказать, как организовать доступ к нашей системе через веб-интерфейс.

Технологии

Как вы помните, ПО для управления нашим «умным домом» мы пишем на языке perl . Современная информационная система практически немыслима без БД. Мы тоже не останемся в стороне и для хранения наших данных будем использовать СУБД MySQL . Для реализации веб-сервера я решил воспользоваться не сторонним софтом, а модулем для perl - HTTP::Server::Simple , в частности - HTTP::Server::Simple::CGI . Для чего я это сделал? В большой части, ради интереса;) Но в теории, можно получить доступ к низкоуровневой обработке HTTP-запросов/ответов без нагромождения комплекса Apache/mod_perl. В целом, ничего не мешает перевести проект на рельсы Apache, если у вас будет желание и достаточно времени.

База данных

Первым делом установим СУБД MySQL и создадим базу с таблицами из db.sql. Вот листинг:

CREATE DATABASE ion; USE ion; # # Table structure for table "calendar" # DROP TABLE IF EXISTS calendar; CREATE TABLE `calendar` (`id` int(15) NOT NULL AUTO_INCREMENT, `date` datetime NOT NULL, `message` text, `nexttimeplay` datetime NOT NULL, `expired` datetime NOT NULL, `type` int(1) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1; # # Table structure for table "commandslog" # DROP TABLE IF EXISTS commandslog; CREATE TABLE `commandslog` (`id` int(15) NOT NULL AUTO_INCREMENT, `date` datetime NOT NULL, `cmd` varchar(255) NOT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; # # Table structure for table "log" # DROP TABLE IF EXISTS log; CREATE TABLE `log` (`id` int(15) NOT NULL AUTO_INCREMENT, `date` datetime NOT NULL, `message` varchar(255) NOT NULL, `level` int(1) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

Выполним необходимые действия:

Nix@nix-boss:~$ sudo apt-get install mysql-server
nix@nix-boss:~$ mysql -uroot -ppassword < db.sql

Модифицируем код

Теперь нам необходимо создать папки lib , html и config (рядом с папкой data ). В папку lib мы положим модуль, отвечающий за реализацию веб-сервера и обработку наших HTTP-запросов.

Нам нужно немного подправить скрипт srv.pl . Добавим к блоку инциализации:

Our %cfg = readCfg("common.cfg"); our $dbh = dbConnect($cfg{"dbName"}, $cfg{"dbUser"}, $cfg{"dbPass"});
Добавим строки, отвечающие за запуск HTTP-сервера ниже блока инициализации:

## Запуск HTTP-сервера ################################ my $pid = lib::HTTP->new($cfg{"httpPort"})->background(); print "HTTP PID: $pid\n"; logSystem("Сервис HTTP - PID: $pid, порт: $cfg{"httpPort"}, хост: $cfg{"httpHost"}", 0); ################################
А теперь добавим недостающие функции в конец файла:

Sub readCfg { my $file = shift; my %cfg; open(CFG, "; foreach my $line (@cfg) { next if $line =~ /^\#/; if ($line =~ /(.*?) \= \"(.*?)\"\;/) { chomp $2; $cfg{$1} = $2; } } close(CFG); return %cfg; } ######################################## sub dbConnect { my ($db, $user, $pass) = @_; return $dbh = DBI->connect("DBI:mysql:$db", $user, $pass) || die "Could not connect to database: $DBI::errstr"; } ######################################## sub logSystem { my ($text, $level) = @_; my %cfg = readCfg("common.cfg"); dbConnect($cfg{"dbName"}, $cfg{"dbUser"}, $cfg{"dbPass"}); $dbh->do("INSERT INTO log (date, message, level) VALUES (NOW(), "$text", $level)"); }

Как можно понять по названиям функций, dbConnect() - отвечает за соединение с нашей СУБД, logSystem() - за логгирование, readCfg() - за загрузку конфигурации. Остановимся на ней подробнее. Конфигурация представляет собой простой текстовый файл в директории config. В нашем случае, он называется common.cfg . Выглядит примерно так:

## Настройки daemonMode = "undef"; logSystem = "1"; logUser = "1"; dbName = "ion"; dbUser = "root"; dbPass = "password"; camNumber = "4"; camMotionDetect = "1"; httpPort = "16100"; httpHost = "localhost"; telnetPort = "16000"; telnetHost = "localhost"; micThreads = "5";

Некоторые строки в нем будут использованы позже. Нас же пока интересуют только строки, начинающиеся с префикса db . Как мы видим - это настройки для соединения с нашей БД.

Теперь расскажу о том, как побороть многократное выполнение команды. Подредактируем функцию checkcmd() :

Sub checkcmd { my $text = shift; chomp $text; $text =~ s/ $//g; print "+OK - Got command \"$text\" (Length: ".length($text).")\n"; if($text =~ /система/) { ################################################# my $sth = $dbh->prepare("SELECT cmd FROM commandslog WHERE DATE_SUB(NOW(),INTERVAL 4 SECOND) <= date LIMIT 0, 1"); $sth->execute(); my $result = $sth->fetchrow_hashref(); if($result->{cmd} ne "") { return; } $dbh->do("INSERT INTO commandslog (date, cmd) VALUES (NOW(), "$text")"); ################################################# if($text =~ /провер/) { my $up = `uptime`; $up =~ /up (.*?),/; sayText("Время работы сервера - $1. Номер главного процесса - $parent."); } if($text =~ /врем/) { my $up = `uptime`; $up =~ /(.*?) up/; sayText("Сейчас $1"); } if($text =~ /законч/ || $text =~ /заверш/) { sayText("Завершаю работу. Всего доброго!"); system("killall motion"); system("rm ./data/*.flac && rm ./data/*.wav"); system("killall perl"); exit(0); } if($text =~ /погод/) { my ($addit, $mod); my %wh = lib::HTTP::checkWeather(); $wh{"condition"} = Encode::decode_utf8($wh{"condition"}, $Encode::FB_DEFAULT); $wh{"hum"} = Encode::decode_utf8($wh{"hum"}, $Encode::FB_DEFAULT); $wh{"wind"} = Encode::decode_utf8($wh{"wind"}, $Encode::FB_DEFAULT); if($wh{"temp"} < 0) { $mod = "ниже нуля"; } if($wh{"temp"} > 0) { $mod = "выше нуля"; } $wh{"wind"} =~ s/: В,/восточный/; $wh{"wind"} =~ s/: З,/западный/; $wh{"wind"} =~ s/: Ю,/южный/; $wh{"wind"} =~ s/: С,/северный/; $wh{"wind"} =~ s/: СВ,/северо-восточный/; $wh{"wind"} =~ s/: СЗ,/северо-западный/; $wh{"wind"} =~ s/: ЮВ,/юго-восточный/; $wh{"wind"} =~ s/: ЮЗ,/юго-западный/; sayText("Сейчас $wh{"condition"}, $wh{"temp"} градусов $mod. $wh{"hum"}. $wh{"wind"}"); if ($wh{"temp"} <= 18) { $addit = sayText("Одевайтесь теплее, на улице холодно!"); } if ($wh{"temp"} >= 28) { $addit = sayText("Переносной кондиционер не помешает!"); } } } #sayText("Ваша команда - $text"); return; }
Мы выбираем последнюю выполненную команду в интервале четырех секунд и если она совпадает с текущей - выходим из функции. Как вы можете заметить, я добавил некоторые команды, по сравнению с описанной функцией в прошлой статье. Наиболее интересная - это погода. Реализация получения данных для нее - чуть ниже.

Модуль HTTP.pm

Вернемся к реализации встроенного HTTP-сервера. Создадим файл HTTP.pm в директории lib . Запишем туда следующий код:

Package lib::HTTP; use HTTP::Server::Simple::CGI; use LWP::UserAgent; use URI::Escape; use base qw(HTTP::Server::Simple::CGI); use Template; ######################################### ######################################### our %dispatch = ("/" => \&goIndex, "/index" => \&goIndex, "/camers" => \&goCamers,); our $tt = Template->new(); ######################################### ######################################### sub handle_request { my $self = shift; my $cgi = shift; my $path = $cgi->path_info(); my $handler = $dispatch{$path}; if ($path =~ qr{^/(.*\.(?:png|gif|jpg|css|xml|swf))}) { my $url = $1; print "HTTP/1.0 200 OK\n"; print "Content-Type: text/css\r\n\n" if $url =~ /css/; print "Content-Type: image/jpeg\r\n\n" if $url =~ /jpg/; print "Content-Type: image/png\r\n\n" if $url =~ /png/; print "Content-Type: image/gif\r\n\n" if $url =~ /gif/; print "Content-Type: text/xml\r\n\n" if $url =~ /xml/; print "Content-Type: application/x-shockwave-flash\r\n\n" if $url =~ /swf/; open(DTA, "<$url") || die "ERROR: $! - $url"; binmode DTA if $url =~ /jpg|gif|png|swf/; my @dtast = ; foreach my $line (@dtast) { print $line; } close(DTA); return; } if (ref($handler) eq "CODE") { print "HTTP/1.0 200 OK\r\n"; $handler->($cgi); } else { print "HTTP/1.0 404 Not found\r\n"; print $cgi->header, $cgi->start_html("Not found"), $cgi->h1("Not found"), $cgi->h2($cgi->path_info()); $cgi->end_html; } } ## Обработка запроса / ######################################## sub goIndex { my $cgi = shift; # CGI.pm object return if !ref $cgi; my %w = checkWeather(); my $cmd; my $dbh = iON::dbConnect($iON::cfg{"dbName"}, $iON::cfg{"dbUser"}, $iON::cfg{"dbPass"}); my $sth = $dbh->prepare("SELECT cmd FROM commandslog WHERE id > 0 ORDER BY id DESC LIMIT 0, 1"); $sth->execute(); my $result = $sth->fetchrow_hashref(); if($result->{cmd} ne "") { $cmd = $result->{cmd}; } else { $cmd = "Нет комманд..."; } print "Content-Type: text/html; charset=UTF-8\n\n"; my $uptime = `uptime`; $uptime =~ /up (.*?),/; $uptime = $1; my $videosys = `ps aux | grep motion`; if ($videosys =~ /motion -c/) { $videosys = "работает"; } else { $videosys = "не работает"; } my $micsys = `ps aux | grep mic`; if ($micsys =~ /perl mic\.pl/) { $micsys = "работает"; } else { $micsys = "не работает"; } my $vars = { whIcon => $w{"icon"}, whCond => $w{"condition"}, whTemp => $w{"temp"}, whHum => $w{"hum"}, whWind => $w{"wind"}, cmd => $cmd, uptime => $uptime, video => $videosys, mic => $micsys, threads => $iON::cfg{"micThreads"}, }; my $output; $tt->process("html/index", $vars, $output) || print $tt->error(), "\n"; } ## Обработка запроса /camers ######################################## sub goCamers { my $cgi = shift; # CGI.pm object return if !ref $cgi; my %w = checkWeather(); my $cmd; my $dbh = iON::dbConnect($iON::cfg{"dbName"}, $iON::cfg{"dbUser"}, $iON::cfg{"dbPass"}); my $sth = $dbh->prepare("SELECT cmd FROM commandslog WHERE id > 0 ORDER BY id DESC LIMIT 0, 1"); $sth->execute(); my $result = $sth->fetchrow_hashref(); if($result->{cmd} ne "") { $cmd = $result->{cmd}; } else { $cmd = "Нет комманд..."; } if($cgi->param("text") ne "") { my $txt = $cgi->param("text"); require Encode; $txt = Encode::decode_utf8($txt, $Encode::FB_DEFAULT); iON::sayText($txt); } print "Content-Type: text/html; charset=UTF-8\n\n"; my $vars = { camera1 => "video-0/camera.jpg", camera2 => "video-1/camera.jpg", camera3 => "video-2/camera.jpg", camera4 => "video-3/camera.jpg", whIcon => $w{"icon"}, whCond => $w{"condition"}, whTemp => $w{"temp"}, whHum => $w{"hum"}, whWind => $w{"wind"}, cmd => $cmd, }; my $output; $tt->process("html/camers", $vars, $output) || print $tt->error(), "\n"; } ## Погода ######################################## sub checkWeather { my %wh; my $ua = LWP::UserAgent->new(agent => "Mozilla/5.0 (Windows NT 5.1; ru-RU) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.872.0 Safari/535.2"); my $content = $ua->get("http://www.google.com/ig/api?hl=ru&weather=".uri_escape("Санкт-Петербург")); $content->content =~ /(.*?)<\/current_conditions>/g; my $cond = $1; $cond =~ /

Разберем содержимое подробнее. В хэше %dispatch мы определяем соответствие URL-адреса и вызываемой функции. Все прочие URL, не описанные в этом хэше, будут выдавать страницу 404 .
Шаблонизатором у нас будет выступать мощная и гибкая библиотека Template Toolkit . Её мы инициализируем строкой:

Our $tt = Template->new();
Перегружая функцию handle_request() родительского класса, мы получаем управление обработкой запросов к HTTP-серверу. Для отдачи браузеру статического контента (png, gif, jpg, css, xml, swf) используется блок:

If ($path =~ qr{^/(.*\.(?:png|gif|jpg|css|xml|swf))}) { my $url = $1; print "HTTP/1.0 200 OK\n"; print "Content-Type: text/css\r\n\n" if $url =~ /css/; print "Content-Type: image/jpeg\r\n\n" if $url =~ /jpg/; print "Content-Type: image/png\r\n\n" if $url =~ /png/; print "Content-Type: image/gif\r\n\n" if $url =~ /gif/; print "Content-Type: text/xml\r\n\n" if $url =~ /xml/; print "Content-Type: application/x-shockwave-flash\r\n\n" if $url =~ /swf/; open(DTA, "<$url") || die "ERROR: $! - $url"; binmode DTA if $url =~ /jpg|gif|png|swf/; my @dtast = ; foreach my $line (@dtast) { print $line; } close(DTA); return; }
Так как MIME-типов у меня получилось немного, я записал их чуть по-индусски;)
Дальше начинаются функции, отвечающие за генерацию контента определенного URL. Пока их всего две - индекс и страница с камерами.
На индексе мы сможем увидеть, работают ли такие подсистемы, как видео- и аудио-захват. Отдельной строкой идет:

My %w = checkWeather();
Эта функция возвращает хэш с текущими данными о погоде в городе, которые будут отображаться на нашей странице. Такая мелкая приятная плюшка;)
Там же рядом мы будем выводить последнюю полученную и распознанную команду для «умного дома».

Следующая функция goCamers() выполняет те же функции, что и индекс, только вместо вывода информации по состоянию подсистем, показывает изображение с наших камер и имеется возможность написать какой-либо текст, который будет синтезирован и озвучен нашим «умным домом».

Все странички строятся на основе шаблонов, лежащих в папке html . Выкладывать листинг здесь будет не удобно, поэтому дам ссылку на архив -

На Хабре много статей про проекты умных домов, но почти все они были на самодельном оборудовании и китайских примочках. В своей статье я хотел рассказать о другом подходе, который показывает, насколько легче выполнять проекты, используя готовые решения мировых производителей (и выглядит солидней ), а так же демонстрирует возможность использования оборудования не только в промышленных объектах, но в частной сфере. Получился симбиоз технологий и направлений автоматики. С одной стороны, используя ПЛК, который в основном разработан для нужд промышленности, позволяющий выполнять задачи любой сложности без ограничений жестких алгоритмов готовых устройств умных домов (например, по технологии KNX) с увязкой веб-технологией html/javascript дает неограниченный полет фантазий для расширения проектов.

Текущие затраты - 170 тысяч рублей (по старому курсу евро).

Начнем.

Что я задумал

Управляем освещением и электроснабжением
- В основном управление будет производиться сигналом включить/выключить, диммирование не хочу и не надо;
- Хочу управление с разных мест, например, зашел в спальню - включил люстру, лег на кровать - нажал выключить люстру. Если забыл выключить свет в зале (или в туалете …) нажал кнопку «выключить свет везде». Удобно;
- При выходе из квартиры нажимаю одну кнопку – выключается во всей квартире свет и т.д.;
- Считывать показание с электросчетчика;
- Бесперебойное питание систем управления и безопасности квартиры;
- Без исключений, все группы освещения должны управляться с ПЛК. В случае пожара розеточные группы должны отключаться с ПЛК в автомате - отключать электроснабжения в квартире в экстренных случаях;
- Каждая группа освещения должна приходить в щит и проходить через ближайший выключатель для возможности переделки управления освещения в обычную схему (если продам квартиру, буду все забирать);
- В коридоре предусмотреть датчик движения человека для управления освещением + завязывается в охранную сигнализацию;
- Теплый пол на балконе, в туалете, ванной, в прихожей - с возможностью управления в зависимости от уличной температуры, по времени.

Управляем отоплением и вентиляцией
- Управление отоплением - на каждую батарею устанавливается клапан с приводом (для регулирования температуры покомнатно, для измерения температуры комнаты, необходимо предусмотреть датчики температуры);
- Предусмотреть управление кондиционерами по ИК каналу (текущие решение задачи пока не найдено, выводим витую пару на внутренний блок кондея дальше придумаю);
- Температурные датчики уличной температуры (солнечная и не солнечная сторона);
- В зимний период достаточно часто встречаются две проблемы – это холодно и нечем дышать. Решение установить приточную систему. Далее обеспечить управление приточной системой (температура в канале, уличный датчик температуры, три ступени нагрева, вентилятор);
- Управление вытяжными вентиляторами (сан узел, ванная).

Охрана сигнализация
Сигнализация состояния входной двери (архивация состояния двери – время открытие/ закрытие);
Постановка на охрану через Web интерфейс или через выключатель управления светом.

Видеонаблюдение
Запись с камеры входной двери, уличная место парковки;
Архивация записей на удаленном сервере.

Оборудование

Так как я привык уже к ПЛК от фирмы ABB, то в качестве мозгов для системы управления квартирой был выбран ПЛК модели AC500-eco (ЦПУ PM554-ETH с поддержкой Ethernet);
- Дальше я уже начал считать деньги и … нужно было выбрать среду отображения информации, с возможностью веб-отображения информации о доме. Существует много вариантов, но в основном все базируется на не кроссплатформенных решениях, что не подходит для меня. Все, что со словами SCADA и WEB, были с запредельным ценником. Пришлось немного попуглить, в результате решено использовать не SCADA систему, а framework с большим функционалом для HTML5. Пришел к CSWorks. Этот фримворк дает возможность бесплатно использовать с ограничением 999 переменных, 1 клиент. Что меня полностью устраивало.
- в качестве выключателей и розеток (орган управления светом) была выбрана фирма JUNG, Serie A . Из плюсов - они могут нести до 4-х кнопок на один кнопочный пост (выключатель без фиксации), так же в них присутствует светодиоды индикации с напряжением 24В (данное напряжение является стандартным промышленное напряжением питания систем автоматики). Данные функции не видел ни у одного из производителей электроустановок (не считая Китая);

Начало работ

1. Способ проводки освещения. Каждая группа приходит напрямую в шкаф электроснабжения. В шкафу стоят контакторы и реле для управления. Катушки реле и контакторов управляются от сигналов ПЛК (DC24V). Для резервирования управления использую контакторы с ручным управлением. Питающий провод сделал проходящий через стаканчик выключателя, чтобы была возможность переделки проводку на обычную схему.

Сам контактор с ручным управлением:

Собран и смонтирован шкаф:

Как я писал выше, выключатели выбрал без фиксаций с led индикаторами. Максимально 4 кнопки, возможно расключение этих кнопок на 8 групп (см. документацию на выключатель выключатель JUNG 4248TSM .



В следующий частях реализация проекта будет рассмотрен более подробно.

Забегаю вперед, открываю вам скриншоты веб-интерфейса:



Запись опубликована автором в рубрике Без рубрики. Добавьте в закладки .