ФОРУМ КУПИТЬ

Последние статьи

ВСЕ СТАТЬИ

Интеграция GSM-сигнализации в общую систему посредством 1-wire

23/02/2010 13:26:03

Возможно, данная статья устарела.
Все новые статьи

GSM сигнализация CCU6225В доме, оснащенном, так сказать, интеллектом, часто используются совершенно различные технологии, модули, интерфейсы, которые, не смотря на свою разнородность, позволяют решать общие задачи. Но чем более разношерстная среда, в которой строится единая система, тем острее стоит вопрос стабильности, надежности, отказоустойчивости, независимости. Я уже писал в своем обзоре, посвященном надежности централизованного управления Умным Домом, что некоторые блоки системы лучше реализовывать на функционально завершенных, промышленных элементах. Одним из таких блоков бесспорно является охранно-пожарная сигнализация. Я использовал в своей системе GSM-сигнализацию CCU6225 от российского производителя. Эта сигнализация обладает широкими возможностями в плане программирования и управления, а также имеет достаточное количество выходов, позволяющих не только информировать о тревожных событиях, но также производить запрограммированные действия: выключение электропитания, воды, газа и т.д. Кроме этого, блок сигнализации не требует для работы доступ в Интернет, а также очень продолжительное время (более недели) может обходиться без электропитания, так как способна работать от резервного аккумулятора.

Использующаяся GSM-сигнализация CCU6225 имеет RS232 интерфейс и позволяет производить программирование посредством специального ПО (конфигуратора), написанного для ОС Windows. Такой способ программирования очень удобен и понятен. Однако производить мониторинг работы сигнализации через RS232, а именно считывать текущий режим работы, состояние входов и выходов нельзя. Таким образом сигнализацию невозможно с помощью встроенного интерфейса интегрировать в общую систему Умного Дома. А такая интеграция была бы весьма кстати. Основное, что необходимо знать центральному компьютеру, в каком режиме работает охранный блок: Охрана или Наблюдение. Эта информация очень полезна, так как позволяет вносить некоторые коррективы в работу многих модулей системы. Например, возьмем управление отоплением. Очевидно, что при включенном режиме Охрана в доме никого нет. Это означает, что можно на определенное заранее заданное значение снижать температуру в доме, а, следовательно, экономить энергоресурсы. Можно не включать или включить позже уличное освещение, в форсированном режиме включать вентиляцию, отключить с помощью клапана или крана подачу воды, обесточить опасные потребители и многое другое. Даже видеонаблюдение можно настроить на запись только в случае отсутствия хозяев в доме.

2-х канальный датчик сухого контакта 1-wire на базе DS2406P
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
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.



Добавить комментарий:

(необязательно, не отображается на сайте)


Сортировка комментариев: Последние сверху | Первые сверху

2010-10-15 12:33:46 | Alex
Хотелось бы увидеть код Ваших нештатных функций для чтения и записи данных в MySQL.


2010-10-15 13:19:40 | Andrey_B
Alex, нештатные функции всего лишь преобразуют макрокоманду в типовые SQL-запросы. Вместо этих функций можно написать отдельные обычные SQL-запросы с применением mysql_query() и ровным счетом ничего не изменится. Они были написаны мной для ускорения программирования и компактности кода и не представляют сами по себе никакого интереса.


2011-08-01 23:30:18 | Дмитрий
Отличная статья! А не планируете что либо RFID технологий применить? В качестве охранной системы например.


2011-08-02 10:16:33 | Andrey_B
Дмитрий, вы имеете ввиду метки у человека как признак присутствия или метки на особо ценных предметах? ;)
Вообще идентификация свой-чужой интересна. С одной стороны телефон+GPS+3G дает больше возможностей, с другой стороны RFID имеет лучшую автономность. Но если телефон в большинстве случаев всегда у человека, то заставить носить метку не так то просто. Хотя, и ее ведь можно клеить на телефон и сделать систему "двойной". А у вас какие мысли на этот счет? И главное, что-то можете порекомендовать из аппаратной части?


2011-08-04 14:44:23 | stanislav.l
Если придумать какую-то ублюдочную БС с "радиусом действия" 1 метр (у входной двери), чтобы она могла считать IMEI - это было бы круто... Но боюсь что дорого и сложно.
Вообще, для свой-чужой может быть попробовать распознавать лица ?