Опрос


Что для Вас Умный Дом?


Результаты

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



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



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

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.