Exemplo n.º 1
0
import logging
import serial
import time
from emonitor.extensions import events
from flask import current_app
from .extensions import scheduler

logger = logging.getLogger(__name__)
connected = False
events.addEvent('incoming_serial_data', handlers=[], parameters=['out.text'])


def handleIncomingData(data):
    timestr = "alarm{}.log".format(time.strftime("%Y%m%d-%H%M%S"))
    fname = "{}{}".format(current_app.config.get('PATH_DATA'), timestr)
    text_file = open(fname, "w")
    text_file.write(data)
    text_file.close()
    logger.debug('Incoming serial alarm message: {}'.format(data))
    events.raiseEvent('incoming_serial_data', text=data)


def readFromPort(ser):
    global connected
    data = ''
    while connected:
        data += ser.read(1)
        if data.endswith('\x03'):
            handleIncomingData(data)
            data = ''
        #firstData = ser.read(1);
Exemplo n.º 2
0
        def on_created(self, event):
            incomepath, filename = os.path.split(event.src_path)
            incomepath += '/'
            events.raiseEvent('file_added',
                              incomepath=incomepath,
                              filename=filename)
            logger.info(u"file_added: {}{}".format(incomepath, filename))

except:
    OBSERVERTYPE = "other"

logger = logging.getLogger(__name__)
BEFORE = AFTER = {}

events.addEvent('file_added',
                handlers=[],
                parameters=['out.incomepath', 'out.filename'])
events.addEvent('file_removed',
                handlers=[],
                parameters=['out.incomepath', 'out.filename'])

OBSERVERACTIVE = 1
ERROR_RAISED = 0

FILES = []
INPUTFORMAT = Settings.get('ocr.inputformat', ['pdf']) + Settings.get(
    'ocr.inputtextformat', [])


# noinspection PyPep8Naming
def observeFolder(**kwargs):
Exemplo n.º 3
0
            events.raiseEvent('file_removed', incomepath=incomepath, filename=filename)
            logger.info(u"file_removed: {}{}".format(incomepath, filename))

        def on_created(self, event):
            incomepath, filename = os.path.split(event.src_path)
            incomepath += '/'
            events.raiseEvent('file_added', incomepath=incomepath, filename=filename)
            logger.info(u"file_added: {}{}".format(incomepath, filename))

except:
    OBSERVERTYPE = "other"

logger = logging.getLogger(__name__)
BEFORE = AFTER = {}

events.addEvent('file_added', handlers=[], parameters=['out.incomepath', 'out.filename'])
events.addEvent('file_removed', handlers=[], parameters=['out.incomepath', 'out.filename'])

OBSERVERACTIVE = 1
ERROR_RAISED = 0

FILES = []
INPUTFORMAT = Settings.get('ocr.inputformat', ['pdf']) + Settings.get('ocr.inputtextformat', [])


# noinspection PyPep8Naming
def observeFolder(**kwargs):
    """
    Observer method to observe given folder
    :param kwargs:
    """
Exemplo n.º 4
0
    def __init__(self, app):
        """
        Add specific parameters and configuration to app object

        :param app: flask wsgi application
        """
        Module.__init__(self, app)
        # add template path
        app.jinja_loader.searchpath.append("{}/emonitor/modules/alarms/templates".format(app.config.get('PROJECT_ROOT')))

        # subnavigation
        self.adminsubnavigation = [('/admin/alarms', 'alarms.base'), ('/admin/alarms/types', 'module.alarms.types'), ('/admin/alarms/report', 'module.alarms.report'), ('/admin/alarms/config', 'module.alarms.config'), ('/admin/alarms/test', 'module.alarms.test')]
        
        # create database tables
        from emonitor.modules.alarms.alarm import Alarm
        from emonitor.modules.alarms.alarmhistory import AlarmHistory
        from emonitor.modules.alarms.alarmattribute import AlarmAttribute
        from emonitor.modules.alarms.alarmsection import AlarmSection
        from emonitor.modules.alarms.alarmtype import AlarmType

        self.widgets = [AlarmIncomeWidget('alarms_income'), AlarmWidget('alarms'), AlarmTimerWidget('alarms_timer'), AlarmRemarkWidget('alarms_remark')]
        
        # eventhandlers
        for f in [f for f in os.listdir('{}/emonitor/modules/alarms/inc/'.format(app.config.get('PROJECT_ROOT'))) if f.endswith('.py')]:
            if not f.startswith('__'):
                cls = imp.load_source('emonitor.modules.alarms.inc', '{}/emonitor/modules/alarms/inc/{}'.format(app.config.get('PROJECT_ROOT'), f))
                checker = getattr(cls, cls.__all__[0])()
                if isinstance(checker, AlarmFaxChecker) and checker.getId() != 'Dummy':
                    events.addEvent('alarm_added.{}'.format(checker.getId()), handlers=[], parameters=['out.alarmid'])
                    events.addEvent('alarm_changestate.{}'.format(checker.getId()), handlers=[], parameters=['out.alarmid', 'out.state'])

        events.addEvent('alarm_added', handlers=[], parameters=['out.alarmid'])  # for all checkers
        events.addEvent('alarm_changestate', handlers=[], parameters=['out.alarmid', 'out.state'])  # for all checkers
        
        events.addHandlerClass('file_added', 'emonitor.modules.alarms.alarm.Alarms', Alarm.handleEvent, ['in.text', 'out.id', 'out.fields'])
        events.addHandlerClass('file_added', 'emonitor.modules.alarms.alarmtype.AlarmTypes', AlarmType.handleEvent, ['in.text', 'out.type'])

        # signals and handlers
        signal.addSignal('alarm', 'changestate')
        signal.addSignal('alarm', 'added')
        signal.addSignal('alarm', 'updated')
        signal.connect('alarm', 'changestate', frontendAlarmHandler.handleAlarmChanges)
        signal.connect('alarm', 'added', frontendAlarmHandler.handleAlarmChanges)
        signal.connect('alarm', 'updated', frontendAlarmHandler.handleAlarmChanges)
        signal.connect('alarm', 'deleted', frontendAlarmHandler.handleAlarmChanges)

        signal.connect('alarm', 'testupload_start', adminAlarmHandler.handleAlarmTestUpload)

        # static folders
        @app.route('/alarms/inc/<path:filename>')
        def alarms_static(filename):
            return send_from_directory("{}/emonitor/modules/alarms/inc/".format(app.config.get('PROJECT_ROOT')), filename)

        @app.route('/alarms/export/<path:filename>')  # filename = [id]-[style].pdf
        def export_static(filename):
            filename, extension = os.path.splitext(filename)
            try:
                id, template = filename.split('-')
                if extension not in ['.pdf', '.html', '.png']:
                    abort(404)
                elif extension == '.pdf':
                    return Response(Module.getPdf(Alarm.getExportData('.html', id=id, style=template, args=request.args)), mimetype="application/pdf")
                elif extension == '.html':
                    return Response(Alarm.getExportData(extension, id=id, style=template, args=request.args), mimetype="text/html")
                elif extension == '.png':
                    return Response(Alarm.getExportData(extension, id=id, style=template, filename=filename, args=request.args), mimetype="image/png")
            except ValueError:
                return abort(404)

        # add reportfolder
        if not os.path.exists('{}/alarmreports/'.format(app.config.get('PATH_DATA'))):
            os.makedirs('{}/alarmreports/'.format(app.config.get('PATH_DATA')))
            
        # translations
        babel.gettext(u'module.alarms')
        babel.gettext(u'alarms.base')
        babel.gettext(u'module.alarms.types')
        babel.gettext(u'module.alarms.report')
        babel.gettext(u'module.alarms.config')
        babel.gettext(u'module.alarms.test')
        babel.gettext(u'alarms_income')
        babel.gettext(u'alarms_timer')
        babel.gettext(u'alarms_remark')
        babel.gettext(u'alarms')
        babel.gettext(u'alarms.prio0')
        babel.gettext(u'alarms.prio1')
        babel.gettext(u'alarms.prio2')
        babel.gettext(u'emonitor.modules.alarms.alarm.Alarms')
        babel.gettext(u'emonitor.modules.alarms.alarmtype.AlarmTypes')
        babel.gettext(u'alarms.test.protocol')
        babel.gettext(u'alarms.test.result')
        babel.gettext(u'alarmstate.active')
        babel.gettext(u'alarmstate.created')
        babel.gettext(u'alarmstate.done')
        babel.gettext(u'alarmstate.archive')
        babel.gettext(u'active')
        babel.gettext(u'created')
        babel.gettext(u'done')
        babel.gettext(u'archive')
        babel.gettext(u'alarms.statechangeactivated')
        babel.gettext(u'alarms.prioshort0')
        babel.gettext(u'alarms.prioshort1')
        babel.gettext(u'alarms.prioshort2')
        babel.gettext(u'alarms.carsinuse')
        babel.gettext(u'history.autochangeState')
        babel.gettext(u'history.message')
        babel.gettext(u'trigger.alarm_added')
        babel.gettext(u'trigger.alarm_changestate')

        babel.gettext(u'trigger.alarm_added_sub')
        babel.gettext(u'trigger.alarm_changestate_sub')

        babel.gettext(u'alarms.print.slightleft')
        babel.gettext(u'alarms.print.slightright')
        babel.gettext(u'alarms.print.right')
        babel.gettext(u'alarms.print.left')
        babel.gettext(u'alarms.print.straight')
        babel.gettext(u'alarms.print.exit')
        babel.gettext(u'alarms.print.bus')
        babel.gettext(u'alarms.print.positive')
        babel.gettext(u'alarms.print.negative')

        babel.gettext(u'alarms.filter.0')
        babel.gettext(u'alarms.filter.1')
        babel.gettext(u'alarms.filter.7')
        babel.gettext(u'alarms.filter.31')

        babel.gettext(u'internal')
        babel.gettext(u'external')

        babel.gettext(u'AFAlerting')
        babel.gettext(u'AFCars')
        babel.gettext(u'AFMaterial')
        babel.gettext(u'AFReport')
        babel.gettext(u'AFTime')
        babel.gettext(u'AFDamage')
        babel.gettext(u'AFOthers')
        babel.gettext(u'AFPersons')

        babel.gettext(u'alarms.fields.simple')
        babel.gettext(u'alarms.fields.extended')
        babel.gettext(u'alarms.fields.persons.field.sum')
        babel.gettext(u'alarms.fields.persons.field.house')
        babel.gettext(u'alarms.fields.persons.field.pa_alarm')
        babel.gettext(u'alarms.fields.persons.field.el')
        babel.gettext(u'alarms.fields.persons.field.alarm')
        babel.gettext(u'alarms.fields.persons.field.pa')
        babel.gettext(u'alarms.fields.persons.field.pa_house')
        babel.gettext(u'alarms.fields.persons.field.elgrade')
        babel.gettext(u'alarms.fields.persons.field.style.simple')
        babel.gettext(u'alarms.fields.persons.field.style.extended')

        # init
        # Do init script for alarms at start and add alarms (state = 1 or 2) (active or done)
        for aalarm in Alarm.query.filter(Alarm.state in [1, 2]).all():
            aalarm.updateSchedules(reference=1)
Exemplo n.º 5
0
def getAdminContent(self, **params):
    """
    Deliver admin content of module alarms

    :param params: use given parameters of request
    :return: rendered template as string
    """
    module = request.view_args['module'].split('/')

    if len(module) > 1:
        if module[1] == 'types':
            impl = []  # load implementations of faxchecker
            for f in [f for f in os.listdir('%s/emonitor/modules/alarms/inc/' % current_app.config.get('PROJECT_ROOT')) if f.endswith('.py')]:
                if not f.startswith('__'):
                    cls = imp.load_source('emonitor.modules.alarms.inc', 'emonitor/modules/alarms/inc/%s' % f)
                    if isinstance(getattr(cls, cls.__all__[0])(), AlarmFaxChecker):
                        impl.append((f, getattr(cls, cls.__all__[0])(), AlarmType.getAlarmTypeByClassname(f)))

            if request.method == 'POST':
                if request.form.get('action') == 'createtype':  # add type
                    params.update({'alarmtype': AlarmType('', ''), 'interpreter': impl})
                    return render_template('admin.alarms.type_actions.html', **params)

                elif request.form.get('action').startswith('deleteinterpreter_'):  # delete checker
                    for cls in impl:
                        if cls[0] == request.form.get('action')[18:]:
                            if os.path.exists('%s/emonitor/modules/alarms/inc/%s' % (current_app.config.get('PROJECT_ROOT'), cls[0])):
                                os.remove('%s/emonitor/modules/alarms/inc/%s' % (current_app.config.get('PROJECT_ROOT'), cls[0]))
                            if os.path.exists('%s/emonitor/modules/alarms/inc/%sc' % (current_app.config.get('PROJECT_ROOT'), cls[0])):
                                os.remove('%s/emonitor/modules/alarms/inc/%sc' % (current_app.config.get('PROJECT_ROOT'), cls[0]))
                            impl.remove(cls)

                elif request.form.get('action').startswith('editalarmtype_'):  # edit type
                    params.update({'alarmtype': AlarmType.getAlarmTypes(id=int(request.form.get('action').split('_')[-1])), 'interpreter': impl})
                    return render_template('admin.alarms.type_actions.html', **params)

                elif request.form.get('action').startswith('deletetype_'):  # delete type
                    atype = AlarmType.getAlarmTypes(id=int(request.form.get('action').split('_')[-1]))
                    for e in [e for e in events.events if e.name in ['alarm_added.{}'.format(atype.name), 'alarm_changestate.{}'.format(atype.name)]]:
                        # delete event handlers and monitor layout
                        for eh in Eventhandler.getEventhandlers(event=e.name):
                            for ml in MonitorLayout.query.filter(MonitorLayout.trigger.like('%{}%'.format(eh.event))).all():
                                if ';' in ml.trigger:
                                    _tr = ml.trigger.split(';')
                                    del _tr[_tr.index(e.name)]
                                    ml.trigger = ";".join(_tr)
                                else:
                                    db.session.remove(ml)
                            db.session.delete(eh)
                        # delete event
                        del events.events[events.events.index(e)]
                    db.session.delete(atype)
                    db.session.commit()

                elif request.form.get('action') == 'updatetype':  # update type
                    if request.form.get('type_id') == 'None':  # add type
                        atype = AlarmType('', '')
                        db.session.add(atype)
                        events.addEvent('alarm_added.{}'.format(request.form.get('edit_name')), handlers=[], parameters=[])
                        events.addEvent('alarm_changestate.{}'.format(request.form.get('edit_name')), handlers=[], parameters=[])
                    else:  # update type
                        atype = AlarmType.getAlarmTypes(id=int(request.form.get('type_id')))
                        for e in [e for e in events.events if e.name in ['alarm_added.{}'.format(atype.name), 'alarm_changestate.{}'.format(atype.name)]]:
                            # update event handler and monitor layout
                            newname = '{}.{}'.format(e.name.split('.')[0], request.form.get('edit_name'))
                            for eh in Eventhandler.getEventhandlers(event=e.name):
                                for ml in MonitorLayout.query.filter(MonitorLayout.trigger.like('%{}%'.format(eh.event))).all():
                                    ml.trigger = ml.trigger.replace(e.name, newname)
                                eh.event = newname
                            # update event
                            e.name = newname

                    atype.name = request.form.get('edit_name')
                    atype.keywords = request.form.get('edit_keywords')
                    atype.interpreter = request.form.get('edit_interpreter')
                    atype.attributes = dict(zip(request.form.getlist('attribute_name'), request.form.getlist('attribute_value')))
                    atype.translations = dict(zip(request.form.getlist('alarmtypevariables'), request.form.getlist('alarmtypetranslation')))
                    db.session.commit()

                    if request.form.get('type_id') == 'None':  # add predefined keywords and sections
                        # add pre-defined sections
                        for checker in [i for i in impl if i[0] == request.form.get('edit_interpreter')]:
                            if request.form.get('edit_keywords') == "":
                                atype.keywords = "\n".join(checker[1].getDefaultConfig()['keywords'])
                            sections = checker[1].getDefaultConfig()['sections']
                            i = 1
                            for key in sections:
                                db.session.add(AlarmSection(atype.id, key, sections[key][0], 1, sections[key][1], i))
                                i += 1
                        db.session.commit()

                elif request.form.get('action').startswith('createsection_'):  # add section
                    alarmtype = AlarmType.getAlarmTypes(id=int(request.form.get('action').split('_')[-1]))
                    params.update({'alarmtype': alarmtype, 'section': AlarmSection(alarmtype.id, '', '', 0, '', 0), 'functions': alarmtype.interpreterclass().getEvalMethods()})
                    return render_template('admin.alarms.sections_actions.html', **params)

                elif request.form.get('action') == 'updatesection':  # save section
                    db.session.rollback()
                    if request.form.get('section_id') == 'None':  # add
                        section = AlarmSection(request.form.get('edit_tid'), '', '', '', '', '')
                        section.orderpos = 1 + len(AlarmSection.getSections())
                        db.session.add(section)

                    else:  # update
                        section = AlarmSection.getSections(id=int(request.form.get('section_id')))
                        section.orderpos = request.form.get('edit_orderpos')

                    section.tid = request.form.get('edit_tid')
                    section.name = request.form.get('edit_name')
                    section.key = request.form.get('edit_key')
                    section.method = request.form.get('edit_method')
                    section.active = request.form.get('edit_active')
                    alarmtype = AlarmType.getAlarmTypes(request.form.get('edit_tid'))
                    if alarmtype.interpreterclass().configtype == 'generic':
                        attrs = {'start': request.form.get('edit_start'), 'end': request.form.get('edit_end')}
                        if 'edit_multiline' in request.form.keys():
                            attrs['multiline'] = 'True'
                        section.attributes = attrs
                    db.session.commit()

                elif request.form.get('action') == 'updateorder':
                    for item in [i for i in request.form if i.startswith('position_')]:
                        ids = request.form.getlist(item)
                        for _id in ids:
                            AlarmSection.getSections(id=_id).orderpos = ids.index(_id) + 1
                    db.session.commit()

                elif request.form.get('action').startswith('editalarmsection_'):  # edit section
                    section = AlarmSection.getSections(id=int(request.form.get('action').split('_')[-1]))
                    params.update({'section': section, 'functions': section.alarmtype.interpreterclass().getEvalMethods(), 'alarmtype': AlarmType.getAlarmTypes(section.tid)})
                    return render_template('admin.alarms.sections_actions.html', **params)

                elif request.form.get('action').startswith('deletealarmsection_'):  # delete section
                    section = AlarmSection.getSections(id=int(request.form.get('action').split('_')[-1]))
                    db.session.delete(section)
                    db.session.commit()

            params.update({'alarmtypes': AlarmType.getAlarmTypes(), 'interpreters': impl})
            return render_template('admin.alarms.type.html', **params)

        elif module[1] == 'report':

            if request.method == 'POST':
                if request.form.get('action') == 'createreport':  # add report
                    params.update({'report': AlarmReport('', '', '', 1, []), 'departments': Department.getDepartments(), 'reporttypes': AlarmReport.getReportTypes()})
                    return render_template('admin.alarms.report_action.html', **params)

                elif request.form.get('action') == 'updatereport':
                    if request.form.get('report_id') == 'None':  # add new report
                        report = AlarmReport('', '', '', '')
                        db.session.add(report)
                    else:
                        report = AlarmReport.getReports(request.form.get('report_id'))

                    report.name = request.form.get('edit_name')
                    if not request.form.get('template').startswith(current_app.config.get('PATH_DATA')):  # internal template
                        report._reporttype = 'internal'
                        report.filename = request.form.get('template').replace("{}/emonitor/modules/alarms/templates/".format(current_app.config.get('PROJECT_ROOT')).replace('\\', '/'), "")
                    else:
                        report._reporttype = 'external'
                        report.filename = request.form.get('template').replace("{}".format(current_app.config.get('PATH_DATA')), "")
                        report.fields = json.loads(request.form.get('fielddefinition'))
                    report.departments = request.form.getlist('edit_department')
                    db.session.commit()

                elif request.form.get('action').startswith('editreport_'):  # edit report
                    report = AlarmReport.getReports(request.form.get('action').split('_')[-1])
                    params.update({'report': report, 'departments': Department.getDepartments(), 'reporttypes': AlarmReport.getReportTypes(), 'alarmfields': AlarmField.getAlarmFields()})
                    return render_template('admin.alarms.report_action.html', **params)

                elif request.form.get('action').startswith('deletereport_'):  # delete report
                    report = AlarmReport.getReports(request.form.get('action').split('_')[-1])
                    if AlarmReport.query.filter(AlarmReport.filename == report.filename).count() == 1 and os.path.exists(report.filename):
                        os.remove(report.filename)
                    db.session.delete(report)
                    db.session.commit()

            params.update({'reports': AlarmReport.getReports(), 'departments': Department.getDepartments()})
            return render_template('admin.alarms.report.html', **params)

        elif module[1] == 'config':
            if request.method == 'POST':
                if request.form.get('action') == 'alarmcarsprio':
                    for k in Alarm.ALARMSTATES.keys():
                        if 'used_cars{}'.format(k) in request.form.keys():
                            Settings.set('alarms.spc_cars.{}'.format(k), request.form.get('used_cars{}'.format(k)))
                    db.session.commit()

                elif request.form.get('action') == 'alarmsettings':
                    Settings.set('alarms.autoclose', request.form.get('settings.autoclose'))
                    for aalarm in [a for a in Alarm.getAlarms() if a.state == 1]:  # only active alarms
                        aalarm.updateSchedules(reference=1)  # use alarmtime as refernce

                elif request.form.get('action') == 'archivesettings':
                    Settings.set('alarms.autoarchive', request.form.get('settings.autoarchive'))
                    for aalarm in [a for a in Alarm.getAlarms() if a.state == 2]:  # only closed alarms
                        aalarm.updateSchedules(reference=1)  # use alarmtime as refernce

                elif request.form.get('action').startswith('save_'):
                    if request.form.get('fieldid') == 'None':
                        field = AlarmField.getAlarmFieldForType(request.form.get('action').split('_')[1], dept=request.form.get('action').split('_')[2])
                        db.session.add(field)
                    else:
                        field = AlarmField.getAlarmFields(id=request.form.get('fieldid'))
                    field.saveConfigForm(request)
                    db.session.commit()

                elif request.form.get('action').startswith('field_delete_'):  # delete definition of field
                    db.session.delete(AlarmField.getAlarmFields(id=request.form.get('action').split('_')[-1]))
                    db.session.commit()

                elif request.form.get('action').startswith('field_add_'):  # add field for department
                    field = AlarmField.getAlarmFieldForType(request.form.get('action').split('_')[-2], dept=request.form.get('action').split('_')[-1])
                    field.name = babel.gettext(field.name)
                    db.session.add(field)
                    db.session.commit()

            fields = {}
            for dept in Department.getDepartments():
                fields[dept.id] = AlarmField.getAlarmFieldsForDepartment(dept.id)
            params.update({'cars': Car.getCars(), 'alarmstates': Alarm.ALARMSTATES, 'settings': Settings, 'departments': Department.getDepartments(), 'fields': fields})
            return render_template('admin.alarms.config.html', **params)

        elif module[1] == 'test':
            params.update({'uploadfileformat': filter(None, sum([Settings.get('ocr.inputformat', []), Settings.get('ocr.inputtextformat', [])], []))})
            return render_template('admin.alarms.test.html', **params)

    else:
        params.update({'alarms': dict(Alarm.getAlarmCount()), 'alarmstates': Alarm.ALARMSTATES, 'help': self.hasHelp('admin')})
        return render_template('admin.alarms.html', **params)
Exemplo n.º 6
0
import os
import logging
from emonitor.extensions import events
from emonitor.modules.settings.settings import Settings

logger = logging.getLogger(__name__)
BEFORE = AFTER = {}

events.addEvent("file_added", handlers=[], parameters=["out.incomepath", "out.filename"])
events.addEvent("file_removed", handlers=[], parameters=["out.incomepath", "out.filename"])

OBSERVERACTIVE = 1
ERROR_RAISED = 0

FILES = []
INPUTFORMAT = Settings.get("ocr.inputformat", ["pdf"]) + Settings.get("ocr.inputtextformat", [])


def observeFolder(**kwargs):
    """
    Observer method to observe given folder
    :param kwargs:
    """
    global BEFORE, AFTER, FILES, ERROR_RAISED

    if OBSERVERACTIVE == 0:
        return

    if "path" in kwargs:
        path = kwargs["path"]
    else:
Exemplo n.º 7
0
    def __init__(self, app):
        """
        Add specific parameters and configuration to app object

        :param app: flask wsgi application
        """
        Module.__init__(self, app)
        # add template path
        app.jinja_loader.searchpath.append(
            "{}/emonitor/modules/alarms/templates".format(
                app.config.get('PROJECT_ROOT')))

        # subnavigation
        self.adminsubnavigation = [
            ('/admin/alarms', 'alarms.base'),
            ('/admin/alarms/types', 'module.alarms.types'),
            ('/admin/alarms/report', 'module.alarms.report'),
            ('/admin/alarms/config', 'module.alarms.config'),
            ('/admin/alarms/test', 'module.alarms.test')
        ]

        # create database tables
        from emonitor.modules.alarms.alarm import Alarm
        from emonitor.modules.alarms.alarmhistory import AlarmHistory
        from emonitor.modules.alarms.alarmattribute import AlarmAttribute
        from emonitor.modules.alarms.alarmsection import AlarmSection
        from emonitor.modules.alarms.alarmtype import AlarmType

        self.widgets = [
            AlarmIncomeWidget('alarms_income'),
            AlarmWidget('alarms'),
            AlarmTimerWidget('alarms_timer'),
            AlarmRemarkWidget('alarms_remark')
        ]

        # eventhandlers
        for f in [
                f for f in os.listdir('{}/emonitor/modules/alarms/inc/'.format(
                    app.config.get('PROJECT_ROOT'))) if f.endswith('.py')
        ]:
            if not f.startswith('__'):
                cls = imp.load_source(
                    'emonitor.modules.alarms.inc',
                    '{}/emonitor/modules/alarms/inc/{}'.format(
                        app.config.get('PROJECT_ROOT'), f))
                checker = getattr(cls, cls.__all__[0])()
                if isinstance(checker,
                              AlarmFaxChecker) and checker.getId() != 'Dummy':
                    for at in AlarmType.getAlarmTypes():
                        if at.interpreter == f:
                            events.addEvent('alarm_added.{}'.format(at.name),
                                            handlers=[],
                                            parameters=['out.alarmid'])
                            events.addEvent(
                                'alarm_changestate.{}'.format(at.name),
                                handlers=[],
                                parameters=['out.alarmid', 'out.state'])

        events.addEvent('alarm_added', handlers=[],
                        parameters=['out.alarmid'])  # for all checkers
        events.addEvent('alarm_changestate',
                        handlers=[],
                        parameters=['out.alarmid',
                                    'out.state'])  # for all checkers

        events.addHandlerClass('file_added',
                               'emonitor.modules.alarms.alarm.Alarms',
                               Alarm.handleEvent,
                               ['in.text', 'out.id', 'out.fields'])
        events.addHandlerClass('file_added',
                               'emonitor.modules.alarms.alarmtype.AlarmTypes',
                               AlarmType.handleEvent, ['in.text', 'out.type'])

        events.addHandlerClass('incoming_serial_data',
                               'emonitor.modules.alarms.alarm.Alarms',
                               Alarm.handleSerialEvent,
                               ['in.text', 'out.id', 'out.fields'])
        events.addHandlerClass('incoming_serial_data',
                               'emonitor.modules.alarms.alarmtype.AlarmTypes',
                               AlarmType.handleEvent, ['in.text', 'out.type'])

        # signals and handlers
        signal.addSignal('alarm', 'changestate')
        signal.addSignal('alarm', 'added')
        signal.addSignal('alarm', 'updated')
        signal.addSignal('alarm', 'error')
        signal.connect('alarm', 'changestate',
                       frontendAlarmHandler.handleAlarmChanges)
        signal.connect('alarm', 'added',
                       frontendAlarmHandler.handleAlarmChanges)
        signal.connect('alarm', 'updated',
                       frontendAlarmHandler.handleAlarmChanges)
        signal.connect('alarm', 'deleted',
                       frontendAlarmHandler.handleAlarmChanges)
        signal.connect('alarm', 'error',
                       frontendAlarmHandler.handleAlarmErrors)

        signal.connect('alarm', 'testupload_start',
                       adminAlarmHandler.handleAlarmTestUpload)

        # static folders
        @app.route('/alarms/inc/<path:filename>')
        def alarms_static(filename):
            if filename.startswith('sample_'):  # deliver sample checker file
                clsname = filename.split('_')[1]
                return Response(AlarmType.getAlarmTypes(
                    clsname).interpreterclass().getSampleLayout(),
                                mimetype="image/jpeg")

            return send_from_directory(
                "{}/emonitor/modules/alarms/inc/".format(
                    app.config.get('PROJECT_ROOT')), filename)

        @app.route('/alarms/export/<path:filename>'
                   )  # filename = [id]-[style].pdf
        def export_static(filename):
            filename, extension = os.path.splitext(filename)
            try:
                id, template = filename.split('-')
                if extension not in ['.pdf', '.html', '.png']:
                    abort(404)
                elif extension == '.pdf':
                    return Response(Module.getPdf(
                        Alarm.getExportData('.html',
                                            id=id,
                                            style=template,
                                            args=request.args)),
                                    mimetype="application/pdf")
                elif extension == '.html':
                    return Response(Alarm.getExportData(extension,
                                                        id=id,
                                                        style=template,
                                                        args=request.args),
                                    mimetype="text/html")
                elif extension == '.png':
                    return Response(Alarm.getExportData(extension,
                                                        id=id,
                                                        style=template,
                                                        filename=filename,
                                                        args=request.args),
                                    mimetype="image/png")
            except ValueError:
                return abort(404)

        # add reportfolder
        if not os.path.exists('{}/alarmreports/'.format(
                app.config.get('PATH_DATA'))):
            os.makedirs('{}/alarmreports/'.format(app.config.get('PATH_DATA')))

        # translations
        babel.gettext(u'module.alarms')
        babel.gettext(u'alarms.base')
        babel.gettext(u'module.alarms.types')
        babel.gettext(u'module.alarms.report')
        babel.gettext(u'module.alarms.config')
        babel.gettext(u'module.alarms.test')
        babel.gettext(u'alarms_income')
        babel.gettext(u'alarms_timer')
        babel.gettext(u'alarms_remark')
        babel.gettext(u'alarms')
        babel.gettext(u'alarms.prio0')
        babel.gettext(u'alarms.prio1')
        babel.gettext(u'alarms.prio2')
        babel.gettext(u'emonitor.modules.alarms.alarm.Alarms')
        babel.gettext(u'emonitor.modules.alarms.alarmtype.AlarmTypes')
        babel.gettext(u'alarms.test.protocol')
        babel.gettext(u'alarms.test.result')
        babel.gettext(u'alarmstate.active')
        babel.gettext(u'alarmstate.created')
        babel.gettext(u'alarmstate.done')
        babel.gettext(u'alarmstate.archive')
        babel.gettext(u'active')
        babel.gettext(u'created')
        babel.gettext(u'done')
        babel.gettext(u'archive')
        babel.gettext(u'alarms.statechangeactivated')
        babel.gettext(u'alarms.prioshort0')
        babel.gettext(u'alarms.prioshort1')
        babel.gettext(u'alarms.prioshort2')
        babel.gettext(u'alarms.carsinuse')
        babel.gettext(u'history.autochangeState')
        babel.gettext(u'history.message')
        babel.gettext(u'trigger.alarm_added')
        babel.gettext(u'trigger.alarm_changestate')

        babel.gettext(u'trigger.alarm_added_sub')
        babel.gettext(u'trigger.alarm_changestate_sub')

        babel.gettext(u'alarms.print.slightleft')
        babel.gettext(u'alarms.print.slightright')
        babel.gettext(u'alarms.print.right')
        babel.gettext(u'alarms.print.left')
        babel.gettext(u'alarms.print.straight')
        babel.gettext(u'alarms.print.exit')
        babel.gettext(u'alarms.print.bus')
        babel.gettext(u'alarms.print.positive')
        babel.gettext(u'alarms.print.negative')

        babel.gettext(u'alarms.filter.0')
        babel.gettext(u'alarms.filter.1')
        babel.gettext(u'alarms.filter.7')
        babel.gettext(u'alarms.filter.31')

        babel.gettext(u'internal')
        babel.gettext(u'external')

        babel.gettext(u'AFAlerting')
        babel.gettext(u'AFCars')
        babel.gettext(u'AFMaterial')
        babel.gettext(u'AFReport')
        babel.gettext(u'AFTime')
        babel.gettext(u'AFDamage')
        babel.gettext(u'AFOthers')
        babel.gettext(u'AFPersons')

        babel.gettext(u'alarms.fields.simple')
        babel.gettext(u'alarms.fields.extended')
        babel.gettext(u'alarms.fields.persons.field.sum')
        babel.gettext(u'alarms.fields.persons.field.house')
        babel.gettext(u'alarms.fields.persons.field.pa_alarm')
        babel.gettext(u'alarms.fields.persons.field.el')
        babel.gettext(u'alarms.fields.persons.field.alarm')
        babel.gettext(u'alarms.fields.persons.field.pa')
        babel.gettext(u'alarms.fields.persons.field.pa_house')
        babel.gettext(u'alarms.fields.persons.field.elgrade')
        babel.gettext(u'alarms.fields.persons.field.style.simple')
        babel.gettext(u'alarms.fields.persons.field.style.extended')

        # init
        # Do init script for alarms at start and add alarms (state = 1 or 2) (active or done)
        for aalarm in Alarm.query.filter(Alarm.state == 1
                                         or Alarm.state == 2).all():
            aalarm.updateSchedules(reference=1)