Контакты

Управление с мобильных устройств

Мы смогли научить нашу систему «умный дом» распознавать сказанное нами и синтезировать голосовые ответы при помощи 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 . Выкладывать листинг здесь будет не удобно, поэтому дам ссылку на архив -

Инсталляция систем «Умный дом», мультирум и домашнего кинотеатра Kymera Magic Wand

В 2011 году была нашими специалистами была закончена работа над интерфейсом управления для сенсорных панелей и пульта управления AMX, являющихся основными элементами управления системы «Умный дом».

В данном примере интерфейс управления реализован для двух типов устройств:

  1. Сенсорной панели AMX MVP-5200i с разрешением 800 на 480 пикселей.
  2. Пульта AMX MIO-R4 с разрешением экрана 240 на 320 пикселей.

При этом обе реализации интерфейсов имеют абсолютно одинаковую функциональность.

Сенсорная панель управления AMX MVP-5200i и пульт AMX MIO-R4 имеют различное разрешение, сохраняя при этом одинаковую функциональность

Пользовательский интерфейс управления был разработан для сенсорных панелей AMX 4-го поколения и пульта управления AMX с учетом всех графических и функциональных возможностей этих устройств.

Часть 1. Конкретный подход

На фото 1 мы видим главное меню, в котором пользователю предоставлена возможность выбора инженерной системы, которой он может управлять.

Фото 1




А так выглядит этот интерфейс на пульте AMX MIO-R4, который имеет разрешение 240х320 пикселей

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

Фото 2


На странице общего плана мы уже имеем дело не с одной комнатой, а со всем домом. Отсюда мы можем перейти в любую комнату или управлять всем домом сразу («глобальное управление», как мы это называем). Слева расположены закладки выбора инженерной системы, состояние которой будет отражено на общем плане.

Если выбранная система активна в комнате - кнопка комнаты имеет оранжевый цвет, если нет - синий.

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

Перейдем к страницам интерфейса, посвященных управлению конкретными инженерными системами.

На фото 3 представлен интерфейс управления светом в комнате.

Фото 3



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

На фото 4 мы управляем климатом в комнате.

Фото 4




Интерфейс управления климатом также доступен и с пульта AMX

Исполнительным устройством в данном случае выступает климатическая система Daikin. Интерфейс управления климатом максимально прост и нагляден. Одним нажатием на соответствующую кнопку меняется режим «охлаждение-обогрев-вентиляция», задается скорость работы вентилятора и желаемая температура.

На фото 5 представлен интерфейс управления медиа устройствами комнаты.

Фото 5




На данной странице интерфейса можно выбрать для воспроизведения источник аудио или видео. Активный источник выделяется зеленой рамкой. При выборе источника мы попадаем на страницу управления этим источником (в данной статье эти страницы не представлены). Кнопка «Настройки» приводит нас в меню управления настройками телевизора.

Здесь также можно управлять уровнем громкости аудио или видео источника и открывать окно эквалайзера (см. фото 6).

Фото 6




Часть 2. Принципиальный подход

Здесь мы обозначим основные принципы, которые были использованы при разработке показанных выше интерфейсов.

1) Наглядность - использование графических изображений объектов, отражающих их функциональность. Данный принцип упрощает работу с интерфейсом, делая его интуитивно более понятным (см. фото 1). На данном примере каждая система имеет свою иконку, а активность системы отражается выделяющей рамкой зеленого цвета.

2) Структурированность - четкое соблюдение структуры при построении сложных много уровневых интерфейсов. В данном примере существует 4 уровня управления: весь дом, комната, система, подсистема (см. фото 2). В доме 11 комнат и 3 системы, доступных для управления (свет, климат, медиа).

Разработанный интерфейс позволяет осуществлять управление системами на всех уровнях, а также быстро и легко менять систему и комнату, как объект управления. Правильно построенная структура существенно упрощает навигацию по страницам интерфейса.

3) Мультимасштабность - совмещение в одном интерфейсе функций локального и глобального управления. То есть с помощью одной панели пользователь может управлять, как отдельной системой в отдельно взятой комнате, так и всеми системами во всем доме сразу. Так на фото 3 представлен интерфейс управления светом в одной комнате, а на фото 2 мы уже управляем светом во всем доме.

4) Полисемия - наличие нескольких вариантов управления одним и тем же объектом. Например в данном интерфейсе управление громкостью в комнате (см. фото 4) возможно как с сенсорного экрана, так и с внешних элементов управления (вращаемое колесико для панели MVP-5200i или внешняя кнопка «Vol» для пультов MIO-R4).

5) Универсальность - возможность реализации интерфейса управления на различных панелях с различным разрешением экрана.

Так в данном примере интерфейс управления реализован для двух типов устройств: сенсорной панели AMX MVP-5200i (разрешение 800х480) и пульта AMX MIO-R4 (разрешение 240х320). При этом обе реализации интерфейса имеют абсолютно одинаковую функциональность (см. самое первое фото).

Об эстетике

При разработке интерфейса нами также были применены различные графические приемы, улучшающие его восприятие и внешний вид. Для этого были использованы полупрозрачные поля и заголовки, стильные фоновые рисунки, меняющие цветовые гаммы в зависимости от выбранной системы, всплывающие окна, объемные иконки с тенями, объемные кнопки с цветовой индикацией состояния, активности и т. д.

Короче говоря, мы постарались, чтобы интерфейс управления использовал технические возможности устройств управления AMX, соответствовал их стилю и дизайну, для которых он был разработан, а также был удобен для пользователя.

Сервер умного дома – это «мозг» системы управления. Он реализует и поддерживает работу всей сети. Генерирует и посылает необходимые сигналы на контроллеры, которые отвечают за управление датчиками, сигнализацией, климат-контролем, прочими функциями и режимами, заложенными в программное обеспечение.

Виды сервера

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

Основные требования к серверу:

  • Стабильная работа.
  • Обязательное резервирования данных.
  • Контроль версий ПО.
  • Возможность обновления и доработки функционала.
  • Быстрая наладка в случае сбоя.

Стационарный сервер, который поставляется в комплекте для умного дома, стабилен и имеет широкий функционал, но также имеет некоторые недостатки. Это и стоимость, и необходимость установки дублирующего устройства, на случай выхода из строя основного прибора. Главным недостатком можно считать невозможность управления системой на расстоянии.

Сервер и web-сервер умного дома среднего объекта

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

Платформа Raspberry Pi 2 для построения веб-сервера умного дома

Web сервер для умного дома — это микро, планшетный компьютер или смартфон. Платформой для него может быть любое устройство с большим объёмом оперативной памяти (Raspberry Pi 2 или Raspberry Pi 3, AC500-eco, Arduino), мощным процессором и возможностью выхода в сеть Интернет. Web сервер в составе системы умный дом обеспечивает визуализацию управления через браузер.

Веб сервер для умного дома работает по простому принципу. Мобильное устройство выступает в качестве основного ядра, дистанционно отправляющего командные сигналы. Программное обеспечение, которое можно купить или прописать самостоятельно, превращает Android, Linux или Windows устройства в диспетчерскую станцию, взаимодействующую с контроллерами по wifi. Преимущества блока web умный дом в том, что можно не только управлять системами в доме, но и производить любые операции извне. Также возможна настройка на расстоянии и хранение данных на облаке.

Интерфейс управления умным домом

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

Интерфейс умного дома создается для каждого пользователя индивидуально

В современной системе умный дом web интерфейс делают модульной архитектуры, построен на PHP, CSS и JavaScript. ПО прописано в плагинах UI как html или css, расположенных в ресурсах DLL. Их можно добавлять или менять по своему усмотрению. Примерная структура интерфейса выглядит так:

  • Стартовая страница на рабочем столе. На ней в виде значков отображаются все элементы управления.
  • Плагины содержат разделы, подразделяющиеся на системные (для работы с настройками) и пользовательские (для непосредственного управления функциями).

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

Как сделать сервер для умного дома

Самостоятельно сделать сервер достаточно просто. В корпус неиспользуемого компьютера (желательно брать модель от 2006 года выпуска) монтируется в порядке очередности:

  • блок электропитания;
  • кулер с пониженным производством шума;
  • материнская плата с современным процессором;
  • оперативная память, соответствующая требованиям процессора;
  • несколько жестких дисков (желательно NAS-систему) и контроллер sata;
  • сетевая карта с поддержкой host режима;
  • модуль wifi.

Комплектация может видоизменяться в зависимости от требований. Далее следует настройка сервера с использованием полнофункциональных сервисов (подойдет система Linux) и установка программного обеспечения.

Самостоятельная сборка сервера для умного дома под названием AVRobot

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

На Хабре много статей про проекты умных домов, но почти все они были на самодельном оборудовании и китайских примочках. В своей статье я хотел рассказать о другом подходе, который показывает, насколько легче выполнять проекты, используя готовые решения мировых производителей (и выглядит солидней ), а так же демонстрирует возможность использования оборудования не только в промышленных объектах, но в частной сфере. Получился симбиоз технологий и направлений автоматики. С одной стороны, используя ПЛК, который в основном разработан для нужд промышленности, позволяющий выполнять задачи любой сложности без ограничений жестких алгоритмов готовых устройств умных домов (например, по технологии 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 .



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

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



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

В очередной раз бродя по просторам интернета в поисках Веб интерфейса для управления электроприборами по протоколу Х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 вечера плотного сидения за компом.

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



Понравилась статья? Поделитесь ей