Последние статьи
- Твердотельный датчик направления и скорости ветра. Эксперимент
- 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 - больше портов, зуммер и ИОН
Интеграция GSM-сигнализации в общую систему посредством 1-wire
23/02/2010 13:26:03
Возможно, данная статья устарела.
Все новые статьи
В доме, оснащенном, так сказать, интеллектом, часто используются совершенно различные технологии, модули, интерфейсы, которые, не смотря на свою разнородность, позволяют решать общие задачи. Но чем более разношерстная среда, в которой строится единая система, тем острее стоит вопрос стабильности, надежности, отказоустойчивости, независимости. Я уже писал в своем обзоре, посвященном надежности централизованного управления Умным Домом, что некоторые блоки системы лучше реализовывать на функционально завершенных, промышленных элементах. Одним из таких блоков бесспорно является охранно-пожарная сигнализация. Я использовал в своей системе GSM-сигнализацию CCU6225 от российского производителя. Эта сигнализация обладает широкими возможностями в плане программирования и управления, а также имеет достаточное количество выходов, позволяющих не только информировать о тревожных событиях, но также производить запрограммированные действия: выключение электропитания, воды, газа и т.д. Кроме этого, блок сигнализации не требует для работы доступ в Интернет, а также очень продолжительное время (более недели) может обходиться без электропитания, так как способна работать от резервного аккумулятора.
Использующаяся GSM-сигнализация CCU6225 имеет RS232 интерфейс и позволяет производить программирование посредством специального ПО (конфигуратора), написанного для ОС Windows. Такой способ программирования очень удобен и понятен. Однако производить мониторинг работы сигнализации через RS232, а именно считывать текущий режим работы, состояние входов и выходов нельзя. Таким образом сигнализацию невозможно с помощью встроенного интерфейса интегрировать в общую систему Умного Дома. А такая интеграция была бы весьма кстати. Основное, что необходимо знать центральному компьютеру, в каком режиме работает охранный блок: Охрана или Наблюдение. Эта информация очень полезна, так как позволяет вносить некоторые коррективы в работу многих модулей системы. Например, возьмем управление отоплением. Очевидно, что при включенном режиме Охрана в доме никого нет. Это означает, что можно на определенное заранее заданное значение снижать температуру в доме, а, следовательно, экономить энергоресурсы. Можно не включать или включить позже уличное освещение, в форсированном режиме включать вентиляцию, отключить с помощью клапана или крана подачу воды, обесточить опасные потребители и многое другое. Даже видеонаблюдение можно настроить на запись только в случае отсутствия хозяев в доме.
2-х канальный датчик сухого контакта
для шины 1-wire на базе DS2406P
Но как компьютеру, который в моей системе выполняет центральную и координирующую роль, получить информацию о режиме работы сигнализации? В этом случае удобно использовать технологию 1-wire. Был изготовлен модуль на базе двухканального компонента DS2406P, выполняющий роль датчика сухого контакта. Этот модуль был подключен к одному из двух встроенных в блок сигнализации перекидных реле. В конфигураторе сигнализации я указал, что при переходе в режим Охрана включать реле, а при переходе в режим Наблюдении выключать. И... все. Осталось только обеспечить несложную программную поддержку нового модуля. В качестве программы я использовал уже написанный код для отслеживания работынасоса системы водоснабжения и управления водоочисткой. Я только добавил в программу код обработки нового события - переключения режимов сигнализации с записью состояния в базу данных.
Для наглядности привожу небольшой участок кода, ответственный за получение и обработку сигнала от сигнализации.
<? $index = 2; require_once("/var/www/page.php"); include("key.php"); $loop = 1; $pio_state = 0; $dir = opendir("/mnt/1wire/bus.0/alarm/"); $log = fopen("/var/www/server.log", "a"); $keys_id = get_id_cl("keys", 1); $keys_journal = get_id_cl("keys_journal", 1); $keys = array ( 0 => array ( 'key_address' => '12.E2FB69000000', 'key_label' => 'gsm_arm', 'alarm' => 0, 'key_pio' => 0, 'key_id' => 0 ) ); # Получаем id ключа в БД for ( $i = 0; $i < count($keys); $i++ ) $keys[$i]['key_id'] = show_list($keys_id, "#tmpID#", "", 1, "key_label='".$keys[$i]['key_label']."'", 1); $down_time = time(); while ( $loop == 1 ) { usleep(500000); $sleep_count++; # Каждые 5 минут проверяем соединение с БД if ( $sleep_count == 600 ) { $sleep_count=0; if (!mysql_ping($conn)) echo "MySQL connectio is lost"; } for ( $i = 0; $i < count($keys); $i++ ) $keys[$i]['alarm'] = 0; rewinddir($dir); while (false !== ($file = readdir($dir))) { for ( $i = 0; $i < count($keys); $i++ ) { if ( $file == $keys[$i]['key_address'] ) $keys[$i]['alarm'] = 1; } } for ( $i = 0; $i < count($keys); $i++ ) { # Обработка событий для сигнализации if ( $keys[$i]['key_label'] == "gsm_arm" ) { if ( $keys[$i]['alarm'] == 1 && $keys[$i]['key_pio'] == 0 ) { $keys[$i]['key_pio'] = 1; $log_txt = date('H:i:s')." ".$keys[$i]['key_label']." ON"; fwrite($log, $log_txt); write_list($keys_id, "key_pio='1'", "key_label='".$keys[$i]['key_label']."'"); write_list($keys_journal, "SYSDATE(), ".$keys[$i]['key_id'].", '1'"); } elseif ( $keys[$i]['alarm'] == 0 && $keys[$i]['key_pio'] == 1 ) { $keys[$i]['key_pio'] = 0; $temp_time = 0; $log_txt = date('H:i:s')." ".$keys[$i]['key_label']." OFF"; fwrite($log, $log_txt); write_list($keys_id, "key_pio='0'", "key_label='".$keys[$i]['key_label']."'"); write_list($keys_journal, "SYSDATE(), ".$keys[$i]['key_id'].", '0'"); } } } }
Пусть вас не пугает наличие нештатных функций для чтения и записи данных в MySQL. Моя задача - показать принцип работы. Хочу обратить внимание на часть кода, где используется функция mysq_ping(). Каждые 600 циклов, а это в данном случае 5 минут, вызывается эта функция, которая проверяет соединение с базой данных. Дело в том, что установленное соединение с MySQL базой данных обрывается ориентировочно через 12 часов после соединения в случае, если нет никакой активности. Кто именно завершает соединение не совсем понятно. Возможно, сам сервер или ядро операционной системы. Из конкретного примера понятно, что сигнализацию в режим Охрана переводят не каждый день. Конечно, можно устанавливать соединение каждый раз при обращении к БД, но это неоптимально для тех модулей, которые работают с другими элементами системы (например, выключатели света).
Проснись и пой
Удобно вносить изменения в работу сигнализации удаленно, из локальной сети или Интернета. Для этого, казалось бы, все есть. Я специально установил дополнительно рядом с Linux'ом еще сервер под управлением Windows. Он не выполняет никаких особенных задач, но нужен часто для реинжениринга протоколов и управления блоками, к которым ПО поставляется только для Windows. В частности для управления сигнализацией CCU6225 существует программа-конфигуратор, которая работает только в среде Windows. Конечно, можно было установить виртуальную машину, эмулятор, но мне не хотелось загружать основной сервер ненужными задачами. В то же время держать компьютер под управлением Windows постоянно работающим было бы расточительным с точки зрения энергозатрат. Поэтому я решил воспользоваться технологией WakeOnLan. Эта технология позволяет включать удаленно компьютер с помощью сетевого пакета, сформированного особым образом, где в качестве своеобразного пароля используется MAC-адрес сетевого адаптера. Современные системные платы с интегрированным сетевым контроллером полностью поддерживают эту технологию. Но у меня в наличии была старая системная плата Gigabyte GA-6OXT с коннектором WOL и сетевой адаптер Compex ReadyLink RE 100TX на базе чипа Realtek 8139B с проводком WOL. Используя поиск aptitude для Debian я обнаружил, что для Debian lenny доступно два пакета: Perl-скрипт wakeonlan и etherwake, использующий стандартный формат AMD Magic Packet. Программа wakeonlan с моими компонентами не заработала, а вот etherwake прекрасно включает компьютер. Таким образом, у меня появилась возможность удаленно включать компьютер, заходить на него через Remote Desktop, изменять параметры сигнализации и выключать компьютер стандартными средствами операционной системы. Кроме того, система теперь всегда знает состояние сигнализации, что учитывается в работе многих систем дома и, прежде всего, отопления.
Автор: Andrey_B
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.
Добавить комментарий:
Сортировка комментариев: Последние сверху | Первые сверху
2011-08-04 14:44:23 | stanislav.l
Если придумать какую-то ублюдочную БС с "радиусом действия" 1 метр (у входной двери), чтобы она могла считать IMEI - это было бы круто... Но боюсь что дорого и сложно.
Вообще, для свой-чужой может быть попробовать распознавать лица ?
2011-08-02 10:16:33 | Andrey_B
Дмитрий, вы имеете ввиду метки у человека как признак присутствия или метки на особо ценных предметах? ;)
Вообще идентификация свой-чужой интересна. С одной стороны телефон+GPS+3G дает больше возможностей, с другой стороны RFID имеет лучшую автономность. Но если телефон в большинстве случаев всегда у человека, то заставить носить метку не так то просто. Хотя, и ее ведь можно клеить на телефон и сделать систему "двойной". А у вас какие мысли на этот счет? И главное, что-то можете порекомендовать из аппаратной части?
2011-08-01 23:30:18 | Дмитрий
Отличная статья! А не планируете что либо RFID технологий применить? В качестве охранной системы например.
2010-10-15 13:19:40 | Andrey_B
Alex, нештатные функции всего лишь преобразуют макрокоманду в типовые SQL-запросы. Вместо этих функций можно написать отдельные обычные SQL-запросы с применением mysql_query() и ровным счетом ничего не изменится. Они были написаны мной для ускорения программирования и компактности кода и не представляют сами по себе никакого интереса.
2010-10-15 12:33:46 | Alex
Хотелось бы увидеть код Ваших нештатных функций для чтения и записи данных в MySQL.