コード例 #1
0
ファイル: notifications.py プロジェクト: mindcrimer/geolead
def route_overstatement_notification(job,
                                     sess_id,
                                     routes_cache=None,
                                     job_template=None):
    """7. Превышение времени нахождения на маршруте"""
    if not job_template:
        raise NotificationError(
            'Не найден норматив шаблона задания. ID ПЛ=%s' % job.pk)

    if not routes_cache:
        routes = get_routes(sess_id, with_points=True)
        routes_cache = {r['id']: r for r in routes}

    dt_from = int(time.mktime(job.date_begin.timetuple()))
    dt_to = int(time.mktime(job.date_end.timetuple()))

    route = routes_cache.get(int(job.route_id), {})
    # ищем только маршруты
    geozones = list(
        filter(lambda x: 'маршрут' in x['name'].lower(),
               route.get('points', [])))

    if not route or not geozones:
        raise NotificationError(
            'Маршрут неизвестен или отсутствуют геозоны. ID ПЛ=%s' % job.pk)

    for geozone in geozones:
        standard = StandardPoint.objects.filter(
            wialon_id=geozone['id'].strip()).first()
        if not standard or not standard.total_time_standard:
            print(
                'Не найдена геозона или отсутствует норматив нахождения для нее. '
                'ID ПЛ=%s, ID геозоны=%s' % (job.pk, geozone['id']))
            continue

        data = {
            'itemId':
            get_wialon_report_resource_id(job.user, sess_id),
            'id':
            0,
            'callMode':
            'create',
            'n':
            'Превысил время нахождения на маршруте %s' % geozone['name'],
            'txt':
            '%UNIT% %CURR_TIME% превысил время нахождения (' +
            str(standard.total_time_standard) + ' мин.) на маршруте ' +
            geozone['name'],
            # время активации (UNIX формат)
            'ta':
            dt_from,
            # время деактивации (UNIX формат)
            'td':
            dt_to,
            # максимальное количество срабатываний (0 - не ограничено)
            'ma':
            0,
            # таймаут срабатывания(секунд)
            'cdt':
            10,
            # максимальный временной интервал между сообщениями (секунд)
            'mmtd':
            60 * 60,
            # минимальная продолжительность тревожного состояния (секунд)
            'mast':
            int(standard.total_time_standard * 60),
            # минимальная продолжительность предыдущего состояния (секунд)
            'mpst':
            10,
            # период контроля относительно текущего времени (секунд)
            'cp':
            24 * 60 * 60,
            # флаги
            'fl':
            0,
            # часовой пояс
            'tz':
            get_wialon_timezone_integer(job.user.timezone
                                        or get_current_timezone()),
            # язык пользователя (двухбуквенный код)
            'la':
            'ru',
            # массив ID объектов/групп объектов
            'un': [int(job.unit_id)],
            'sch': {
                'f1': 0,
                'f2': 0,
                't1': 0,
                't2': 0,
                'm': 0,
                'y': 0,
                'w': 0
            },
            'ctrl_sch': {
                'f1': 0,
                'f2': 0,
                't1': 0,
                't2': 0,
                'm': 0,
                'y': 0,
                'w': 0
            },
            'trg': {
                't': 'geozone',
                'p': {
                    'sensor_type': '',
                    'sensor_name_mask': '',
                    'lower_bound': 0,
                    'upper_bound': 0,
                    'merge': 0,
                    'geozone_ids': str(geozone['id'].split('-')[1]),
                    'reversed': 0,
                    'type': 0,
                    'min_speed': 0,
                    'max_speed': 0,
                    'lo': 'AND'
                }
            },
            'act': [{
                't': 'message',
                'p': {
                    'name':
                    'Превысил время нахождения на маршруте %s' %
                    geozone['name'],
                    'url':
                    '',
                    'color':
                    '',
                    'blink':
                    0
                }
            }, {
                't': 'event',
                'p': {
                    'flags': 1
                }
            }]
        }

        result = update_notification(data, sess_id)
        yield result[0], result[1], data
コード例 #2
0
ファイル: notifications.py プロジェクト: mindcrimer/geolead
def space_notification(job, sess_id, routes_cache=None, job_template=None):
    """6. Нахождение объекта вне планового маршрута"""
    if not job_template or not job_template.space_overstatements_standard:
        raise NotificationError(
            'Не найден норматив перенахождения вне маршрута. ID ПЛ=%s' %
            job.pk)

    if not routes_cache:
        routes = get_routes(sess_id, with_points=True)
        routes_cache = {r['id']: r for r in routes}

    dt_from = int(time.mktime(job.date_begin.timetuple()))
    dt_to = int(time.mktime(job.date_end.timetuple()))

    route = routes_cache.get(int(job.route_id), {})
    route_title = route.get('name')
    geozones = route.get('points', [])
    geozones_ids = list(map(lambda x: x['id'].split('-')[1], geozones))

    if not route or not geozones:
        raise NotificationError(
            'Маршрут неизвестен или отсутствуют геозоны. ID ПЛ=%s' % job.pk)

    data = {
        'itemId':
        get_wialon_report_resource_id(job.user, sess_id),
        'id':
        0,
        'callMode':
        'create',
        'n':
        'Нахождение вне планового маршрута %s' % route_title,
        'txt':
        '%UNIT% находился вне планового маршрута ' + route_title,
        # время активации (UNIX формат)
        'ta':
        dt_from,
        # время деактивации (UNIX формат)
        'td':
        dt_to,
        # максимальное количество срабатываний (0 - не ограничено)
        'ma':
        0,
        # таймаут срабатывания(секунд)
        'cdt':
        10,
        # максимальный временной интервал между сообщениями (секунд)
        'mmtd':
        60 * 60,
        # минимальная продолжительность тревожного состояния (секунд)
        'mast':
        int(job_template.space_overstatements_standard * 60.0),
        # минимальная продолжительность предыдущего состояния (секунд)
        'mpst':
        10,
        # период контроля относительно текущего времени (секунд)
        'cp':
        24 * 60 * 60,
        # флаги
        'fl':
        0,
        # часовой пояс
        'tz':
        get_wialon_timezone_integer(job.user.timezone
                                    or get_current_timezone()),
        # язык пользователя (двухбуквенный код)
        'la':
        'ru',
        # массив ID объектов/групп объектов
        'un': [int(job.unit_id)],
        'sch': {
            'f1': 0,
            'f2': 0,
            't1': 0,
            't2': 0,
            'm': 0,
            'y': 0,
            'w': 0
        },
        'ctrl_sch': {
            'f1': 0,
            'f2': 0,
            't1': 0,
            't2': 0,
            'm': 0,
            'y': 0,
            'w': 0
        },
        'trg': {
            't': 'geozone',
            'p': {
                'sensor_type': '',
                'sensor_name_mask': '',
                'lower_bound': 0,
                'upper_bound': 0,
                'merge': 0,
                'geozone_ids': ','.join(geozones_ids),
                'reversed': 0,
                'type': 1,
                'min_speed': 0,
                'max_speed': 0,
                'lo': 'AND'
            }
        },
        'act': [{
            't': 'message',
            'p': {
                'name': 'Нахождение вне планового маршрута %s' % route_title,
                'url': '',
                'color': '',
                'blink': 0
            }
        }, {
            't': 'event',
            'p': {
                'flags': 1
            }
        }]
    }

    result = update_notification(data, sess_id)
    yield result[0], result[1], data