Выпуск №3. Ethernet контроллер Megad-328
|
|
В этой статье я хотел бы описать с чего началось мое знакомство с технологиями умного дома и рассказать о моей первой системе «Умного дома» , которая отвечает за автоосвещение в 4-х комнатах и имеет веб интерфейс управления. Планировалось также оповещать по смс, если система работает в режиме «Охраны», но я пока не включил эту опцию, хотя код уже написан и протестирован.
Итак, если вкратце, купил я в 2013 году такой MegaD-328 ethernet контролер.
Краткая справка с сайта «https://ab-log.ru»:
{начало отрывка}
Модуль MegaD-328 является устройством, которое может работать как в децентрализованной схеме, так и в централизованной. Например, к одному устройству у нас подключены кнопки и светильники. Пользователь посредством Web-интерфейса настраивает устройство таким образом, чтобы при нажатии на кнопку, включались те или иные светильники или другие подключенные приборы. При этом существует возможность удаленного управления подключенными нагрузками и изменения логики работы с помощью встроенного в MegaD-328 Web-интерфейса.

Когда же в системе есть сервер, в котором заложены все интеллектуальные алгоритмы, MegaD-328 при нажатии на кнопку сообщает об этом событии ему и внимательно слушает ответ. Если сервер приказал включить или выключить те или иные потребители, MegaD-328 незамедлительно выполняет эти команды.
Сервер также по собственной инициативе (по заложенному в программе алгоритму) или по команде пользователя может послать любую команду для включения и выключения приборов. Таким образом, пользователь может работать через свой iPhone, HTC или Samsung с красивым Web-интерфейсом сервера, а сервер в свою очередь будет передавать команды устройствам MegaD-328 по сети Ethernet.

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

Иными словами логику устройства можно выразить так: есть сервер - работаем с ним, нет сервера - работаем сами. Пользователь всегда может рассчитывать на интеллектуальное управление со стороны сервера, но при возникновении аварии ключевые функции по-прежнему будут работать."
{конец отрывка}
Продолжаю статью…
Подключил к портам (3-6) на вход 4 инфракрасных датчика Pyronix COLT XS
Выставил на портах режим срабатывания датчика на «R», т.к. при срабатывании датчика низкий сигнал. (R - устройство реагирует только при размыкании контакта/выключателя.)

При срабатывании датчика запускается скрипт megad.php, который делает запись в базу данных mySql, расположенную на микрокомпьютере raspberry Pi, где установлен также веб-сервер nginx, который собственно и выполняет скрипт megad.php, а также другие о которых напишу ниже.
На скринах ниже видно, что база состоит из одной таблицы с 4-мя полями, в которую записывается время и порт при срабатывании датчиков движения.

Вот код megad.php
$time_evening)
//{
//if (!mysql_query($sql,$link))
// {
// die('Error: ' . mysql_error());
// }
//echo "9:1";}
// else if ( $_GET['pt'] == "6" AND $date_sql>$time_evening)
//{
//if (!mysql_query($sql,$link))
// {
// die('Error: ' . mysql_error());
// }
//echo "10:1";}
mysql_close($link);
?>
В планировщике Cron raspberry-Pi выставил расписание на запуск скрипта shutdown.php каждые 10 минут
Скрипт shutdown.php делает обход всех портов выхода и считывает статус (включен/не включен). Если включен, то смотрит на время последней записи в базе данных датчика движения с которым связан порт выхода и сравнивает с текущим временем. Если это время больше 5 минут (можно написать 10), то система понимает, что в комнате никого нет и отключает свет.
код shutdown.php
В настоящий момент сервер базы данных не доступен, поэтому
корректное отображение страницы невозможно." );
exit();
}
function Off_light($dname, $dcnx, $file_for_get, $select_for_port_limit, $delete_for_port, $select_for_port, $light_off_adr, $insert_for_OnPort)
{
//Дата на 10 минут раньше от текущей
$date_sql=date("Y-m-d H:i:s",mktime(date("H"),date("i")-5,date("s"),date("m"),date("d"),date("Y")));
if (!@mysql_select_db($dname, $dcnx))
{
echo( "В настоящий момент база данных не доступна, поэтому
корректное отображение страницы невозможно.
" );
exit();
}
// Проверяем какие порты включены
$lines7 = file($file_for_get);
// Осуществим проход массива и выведем содержимое в виде HTML-кода вместе с номерами строк.
foreach ($lines7 as $line_num => $line) {
$arr7=htmlspecialchars($line);
echo $arr7;
}
if($arr7==="ON")
{
//Проверяем время последнего срабатывания датчика и если есть результат то обрабатываем
$ath7 = mysql_query($select_for_port_limit);
if($ath7)
{
$num_rows7 = mysql_num_rows($ath7);
if ($num_rows7>0)
{
$author7 = mysql_fetch_array($ath7);
echo "
id = ".$author7['id']."
";
echo "port = ".$author7['port']."
";
echo "status = ".$author7['status']."
";
echo "date = ".$author7['timelast']."
";
echo "time=".$date_sql;
if ($author7['timelast']<$date_sql)
// echo $date_sql;
{
$delresult7=mysql_query($delete_for_port);
$result7=mysql_query($select_for_port);
while ($row7 = mysql_fetch_array($result7, MYSQL_ASSOC))
{
echo "
id = ".$row7['id']."
";
echo "port = ".$row7['port']."
";
echo "status = ".$row7['status']."
";
echo "date = ".$row7['timelast']."
";
}
$handle7 = fopen($light_off_adr, "r");
echo $handle7;
}
}
//Если нет записей этого датчика и порт включен, то не выключаем и добавляем одну запись
else {
echo "
Порт".$pt ." включен, но запись в БД не найдена
";
if (!mysql_query($insert_for_OnPort,$dcnx))
{die('Error: ' . mysql_error());}
echo "Запись " .$pt ." добавлена";
}
}
}
$res="Функция по порту ".$pt." отработана";
return $res;
}
for ($pt = 7; $pt <= 13; $pt++)
{
if($pt==7)
{
$arg1='http://192.168.0.14/sec/?pt=7&cmd=get'; //получаем значение порта "on" или "off" с сервера Ethernet-controler
$arg2="select timelast from light where port=3 ORDER BY id DESC LIMIT 1"; //sql запрос последнего значения времени записи порта датчика 3, связанного с портом выхода 7(выключателем)
$arg3="delete from light where port=3"; //sql запрос на удаление всех записей датчика 3
$arg4="select * from light where port=3"; //sql запрос записей по порту датчика 3
$arg5="http://192.168.0.14/sec/?cmd=7:0"; //команда серверу Ethernet-controler на выключение порта 7
$arg6="INSERT INTO light (port, status) VALUES(3,1)"; //если порт включен и записей датчика нет, срабатывает этот запрос, который вводит одну запись, чтобы при следующем запуске этой функции свет выключился, если время простоя датчика больше указанного
//echo
;
echo Off_light($dbname, $dbcnx,$arg1, $arg2, $arg3, $arg4, $arg5, $arg6);
}
else if($pt==8)
{
$arg1='http://192.168.0.14/sec/?pt=8&cmd=get';
$arg2="select timelast from light where port=4 ORDER BY id DESC LIMIT 1";
$arg3="delete from light where port=4";
$arg4="select * from light where port=4";
$arg5="http://192.168.0.14/sec/?cmd=8:0";
$arg6="INSERT INTO light (port, status) VALUES(4,1)";
//echo
;
echo Off_light($dbname, $dbcnx,$arg1, $arg2, $arg3, $arg4, $arg5, $arg6);
}
else if($pt==9)
{
$arg1='http://192.168.0.14/sec/?pt=9&cmd=get';
$arg2="select timelast from light where port=5 ORDER BY id DESC LIMIT 1";
$arg3="delete from light where port=5";
$arg4="select * from light where port=5";
$arg5="http://192.168.0.14/sec/?cmd=9:0";
$arg6="INSERT INTO light (port, status) VALUES(5,1)";
//echo
;
echo Off_light($dbname, $dbcnx,$arg1, $arg2, $arg3, $arg4, $arg5, $arg6);
}
else if($pt==10)
{
$arg1='http://192.168.0.14/sec/?pt=10&cmd=get';
$arg2="select timelast from light where port=6 ORDER BY id DESC LIMIT 1";
$arg3="delete from light where port=6";
$arg4="select * from light where port=6";
$arg5="http://192.168.0.14/sec/?cmd=10:0";
$arg6="INSERT INTO light (port, status) VALUES(6,1)";
//echo
;
echo Off_light($dbname, $dbcnx,$arg1, $arg2, $arg3, $arg4, $arg5, $arg6);
}
}
mysql_close($dbcnx);
?>
Вход в панель администрирования базы my sql, по адресу http://192.168.0.100/phpmyadmin, как root. Ну и в заключении статьи выложу код веб интерфейса, который функционирует, но выглядит не очень красиво и не доработан мной, по причине моего перехода на интерфейс системы MajorDoMo.
Разрабатывался для планшета и имел такой внешний вид:
Код index.html
Система "Умный дом"
Тут будет ответ от сервера
Код Ajax.php
Данная система вот уже как 3 года работает без перебоя, после того как были правильно выбраны места установки датчиков с максимальной зоной слежения.
Вместо Ethernet-controller можно использовать Ардуино с Ethernet или Wi-fi модулем






















Добавить комментарий (через VK):