Example #1
0
class error_process(object):
    '''
    FUNCIONES USADAS POR ctrl_error_frec.py
    '''
    def __init__(self, LIST_CONFIG):
        '''
        Constructor
        '''
        #
        self.config = config_var(LIST_CONFIG)
        #
        #VARIABLES DE EJECUCION
        self.print_log = self.config.lst_get('print_log')
        self.LOG_LEVEL = self.config.lst_get('LOG_LEVEL')
        self.DLGID = self.config.lst_get('DLGID')
        self.TYPE = self.config.lst_get('TYPE')
        #
        #VARIABLES DE CONFIGURACION
        self.SWITCH_OUTPUTS = str2bool(self.config.lst_get('SWITCH_OUTPUTS'))
        self.TEST_OUTPUTS = str2bool(self.config.lst_get('TEST_OUTPUTS'))
        self.RESET_ENABLE = str2bool(self.config.lst_get('RESET_ENABLE'))
        self.EVENT_DETECTION = str2bool(self.config.lst_get('EVENT_DETECTION'))
        self.TIMER_POLL = str2bool(self.config.lst_get('TIMER_POLL'))
        #

        # INSTANCIAS
        self.logs = ctrl_logs(self.TYPE, 'CTRL_FREC_error', self.DLGID,
                              self.print_log, self.LOG_LEVEL)

        self.redis = Redis()

    def test_tx(self):
        '''
        detecta errores tx y RTC
        return '' =>     si no existe el line del datalogger
        return False =>  si hay errores TX de cualquier tipo
        return True =>   cualquier otra opcion
        '''

        name_function = 'TEST_TX_ERRORS'

        # CHEQUEO DE ERROR TX
        #

        # CHEQUEO SI EXISTE EL LINE EN EL DATALOGGER
        if not (self.redis.hexist(self.DLGID, 'LINE')):
            return 'noLine'

        # DEVUELVO last_line CON EL LINE ANTERIOR Y current_line CON EL LINE ACTUAL
        if self.redis.hexist(f'{self.DLGID}_ERROR', 'last_line'):
            last_line = self.redis.hget(f'{self.DLGID}_ERROR', 'last_line')
            current_line = self.redis.hget(self.DLGID, 'LINE')
            self.redis.hset(f'{self.DLGID}_ERROR', 'last_line', current_line)
        else:
            last_line = self.redis.hget(self.DLGID, 'LINE')
            self.redis.hset(f'{self.DLGID}_ERROR', 'last_line', last_line)
            current_line = last_line
            return True

        # ASIGNO EL VALOR DE LA BATERIA PARA MOSTRARLO EN LOS LOGS
        if read_param(self.DLGID, 'BAT'):
            bat = read_param(self.DLGID, 'BAT')
        else:
            bat = read_param(self.DLGID, 'bt')

        def error_1min_TX(self):
            '''
            return True si hubo error de TX durante un minuto
            return False si no hubo error de TX durante un minuto
            '''

            if last_line == current_line:
                #
                return True
            else:
                #
                self.logs.print_inf(name_function, 'TX OK')
                #
                return False

        def RTC_error(self, error_1min):
            '''
            return False: si no se comprueba el RTC por error_1min
                          si no hay errores RTC
            return True:  si hay errores TRC 
                          
            '''

            # COMPRUEBO ERROR RTC SOLO SI NO HAY ERROR TX
            if error_1min: return False

            # DEVUELVO LOS VALORES DE last_fecha_data y last_hora_data asi como fecha_data y hora_data
            if self.redis.hexist(f'{self.DLGID}_ERROR',
                                 'last_fecha_data') & self.redis.hexist(
                                     f'{self.DLGID}_ERROR', 'last_hora_data'):
                last_fecha_data = self.redis.hget(f'{self.DLGID}_ERROR',
                                                  'last_fecha_data')
                last_hora_data = self.redis.hget(f'{self.DLGID}_ERROR',
                                                 'last_hora_data')
                fecha_data = read_param(self.DLGID, 'DATE')
                hora_data = read_param(self.DLGID, 'TIME')
                #
                # ACTUALIZO last_fecha_data Y last_hora_data CON LOS VALORES ACTUALES
                self.redis.hset(f'{self.DLGID}_ERROR', 'last_fecha_data',
                                fecha_data)
                self.redis.hset(f'{self.DLGID}_ERROR', 'last_hora_data',
                                hora_data)
            else:
                fecha_data = read_param(self.DLGID, 'DATE')
                hora_data = read_param(self.DLGID, 'TIME')
                last_fecha_data = fecha_data
                last_hora_data = hora_data
                #
                # ACTUALIZO last_fecha_data Y last_hora_data CON LOS VALORES ACTUALES
                self.redis.hset(f'{self.DLGID}_ERROR', 'last_fecha_data',
                                fecha_data)
                self.redis.hset(f'{self.DLGID}_ERROR', 'last_hora_data',
                                hora_data)
                #
                return False
            #
            # CHEQUEO QUE NO ESTE CAMBIANDO LA FECHA Y HORA
            if fecha_data == last_fecha_data and hora_data == last_hora_data:
                self.logs.print_inf(name_function, 'RTC ERROR')
                self.logs.dlg_performance(f'< RTC ERROR >')
                return True
            else:
                self.logs.print_inf(name_function, 'RTC OK')
                return False

        def error_10min_TX(self, error_1min):
            '''
            return True si hubo error de TX durante mas 10 minuto
            return False si se restablece la cominicacion
            '''

            if error_1min:
                # INICIALIZO EL CONTADOR DE MINUTOS CON ERORR TX
                if not (self.redis.hexist(f'{self.DLGID}_ERROR',
                                          'count_error_tx')):
                    self.redis.hset(f'{self.DLGID}_ERROR', 'count_error_tx', 1)

                # LEO EL CONTADOS DE TIEMPO
                count_error_tx = int(
                    self.redis.hget(f'{self.DLGID}_ERROR', 'count_error_tx'))

                # VEO EL ESTADO DEL CONTADOR
                if count_error_tx >= 10:
                    #
                    return True
                else:
                    self.logs.print_inf(
                        name_function,
                        f'CONTADOR DE ERROR TX [{count_error_tx}]')
                    count_error_tx += 1
                    self.redis.hset(f'{self.DLGID}_ERROR', 'count_error_tx',
                                    count_error_tx)
                    #
                    return False
            else:
                if self.redis.hexist(f'{self.DLGID}_ERROR', 'count_error_tx'):
                    self.redis.hdel(f'{self.DLGID}_ERROR', 'count_error_tx')
                #
                return False

        def error_TPOLL_TX(self, timer_poll, error_1min):
            '''
            return True si hubo error de TX durante mas TPOLL minutos
            return False si se restablece la cominicacion
            '''

            if error_1min:
                # INICIALIZO EL CONTADOR DE MINUTOS CON ERORR TX
                if not (self.redis.hexist(f'{self.DLGID}_ERROR',
                                          'count_error_tx')):
                    self.redis.hset(f'{self.DLGID}_ERROR', 'count_error_tx', 1)

                # LEO EL CONTADOS DE TIEMPO
                count_error_tx = int(
                    self.redis.hget(f'{self.DLGID}_ERROR', 'count_error_tx'))

                # VEO EL ESTADO DEL CONTADOR
                if count_error_tx >= timer_poll:
                    #
                    return True
                else:
                    self.logs.print_inf(
                        name_function,
                        f'CONTADOR DE ERROR TX [{count_error_tx}]')
                    count_error_tx += 1
                    self.redis.hset(f'{self.DLGID}_ERROR', 'count_error_tx',
                                    count_error_tx)
                    #
                    return False
            else:
                if self.redis.hexist(f'{self.DLGID}_ERROR', 'count_error_tx'):
                    self.redis.hdel(f'{self.DLGID}_ERROR', 'count_error_tx')
                #
                return False

        # SI TENGO TIMER_POLL
        if self.config.lst_get('TIMER_POLL'):
            # LERO EL VALOR DE TPOLL PASADO
            timer_poll = int(self.config.lst_get('TIMER_POLL'))
            #
            # CHEQUEO ERROR TX DURANTE UN MINUTO
            error_1min = error_1min_TX(self)
            #
            # CHEQUEO ERROR DE RTC
            RTC_error(self, error_1min)
            #
            # CHEQUEO ERRORES TX EN EL TPOLL DADO
            error_TPOLL = error_TPOLL_TX(self, timer_poll, error_1min)
            #
        else:
            # CHEQUEO ERROR TX DURANTE UN MINUTO
            error_1min = error_1min_TX(self)
            #
            # CHEQUEO ERROR DE RTC
            RTC_error(self, error_1min)
            #
            # CHEQUEO ERROR TX DURANTE 10 MINUTOS
            error_10min = error_10min_TX(self, error_1min)
            #

        # TRABAJO LOS LOGS
        if self.config.lst_get('TIMER_POLL'):
            if error_TPOLL:
                # MUESTRO LOG EN CONSOLA
                self.logs.print_inf(
                    name_function,
                    f'TX STOPPED FOR MORE THAN {timer_poll} MIN')
                #
                # ESCRIBO EN EL LOG
                self.logs.dlg_performance(
                    f'< MAS DE {timer_poll} MIN CAIDO > [BAT = {bat}]')
                #
                return False
            else:
                return True
        else:
            if error_10min:
                #
                # MUESTRO LOG EN CONSOLA
                self.logs.print_inf(name_function,
                                    'TX STOPPED FOR MORE THAN 10 MIN')
                self.logs.print_out(name_function,
                                    dic.get_dic('TX_ERROR', 'name'),
                                    dic.get_dic('TX_ERROR', 'True_value'))
                #
                # ESCRIBO EN EL LOG
                self.logs.dlg_performance(
                    f'< MAS DE 10 MIN CAIDO > [BAT = {bat}]')
                #
                # ESCRIBO EN REDIS LA ALARMA TX_ERROR CON VALOR DE ALARMA PRENDIDA
                self.redis.hset(self.DLGID, dic.get_dic('TX_ERROR', 'name'),
                                dic.get_dic('TX_ERROR', 'True_value'))
                #
                return False
            else:
                #
                # ESCRIBO EN REDIS LA ALARMA TX_ERROR CON VALOR DE ALARMA APAGADA
                self.redis.hset(self.DLGID, dic.get_dic('TX_ERROR', 'name'),
                                dic.get_dic('TX_ERROR', 'False_value'))
                #
                #MUESTRO LOGS EN CONSOLA DE QUE SE ESCRIBIO LA ALARMA DE ERROR TX EN REDIS
                self.logs.print_out(name_function,
                                    dic.get_dic('TX_ERROR', 'name'),
                                    dic.get_dic('TX_ERROR', 'False_value'))
                #
                if error_1min:
                    # MUESTRO LOG EN CONSOLA
                    self.logs.print_inf(name_function, 'TX STOPPED')
                    #
                    # ESCRIBO EN REDIS ALARMA DE 1MIN EL EQUIPO CAIDO
                    self.redis.hset(self.DLGID, 'error_1min', 'SI')
                    #
                    # ESCRIBO EN EL LOG
                    self.logs.dlg_performance(f'< ERROR TX > [BAT = {bat}]')
                    #
                    return False
                else:
                    #
                    # ESCRIBO EN REDIS ALARMA DE 1MIN QUE INDICA QUE EL DATO QUE ESTA LLEGADNO ES VALIDO
                    self.redis.hset(self.DLGID, 'error_1min', 'NO')
                    #
                    return True

    def visual(self):
        pass

    def event_detection(self):

        name_function = 'EVENT_DETECTION'

        # SI EVENT_DETECTION ES False INTERRUMPO LA FUNCION
        if not (self.EVENT_DETECTION == None):
            if not (self.EVENT_DETECTION):
                self.logs.print_inf(name_function,
                                    'EVENT_DETECTION INHABILITADO')
                return

        # PIERTA DEL GABINETE
        if read_param(self.DLGID, 'GA') == '1':
            self.logs.print_inf(name_function, 'GABINETE_ABIERTO')
            #
            # ESCRIBO EN EL LOG
            self.logs.dlg_performance(f'< {name_function} > GABINETE_ABIERTO')

        # FALLA ELECTRICA
        if read_param(self.DLGID, 'FE') == '1':
            self.logs.print_inf(name_function, 'FALLA_ELECTRICA')
            #
            # ESCRIBO EN EL LOG
            self.logs.dlg_performance(f'< {name_function} > FALLA_ELECTRICA')

        # FALLA TERMICA 1
        if read_param(self.DLGID, 'FT1') == '1':
            self.logs.print_inf(name_function, 'FALLA_TERMICA_1')
            #
            # ESCRIBO EN EL LOG
            self.logs.dlg_performance(f'< {name_function} > FALLA_TERMICA_1')

        # TRABAJO EN MODO LOCAL
        if read_param(self.DLGID, 'LM') == '1':
            self.logs.print_inf(name_function, 'MODO_LOCAL')
            #
            # ESCRIBO EN EL LOG
            self.logs.dlg_performance(f'< {name_function} > MODO_LOCAL')

        # TRABAJO EN MODO REMOTO
        if self.redis.hget(self.DLGID,
                           dic.get_dic('WEB_MODE', 'name')) == dic.get_dic(
                               'WEB_MODE', 'False_value'):
            #
            # CHEQUEO QUE SE ESTE MANDANDO A PRENDER LA BOMBA
            if self.redis.hget(self.DLGID,
                               dic.get_dic('PUMP_1_WEB_MODE',
                                           'name')) == dic.get_dic(
                                               'PUMP_1_WEB_MODE',
                                               'True_value'):
                #
                # ESCRIBO EN EL LOG
                PUMP_FREC = self.redis.hget(self.DLGID,
                                            dic.get_dic('PUMP_FREC', 'name'))
                self.logs.print_inf(
                    name_function,
                    f'MODO REMOTO => PRENDER BOMBA [ PUMP_FREC = {PUMP_FREC} ]'
                )
                self.logs.dlg_performance(
                    f'< {name_function} > MODO REMOTO => PRENDER BOMBA [ PUMP_FREC = {PUMP_FREC} ]'
                )
                #
            elif self.redis.hget(self.DLGID,
                                 dic.get_dic('PUMP_1_WEB_MODE',
                                             'name')) == dic.get_dic(
                                                 'PUMP_1_WEB_MODE',
                                                 'False_value'):
                # ESCRIBO EN EL LOG
                self.logs.print_inf(name_function,
                                    f'MODO REMOTO => APAGAR BOMBA')
                self.logs.dlg_performance(
                    f'< {name_function} > MODO REMOTO => APAGAR BOMBA')

        # TRABAJO EN MODO EMERGENCIA
        if self.redis.hget(
                self.DLGID, dic.get_dic('WEB_MODE', 'name')) == dic.get_dic(
                    'WEB_MODE', 'value_1') or self.redis.hget(
                        self.DLGID, dic.get_dic('WEB_MODE',
                                                'name')) == dic.get_dic(
                                                    'WEB_MODE', 'value_2'):
            #
            # ESCRIBO EN EL LOG
            self.logs.print_inf(name_function, f'MODO BOYA O TIMER')
            self.logs.dlg_performance(f'< {name_function} > MODO BOYA O TIMER')

        # TRABAJO CON EL SISTEMA DE REFERENCIA_1
        if self.redis.hget(self.DLGID, 'flag_work_syst_ref_1') == 'SI':
            #
            FREC = self.redis.hget(self.DLGID, 'FREC')
            #
            # ESCRIBO EN EL LOG
            self.logs.print_inf(
                name_function,
                f'TRABAJO CON LA REFERENCIA_1 [ FREC = {FREC} ]')
            self.logs.dlg_performance(
                f'< {name_function} > TRABAJO CON LA REFERENCIA_1 [ FREC = {FREC} ]'
            )

        # TRABAJO CON FRECUENCIA MAXIMA
        if int(self.redis.hget(self.DLGID, 'FREC')) == 7:
            self.logs.dlg_performance(
                f'< {name_function} > SE ALCANZA FRECUENCIA MAXIMA')

    def switch_outputs(self):

        name_function = 'SWITCH_OUTPUTS'

        #
        # SI ESTA HABILITADO EL SWITCH_OUTPUTS
        if not (self.SWITCH_OUTPUTS):
            self.logs.print_inf(name_function, 'SWITCH_OUTPUTS INHABILITADO')
            #
            # ELIMINO EL MONITOR DE ESTADOS DE REDIS EN CASO DE QUE EXISTA
            if self.redis.hexist(f'{self.DLGID}_ERROR', 'outputs_states'):
                self.redis.hdel(f'{self.DLGID}_ERROR', 'outputs_states')
            return

        # PREPARO INDICADOR DE ESTADOS
        if not (self.redis.hexist(f'{self.DLGID}_ERROR', 'outputs_states')):
            self.redis.hset(f'{self.DLGID}_ERROR', 'outputs_states', 0)
            outputs_states = 0
        else:
            outputs_states = int(
                self.redis.hget(f'{self.DLGID}_ERROR', 'outputs_states'))

        # DETECTO QUE TIPO DE AUTOMATISMO TENGO PARA EJECUTAR EL SWITCH DE LAS SALIDAS
        if self.TYPE == 'CTRL_FREC':
            # PASO POR ESTADOS
            if outputs_states == 0:
                DO_0 = 0
                DO_1 = 0
            elif outputs_states == 1:
                DO_0 = 1
                DO_1 = 0
            elif outputs_states == 2:
                DO_0 = 0
                DO_1 = 1
            elif outputs_states == 3:
                DO_0 = 1
                DO_1 = 1

            if outputs_states == 3:
                outputs_states = 0
            else:
                outputs_states += 1

            # MUESTRO LOGS EN CONSOLA
            self.logs.print_out(name_function, 'DO_0', DO_0)
            self.logs.print_out(name_function, 'DO_1', DO_1)

            # MANDO A SETEAR LAS SALIDAS
            set_outs(self.DLGID, DO_0, DO_1)

            # LATCHEO LAS SALIDAS
            error_process.latch__outpust(self, self.DLGID)

        else:
            self.logs.print_inf(name_function, 'AUTOMATISMO NO RECONOCIDO')
            self.logs.print_out(name_function, 'TYPE', self.TYPE)
            return

        # ESCRIBO EL VALO DEL ESTADO
        self.redis.hset(f'{self.DLGID}_ERROR', 'outputs_states',
                        outputs_states)

    def test_outputs(self):
        '''
        return True =>     SI EL TESTEO FUE SATISFACTORIO
        return False =>    SI HUBO ERRORES E/S
        retur None =>      SI TEST_OUTPUTS INHABILITADO
                           SI SE TRABAJA EN MODO LOCAL O HAY FALLA ELECTRICA
                           OTROS ERRORES
        '''

        name_function = 'TEST_OUTPUTS'

        # SI TEST_OUTPUTS ES False INTERRUMPO LA FUNCION
        # DEJO QUE SE TESTEEN LAS SALIDAS SI NO SE CARGA TEST_OUTPUTS
        if not (self.TEST_OUTPUTS == None):
            if not (self.TEST_OUTPUTS):
                self.logs.print_inf(name_function, 'TEST_OUTPUTS INHABILITADO')
                return None

        # LEO EL VALOR ANTERIOR DE LAS SALIDAS
        last_OUTPUTS = self.redis.hget(self.DLGID, 'last_OUTPUTS')
        #
        # CHEQUEO EL VALOR ANTERIOR DE LAS SALIDAS ES VALIDO
        if not (last_OUTPUTS):
            self.logs.print_inf(name_function,
                                f'NO EXISTE last_OUTPUTS en {self.DLGID}')
            self.logs.print_inf(name_function, 'NO SE TESTEAN SALIDAS')
            return None
        #
        # SELECCIONO EL TEST DE ACUERDO AL TIPO DE AUTOMATISMO
        if self.TYPE == 'CTRL_FREC':
            # DEFINO SALIDAS A TESTEAR
            DO_0 = get_outs(self.DLGID, last_OUTPUTS, 0)
            DO_1 = get_outs(self.DLGID, last_OUTPUTS, 1)
            #
            # DEFINO ENTRADAS A VERIFICAR
            BR1 = int(read_param(self.DLGID, 'BR1'))
            TM = int(read_param(self.DLGID, 'TM'))
            FT1 = int(read_param(self.DLGID, 'FT1'))

            # PREVEO QUE NO SE TESTEEN LAS SALIDAS BAJO MODO LOCAL O FALLA ELECTRICA
            if read_param(self.DLGID, 'LM') == '1' or read_param(
                    self.DLGID, 'FE') == '1':
                self.logs.print_in(name_function, 'LM',
                                   read_param(self.DLGID, 'LM'))
                self.logs.print_in(name_function, 'FE',
                                   read_param(self.DLGID, 'FE'))
                self.logs.print_inf(
                    name_function,
                    'NO SE TESTEAN SALIDAS POR TRABAJO EN MODO LOCAL O FALLA ELECTRICA'
                )
                return None

            # STATE: MODO DE EMERGENCIA
            if DO_0 == 0:
                if TM == 0:
                    if not (BR1 == 0 and FT1 == 0):
                        self.logs.dlg_performance(
                            f'< ERROR_E/S > [ TM = {TM} ], [ DO_1 = {DO_1}, DO_0 = {DO_0} ] <=> [ BR1 = {BR1}, FT1 = {FT1} ]'
                        )
                        self.logs.print_inf(
                            name_function,
                            f'< ERROR_E/S > [ TM = {TM} ] - [ DO_1 = {DO_1}, DO_0 = {DO_0} ] <=> [ BR1 = {BR1}, FT1 = {FT1} ]'
                        )
                        return False
                    else:
                        self.logs.print_inf(name_function, 'OUTPUTS OK')
                        return True
                elif TM == 1:
                    if not (BR1 == 1 or FT1 == 1):
                        self.logs.dlg_performance(
                            f'< ERROR_E/S > [ TM = {TM} ], [ DO_1 = {DO_1}, DO_0 = {DO_0} ] <=> [ BR1 = {BR1}, FT1 = {FT1} ]'
                        )
                        self.logs.print_inf(
                            name_function,
                            f'< ERROR_E/S > [ TM = {TM} ] - [ DO_1 = {DO_1}, DO_0 = {DO_0} ] <=> [ BR1 = {BR1}, FT1 = {FT1} ]'
                        )
                        return False
                    else:
                        self.logs.print_inf(name_function, 'OUTPUTS OK')
                        return True
                else:
                    self.logs.print_inf(
                        name_function,
                        f'VALOR NO RECONOCIDO EN TM [ TM = {TM} ]')
                    self.logs.script_performance(
                        f'VALOR NO RECONOCIDO EN TM [ TM = {TM} ]')
                    return None

            elif DO_0 == 1:
                if DO_1 == 0:
                    if not (BR1 == 0 and FT1 == 0):
                        self.logs.dlg_performance(
                            f'< ERROR_E/S > [ DO_1 = {DO_1}, DO_0 = {DO_0} ] <=> [ BR1 = {BR1}, FT1 = {FT1} ]'
                        )
                        self.logs.print_inf(
                            name_function,
                            f'< ERROR_E/S > [ DO_1 = {DO_1}, DO_0 = {DO_0} ] <=> [ BR1 = {BR1}, FT1 = {FT1} ]'
                        )
                        return False
                    else:
                        self.logs.print_inf(name_function, 'OUTPUTS OK')
                        return True
                elif DO_1 == 1:
                    if not (BR1 == 1 or FT1 == 1):
                        self.logs.dlg_performance(
                            f'< ERROR_E/S > [ DO_1 = {DO_1}, DO_0 = {DO_0} ] <=> [ BR1 = {BR1}, FT1 = {FT1} ]'
                        )
                        self.logs.print_inf(
                            name_function,
                            f'< ERROR_E/S > [ DO_1 = {DO_1}, DO_0 = {DO_0} ] <=> [ BR1 = {BR1}, FT1 = {FT1} ]'
                        )
                        return False
                    else:
                        self.logs.print_inf(name_function, 'OUTPUTS OK')
                        return True
                else:
                    self.logs.print_inf(
                        name_function,
                        f'VALOR NO RECONOCIDO EN DO_1 [ DO_1 = {DO_1} ]')
                    self.logs.script_performance(
                        f'VALOR NO RECONOCIDO EN DO_1 [ DO_1 = {DO_1} ]')
                    return None
            # MODO DE CONTROL
            else:
                self.logs.print_inf(
                    name_function,
                    f'VALOR NO RECONOCIDO EN D0_0 [ DO_0 = {DO_0} ]')
                self.logs.script_performance(
                    f'VALOR NO RECONOCIDO EN D0_0 [ DO_0 = {DO_0} ]')
                return None

    def latch__outpust(self, dlgid):
        if self.redis.hexist(dlgid, 'current_OUTPUTS'):
            last_OUTPUTS = self.redis.hget(dlgid, 'current_OUTPUTS')
            self.redis.hset(dlgid, 'last_OUTPUTS', last_OUTPUTS)

        if self.redis.hget(dlgid, 'OUTPUTS') != '-1':
            current_OUTPUTS = self.redis.hget(dlgid, 'OUTPUTS')
            self.redis.hset(dlgid, 'current_OUTPUTS', current_OUTPUTS)

    def pump_time(self, channel_pump_name, no_pump):
        #
        name_function = f'PUMP{no_pump}_TIME'
        #
        from datetime import datetime, date, time, timedelta
        #
        pump_state = int(read_param(self.DLGID, channel_pump_name))
        #
        # PREPARO VARIABLES DE TIEMPO
        #
        ## TIEMPO TOTAL
        if not (self.redis.hexist(f'{self.DLGID}_ERROR',
                                  f'pump{no_pump}_total_time')):
            self.redis.hset(f'{self.DLGID}_ERROR', f'pump{no_pump}_total_time',
                            '2020,1,1,0,0,0,0')
            pump_total_time = datetime(2020, 1, 1, 0, 0, 0, 0)
            #
            # ESCRIBO LA VARIABLE DE VISUALIZACION
            self.redis.hset(self.DLGID,
                            dic.get_dic(f'PUMP{no_pump}_TOTAL_TIME', 'name'),
                            '0 horas')
        else:
            # OBTENGO pump_total_time EN FORMATO datetime
            str_pump_total_time = self.redis.hget(f'{self.DLGID}_ERROR',
                                                  f'pump{no_pump}_total_time')
            lst_pump_total_time = str_pump_total_time.split(',')
            pump_total_time = datetime(int(lst_pump_total_time[0]),
                                       int(lst_pump_total_time[1]),
                                       int(lst_pump_total_time[2]),
                                       int(lst_pump_total_time[3]),
                                       int(lst_pump_total_time[4]),
                                       int(lst_pump_total_time[5]),
                                       int(lst_pump_total_time[6]))
            #
            # INCREMENTO 1 MINUTO EN pump_total_time SI LA BOMBA ESTA PRENDIDA
            if pump_state == 1:
                # SUMO UN MINUTO AL CONTEO DE TIEMPO
                pump_total_time = pump_total_time + timedelta(minutes=1)
                #
                # VEO LA DIFERENCIA DE TIEMPO RESPECTO A LA REFERENCIA INICIAL
                delta_total_time = pump_total_time - datetime(
                    2020, 1, 1, 0, 0, 0, 0)
                #
                # CONVIERTO LA DIFERENCIA A HORAS
                delta_total_time_hours = int(delta_total_time.days * 24 +
                                             delta_total_time.seconds / 3600)
                #
                # ESCRIBO LA VARIABLE DE VISUALIZACION
                self.redis.hset(
                    self.DLGID, dic.get_dic(f'PUMP{no_pump}_TOTAL_TIME',
                                            'name'),
                    f'{delta_total_time_hours} horas')
                #
                self.logs.print_out(
                    name_function,
                    dic.get_dic(f'PUMP{no_pump}_TOTAL_TIME', 'name'),
                    f'{delta_total_time_hours} horas')
            #
            # GUARDO pump_total_time EN REDIS
            str_pump_total_time = f'{pump_total_time.year},{pump_total_time.month},{pump_total_time.day},{pump_total_time.hour},{pump_total_time.minute},{pump_total_time.second},{pump_total_time.microsecond}'
            self.redis.hset(f'{self.DLGID}_ERROR', f'pump{no_pump}_total_time',
                            str_pump_total_time)
Example #2
0
class errorProcess(object):  
    '''
    FUNCIONES USADAS POR ctrl_error_frec.py
    '''
    
    def __init__(self,LIST_CONFIG):
        '''
        Constructor
        '''
        #
        self.config = config_var(LIST_CONFIG)
        #
        #VARIABLES DE EJECUCION
        self.print_log = self.config.lst_get('print_log')
        self.DLGID = self.config.lst_get('DLGID')
        self.TYPE = self.config.lst_get('TYPE')
        self.LOG_LEVEL = self.config.lst_get('LOG_LEVEL')
        
        #
        #VARIABLES DE CONFIGURACION
        self.SWITCH_OUTPUTS = str2bool(self.config.lst_get('SWITCH_OUTPUTS'))
        self.TEST_OUTPUTS = str2bool(self.config.lst_get('TEST_OUTPUTS'))
        self.RESET_ENABLE = str2bool(self.config.lst_get('RESET_ENABLE'))
        self.EVENT_DETECTION = str2bool(self.config.lst_get('EVENT_DETECTION'))
        self.TIMER_POLL = str2bool(self.config.lst_get('TIMER_POLL'))
        #
        
        # INSTANCIAS
        self.logs = ctrl_logs(self.TYPE,'CTRL_FREC_error',self.DLGID,self.print_log,self.LOG_LEVEL)
        
        self.redis = Redis()   
        
    def test_tx(self):
        '''
        detecta errores tx y RTC
        return '' =>     si no existe el line del datalogger
        return False =>  si hay errores TX de cualquier tipo
        return True =>   cualquier otra opcion
        '''
        
        name_function = 'TEST_TX_ERRORS'
        
        # CHEQUEO DE ERROR TX
        #
        
        # CHEQUEO SI EXISTE EL LINE EN EL DATALOGGER
        if not(self.redis.hexist(self.DLGID, 'LINE')):
            return 'noLine'
        
        # DEVUELVO last_line CON EL LINE ANTERIOR Y current_line CON EL LINE ACTUAL
        if self.redis.hexist(f'{self.DLGID}_ERROR', 'last_line'):
            last_line = self.redis.hget(f'{self.DLGID}_ERROR', 'last_line')
            current_line = self.redis.hget(self.DLGID, 'LINE')
            self.redis.hset(f'{self.DLGID}_ERROR', 'last_line', current_line)
        else:
            last_line = self.redis.hget(self.DLGID, 'LINE')
            self.redis.hset(f'{self.DLGID}_ERROR', 'last_line', last_line)
            current_line = last_line
            return True
            
        # ASIGNO EL VALOR DE LA BATERIA PARA MOSTRARLO EN LOS LOGS
        if read_param(self.DLGID, 'BAT'):
            bat = read_param(self.DLGID, 'BAT')
        else:
            bat = read_param(self.DLGID, 'bt')
        
        
        
        def error_1min_TX(self):
            '''
            return True si hubo error de TX durante un minuto
            return False si no hubo error de TX durante un minuto
            '''
            
            if last_line == current_line:
                #
                return True
            else:
                #
                self.logs.print_inf(name_function, 'TX OK')
                #
                return False
        
        def RTC_error(self,error_1min):
            '''
            return False: si no se comprueba el RTC por error_1min
                          si no hay errores RTC
            return True:  si hay errores TRC 
                          
            '''
            
            # COMPRUEBO ERROR RTC SOLO SI NO HAY ERROR TX
            if error_1min: return False
                
            # DEVUELVO LOS VALORES DE last_fecha_data y last_hora_data asi como fecha_data y hora_data
            if self.redis.hexist(f'{self.DLGID}_ERROR', 'last_fecha_data') & self.redis.hexist(f'{self.DLGID}_ERROR', 'last_hora_data'):
                last_fecha_data = self.redis.hget(f'{self.DLGID}_ERROR', 'last_fecha_data')
                last_hora_data = self.redis.hget(f'{self.DLGID}_ERROR', 'last_hora_data')
                fecha_data = read_param(self.DLGID, 'DATE')
                hora_data = read_param(self.DLGID, 'TIME')
                #
                # ACTUALIZO last_fecha_data Y last_hora_data CON LOS VALORES ACTUALES
                self.redis.hset(f'{self.DLGID}_ERROR', 'last_fecha_data', fecha_data)
                self.redis.hset(f'{self.DLGID}_ERROR', 'last_hora_data', hora_data)
            else:
                fecha_data = read_param(self.DLGID, 'DATE')
                hora_data = read_param(self.DLGID, 'TIME')
                last_fecha_data = fecha_data
                last_hora_data = hora_data
                #
                # ACTUALIZO last_fecha_data Y last_hora_data CON LOS VALORES ACTUALES
                self.redis.hset(f'{self.DLGID}_ERROR', 'last_fecha_data', fecha_data)
                self.redis.hset(f'{self.DLGID}_ERROR', 'last_hora_data', hora_data)
                #
                return False
            #
            # CHEQUEO QUE NO ESTE CAMBIANDO LA FECHA Y HORA
            if fecha_data == last_fecha_data and hora_data == last_hora_data:
                self.logs.print_inf(name_function, 'RTC ERROR')
                self.logs.dlg_performance(f'< RTC ERROR >')
                return True
            else:
                self.logs.print_inf(name_function, 'RTC OK')
                return False
        
        def error_10min_TX(self,error_1min):
            '''
            return True si hubo error de TX durante mas 10 minuto
            return False si se restablece la cominicacion
            '''
            
            if error_1min:
                # INICIALIZO EL CONTADOR DE MINUTOS CON ERORR TX 
                if not(self.redis.hexist(f'{self.DLGID}_ERROR','count_error_tx')):
                    self.redis.hset(f'{self.DLGID}_ERROR', 'count_error_tx', 1)
                
                # LEO EL CONTADOS DE TIEMPO
                count_error_tx = int(self.redis.hget(f'{self.DLGID}_ERROR','count_error_tx'))
                
                # VEO EL ESTADO DEL CONTADOR    
                if count_error_tx >= 10:
                    #
                    return True
                else:
                    self.logs.print_inf(name_function, f'CONTADOR DE ERROR TX [{count_error_tx}]')
                    count_error_tx += 1
                    self.redis.hset(f'{self.DLGID}_ERROR','count_error_tx',count_error_tx)
                    #   
                    return False
            else:
                if self.redis.hexist(f'{self.DLGID}_ERROR','count_error_tx'):
                    self.redis.hdel(f'{self.DLGID}_ERROR','count_error_tx')   
                #
                return False
            
        def error_TPOLL_TX(self,timer_poll,error_1min):
            
            '''
            return True si hubo error de TX durante mas TPOLL minutos
            return False si se restablece la cominicacion
            '''
            
            if error_1min:
                # INICIALIZO EL CONTADOR DE MINUTOS CON ERORR TX 
                if not(self.redis.hexist(f'{self.DLGID}_ERROR','count_error_tx')):
                    self.redis.hset(f'{self.DLGID}_ERROR', 'count_error_tx', 1)
                
                # LEO EL CONTADOS DE TIEMPO
                count_error_tx = int(self.redis.hget(f'{self.DLGID}_ERROR','count_error_tx'))
                
                # VEO EL ESTADO DEL CONTADOR    
                if count_error_tx >= timer_poll:
                    #
                    return True
                else:
                    self.logs.print_inf(name_function, f'CONTADOR DE ERROR TX [{count_error_tx}]')
                    count_error_tx += 1
                    self.redis.hset(f'{self.DLGID}_ERROR','count_error_tx',count_error_tx)
                    #   
                    return False
            else:
                if self.redis.hexist(f'{self.DLGID}_ERROR','count_error_tx'):
                    self.redis.hdel(f'{self.DLGID}_ERROR','count_error_tx')   
                #
                return False
        
        
        # SI TENGO TIMER_POLL
        if self.config.lst_get('TIMER_POLL'):
            # LERO EL VALOR DE TPOLL PASADO
            timer_poll = int(self.config.lst_get('TIMER_POLL'))           
            #
            # CHEQUEO ERROR TX DURANTE UN MINUTO
            error_1min = error_1min_TX(self)
            #
            # CHEQUEO ERROR DE RTC
            RTC_error(self,error_1min)
            #
            # CHEQUEO ERRORES TX EN EL TPOLL DADO
            error_TPOLL = error_TPOLL_TX(self,timer_poll,error_1min)
            #
        else:
            # CHEQUEO ERROR TX DURANTE UN MINUTO
            error_1min = error_1min_TX(self)
            #
            # CHEQUEO ERROR DE RTC
            RTC_error(self,error_1min)
            #
            # CHEQUEO ERROR TX DURANTE 10 MINUTOS
            error_10min = error_10min_TX(self,error_1min)
            #
           
        # TRABAJO LOS LOGS
        if self.config.lst_get('TIMER_POLL'):
            if error_TPOLL:
                # MUESTRO LOG EN CONSOLA
                self.logs.print_inf(name_function, f'TX STOPPED FOR MORE THAN {timer_poll} MIN')
                #
                # ESCRIBO EN EL LOG
                self.logs.dlg_performance(f'< MAS DE {timer_poll} MIN CAIDO >')
                #
                return False
            else:
                return True
        else:    
            if error_10min:
                #
                # MUESTRO LOG EN CONSOLA
                self.logs.print_inf(name_function, 'TX STOPPED FOR MORE THAN 10 MIN')
                self.logs.print_out(name_function, 'TX_ERROR', 'SI')
                #
                # ESCRIBO EN EL LOG
                self.logs.dlg_performance(f'< MAS DE 10 MIN CAIDO > ')
                #
                # ESCRIBO EN REDIS LA ALARMA TX_ERROR CON VALOR DE ALARMA PRENDIDA
                self.redis.hset(self.DLGID,'TX_ERROR', 'SI')
                #
                return False
            else:
                #
                # ESCRIBO EN REDIS LA ALARMA TX_ERROR CON VALOR DE ALARMA APAGADA
                self.redis.hset(self.DLGID, 'TX_ERROR', 'NO')
                #
                #MUESTRO LOGS EN CONSOLA DE QUE SE ESCRIBIO LA ALARMA DE ERROR TX EN REDIS
                self.logs.print_out(name_function,'TX_ERROR', 'NO')
                #
                if error_1min:
                    # MUESTRO LOG EN CONSOLA
                    self.logs.print_inf(name_function, 'TX STOPPED')
                    #
                    # ESCRIBO EN REDIS ALARMA DE 1MIN EL EQUIPO CAIDO
                    self.redis.hset(self.DLGID, 'error_1min', 'SI')
                    #
                    # ESCRIBO EN EL LOG
                    self.logs.dlg_performance(f'< ERROR TX >')
                    #
                    return False
                else:
                    #
                    # ESCRIBO EN REDIS ALARMA DE 1MIN QUE INDICA QUE EL DATO QUE ESTA LLEGADNO ES VALIDO
                    self.redis.hset(self.DLGID, 'error_1min', 'NO')
                    #
                    return True
Example #3
0
class ctrlProcess(object):
    '''
    FUNCIONES USADAS POR ctrl_process_frec.py
    '''
    def __init__(self, LIST_CONFIG):
        '''
        Constructor
        '''
        #
        ## DEFINICION DE VARIABLES DE LA CLASE
        self.config = config_var(LIST_CONFIG)
        self.print_log = self.config.lst_get('print_log')
        self.LOG_LEVEL = self.config.lst_get('LOG_LEVEL')
        self.DLGID_CTRL = self.config.lst_get('DLGID_CTRL')
        self.TYPE = self.config.lst_get('TYPE')
        self.ENABLE_OUTPUTS = self.config.lst_get('ENABLE_OUTPUTS')
        self.ENABLE_OUTPUTS = str2bool(self.config.lst_get('ENABLE_OUTPUTS'))

        self.TYPE_IN_FREC = self.config.lst_get('TYPE_IN_FREC')
        self.DLGID_REF = self.config.lst_get('DLGID_REF')
        self.CHANNEL_REF = self.config.lst_get('CHANNEL_REF')
        self.TYPE_IN_FREC = self.config.lst_get('TYPE_IN_FREC')
        self.DLGID_REF_1 = self.config.lst_get('DLGID_REF_1')
        self.CHANNEL_REF_1 = self.config.lst_get('CHANNEL_REF_1')
        self.PROGRAMMED_FREC = self.config.lst_get('PROGRAMMED_FREC')

        ## INSTANCIAS
        self.logs = ctrl_logs(self.TYPE, 'CTRL_FREC_process', self.DLGID_CTRL,
                              self.print_log, self.LOG_LEVEL)
        self.redis = Redis()

    def chequeo_alarmas(self):

        name_function = 'CHEQUEO_ALARMAS'

        # PIERTA DEL GABINETE
        if read_param(self.DLGID_CTRL, 'GA') == '1':
            self.logs.print_inf(name_function, 'GABINETE_ABIERTO')
            # ESCRIBO LA ALARMA EN REDIS
            self.redis.hset(self.DLGID_CTRL,
                            dic.get_dic('GABINETE_ABIERTO', 'name'),
                            dic.get_dic('TX_ERROR', 'True_value'))
        elif read_param(self.DLGID_CTRL, 'GA') == '0':
            # ESCRIBO LA ALARMA EN REDIS
            self.redis.hset(self.DLGID_CTRL,
                            dic.get_dic('GABINETE_ABIERTO', 'name'),
                            dic.get_dic('TX_ERROR', 'False_value'))
        else:
            self.logs.print_inf(
                name_function,
                f"error in {name_function}, GA = {read_param(self.DLGID_CTRL,'GA')}"
            )
            # DEJAR REGISTRO DEL ERROR
            self.logs.script_performance(
                f"error in {name_function}, GA = {read_param(self.DLGID_CTRL,'GA')}"
            )

        # FALLA ELECTRICA
        if read_param(self.DLGID_CTRL, 'FE') == '1':
            self.logs.print_inf(name_function, 'FALLA ELECTRICA')
            # ESCRIBO LA ALARMA EN REDIS
            self.redis.hset(self.DLGID_CTRL,
                            dic.get_dic('FALLA_ELECTRICA', 'name'),
                            dic.get_dic('FALLA_ELECTRICA', 'True_value'))
        elif read_param(self.DLGID_CTRL, 'FE') == '0':
            # ESCRIBO LA ALARMA EN REDIS
            self.redis.hset(self.DLGID_CTRL,
                            dic.get_dic('FALLA_ELECTRICA', 'name'),
                            dic.get_dic('FALLA_ELECTRICA', 'False_value'))
        else:
            self.logs.print_inf(
                name_function,
                f"error in {name_function}, FE = {read_param(self.DLGID_CTRL,'FE')}"
            )
            # DEJAR REGISTRO DEL ERROR
            self.logs.script_performance(
                f"error in {name_function}, FE = {read_param(self.DLGID_CTRL,'FE')}"
            )

        # FALLA TERMICA 1
        if read_param(self.DLGID_CTRL, 'FT1') == '1':
            self.logs.print_inf(name_function, 'FALLA TERMICA 1')
            # ESCRIBO LA ALARMA EN REDIS
            self.redis.hset(self.DLGID_CTRL,
                            dic.get_dic('FALLA_TERMICA_1', 'name'),
                            dic.get_dic('FALLA_ELECTRICA', 'True_value'))
        elif read_param(self.DLGID_CTRL, 'FT1') == '0':
            # ESCRIBO LA ALARMA EN REDIS
            self.redis.hset(self.DLGID_CTRL,
                            dic.get_dic('FALLA_TERMICA_1', 'name'),
                            dic.get_dic('FALLA_ELECTRICA', 'False_value'))
        else:
            self.logs.print_inf(
                name_function,
                f"error in {name_function}, FT1 = {read_param(self.DLGID_CTRL,'FT1')}"
            )
            # DEJAR REGISTRO DEL ERROR
            self.logs.script_performance(
                f"error in {name_function}, FT1 = {read_param(self.DLGID_CTRL,'FT1')}"
            )

    def chequeo_sensor(self, dlgid, channel_came):

        name_function = 'CHEQUEO_SENSOR'

        # SI NO EXISTE LA VARIABLE ERR_SENSOR EN DLGID_REF LA CREO CON VALOR NO
        if not (self.redis.hexist(self.DLGID_REF, 'ERR_SENSOR')):
            self.redis.hset(self.DLGID_REF, 'ERR_SENSOR', 'NO')

        return True

    def modo_remoto(self):

        name_function = 'MODO_REMOTO'

        pump_state = False
        #
        # SI NO EXISTE PUMP_FREC LO CREO CON VALOR 100%
        if not (self.redis.hexist(self.DLGID_CTRL,
                                  dic.get_dic('PUMP_FREC', 'name'))):
            self.redis.hset(self.DLGID_CTRL, dic.get_dic('PUMP_FREC', 'name'),
                            dic.get_dic('PUMP_FREC', 'True_value'))
            PUMP_FREC = 7
        else:
            PUMP_FREC = int((int(
                self.redis.hget(self.DLGID_CTRL,
                                dic.get_dic('PUMP_FREC', 'name')))) / 100 * 7)

        # SI NO EXISTE SW2 LO CREO CON VALOR OFF
        if not (self.redis.hexist(self.DLGID_CTRL, 'SW2')):
            self.redis.hset(self.DLGID_CTRL, 'SW2', 'OFF')
        #
        # REVISO LA ACCION TOMADA EN EL SERVER RESPECTO A LA BOMBA
        if self.redis.hget(self.DLGID_CTRL, 'SW2') == 'ON':
            self.logs.print_inf(name_function,
                                f'PRENDER BOMBA [ PUMP_FREC = {PUMP_FREC} ]')
            #
            pump_state = True
            #
        elif self.redis.hget(self.DLGID_CTRL, 'SW2') == 'OFF':
            self.logs.print_inf(name_function, 'APAGAR BOMBA')
            #
        else:
            self.logs.print_inf(
                name_function,
                f"error in {name_function}, SW2 = {read_param(self.DLGID_CTRL,'SW2')}"
            )
            # DEJAR REGISTRO DEL ERROR
            self.logs.script_performance(
                f"error in {name_function}, SW2 = {read_param(self.DLGID_CTRL,'SW2')}"
            )

        # REVISO ACCION DE LAS SALIDAS
        if self.ENABLE_OUTPUTS:
            if pump_state:
                # SETEO LA FRECUENCIA A LA QUE SE QUIERE PRENDER LA BOMBA
                if self.TYPE_IN_FREC == 'NPN':
                    douts(self.DLGID_CTRL, not_dec(PUMP_FREC, 3))
                elif self.TYPE_IN_FREC == 'PNP':
                    douts(self.DLGID_CTRL, PUMP_FREC)
                else:
                    self.logs.print_inf(
                        name_function,
                        f"error in {name_function}, TYPE_IN_FREC = {self.TYPE_IN_FREC}"
                    )
                    self.logs.script_performance(
                        f"error in {name_function}, TYPE_IN_FREC = {self.TYPE_IN_FREC}"
                    )

            # MANDOLA ACCION A LA BOMBA
            pump1(self.DLGID_CTRL, pump_state)

        else:
            self.logs.print_inf(
                name_function,
                f"SALIDAS DESCACTIVADAS [ENABLE_OUTPUTS = {self.ENABLE_OUTPUTS}]"
            )
            self.logs.script_performance(
                f"{name_function} ==> SALIDAS DESCACTIVADAS [ENABLE_OUTPUTS = {self.ENABLE_OUTPUTS}]"
            )

    def control_sistema(self, dlgid_ref, channel_ref, MAG_REF):

        name_function = 'CONTROL_SISTEMA'

        WND = 0.1  # VENTANA DE FRECUENCIA ABIERTA

        # SI NO EXISTE LMIN LO CREO CON VALOR 1
        if not (self.redis.hexist(self.DLGID_CTRL,
                                  dic.get_dic('MAG_REF', 'name'))):
            self.redis.hset(self.DLGID_CTRL, dic.get_dic('MAG_REF', 'name'),
                            dic.get_dic('MAG_REF', 'True_value'))

        #
        #ESTABLEZCO LMIN Y LMAX A PARTIR DE WND
        LMIN = MAG_REF - WND
        LMAX = MAG_REF + WND
        #
        # LEO EL CANAL DE REFERENCIA
        if self.redis.hexist(dlgid_ref, 'LINE'):
            REF = float(read_param(dlgid_ref, channel_ref))
        else:
            self.logs.print_inf(
                name_function,
                f"error in {name_function}, {self.CHANNEL_REF} = {read_param(self.DLGID_CTRL,self.CHANNEL_REF)}"
            )

        # MUESTRO LOGS
        self.logs.print_in(name_function, 'ENABLE_OUTPUTS',
                           self.ENABLE_OUTPUTS)
        self.logs.print_in(name_function, 'TYPE_IN_FREC', self.TYPE_IN_FREC)
        self.logs.print_in(name_function, 'MAG_REF', MAG_REF)
        self.logs.print_in(name_function, 'WND', WND)
        self.logs.print_in(name_function, 'REF', REF)

        # SI NO FREC LMIN LO CREO CON VALOR 0
        if not (self.redis.hexist(self.DLGID_CTRL, 'FREC')):
            self.redis.hset(self.DLGID_CTRL, 'FREC', 0)
        # LEO EL VALOR DE LA FRECUENCIA ACTUAL
        FREC = int(self.redis.hget(self.DLGID_CTRL, 'FREC'))
        self.logs.print_in(name_function, 'LAST_FREC', FREC)

        if REF < LMIN:
            self.logs.print_inf(name_function, 'PRESION BAJA')
            if FREC < 7:
                FREC += 1
                self.logs.print_inf(name_function, 'SE AUMENTA LA FRECUENCIA')
                #
            else:
                self.logs.print_inf(name_function,
                                    'SE ALCANZA FRECUENCIA MAXIMA')
                #self.logs.dlg_performance(f'< {name_function} > SE ALCANZA FRECUENCIA MAXIMA')

        elif REF > LMAX:
            self.logs.print_inf(name_function, 'PRESION ALTA')
            if FREC > 0:
                FREC -= 1
                self.logs.print_inf(name_function,
                                    'SE DISMINUYE LA FRECUENCIA')
        else:
            self.logs.print_inf(name_function,
                                'PRESION DENTRO DEL RANGO SELECCIONADO')

        # MANDO A PRENDER LA BOMBA
        pump1(self.DLGID_CTRL, True)

        # CHEQUEO SI LAS SALIDAS TIENEN QUE ACOPLARSE A ENTRADAS NPN o PNP Y MANDO A SETEAR EN CASO DE ENABLE_OUTPUTS
        if self.ENABLE_OUTPUTS:
            if self.TYPE_IN_FREC == 'NPN':
                douts(self.DLGID_CTRL, not_dec(FREC, 3))
            elif self.TYPE_IN_FREC == 'PNP':
                douts(self.DLGID_CTRL, FREC)
            else:
                self.logs.print_inf(
                    name_function,
                    f"error in {name_function}, TYPE_IN_FREC = {self.TYPE_IN_FREC}"
                )
                self.logs.script_performance(
                    f"error in {name_function}, TYPE_IN_FREC = {self.TYPE_IN_FREC}"
                )
        else:
            self.logs.print_inf(
                name_function,
                f"SALIDAS DESCACTIVADAS [ENABLE_OUTPUTS = {self.ENABLE_OUTPUTS}]"
            )
            self.logs.script_performance(
                f"{name_function} ==> SALIDAS DESCACTIVADAS [ENABLE_OUTPUTS = {self.ENABLE_OUTPUTS}]"
            )

        # GUARODO LA FRECUENCIA ACTUAL DE TRABAJO
        self.logs.print_out(name_function, 'CURR_FREC', FREC)
        self.redis.hset(self.DLGID_CTRL, 'FREC', FREC)

    def latch__outpust(self, dlgid):

        name_function = 'LATCH_OUTPUTS'

        if self.redis.hexist(dlgid, 'current_OUTPUTS'):
            last_OUTPUTS = self.redis.hget(dlgid, 'current_OUTPUTS')
            self.redis.hset(dlgid, 'last_OUTPUTS', last_OUTPUTS)

        if self.redis.hexist(dlgid, 'OUTPUTS'):
            if self.redis.hget(dlgid, 'OUTPUTS') != '-1':
                current_OUTPUTS = self.redis.hget(dlgid, 'OUTPUTS')
                self.redis.hset(dlgid, 'current_OUTPUTS', current_OUTPUTS)
        else:
            self.logs.print_inf(name_function,
                                f'NO EXISTE OUTPUTS EN {self.DLGID_CTRL}')
            self.logs.print_inf(name_function, 'EJECUCION INTERRUMPIDA')
            quit()

    def show_DATA_DATE_TIME(self, dlgid):
        #
        name_function = 'SHOW_DATA_DATE_TIME'
        #
        DATA_DATE_TIME = f"{read_param(dlgid, 'DATE')}_{read_param(dlgid, 'TIME')}"
        #
        self.redis.hset(dlgid, dic.get_dic('DATA_DATE_TIME', 'name'),
                        DATA_DATE_TIME)
        #
        self.logs.print_out(name_function, f'[{dlgid}] - DATA_DATE_TIME',
                            DATA_DATE_TIME)

    def show_pump1_state(self, channel_pump_name):
        #
        name_function = 'SHOW_PUMP1_STATE'
        #
        pump1_state = int(read_param(self.DLGID_CTRL, channel_pump_name))
        #
        if pump1_state == 1:
            self.redis.hset(self.DLGID_CTRL,
                            dic.get_dic('PUMP1_STATE', 'name'),
                            dic.get_dic('PUMP1_STATE', 'True_value'))
            self.logs.print_out(name_function,
                                dic.get_dic('PUMP1_STATE', 'name'),
                                dic.get_dic('PUMP1_STATE', 'True_value'))

        elif pump1_state == 0:
            self.redis.hset(self.DLGID_CTRL,
                            dic.get_dic('PUMP1_STATE', 'name'),
                            dic.get_dic('PUMP1_STATE', 'False_value'))
            self.logs.print_out(name_function,
                                dic.get_dic('PUMP1_STATE', 'name'),
                                dic.get_dic('PUMP1_STATE', 'False_value'))

    def show_work_frequency(self):

        name_function = 'SHOW_WORK_FREQUENCY'

        #str_PROGRAMMED_FREC = self.redis.hget(self.DLGID_CTRL, 'PROGRAMMED_FREC')
        #str_PROGRAMMED_FREC = self.conf.lst_get('DLGID_CTRL')
        lst_PROGRAMMED_FREC = self.PROGRAMMED_FREC.split('/')

        if self.redis.hexist(self.DLGID_CTRL, 'FREC'):
            FREC = int(self.redis.hget(self.DLGID_CTRL, 'FREC'))
            WORKING_FREQUENCY = lst_PROGRAMMED_FREC[FREC]
        else:
            self.logs.print_inf(
                name_function,
                f'NO EXISTE LA VARIABLE FREC EN {self.DLGID_CTRL}')
            self.logs.print_inf(name_function,
                                'NO SE MUESTRA FRECUENCIA DE TRABAJO')
            return False

        if FREC == 0:
            self.redis.hset(self.DLGID_CTRL,
                            dic.get_dic('WORKING_FREC', 'name'),
                            f'[MIN]  {WORKING_FREQUENCY} Hz')
            self.logs.print_out(name_function,
                                dic.get_dic('WORKING_FREC', 'name'),
                                f'[MIN]  {WORKING_FREQUENCY} Hz')
        elif FREC == 7:
            self.redis.hset(self.DLGID_CTRL,
                            dic.get_dic('WORKING_FREC', 'name'),
                            f'[MAX]  {WORKING_FREQUENCY} Hz')
            self.logs.print_out(name_function,
                                dic.get_dic('WORKING_FREC', 'name'),
                                f'[MAX]  {WORKING_FREQUENCY} Hz')
        else:
            self.redis.hset(self.DLGID_CTRL,
                            dic.get_dic('WORKING_FREC',
                                        'name'), f'{WORKING_FREQUENCY} Hz')
            self.logs.print_out(name_function,
                                dic.get_dic('WORKING_FREC', 'name'),
                                f'{WORKING_FREQUENCY} Hz')

    def pump_time(self, channel_pump_name, no_pump):
        #
        name_function = f'PUMP{no_pump}_TIME'
        #
        from datetime import datetime, date, time, timedelta
        #
        pump_state = int(read_param(self.DLGID_CTRL, channel_pump_name))
        #
        # PREPARO VARIABLES DE TIEMPO
        #
        ## TIEMPO TOTAL
        if not (self.redis.hexist(self.DLGID_CTRL,
                                  f'pump{no_pump}_total_time')):
            self.redis.hset(self.DLGID_CTRL, f'pump{no_pump}_total_time',
                            '2020,1,1,0,0,0,0')
            pump_total_time = datetime(2020, 1, 1, 0, 0, 0, 0)
            #
            # ESCRIBO LA VARIABLE DE VISUALIZACION
            self.redis.hset(self.DLGID_CTRL,
                            dic.get_dic(f'PUMP{no_pump}_TOTAL_TIME', 'name'),
                            '0 horas')
        else:
            # OBTENGO pump_total_time EN FORMATO datetime
            str_pump_total_time = self.redis.hget(self.DLGID_CTRL,
                                                  f'pump{no_pump}_total_time')
            lst_pump_total_time = str_pump_total_time.split(',')
            pump_total_time = datetime(int(lst_pump_total_time[0]),
                                       int(lst_pump_total_time[1]),
                                       int(lst_pump_total_time[2]),
                                       int(lst_pump_total_time[3]),
                                       int(lst_pump_total_time[4]),
                                       int(lst_pump_total_time[5]),
                                       int(lst_pump_total_time[6]))
            #
            # INCREMENTO 1 MINUTO EN pump_total_time SI LA BOMBA ESTA PRENDIDA
            if pump_state == 1:
                # SUMO UN MINUTO AL CONTEO DE TIEMPO
                pump_total_time = pump_total_time + timedelta(minutes=1)
                #
                # VEO LA DIFERENCIA DE TIEMPO RESPECTO A LA REFERENCIA INICIAL
                delta_total_time = pump_total_time - datetime(
                    2020, 1, 1, 0, 0, 0, 0)
                #
                # CONVIERTO LA DIFERENCIA A HORAS
                delta_total_time_hours = int(delta_total_time.days * 24 +
                                             delta_total_time.seconds / 3600)
                #
                # ESCRIBO LA VARIABLE DE VISUALIZACION
                self.redis.hset(
                    self.DLGID_CTRL,
                    dic.get_dic(f'PUMP{no_pump}_TOTAL_TIME', 'name'),
                    f'{delta_total_time_hours} horas')
                #
                self.logs.print_out(
                    name_function,
                    dic.get_dic(f'PUMP{no_pump}_TOTAL_TIME', 'name'),
                    f'{delta_total_time_hours} horas')
            #
            # GUARDO pump_total_time EN REDIS
            str_pump_total_time = f'{pump_total_time.year},{pump_total_time.month},{pump_total_time.day},{pump_total_time.hour},{pump_total_time.minute},{pump_total_time.second},{pump_total_time.microsecond}'
            self.redis.hset(self.DLGID_CTRL, f'pump{no_pump}_total_time',
                            str_pump_total_time)

    def delta_mag(self):
        '''
        Escribe en DLGID_CTRL/delta_ref_ref1 la diferencia entre las magnitudes de la referencia y la referencia 1
        '''

        name_function = 'DELTA_MAG'

        if (self.DLGID_REF_1 != '' and self.CHANNEL_REF_1 != ''):
            #
            mag_in_ref = float(read_param(self.DLGID_REF, self.CHANNEL_REF))
            mag_in_ref_1 = float(
                read_param(self.DLGID_REF_1, self.CHANNEL_REF_1))
            delta_ref1_ref = round(mag_in_ref_1 - mag_in_ref, 2)
            #
            # ESCRIBO EN REDIS LA DIFERENCIA
            self.redis.hset(self.DLGID_CTRL, 'delta_ref1_ref', delta_ref1_ref)
            #
            # IMPRIMO LOGS
            self.logs.print_out(name_function, 'delta_ref1_ref',
                                delta_ref1_ref)
        else:
            self.redis.hdel(self.DLGID_CTRL, 'delta_ref1_ref')
            self.logs.print_inf(name_function,
                                'NO HAY SISTEMA DE REFERENCIA 1')