#!/usr/bin/python3 import requests import csv from datetime import datetime API_KEY = '35efb00415742337258dd1ba28238572' # Reemplaza 'tu_api_key' con tu clave de OpenWeatherMap BASE_URL = 'http://api.openweathermap.org/data/2.5/weather' def obtener_clima(ciudad="Alonsotegi"): """ Consulta el clima de una ciudad específica y maneja errores de conexión y HTTP. Parámetros: ciudad (str): Nombre de la ciudad a consultar. Retorna: dict: Datos meteorológicos en caso de éxito. None: Si ocurre un error en la conexión o la solicitud. """ parametros = { 'q': ciudad, 'appid': API_KEY, 'units': 'metric', # Resultados en grados Celsius 'lang': 'es' # Descripciones en español } try: response = requests.get(BASE_URL, params=parametros) response.raise_for_status() # Verifica errores HTTP return response.json() # Retorna los datos JSON si la solicitud es exitosa except requests.exceptions.RequestException as e: # Captura errores de conexión o URL mal formada print("Error en la conexión o URL:", e) return None except requests.exceptions.HTTPError as err: # Captura errores HTTP específicos (404, 500, etc.) print("Error HTTP:", err) return None def verificar_alertas(data): """ Verifica condiciones meteorológicas extremas en los datos climáticos y genera alertas adecuadas. Parámetros: data (dict): Un diccionario con datos meteorológicos, típicamente obtenido de la API de OpenWeatherMap. Debe incluir al menos las claves 'main' con la subclave 'temp' para la temperatura, 'wind' con la subclave 'speed' para la velocidad del viento, y opcionalmente 'rain' para lluvia. Retorna: list: Una lista de strings con las alertas correspondientes a condiciones climáticas extremas: - "⚠️ Alerta de calor extremo" si la temperatura supera los 35°C. - "⚠️ Alerta de viento fuerte" si la velocidad del viento supera los 20 m/s. - "☔ Alerta de lluvia" si se detecta la clave 'rain' en los datos meteorológicos. Ejemplo: data = { "main": {"temp": 37}, "wind": {"speed": 15}, "rain": {"1h": 1.0} } alertas = verificar_alertas(data) # alertas debería ser: ["⚠️ Alerta de calor extremo", "☔ Alerta de lluvia"] """ alertas = [] # Lista para almacenar alertas # Verifica si la temperatura supera los 35°C if data['main']['temp'] > 35: alertas.append("⚠️ Alerta de calor extremo") # Verifica si la velocidad del viento supera los 20 m/s if data['wind']['speed'] > 20: alertas.append("⚠️ Alerta de viento fuerte") # Verifica si hay datos de lluvia if 'rain' in data: alertas.append("☔ Alerta de lluvia") return alertas def guardar_datos(data, alertas, archivo='registro_clima.csv'): """ Guarda los datos climáticos y las alertas en un archivo CSV. La función `guardar_datos` almacena información sobre el clima de una ciudad y cualquier alerta relacionada en un archivo CSV. Si el archivo no existe, se crea automáticamente con los encabezados necesarios. Parámetros: data (dict): Un diccionario con información climática, generalmente obtenido de una API como OpenWeatherMap. Este diccionario debe contener al menos: - 'name' (str): Nombre de la ciudad. - 'main': Un subdiccionario con: - 'temp' (float): Temperatura en grados Celsius. - 'humidity' (int): Humedad en porcentaje. - 'wind': Un subdiccionario con: - 'speed' (float): Velocidad del viento en m/s. - 'weather': Una lista de subdiccionarios con: - 'description' (str): Descripción breve de las condiciones climáticas. alertas (list): Lista de alertas de condiciones climáticas, generada por la función `verificar_alertas`. Cada alerta es una cadena que describe un posible riesgo climático. archivo (str): Nombre del archivo CSV donde se guardarán los datos. Por defecto es 'registro_clima.csv'. Comportamiento: - Si el archivo no existe, la función crea un nuevo archivo CSV con los encabezados: 'ciudad', 'temp', 'humedad', 'viento', 'descripcion', 'fecha', 'alertas'. - Si el archivo ya existe, la función solo añade la nueva fila de datos sin duplicar los encabezados. - La fecha y hora actuales se registran con cada entrada, y las alertas se unen en una sola cadena, separadas por '; '. Ejemplo de uso: data = { "name": "Bilbao", "main": {"temp": 28.5, "humidity": 65}, "wind": {"speed": 15}, "weather": [{"description": "cielo parcialmente nublado"}] } alertas = ["⚠️ Alerta de calor extremo"] guardar_datos(data, alertas, 'registro_clima.csv') """ # Encabezados para el archivo CSV campos = ['ciudad', 'temp', 'humedad', 'viento', 'descripcion', 'fecha', 'alertas'] # Crear archivo con encabezado si aún no existe try: with open(archivo, mode='x', newline='') as file: writer = csv.writer(file) writer.writerow(campos) except FileExistsError: pass # Agregar los datos y alertas en una nueva fila del archivo with open(archivo, mode='a', newline='') as file: writer = csv.writer(file) writer.writerow([ data['name'], data['main']['temp'], data['main']['humidity'], data['wind']['speed'], data['weather'][0]['description'], datetime.now(), # Fecha y hora actuales '; '.join(alertas) # Unir las alertas en una cadena de texto ]) def sistema_alerta(ciudad): """ Función para gestionar el sistema de alertas climáticas para una ciudad específica. Esta función obtiene los datos del clima para la ciudad proporcionada, verifica si hay alertas meteorológicas y guarda la información junto con las alertas en un archivo CSV. También imprime en la consola un mensaje confirmando la cantidad de alertas encontradas y, si hay alertas, las muestra. Parámetros: ciudad (str): El nombre de la ciudad para la cual se desean obtener los datos climáticos. Comportamiento: - Llama a la función `obtener_clima` para obtener los datos climáticos de la ciudad. - Si se obtienen datos válidos, llama a la función `verificar_alertas` para determinar si hay alertas basadas en los datos climáticos. - Llama a la función `guardar_datos` para almacenar los datos y las alertas en un archivo CSV. - Imprime un mensaje indicando que los datos han sido guardados y el número de alertas. - Si hay alertas, imprime las alertas encontradas. Ejemplo de uso: sistema_alerta("Bilbao") """ data = obtener_clima(ciudad) # Obtener datos del clima para la ciudad especificada if data: # Verificar que se obtuvieron datos válidos alertas = verificar_alertas(data) # Obtener alertas basadas en los datos climáticos guardar_datos(data, alertas) # Guardar los datos y alertas en el archivo CSV print(f"Datos guardados para {ciudad} con {len(alertas)} alerta(s)") # Mensaje de confirmación if alertas: # Si hay alertas, imprimirlas print("Alertas:", alertas) # Ejecutar el sistema de alerta ciudad = "Bilbao" sistema_alerta(ciudad)