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')
Beispiel #4
0
def control_process(LIST_CONFIG):
    ''''''

    name_function = 'CONTROL_PROCESS'

    conf = config_var(LIST_CONFIG)

    # VARIABLES DE EJECUCION
    DLGID_CTRL = conf.lst_get('DLGID_CTRL')
    TYPE = conf.lst_get('TYPE')
    print_log = str2bool(conf.lst_get('print_log'))
    LOG_LEVEL = conf.lst_get('LOG_LEVEL')

    #VARIABLES DE CONFIGURACION
    ENABLE_OUTPUTS = str2bool(conf.lst_get('ENABLE_OUTPUTS'))
    TYPE_IN_FREC = conf.lst_get('TYPE_IN_FREC')
    DLGID_REF = conf.lst_get('DLGID_REF')
    CHANNEL_REF = conf.lst_get('CHANNEL_REF')
    DLGID_REF_1 = conf.lst_get('DLGID_REF_1')
    CHANNEL_REF_1 = conf.lst_get('CHANNEL_REF_1')

    ## INSTANCIAS
    logs = ctrl_logs(TYPE, 'CTRL_FREC_process', DLGID_CTRL, print_log,
                     LOG_LEVEL)
    config = configparser.ConfigParser()
    redis = Redis()
    #gda = GDA(serv_APP_config['CONFIG']['working_mode'])

    redis.no_execution('MER004')
    '''
    # INSTANCIA DE error_process
    import importlib.util
    #spec = importlib.util.spec_from_file_location("archivo", f"../{TYPE}/PROCESS/ctrl_library.py")
    spec = importlib.util.spec_from_file_location("archivo", f"/datos/cgi-bin/spx/AUTOMATISMOS/{TYPE}/PROCESS/ctrl_library.py")
    archivo = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(archivo)
    p = archivo.ctrl_process(LIST_CONFIG)'''

    p = ctrlProcess(LIST_CONFIG)

    # OBTENFO LA CARPETA EN DONDE SE ENCUENTRA EL ARCHIVO ACTUAL
    current_path = os.path.dirname(os.path.abspath(__file__))
    # LEO EL ARCHIVO DE CONFIGURACION
    config.read(f"{current_path}/ctrl_config.ini")

    #---------------------------------------------------------
    ##PROCESS

    logs.basicLog(__doc__)

    # ESCRIBO LA EJECUCION DEL SCRIPT
    logs.print_log(f"{name_function}")

    #logs.script_performance(f"{name_function}")

    # MUESTRO VARIABLES DE ENTRADA
    logs.print_in(name_function, 'print_log', print_log)
    logs.print_in(name_function, 'DLGID_CTRL', DLGID_CTRL)
    logs.print_in(name_function, 'TYPE', TYPE)
    logs.print_in(name_function, 'ENABLE_OUTPUTS', ENABLE_OUTPUTS)
    logs.print_in(name_function, 'TYPE_IN_FREC', TYPE_IN_FREC)
    logs.print_in(name_function, 'DLGID_REF', DLGID_REF)
    logs.print_in(name_function, 'CHANNEL_REF', CHANNEL_REF)
    logs.print_in(name_function, 'DLGID_REF_1', DLGID_REF_1)
    logs.print_in(name_function, 'CHANNEL_REF_1', CHANNEL_REF_1)

    # ESCRIBO NUMERO DE EJECUCION
    #redis.no_execution(DLGID_CTRL)

    # CHEQUEO QUE EXISTAN LOS LINES DEL DATALOGGER DE CONTROL Y EL DE REFERENCIA.
    if not (redis.hexist(DLGID_CTRL, 'LINE')):
        #logs.script_performance(f'{name_function} ==> NO EXISTE LINE {DLGID_CTRL}')
        logs.print_inf(name_function, f'NO EXISTE LINE {DLGID_CTRL}')
        logs.print_inf(name_function, 'EJECUCION INTERRUMPIDA')
        quit()

    if not (redis.hexist(DLGID_REF, 'LINE')):
        #logs.script_performance(f'NO EXISTE LINE {DLGID_REF}')
        logs.print_inf(name_function, f'NO EXISTE LINE {DLGID_REF}')
        logs.print_inf(name_function, 'EJECUCION INTERRUMPIDA')
        quit()

    #
    logs.print_inf(name_function, 'CHEQUEO_ALARMAS')
    p.chequeo_alarmas()
    #
    #logs.print_inf(name_function, 'CHEQUEO_SENSOR')
    #p.chequeo_sensor()
    #
    logs.print_inf(name_function, 'MAIN')

    # FUNCION MAIN
    name_function = 'MAIN'

    # CONDICIONES INICIALES
    #
    ## ACTIVO BANDERA PARA QUE control_error NOTIFIQUE QUE SE ESTA TRABAJANDO CON REFERENCIA_1
    redis.hset(DLGID_CTRL, 'flag_work_syst_ref_1', 'NO')

    # REVISO SI ESTA TRABAJANDO EN MODO LOCAL EN EL TABLERO
    if read_param(DLGID_CTRL, 'LM') == '1':
        logs.print_inf(name_function, 'TRABAJO EN MODO LOCAL')
        redis.hset(DLGID_CTRL, 'LOCAL_MODE', 'SI')
    elif read_param(DLGID_CTRL, 'LM') == '0':
        redis.hset(DLGID_CTRL, 'LOCAL_MODE', 'NO')  #VISUALIZACION
        #
        # SI NO EXISTE LA VARIABLE DE SELECCION SW1 LA CREO CON VALOR AUTO
        if not (redis.hexist(DLGID_CTRL, dic.get_dic('WEB_MODE', 'name'))):
            redis.hset(DLGID_CTRL, dic.get_dic('WEB_MODE', 'name'),
                       dic.get_dic('WEB_MODE', 'True_value'))
            # MUESTRO LOGS DE ADVERTENCIA
            logs.print_inf(name_function, 'NO EXISTE LA VARIABLE SW1 EN REDIS')
            logs.print_inf(
                name_function, 'SE CREA LA VARIABLE CON VALOR [0]'.format(
                    dic.get_dic('WEB_MODE', 'True_value')))
            #logs.script_performance('error in [0] [1] = ,'.format(name_function,dic.get_dic('WEB_MODE', 'name')))
            #logs.script_performance('error in [0], SE CREA [1] = [2]'.format(name_function,dic.get_dic('WEB_MODE', 'name'),dic.get_dic('WEB_MODE', 'True_value')))
        #
        # LEO VAERIABLE WEB_MODE
        WEB_MODE = redis.hget(DLGID_CTRL, dic.get_dic('WEB_MODE', 'name'))

        # REVISO EL MODO DE TRABAJO WEB
        if WEB_MODE == 'REMOTO':
            logs.print_inf(name_function, 'TRABAJO EN MODO REMOTO')
            p.modo_remoto()

        elif WEB_MODE in [
                dic.get_dic('WEB_MODE', 'value_1'),
                dic.get_dic('WEB_MODE', 'value_1'),
        ]:
            logs.print_inf(name_function,
                           'TRABAJO EN MODO SISTEMA DE EMERGENCIA')
            # REVISO EL ESTADO DE ENABLE_OUTPUTS
            if ENABLE_OUTPUTS:
                emerg_system(DLGID_CTRL)
            else:
                logs.print_inf(
                    name_function,
                    f"SALIDAS DESCACTIVADAS [ENABLE_OUTPUTS = {ENABLE_OUTPUTS}]"
                )
                #logs.script_performance(f"{name_function} ==> SALIDAS DESCACTIVADAS [ENABLE_OUTPUTS = {ENABLE_OUTPUTS}]")

        elif WEB_MODE == 'AUTO':
            logs.print_inf(name_function, 'TRABAJO EN MODO AUTOMATICO')
            #
            # SI NO EXISTE LA VARIABLE TX_ERROR EN DLGID_REF LA CREO CON VALOR NO
            if not (redis.hexist(DLGID_REF, dic.get_dic('TX_ERROR', 'name'))):
                redis.hset(DLGID_REF, dic.get_dic('TX_ERROR', 'name'),
                           dic.get_dic('TX_ERROR', 'False_value'))
            #
            # LEO MAG_REF SELECCIONADA POR EL CLIENTE. SI NO EXISTE LMIN LO CREO CON VALOR 1
            if not (redis.hexist(DLGID_CTRL, dic.get_dic('MAG_REF', 'name'))):
                redis.hset(DLGID_CTRL, dic.get_dic('MAG_REF', 'name'),
                           dic.get_dic('MAG_REF', 'True_value'))
            else:
                MAG_REF = float(
                    redis.hget(DLGID_CTRL, dic.get_dic('MAG_REF', 'name')))

            # LEO TX_ERROR Y # error_1min
            TX_ERROR = redis.hget(DLGID_REF, dic.get_dic('TX_ERROR', 'name'))
            error_1min = redis.hget(DLGID_REF, 'error_1min')

            # CHEQUEO ERROR TX EN EL DLG DE REFERENCIA (SE DECLARA ERROR_TX CUANDO PASAN 10 MIN SIN TRANSMITIR)
            if TX_ERROR == 'SI':
                logs.print_inf(
                    name_function,
                    f'ERROR TX EN SISTEMA DE REFERENCIA [ {DLGID_REF} ]')
                #logs.print_inf(name_function, 'AUTOMATISMO TRABAJADO CON SISTEMA DE EMERGENCIA')
                #
                # CHEQUEO QUE SE HAYA ESCRITO LA DIFERENCIA EN MAGNITUD ENTRE LOS SENSORES
                if redis.hexist(DLGID_CTRL, 'delta_ref1_ref'):
                    #
                    # LEO LA DIFERENCIA ENTRE LAS MAGNITUDES DE REFERENCIA
                    delta_ref1_ref = float(
                        redis.hget(DLGID_CTRL, 'delta_ref1_ref'))
                    #
                    # CHEQUEO EL ESTADO DEL SENSOR DE REFERENCIA 1
                    if not (p.chequeo_sensor(DLGID_REF_1, CHANNEL_REF_1)):
                        logs.print_inf(
                            name_function,
                            'ERROR DE SENSOR EN SISTEMA DE REFERENCIA 1')
                        logs.print_inf(
                            name_function,
                            'AUTOMATISMO TRABAJADO CON SISTEMA DE EMERGENCIA')
                        emerg_system(DLGID_CTRL)
                    else:
                        logs.print_inf(
                            name_function,
                            'AUTOMATISMO TRABAJADO CON SISTEMA DE REFERENCIA 1'
                        )
                        #
                        # ACTIVO BANDERA PARA QUE control_error NOTIFIQUE QUE SE ESTA TRABAJANDO CON REFERENCIA_1
                        redis.hset(DLGID_CTRL, 'flag_work_syst_ref_1', 'SI')
                        #
                        # LLAMO AL CONTROL DEL SISTEMA
                        p.control_sistema(DLGID_REF_1, CHANNEL_REF_1,
                                          MAG_REF + delta_ref1_ref)
                #
                else:
                    logs.print_inf(
                        name_function,
                        'AUTOMATISMO TRABAJADO CON SISTEMA DE EMERGENCIA')
                    emerg_system(DLGID_CTRL)

            elif TX_ERROR == 'NO':
                # ME ASEGURO QUE LA REFENCIA ME HAYA MANDADO UN DATO NUEVO
                if error_1min == 'NO':
                    # CHEQUEO ERROR EN EL SENSOR
                    if not (p.chequeo_sensor(DLGID_REF, CHANNEL_REF)):
                        logs.print_inf(
                            name_function,
                            'ERROR DE SENSOR EN SISTEMA DE REFERENCIA')
                        logs.print_inf(
                            name_function,
                            'AUTOMATISMO TRABAJADO CON SISTEMA DE EMERGENCIA')
                        #
                        emerg_system(DLGID_CTRL)
                    else:
                        logs.print_inf(name_function, 'CONTROL_SISTEMA')
                        p.control_sistema(DLGID_REF, CHANNEL_REF, MAG_REF)
                        #
                        logs.print_inf(name_function, 'DELTA_MAG')
                        p.delta_mag()
                else:
                    logs.print_inf(name_function,
                                   'EN ESPERA DE DATOS DE LA REFERENCIA')

            else:
                logs.print_inf(
                    name_function, "error in [0], [1] = [2]".format(
                        name_function, dic.get_dic('TX_ERROR', 'name'),
                        TX_ERROR))
                # DEJAR REGISTRO DEL ERROR
                #logs.script_performance("error in [0], [1] = [2]".format(name_function,dic.get_dic('TX_ERROR', 'name'),TX_ERROR))
            #
        else:
            logs.print_inf(
                name_function, 'error in [0], [1] = [2]'.format(
                    name_function, dic.get_dic('WEB_MODE', 'name'), WEB_MODE))
            # DEJAR REGISTRO DEL ERROR
            #logs.script_performance('error in [0], [1] = [2]'.format(name_function,dic.get_dic('WEB_MODE', 'name'),WEB_MODE))

    else:
        logs.print_inf(
            name_function,
            f"error in {name_function}, LM = {read_param(DLGID_CTRL,'LM')}")
        logs.print_inf(name_function, 'EJECUCION INTERRUMPIDA')
        # DEJAR REGISTRO DEL ERROR
        #logs.script_performance(f"error in {name_function}, LM = {read_param(DLGID_CTRL,'LM')}")

    # LATCHEO LAS SALIDAS
    p.latch__outpust(DLGID_CTRL)

    # PREPARO DATA_DATE_TIME PARA MOSTRAR EN LA VISUALIZACION EN EL DATALOGGER DE CONTROL
    logs.print_inf(name_function, 'SHOW_DATA_DATE_TIME')
    p.show_DATA_DATE_TIME(DLGID_CTRL)

    # PREPARO DATA_DATE_TIME PARA MOSTRAR EN LA VISUALIZACION EN EL DATALOGGER DE REFERENCIA
    p.show_DATA_DATE_TIME(DLGID_REF)

    # PREPARO PUMP1_STATE PARA MOSTRAR EL ESTADO DE LA BOMBA
    logs.print_inf(name_function, 'SHOW_PUMP1_STATE')
    p.show_pump1_state('BR1')

    # MUESTRA LA FRECUENCIA ACTUAL A LA QUE SE ESTA TRABAJANDO
    logs.print_inf(name_function, 'SHOW_WORK_FREQUENCY')
    p.show_work_frequency()
    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 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 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 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 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)
Beispiel #10
0
    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}]"
            )