Дерево страниц

resources/other/long_event_handler.py

Модуль содержит один класс, для работы с продолжительными событиями LongEventHandler
Суть данного класса - отсеивать короткие события, длительность которых менее указанной.

Модуль работает ТОЛЬКО с парными событиями, т.е. такими, для которых трассир генерирует отдельные события начала и окончания.

Примеры событий

  • Motion Start/Motion Stop
  • Signal Lost/Signal Restored
  • Fire Detected/Fire Stopped
  • Output Low to High/Output High to Low
  • Input Low to High/Input High to Low
  • Connection Lost/Connection Established

Аргументы класса

  • event_types (Tuple[str, str]): Tuple из двух связанных событий, например ("Motion Start", "Motion Stop")
  • callback (callable[SE_Event]): Функция callback, в которую будет прилетать событие трассира
  • event_filter(callable[SE_Event], optional): Функция фильтр, которая в качестве аргумента принимает событие трассира SE_Event и должна возвращать True если данное событие подходит под условие.
  • duration (int, optional): Продолжительность события в секундах, по умолчанию 5
  • mode (int, optional): Индекс события из event_types на которое реагируем. 0 если хотим реагировать только на первое событие, 1 - только на второе, 2 или любое другое значение, если реагируем на оба события.

Методы класса

  • activate_on_events() - Метод добавляет хендлеры для всех event_types - host.activate_on_events. Можно также не использовать данные метод, а установить хендлеры вручную (смотри примеры).

Примеры кода

Простой пример

Вызываем всплывающее окно на события Motion Start/Motion Stop если их продолжительность более 15 секунд

import host
from long_event_handler import LongEventHandler


def handler(ev):
    host.message("%s: %s" % (ev.type, ev.origin_object.name))


leh = LongEventHandler(
	("Motion Start", "Motion Stop"),
    handler,
    duration=15,
    mode=2
)
leh.activate_on_events()
Реагируем только на одно событие

Вызываем всплывающее окно  только для событий  Motion Start

import host
from long_event_handler import LongEventHandler


def handler(ev):
    host.message("%s: %s" % (ev.type, ev.origin_object.name))


leh = LongEventHandler(
	("Motion Start", "Motion Stop"),
    handler,
    duration=15,
    mode=0
)
leh.activate_on_events()
Фильтр событий

Тоже самое + фильтруем только для канала с именем Channel1

import host
from long_event_handler import LongEventHandler


def handler(ev):
    host.message("%s: %s" % (ev.type, ev.origin_object.name))


def channel_filter(ev):
    return ev.origin_object.name == "Channel1"


leh = LongEventHandler(
	("Motion Start", "Motion Stop"),
    handler,
    event_filter=channel_filter,
    duration=15,
    mode=2
)
leh.activate_on_events()
"Ручная" активация

Тоже самое что 1 но добавляем свои хендлеры

import host
from long_event_handler import LongEventHandler


def handler(ev):
    host.message("%s: %s" % (ev.type, ev.origin_object.name))


leh = LongEventHandler(
	("Motion Start", "Motion Stop"),
    handler,
    duration=15,
    mode=2
)

host.activate_on_events("Motion Start", "Channel1Guid", leh)
host.activate_on_events("Motion Stop", "Channel1Guid", leh)

host.activate_on_events("Motion Start", "Channel2Guid", leh)
host.activate_on_events("Motion Stop", "Channel2Guid", leh)