Exemplo n.º 1
0
 def __init__(self, cfg, log, proveedor_datos):
     self.cfg = cfg
     self.log = log
     self.proveedor_datos = proveedor_datos
     self.cliente_mongo = repo.inicializar_cliente(cfg.URI_MONGODB,
                                                   cfg.NOMBRE_BD)
     self.coordinador = CoordinadorEvento(cfg, self.log)
     self.repo_variables = RepoVariables(self.cfg, self.cliente_mongo)
     self.repo_estaciones = RepoEstaciones(self.cfg, self.cliente_mongo)
Exemplo n.º 2
0
 def __init__(self, cfg, log):
     self.cfg = cfg
     self.log = log
     self.cliente_mongo = repo.inicializar_cliente(cfg.URI_MONGODB,
                                                   cfg.NOMBRE_BD)
     self.repo_confederaciones = RepoConfederaciones(
         cfg, self.cliente_mongo)
     self.repo_estaciones = RepoEstaciones(cfg, self.cliente_mongo)
     self.repo_eventos = RepoEventos(cfg, self.cliente_mongo)
     self.repo_variables = RepoVariables(cfg, self.cliente_mongo)
     self.repo_tipo_evento = RepoTiposEvento(cfg, self.cliente_mongo)
     self.twitter = Twitter(self.cfg, self.log)
Exemplo n.º 3
0
 def setUpClass(cls):
     cls.chc = CHCantabrico(cfg)
     cls.cliente_mongo = repo.inicializar_cliente(cfg.URI_MONGODB, cfg.NOMBRE_BD)
     cls.repo_confederaciones = RepoConfederaciones(cfg, cls.cliente_mongo)
     cls.repo_estaciones = RepoEstaciones(cfg, cls.cliente_mongo)
     cls.repo_variables = RepoVariables(cfg, cls.cliente_mongo)
     cls.repo_eventos = RepoEventos(cfg, cls.cliente_mongo)
     cls.nombre_tipo_fluvial = 'Fluvial'
     cls.cod_tipo_fluvial = 1
     cls.cod_chc = 1 #CHCantabrico
Exemplo n.º 4
0
 def setUpClass(cls):
     cls.log = LogSodin(cfg, cfg.FICHERO_LOG_MONITOR,
                        LogSodin.LOGGER_MONITOR)
     cls.log.configurar_log()
     cls.cliente_mongo = repo.inicializar_cliente(cfg.URI_MONGODB,
                                                  cfg.NOMBRE_BD)
     cls.repo_confederaciones = RepoConfederaciones(cfg, cls.cliente_mongo)
     cls.repo_estaciones = RepoEstaciones(cfg, cls.cliente_mongo)
     cls.repo_variables = RepoVariables(cfg, cls.cliente_mongo)
     cls.repo_eventos = RepoEventos(cfg, cls.cliente_mongo)
     cls.repo_tipos_evento = RepoTiposEvento(cfg, cls.cliente_mongo)
Exemplo n.º 5
0
 def setUpClass(cls):
     cls.Chc = CHCantabrico(cfg)
     cls.log = LogSodin(cfg, cfg.FICHERO_LOG_MONITOR,
                        LogSodin.LOGGER_MONITOR)
     cls.log.configurar_log()
     cls.cliente_mongo = repo.inicializar_cliente(cfg.URI_MONGODB,
                                                  cfg.NOMBRE_BD)
     cls.repo_variables = RepoVariables(cfg, cls.cliente_mongo)
     cls.repo_eventos = RepoEventos(cfg, cls.cliente_mongo)
     cls.repo_estaciones = RepoEstaciones(cfg, cls.cliente_mongo)
     cls.repo_tipos_evento = RepoTiposEvento(cfg, cls.cliente_mongo)
     cls.CODIGO_CONFEDERACION_CHC = 1
Exemplo n.º 6
0
 def setUpClass(cls):
     cls.log = LogSodin(cfg, cfg.FICHERO_LOG_MONITOR,
                        LogSodin.LOGGER_MONITOR)
     cls.log.configurar_log()
     cls.chc = CHCantabrico(cfg)
     cls.gestion = Gestion(cfg, cls.log)
     cls.cliente_mongo = repo.inicializar_cliente(cfg.URI_MONGODB,
                                                  cfg.NOMBRE_BD)
     cls.repo_confederaciones = RepoConfederaciones(cfg, cls.cliente_mongo)
     cls.repo_estaciones = RepoEstaciones(cfg, cls.cliente_mongo)
     cls.repo_variables = RepoVariables(cfg, cls.cliente_mongo)
     cls.repo_eventos = RepoEventos(cfg, cls.cliente_mongo)
     cls.repo_tipos_evento = RepoTiposEvento(cfg, cls.cliente_mongo)
     cls.analisis = Analisis(cfg, cls.log)
     cls.coordinador = CoordinadorEvento(cfg, cls.log)
     cls.twitter = Twitter(cfg, cls.log)
 def setUpClass(cls):
     cls.log = LogSodin(cfg, cfg.FICHERO_LOG_GESTOR,
                        LogSodin.LOGGER_MONITOR)
     cls.log.configurar_log()
     cls.gestion = Gestion(cfg, cls.log)
     cls.cliente_mongo = repo.inicializar_cliente(cfg.URI_MONGODB,
                                                  cfg.NOMBRE_BD)
     cls.repo_confederaciones = RepoConfederaciones(cfg, cls.cliente_mongo)
     cls.repo_variables = RepoVariables(cfg, cls.cliente_mongo)
     cls.repo_estaciones = RepoEstaciones(cfg, cls.cliente_mongo)
     cls.repo_eventos = RepoEventos(cfg, cls.cliente_mongo)
     cls.repo_tipos_evento = RepoTiposEvento(cfg, cls.cliente_mongo)
     cls.cod_tipo_evento_fluvial = 1
     cls.Coordinador = CoordinadorEvento(cfg, cls.log)
     cls.id_estacion = 'N020'  #Pontenova
     cls.cod_chc = 1
     cls.nivel_rio = 2.14
Exemplo n.º 8
0
class Gestion(object):
    """Clase para gestionar los eventos mientras permanecen activos"""
    def __init__(self, cfg, log):
        self.cfg = cfg
        self.log = log
        self.cliente_mongo = repo.inicializar_cliente(cfg.URI_MONGODB,
                                                      cfg.NOMBRE_BD)
        self.repo_confederaciones = RepoConfederaciones(
            cfg, self.cliente_mongo)
        self.repo_estaciones = RepoEstaciones(cfg, self.cliente_mongo)
        self.repo_eventos = RepoEventos(cfg, self.cliente_mongo)
        self.repo_variables = RepoVariables(cfg, self.cliente_mongo)
        self.repo_tipo_evento = RepoTiposEvento(cfg, self.cliente_mongo)
        self.twitter = Twitter(self.cfg, self.log)

    def actualizar_datos_eventos(self, eventos_activos):
        '''Obtiene los ultimos datos y los guarda en el evento'''
        for evento in eventos_activos:
            self.guardar_datos_en_evento(evento)
            self.repo_eventos.actualizar_evento(evento)
            self.log.escribir(u'OK - Evento actualizado con los últimos datos',
                              self.log.INFO)

    def guardar_datos_en_evento(self, evento):
        estacion = self.repo_estaciones.obtener_estacion(evento['idEstacion'])
        tipo = self.repo_eventos.obtener_tipo_evento(evento['codigoTipo'])
        self.log.escribir(
            u'EVENTO {0} activo en {1}. Fecha: {2}'.format(
                tipo['nombre'], estacion['nombre'], evento['fechaInicio']),
            self.log.INFO)
        if tipo == self.repo_tipo_evento.obtener_tipo_evento_fluvial():
            # datos de estaciones saih para eventos fluviales
            self.log.escribir(
                u'1) Obtener últimos datos de estaciones SAIH para el evento',
                self.log.INFO)
            self.guardar_datos_de_saih(evento, estacion)
        else:
            # datos de boyas de puertos del estado para eventos costeros
            self.log.escribir(
                u'1) Obtener últimos datos de boyas para el evento',
                self.log.INFO)
            self.guardar_datos_de_boyas(evento, estacion)

        # datos twitter
        self.log.escribir(u'2) Buscar nuevos tweets sobre el evento',
                          self.log.INFO)
        self.guardar_nuevos_tweets_evento(evento, estacion)

        # datos aemet?

    def guardar_datos_de_saih(self, evento, estacion):
        confederacion = self.repo_confederaciones.obtener_confederacion(
            estacion['codigoConfederacion'])
        proveedor_confe = self.repo_confederaciones.obtener_proveedor_saih(
            confederacion)

        for variable_estacion in estacion['variables']:
            variable = self.repo_variables.obtener_variable(
                variable_estacion['codigo'])
            try:
                ultima_medida = proveedor_confe.ultima_medida_de_estacion(
                    estacion, variable)
                Gestion._agregar_medida_a_evento(evento,
                                                 'datosConfederaciones',
                                                 ultima_medida)
                self.log.escribir(
                    u'Último dato de {0} añadido al evento'.format(
                        variable['nombre']), self.log.INFO)
            except ValueError as verr:
                self.log.escribir(
                    u'No se ha podido obtener la medida. {0}'.format(
                        verr.message), self.log.WARNING)
                continue

    def guardar_datos_de_boyas(self, evento, estacion):
        proveedor_boyas = self.repo_confederaciones.obtener_proveedor_boyas()
        for variable_estacion in estacion['variables']:
            variable = self.repo_variables.obtener_variable(
                variable_estacion['codigo'])
            try:
                ultima_medida = proveedor_boyas.ultima_medida_de_estacion(
                    estacion, variable)
                Gestion._agregar_medida_a_evento(evento, 'datosPuertos',
                                                 ultima_medida)
                self.log.escribir(
                    u'Último dato de {0} añadido al evento'.format(
                        variable['nombre']), self.log.INFO)
            except ValueError as verr:
                self.log.escribir(
                    u'No se ha podido obtener la medida. {0}'.format(
                        verr.message), self.log.WARNING)
                continue

    def guardar_nuevos_tweets_evento(self, evento, estacion):
        '''Busca y guarda nuevos tweets relacionados con un evento concreto'''

        # Configurar peticion de busqueda en twitter
        props = self.propiedades_peticion_twitter(evento, estacion)

        # Buscar nuevos tweets por lotes
        tweets = self.twitter.busqueda_tweets_por_lotes(
            props, config_twitter.NUM_LOTES)
        self.log.escribir(u'Filtro avanzado de tweets', self.log.INFO)
        tweets_filtrados = self.twitter.filtro_avanzado_tweets_evento(
            tweets, evento)

        # Guardar nuevos tweets en evento de BD
        if not tweets_filtrados:
            self.log.escribir(
                u'No se han encontrado nuevos tweets sobre el evento',
                self.log.INFO)

        evento['datosTwitter'].extend(tweets_filtrados)
        self.log.escribir(
            u'{0} nuevos tweets agregados al evento'.format(
                str(len(tweets_filtrados))), self.log.INFO)

    @staticmethod
    def _agregar_medida_a_evento(evento, campo_datos, medida):
        '''Agrega una medida de una estación a un evento'''
        evento[campo_datos].append(medida.to_json_obj())

    def propiedades_peticion_twitter(self, evento, estacion):
        tipo_fluvial = self.repo_tipo_evento.obtener_tipo_evento_fluvial()
        toponimos = evento['toponimos']
        query_toponimos = u'"{0}"'.format(toponimos[0])

        for toponimo in toponimos[1:]:
            query_toponimos += u' OR "{0}"'.format(toponimo)

        if evento['codigoTipo'] == tipo_fluvial['codigo']:
            query = self.twitter.crear_query_twitter(
                query_toponimos, config_twitter.PALABRAS_CLAVE_FLUVIAL,
                config_twitter.PALABRAS_EXCLUIDAS,
                config_twitter.CUENTAS_OFICIALES)
        else:
            query = self.twitter.crear_query_twitter(
                query_toponimos, config_twitter.PALABRAS_CLAVE_COSTERO,
                config_twitter.PALABRAS_EXCLUIDAS,
                config_twitter.CUENTAS_OFICIALES)

        #Activar para filtrar espacialmente la búsqueda de tweets
        #coords = Gestion.obtener_centroide_estacion(estacion)
        #query_geo = Twitter.crear_query_geo(coords[0], coords[1])
        query_geo = ''

        id_ultimo_tweet = self.obtener_id_ultimo_tweet_evento(evento)

        return {
            'query': query,
            'query_geo': query_geo,
            'id_ultimo': id_ultimo_tweet,
            'next_max_id': None,
            'max_num_tweets': config_twitter.MAX_TWEETS_PETICION
        }

    def obtener_id_ultimo_tweet_evento(self, evento):
        '''Obtiene la id del último tweet de un evento guardado en la BD'''
        id_ultimo_tweet = 0

        try:
            id_ultimo_tweet = evento['datosTwitter'][0]['id']
        except IndexError:
            self.log.escribir(u'Aun no hay tweets en el evento',
                              self.log.DEBUG)
        finally:
            return id_ultimo_tweet

    @staticmethod
    def obtener_centroide_estacion(estacion_evento):
        try:
            return (estacion_evento['coordenadas']['lon'],
                    estacion_evento['coordenadas']['lat'])
        except AttributeError as atterr:
            raise AttributeError(
                u'Error obteniendo centroide de un evento. {0}'.format(
                    atterr.message))
Exemplo n.º 9
0
class Deteccion(object):
    """Clase para la gestión de las alertas fluviales y costeras"""
    def __init__(self, cfg, log, proveedor_datos):
        self.cfg = cfg
        self.log = log
        self.proveedor_datos = proveedor_datos
        self.cliente_mongo = repo.inicializar_cliente(cfg.URI_MONGODB,
                                                      cfg.NOMBRE_BD)
        self.coordinador = CoordinadorEvento(cfg, self.log)
        self.repo_variables = RepoVariables(self.cfg, self.cliente_mongo)
        self.repo_estaciones = RepoEstaciones(self.cfg, self.cliente_mongo)

    def buscar_alertas(self, confederacion, tipo):
        '''Comprobar posibles alertas de inundación fluvial o costera en una zona'''
        variable_deteccion = self.repo_variables.obtener_variable_por_nombre(
            self.proveedor_datos.cfg_proveedor.VARIABLE_DETECCION)
        estaciones = self.repo_estaciones.obtener_estaciones_de_tipo(
            confederacion['codigo'], tipo['codigo'], True)
        if not estaciones:
            self.log.escribir(
                u' No hay estaciones de tipo {0} en esta confederación'.format(
                    tipo['nombre']), self.log.INFO)
        else:
            self.log.escribir(
                u' Comprobar {0} en estaciones: '.format(
                    variable_deteccion['nombre'].upper()), self.log.INFO)
            self.comprobar_estado_estaciones(estaciones, variable_deteccion)

    def comprobar_estado_estaciones(self, estaciones, variable_deteccion):
        for estacion in estaciones:
            try:
                umbral = Deteccion.obtener_umbral(
                    estacion, variable_deteccion['codigo'],
                    self.proveedor_datos.cfg_proveedor.NIVEL_ALERTA)
                hay_alerta = self.evaluar_datos_actuales(
                    estacion, variable_deteccion, umbral)
                self.coordinador.gestionar_alerta(estacion, variable_deteccion,
                                                  hay_alerta)
            except Exception as ex:
                self.log.escribir(
                    u' {0}: {1}'.format(estacion['nombre'], ex.message),
                    self.log.WARNING)
                continue

    @staticmethod
    def obtener_umbral(estacion, cod_variable, nivel_alerta):
        variable_estacion = util.filtrar_lista(estacion['variables'], 'codigo',
                                               cod_variable)
        if not variable_estacion:
            raise ValueError(u' Variable de detección no disponible')

        if variable_estacion['umbrales'][nivel_alerta]:
            return variable_estacion['umbrales'][nivel_alerta]
        return None

    def evaluar_datos_actuales(self, estacion, variable_deteccion, umbral):
        '''Comprueba si los valores actuales de una variable superan los umbrales de la estación'''
        if umbral is None:
            raise ValueError(u' Umbral no definido.')

        medida = self.proveedor_datos.ultima_medida_de_estacion(
            estacion, variable_deteccion)
        self.log.escribir(
            u' {0}: {1}. Umbral: {2}'.format(estacion['nombre'],
                                             str(medida.valor), str(umbral)),
            self.log.INFO)
        hay_alerta = Deteccion.valores_superan_umbral(umbral, medida.valor)
        return hay_alerta

    @staticmethod
    def valores_superan_umbral(umbral, valor):
        if umbral is not None and valor > umbral:
            return True
        return False