20. Clima

 

20. Clima con Python: Tutorial para Principiantes

☀️ Introducción: Tu asistente meteorológico personal

¡Imagina poder preguntarle a tu asistente cómo está el clima sin abrir tu teléfono! Vamos a enseñarle a tu asistente virtual a consultar el clima de cualquier ciudad. Es como tener un mini meteorólogo dentro de tu computadora.

¿Qué es una API?

  • API = Interfaz de Programación de Aplicaciones

  • Es como un "menú" que un sitio web ofrece para que otros programas puedan obtener información

  • Analoǵía: Un restaurante (sitio web) tiene un menú (API) que tú (tu programa) usas para pedir comida (información)


🌍 ¿Cómo funciona? Esquema visual

text

TU ASISTENTE → Pregunta "¿Cómo está el clima?"

       ↓

PYTHON → Usa la API de OpenWeather

       ↓

INTERNET → Consulta datos en tiempo real

       ↓

OPENWEATHER → Responde con datos del clima

       ↓

TU ASISTENTE → Dice: "Está soleado, 25°C"


🛠️ Lo que necesitaremos

1. Una cuenta en OpenWeatherMap

  • Es GRATIS para uso básico

  • Necesitamos una "API Key" (llave de acceso)

  • Es como una contraseña que identifica a tu programa

2. La librería requests

  • ¡Ya viene con Python! No necesitas instalarla

  • Sirve para hacer peticiones a sitios web

  • Es como un "mensajero" que va y viene entre tu programa e internet


📋 Paso a paso detallado

Paso 1: Crear cuenta en OpenWeatherMap

  1. Ve a openweathermap.org

  2. Haz clic en "Sign Up" (Registrarse)

  3. Completa el formulario

  4. Confirma tu email

Es como abrir una cuenta en el banco:

  • Registrarte = Abrir cuenta

  • API Key = Tu tarjeta de débito

  • Consultar clima = Retirar dinero


Paso 2: Obtener tu API Key

  1. Después de registrarte, ve a tu panel de control

  2. Busca "API Keys" o "My API Keys"

  3. Haz clic en "Generate" o "Create Key"

  4. ¡Guarda esta clave! Es tu contraseña única

⚠️ IMPORTANTE:

  • Nunca compartas tu API Key públicamente

  • Puede demorar unas horas en activarse

  • Si no funciona al inicio, espera un rato


Paso 3: Estructura de la URL de la API

La URL para consultar el clima tiene esta forma:

text

https://api.openweathermap.org/data/2.5/weather?q=CIUDAD&appid=TU_API_KEY&units=metric&lang=es

Partes importantes:

  • q=CIUDAD → Nombre de la ciudad

  • appid=TU_API_KEY → Tu clave de acceso

  • units=metric → Temperatura en Celsius

  • lang=es → Idioma español


✍️ Código completo explicado

Paso 1: Importar la librería

python

import requests  # ← ¡Ya está incluida en Python!

¿Qué hace requests?

  • requests.get(URL) → Visita una página web

  • Devuelve la información que esa página muestra


Paso 2: Crear la función principal

python

def obtener_clima():

    """

    Obtiene y dice el clima actual

    """

    # 1. Configurar los datos

    ciudad = "Santiago"  # Puedes cambiar esta ciudad

    api_key = "TU_API_KEY_AQUI"  # ← ¡Pega tu clave aquí!

    

    # 2. Construir la URL

    url = f"https://api.openweathermap.org/data/2.5/weather?q={ciudad}&appid={api_key}&units=metric&lang=es"

    

    # 3. Hacer la petición

    respuesta = requests.get(url)

    

    # 4. Convertir a formato JSON (fácil de leer)

    datos = respuesta.json()

    

    # 5. Extraer la información

    temperatura = datos["main"]["temp"]

    clima = datos["weather"][0]["description"]

    

    # 6. Decir el resultado

    hablar(f"La temperatura es de {temperatura} grados Celsius")

    hablar(f"El clima está {clima}")


Paso 3: Entender la estructura de los datos

Cuando OpenWeather responde, envía datos en formato JSON:

python

# Ejemplo de lo que recibimos:

{

    "main": {

        "temp": 19.4,          # Temperatura

        "humidity": 65,        # Humedad

        "pressure": 1015       # Presión

    },

    "weather": [

        {

            "description": "cielo claro",  # Descripción

            "main": "Clear"                # Resumen

        }

    ],

    "name": "Santiago"         # Nombre de la ciudad

}

Para acceder a los datos:

  • datos["main"]["temp"] → Temperatura

  • datos["weather"][0]["description"] → Descripción del clima


Paso 4: Código completo mejorado

python

# ASISTENTE VIRTUAL - FUNCIÓN DEL CLIMA

import requests

import pyttsx3


# Configuración de voz

engine = pyttsx3.init()


def hablar(texto):

    engine.say(texto)

    engine.runAndWait()


def obtener_clima(ciudad="Santiago"):

    """

    Obtiene el clima de una ciudad específica

    

    Args:

        ciudad (str): Nombre de la ciudad (por defecto: Santiago)

    

    Returns:

        str: Descripción del clima o mensaje de error

    """

    

    # TU API KEY - ¡REMPLAZA ESTO!

    api_key = "TU_API_KEY_AQUI"  # Ejemplo: "a1b2c3d4e5f6g7h8i9j0"

    

    # Verificar que tengamos API Key

    if api_key == "TU_API_KEY_AQUI":

        hablar("Primero configura tu API Key de OpenWeather")

        return "API Key no configurada"

    

    # Construir la URL

    url = f"https://api.openweathermap.org/data/2.5/weather?q={ciudad}&appid={api_key}&units=metric&lang=es"

    

    try:

        # Hacer la petición

        respuesta = requests.get(url)

        

        # Verificar si la ciudad existe

        if respuesta.status_code == 404:

            hablar(f"No encontré la ciudad {ciudad}")

            return f"Ciudad {ciudad} no encontrada"

        

        # Verificar si hay error de API Key

        if respuesta.status_code == 401:

            hablar("Error con la API Key. Verifica que sea correcta")

            return "Error de autenticación"

        

        # Convertir respuesta a JSON

        datos = respuesta.json()

        

        # Extraer información

        temperatura = datos["main"]["temp"]

        clima = datos["weather"][0]["description"]

        humedad = datos["main"]["humidity"]

        ciudad_nombre = datos["name"]

        

        # Preparar mensaje

        mensaje = f"En {ciudad_nombre} hay {temperatura:.1f} grados. El clima está {clima}. Humedad: {humedad}%."

        

        # Decir el mensaje

        hablar(mensaje)

        

        # También imprimirlo

        print(f"🌤️  Clima en {ciudad_nombre}:")

        print(f"   Temperatura: {temperatura:.1f}°C")

        print(f"   Condición: {clima}")

        print(f"   Humedad: {humedad}%")

        

        return mensaje

        

    except Exception as e:

        error_msg = f"Error al obtener clima: {e}"

        hablar("No pude obtener el clima en este momento")

        print(error_msg)

        return error_msg


def clima_inteligente(comando):

    """

    Versión inteligente que extrae la ciudad del comando

    """

    

    # Lista de palabras clave para clima

    palabras_clima = ["clima", "temperatura", "tiempo", "calor", "frío"]

    

    # Extraer ciudad del comando

    comando_lower = comando.lower()

    

    # Opción 1: Clima por defecto (sin ciudad especificada)

    if "clima" in comando_lower and len(comando_lower.split()) <= 3:

        hablar("Consultando el clima actual...")

        return obtener_clima()  # Ciudad por defecto

    

    # Opción 2: Con ciudad específica

    # Ejemplo: "clima en Madrid" o "temperatura en Buenos Aires"

    for palabra in palabras_clima:

        if palabra in comando_lower:

            # Extraer lo que viene después de "en"

            if " en " in comando_lower:

                partes = comando_lower.split(" en ")

                if len(partes) > 1:

                    ciudad = partes[1].strip()

                    hablar(f"Consultando el clima en {ciudad}...")

                    return obtener_clima(ciudad)

    

    # Opción 3: Preguntar por ciudad

    hablar("¿De qué ciudad quieres saber el clima?")

    # Aquí podrías agregar código para escuchar la respuesta

    

    return "Ciudad no especificada"


# Función principal del asistente

def asistente_principal():

    hablar("Asistente meteorológico activado")

    

    while True:

        # Suponiendo que tienes función para escuchar

        comando = escuchar().lower()

        

        if not comando:

            continue

        

        # Detectar comandos de clima

        if any(palabra in comando for palabra in 

               ["clima", "temperatura", "tiempo", "hace calor", "hace frío"]):

            

            # Decir algo mientras procesa

            hablar("Consultando información meteorológica...")

            

            # Obtener clima

            clima_inteligente(comando)

        

        elif 'salir' in comando:

            hablar("Hasta luego. ¡Que tengas buen día!")

            break


# Diagrama visual del proceso:

"""

🎤 TÚ: "¿Cómo está el clima en Madrid?"

     ↓

🤖 ASISTENTE: Detecta "clima" y "Madrid"

     ↓

🔗 REQUESTS: Visita OpenWeather con la ciudad

     ↓

🌍 API: Responde con datos JSON

     ↓

📊 PROCESO: Extrae temperatura=22.5, clima="soleado"

     ↓

🔊 ASISTENTE: "En Madrid hay 22.5 grados. El clima está soleado"

     ↓

👂 TÚ: "¡Perfecto para salir!"

"""


🎯 Ejemplos de comandos que funcionan

Comando

Resultado

"¿Cómo está el clima?"

Clima de ciudad por defecto

"Clima en Barcelona"

Clima específico de Barcelona

"¿Hace calor hoy?"

Información de temperatura

"Dime la temperatura"

Solo la temperatura

"¿Qué tiempo hace?"

Descripción completa


🚨 Solución de problemas comunes

Problema 1: API Key no funciona

python

# Síntoma: Error 401

# Solución:

# 1. Espera 2-3 horas después de crear la cuenta

# 2. Verifica que copiaste toda la clave

# 3. Asegúrate de no tener espacios

Problema 2: Ciudad no encontrada

python

# Síntoma: Error 404

# Solución:

# 1. Escribe el nombre en inglés: "Madrid" no "Madrí"

# 2. Usa el formato: "Ciudad,País" → "London,UK"

# 3. Verifica ortografía

Problema 3: Temperatura en Kelvin (muy alta)

python

# Síntoma: Dice "290 grados"

# Solución: Agrega &units=metric a la URL

# Esto convierte a Celsius automáticamente


✨ Mejoras opcionales para tu código

1. Clima extendido:

python

def clima_extendido(ciudad):

    # Incluye más información

    datos = respuesta.json()

    

    viento = datos["wind"]["speed"]  # Velocidad del viento

    presion = datos["main"]["pressure"]  # Presión atmosférica

    amanecer = datos["sys"]["sunrise"]  # Hora del amanecer

    

    mensaje = f"""Viento: {viento} km/h

Presión: {presion} hPa

Amanece a las {amanecer}"""

2. Multiples ciudades:

python

ciudades_favoritas = {

    "casa": "Santiago",

    "trabajo": "Madrid",

    "playa": "Barcelona"

}


if "clima en casa" in comando:

    obtener_clima(ciudades_favoritas["casa"])

3. Pronóstico:

python

# Para pronóstico de 5 días (necesita API Key pro)

url_pronostico = f"https://api.openweathermap.org/data/2.5/forecast?q={ciudad}&appid={api_key}"


📊 Resumen de parámetros de la URL

Parámetro

Ejemplo

Descripción

q

q=Madrid

Ciudad a consultar

appid

appid=abc123

Tu API Key

units

units=metric

Celsius (metric) o Fahrenheit (imperial)

lang

lang=es

Idioma español


✅ Resumen clave

  1. OpenWeatherMap = Servicio gratuito de clima

  2. API Key = Tu llave de acceso única (¡guárdala!)

  3. requests.get() = Obtiene datos de internet

  4. .json() = Convierte respuesta a diccionario Python

  5. &units=metric&lang=es = Celsius en español


📝 Cuestionario de repaso

Pregunta 1

¿Qué es una API Key?
a) Una contraseña para tu email
b) Un código que identifica tu programa ante un servicio
c) La temperatura en grados
d) Un tipo de variable en Python

Pregunta 2

¿Qué librería usamos para obtener datos de internet?
a) pyjokes
b) requests
c) weather
d) internet

Pregunta 3

¿Qué agregamos a la URL para obtener la temperatura en Celsius?
a) &celsius=true
b) &units=metric
c) &temp=c
d) &grados=celsius

Pregunta 4

Si OpenWeather responde con error 404, ¿qué significa?
a) API Key incorrecta
b) Ciudad no encontrada
c) Internet desconectado
d) Demasiadas consultas

Pregunta 5

¿Cómo accedemos a la descripción del clima en los datos JSON?
a) datos["weather"]["description"]
b) datos["clima"]
c) datos["weather"][0]["description"]
d) datos.tiempo.descripcion


Respuestas del cuestionario

  1. b) Un código que identifica tu programa ante un servicio - Es como tu DNI para la API

  2. b) requests - Viene incluida en Python, no necesita instalación

  3. b) &units=metric - "metric" = sistema métrico (Celsius)

  4. b) Ciudad no encontrada - Error 404 significa "no encontrado"

  5. c) datos["weather"][0]["description"] - "weather" es una lista, por eso usamos [0]


🌦️ Reto final: Personaliza tu asistente climático

Desafío 1: Agrega recomendaciones

python

if temperatura > 30:

    hablar("Hace mucho calor, lleva agua y protector solar")

elif temperatura < 10:

    hablar("Hace frío, abrígate bien")

Desafío 2: Guarda historial

python

import datetime

historial = []


def guardar_clima(ciudad, temperatura):

    fecha = datetime.datetime.now()

    historial.append({

        "fecha": fecha,

        "ciudad": ciudad,

        "temp": temperatura

    })

Desafío 3: Compara ciudades

python

def comparar_climas(ciudad1, ciudad2):

    temp1 = obtener_clima(ciudad1)

    temp2 = obtener_clima(ciudad2)

    hablar(f"{ciudad1} tiene {temp1}° y {ciudad2} tiene {temp2}°")


🎉 ¡Felicidades!

Ahora tu asistente puede:

  • ✅ Consultar el clima en tiempo real

  • ✅ Hablar en español

  • ✅ Dar temperaturas en Celsius

  • ✅ Trabajar con múltiples ciudades

Próximo paso: Agregar pronóstico del tiempo, alertas de lluvia, o integrar con tu calendario para sugerir ropa según el clima.



https://www.youtube.com/watch?v=Pj9KbAKpQyk

https://www.youtube.com/watch?v=-0tIy8wWtzE

https://www.youtube.com/watch?v=YqSSId7xfwU

https://www.youtube.com/watch?v=MjK-j7YJ5YI


https://www.youtube.com/watch?v=l2G8-iQYfoA



https://www.youtube.com/watch?v=t-YO0XeHczU


Comentarios

Entradas más populares de este blog

1-7. Transforma tu audio a texto

10. Haz que tu asistente hable

8. NUEVO - Solución si tu micrófono no está captando tu audio