Данный скрипт определяет текущее состояние зон на стороне Агента Контроля со сконфигрурированной ОПС ROVALANT (A6, A16) и при получении события GET_OBJECT_STATE генерирует событие OBJECT_STATE_INFO. Настройка зон и привязка к соответствующим шлейфам осуществляется при настройке модуля интеграции ROVALANT (A6, A16).

Подробнее см. Настройка особого режима работы ПК Мониторинг с ПК ACFA-Интеллект).


function GetStateByCounts(armedCount, disarmedCount)
{
	/* Если имеются зоны на охране и не на охране, то считаем что постановка на охрану выполнена частично */
	if(armedCount > 0 && disarmedCount > 0)
	{
		return "PART_ARMED";
	}
	/* Если имеются только зоны на охране, то считаем что контроллер на охране */
	else if(armedCount > 0)
	{
		return "ARMED";
	}
	/* Считаем, что контроллер не на охране */
	return "DISARMED"
}
function ZoneIsUsed(params, id)
{
	var count = params.GetParam("TABLE.zone.count");
	var number = GetObjectParam("ROVALANT_ZONE", id, "number");
	var i;
	for(i=0; i < count; ++i)
	{
		if(params.GetParam("TABLE.zone." + i) == number)
		{
			return "true";
		}
	}
	return "false";
}
function GetControllerState(id, zones)
{
	/* Получаем настройки контроллера*/
	var params = CreateMsg();
	params.StringToMsg(GetObjectParams("ROVALANT_DEVICE", id));
	/* Получаем количество зон используемых контроллером */
	var count = params.GetParam("TABLE.zone.count");	
	/* Если контроллер использует зоны */
	if(count > 0)
	{
		/* Количество зон на охране и не на охране */
		var armedCount = 0;
		var disarmedCount = 0;
		var zoneCount = zones.GetParam("id.count");
		var j;
		for(j = 0; j < zoneCount; ++j)
		{
			/* Определяем является ли зона принадлежной к текущему контроллеру
			   и определяем используется ли данная зона текущим контроллером */
			var zone = zones.GetParam("id."+j);
			if(GetObjectParentId("ROVALANT_ZONE", zone, "ROVALANT_DEVICE") == id && ZoneIsUsed(params, zone) == "true")
			{
				/* Проверяем состояние зоны */
				var state = GetObjectState("ROVALANT_ZONE", zone);
				switch(state)
				{
				case "ARMED":
				case "ALARM_ARMED":
				case "TROUBLE_ARMED":
					armedCount++;
					break;
				case "DISARMED":
				case "TROUBLE_DISARMED":
					disarmedCount++;
					break;
				}
			}
		}
	}

	/* Определяем состояние объекта */
	return GetStateByCounts(armedCount, disarmedCount, msg);
}
function GetSkdStateMsg(type, id, action)
{
	var devices = CreateMsg();
	devices.StringToMsg(GetObjectIds("ROVALANT_DEVICE"));
	var count = devices.GetParam("id.count");
	var zones = CreateMsg();
	zones.StringToMsg(GetObjectIds("ROVALANT_ZONE"));
	/* Количество зон на охране и не на охране */
	var armedCount = 0;
	var disarmedCount = 0;
	var i;
	for(i = 0; i < count; ++i)
	{
		var device = devices.GetParam("id."+i);
		var state = GetControllerState(device, zones);
		switch(state)
		{
			case "PART_ARMED":
				disarmedCount++;
			case "ARMED":
				armedCount++;
				break;
			case "DISARMED":
				disarmedCount++;
				break;
		}
	}
	var msg = CreateMsg();
	msg.SourceType = type;
	msg.SourceId = id;
	msg.Action = action;

	msg.SetParam("state", GetStateByCounts(armedCount, disarmedCount));
	msg.SetParam("card", "");
	return msg;
}
if(Event.SourceType == "VIDEOSRV_C" && Event.Action == "GET_OBJECT_STATE")
{
	NotifyEvent(GetSkdStateMsg(Event.SourceType, Event.SourceId, "OBJECT_STATE_INFO"));
}
else if(Event.SourceType == "ROVALANT_DEVICE" && 
(Event.Action == "A06_CLOSE" || 
Event.Action == "A16_CLOSE" || 
Event.Action == "A06_OPEN" || 
Event.Action == "A16_OPEN" || 
Event.Action == "A06_POLICE" || 
Event.Action == "A16_POLICE" || 
Event.Action == "A06_ELECTRIC" || 
Event.Action == "A16_ELECTRIC" || 
Event.Action == "A06_ENTRY" ||
Event.Action == "A16_ENTRY"))
{
	var card = Event.GetParam("key_code");
	var msg = GetSkdStateMsg("VIDEOSRV_C", "1", "OBJECT_STATE_INFO");
	msg.SetParam("card", card);
	NotifyEvent(msg);
}