Sistema integrado de consulta y anΓ‘lisis de datos climΓ‘ticos desde mΓΊltiples fuentes meteorolΓ³gicas.
ClimaGuru (CLIMAPI) es una plataforma que recopila, procesa y analiza datos meteorolΓ³gicos desde diversas APIs especializadas, proporcionando informaciΓ³n completa sobre:
- β PronΓ³sticos meteorolΓ³gicos
- π‘οΈ Datos climΓ‘ticos actuales e histΓ³ricos
- π¨ Calidad del aire
- π‘ ImΓ‘genes de radares meteorolΓ³gicos
- π AnΓ‘lisis y visualizaciones de datos
Estado: β Funcional y en desarrollo activo
- β Meteoblue - PronΓ³sticos detallados y meteogramas
- β Open-Meteo - PronΓ³sticos gratuitos y datos histΓ³ricos
- β OpenWeatherMap - Clima actual, pronΓ³stico 5 dΓas y calidad del aire
- β Meteosource - Datos meteorolΓ³gicos completos
- β IDEAM - Radares meteorolΓ³gicos de Colombia (AWS pΓΊblico)
- β SIATA - Datos histΓ³ricos de MedellΓn y regiΓ³n
- π Consulta unificada de mΓΊltiples fuentes meteorolΓ³gicas
- π Soporte para ubicaciones personalizadas (coordenadas GPS)
- πΎ Almacenamiento automΓ‘tico de datos en formatos JSON y CSV
- π Procesamiento y anΓ‘lisis de datos de radar
- πΌοΈ Descarga de meteogramas e imΓ‘genes de radar
- ποΈ Estructura organizada de datos por fuente
- π‘ Descarga de datos histΓ³ricos SIATA
- π― MenΓΊ interactivo para consultas rΓ‘pidas
- Python 3.10 o superior
- Node.js 20 o superior
- pip (gestor de paquetes de Python)
- Corepack habilitado (para usar pnpm)
- ConexiΓ³n a Internet
- Claves API (para servicios que las requieren)
git clone https://github.com/xtatikmel/ClimaGuru.git
cd ClimaGuruEn Windows:
python -m venv .venv
.venv\Scripts\activateEn Linux/Mac:
python3 -m venv .venv
source .venv/bin/activatepip install -r requirements.txtEl backend vive en backend/ y usa Flask + SQLAlchemy.
- Copia
.env.examplea.envdentro debackend/. - Ajusta los datos de la base de datos (VM MySQL):
DB_HOST=100.78.215.44
DB_PORT=3306
DB_USER=root
DB_PASSWORD=root
DB_NAME=climagurucd backend
pip install -r requirements.txtpython app.pyEl backend quedarΓ‘ disponible en http://localhost:5000.
Endpoints base:
GET /healthPOST /api/auth/registroPOST /api/auth/loginGET /api/auth/me
DocumentaciΓ³n ampliada en backend/docs/API.md.
El frontend vive en frontend/ y usa Next.js con pnpm.
Si pnpm no estΓ‘ en PATH, usa Corepack:
corepack pnpm installo, si ya tienes pnpm global:
pnpm installCrear frontend/.env.local con:
NEXT_PUBLIC_API_URL=http://localhost:5000/apiPara despliegue en servidor, cambia localhost por el dominio o IP pΓΊblica del backend.
cd frontend
corepack pnpm devcd frontend
corepack pnpm build
corepack pnpm startCrear un archivo .env en la raΓz del proyecto con las siguientes claves API:
# Meteoblue (Opcional - requiere registro)
METEOBLUE_API_KEY=tu_api_key_aqui
METEOBLUE_SHARED_SECRET=tu_shared_secret_aqui
# OpenWeatherMap (Opcional - requiere registro)
OPENWEATHER_API_KEY=tu_api_key_aqui
# Meteosource (Opcional - requiere registro)
METEOSOURCE_API_KEY=tu_api_key_aqui
# Open-Meteo (Gratuito - No requiere API key)
# IDEAM (PΓΊblico - No requiere credenciales)
# SIATA (PΓΊblico - No requiere credenciales)Las APIs que requieren registro ofrecen planes gratuitos:
- Meteoblue: https://www.meteoblue.com/
- OpenWeatherMap: https://openweathermap.org/
- Meteosource: https://www.meteosource.com/
- Open-Meteo: https://open-meteo.com/ (no requiere clave)
DocumentaciΓ³n:
Ejecutar el menΓΊ principal:
python main.pyEl sistema mostrarΓ‘ un menΓΊ con las siguientes opciones:
1. Consulta completa (todas las APIs)
2. Consultar solo Meteoblue
3. Consultar solo Open-Meteo (pronΓ³stico)
4. Consultar solo Open-Meteo (histΓ³rico)
5. Consultar solo OpenWeatherMap
6. Consultar solo Meteosource
7. Consultar radares IDEAM
8. Listar radares IDEAM disponibles
9. Descargar datos SIATA histΓ³ricos
10. Salir
El sistema incluye ubicaciones principales de Colombia:
- ποΈ MedellΓn
- ποΈ BogotΓ‘
- ποΈ Cartagena
- π Cali
- π΄ Barranquilla
TambiΓ©n permite ingresar coordenadas personalizadas.
from main import ClimAPIManager
# Inicializar el gestor
manager = ClimAPIManager()
# Consulta completa para MedellΓn
resultados = manager.consulta_completa(
lat=6.245,
lon=-75.5715,
location_name="Medellin",
asl=1495
)
# Consultar solo OpenWeatherMap
datos = manager.consultar_openweather(6.245, -75.5715, "Medellin")
# Consultar radares IDEAM
archivos_radar = manager.consultar_ideam_radar("Barrancabermeja")ClimaGuru/
βββ main.py # Script principal con menΓΊ interactivo
βββ requirements.txt # Dependencias del proyecto
βββ .env # Variables de entorno (API keys)
βββ README.md # DocumentaciΓ³n
βββ LICENSE # Licencia del proyecto
β
βββ data/ # Datos descargados
β βββ data_meteoblue/ # PronΓ³sticos Meteoblue
β βββ data_openmeteo/ # Datos Open-Meteo (CSV/JSON)
β βββ data_openweathermap/ # Datos OpenWeatherMap
β βββ data_meteosource/ # Datos Meteosource
β βββ images_meteo_blue/ # Meteogramas
β βββ Radar_IDEAM/ # ImΓ‘genes de radar IDEAM
β βββ siata_historico/ # Datos histΓ³ricos SIATA
β
βββ logs/ # Archivos de log
β βββ ideam/ # Logs de IDEAM
β βββ siata/ # Logs de SIATA
β
βββ src/ # CΓ³digo fuente
βββ data_sources/ # Clientes de APIs
β βββ meteoblue.py # Cliente Meteoblue
β βββ open_meteo.py # Cliente Open-Meteo
β βββ openweather.py # Cliente OpenWeatherMap
β βββ Meteosource.py # Cliente Meteosource
β βββ ideam_radar_downloader.py # Descargador IDEAM
β βββ siata_cliente.py # Cliente SIATA
β
βββ processors/ # Procesadores de datos
β βββ radar_processor.py # Procesador de datos radar
β βββ radar_advanced_processor.py
β βββ radar_raw_processor.py
β
βββ data_loaders/ # Cargadores de datos
βββ file_loader.py # Cargador de archivos
βββ json_loader.py # Cargador JSON
βββ unified_loader.py # Cargador unificado
Los datos se guardan automΓ‘ticamente en el directorio data/ con las siguientes caracterΓsticas:
- JSON: Datos estructurados de APIs
- CSV: Series temporales (Open-Meteo)
- PNG/JPG: ImΓ‘genes de meteogramas y radares
- Timestamp: Cada archivo incluye fecha y hora de descarga
- OrganizaciΓ³n: Separados por fuente de datos
- Python 3.8+
- requests - Consultas HTTP
- pandas - AnΓ‘lisis de datos
- boto3 - AWS S3 (IDEAM)
- Pillow - Procesamiento de imΓ‘genes
- matplotlib/seaborn - Visualizaciones
- beautifulsoup4 - Web scraping (SIATA)
- streamlit - Dashboard (opcional)
Las contribuciones son bienvenidas. Para contribuir:
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/NuevaCaracteristica) - Commit tus cambios (
git commit -m 'Agregar nueva caracterΓstica') - Push a la rama (
git push origin feature/NuevaCaracteristica) - Abre un Pull Request
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CLIMAGURU BACKEND β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββ βββββββββββββββββββββββ β
β β VM 1: Ubuntu β β VM 2: MySQL β β
β β Server (Flask) ββββββββββΊβ Database β β
β β β Tailscaleβ β β
β β IP: 100.x.x.x β VPN β IP: 100.x.x.x β β
β β β β β β
β β βββββββββββββββββ β β βββββββββββββββββ β β
β β β Flask App β β β β MySQL 8.0 β β β
β β β - API REST β β β β - Usuarios β β β
β β β - Auth JWT β β β β - Consultas β β β
β β β - Cache β β β β - API Keys β β β
β β βββββββββββββββββ β β βββββββββββββββββ β β
β βββββββββββββββββββββββ βββββββββββββββββββββββ β
β β β² β
β β βββββββββββββββββββββββββ β
β β β β
β βΌ β β
β βββββββββββββββββββββββ β
β β APIs Externas β β
β β - OpenWeatherMap β β
β β - Open-Meteo β β
β β - Meteoblue β β
β β - Meteosource β β
β β - IDEAM β β
β β - SIATA β β
β βββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
| Componente | FunciΓ³n | TecnologΓa |
|---|---|---|
| API REST | Exponer endpoints para el frontend | Flask + Flask-RESTful |
| AutenticaciΓ³n | Login seguro de operarios | JWT (PyJWT) |
| Base de Datos | Almacenar usuarios, consultas, API keys | MySQL 8.0 |
| ORM | Mapeo objeto-relacional | SQLAlchemy |
| Migraciones | Control de cambios en BD | Flask-Migrate |
| ValidaciΓ³n | Validar datos de entrada | Marshmallow |
| CORS | Permitir acceso desde frontend | Flask-CORS |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MODELO ENTIDAD-RELACIΓN β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββ ββββββββββββββββββββ βββββββββββββββββββ β
β β usuarios β β consultas β β api_keys β β
β ββββββββββββββββ€ ββββββββββββββββββββ€ βββββββββββββββββββ€ β
β β PK id βββββββββββ€ PK id β β PK id β β
β β username β 1:N β FK usuario_id β β FK usuario_id βββ
β β email β β tipo_consulta β β proveedor β
β β password β β ciudad β β api_key β
β β rol β β latitud β β activa β
β β activo β β longitud β β creada_en β
β β creado_en β β fecha_inicio β βββββββββββββββββββ
β ββββββββββββββββ β fecha_fin β
β β formato β βββββββββββββββββββ
β β parametros β β datos_clima β
β β respuesta_api β βββββββββββββββββββ€
β β promedios βββββββββββ€ PK id β
β β estado β 1:1 β FK consulta_id β
β β creada_en β β temperatura β
β ββββββββββββββββββββ β presion β
β β humedad β
β β viento_vel β
β β viento_dir β
β β fuentes β
β β guardado_en β
β βββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
PRΓXIMOS PASOS (FRONTEND)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ARQUITECTURA FUTURA CON FRONTEND β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββ β
β β FRONTEND β β BACKEND β β DATABASE β β
β β (React/Vue) ββββββββββΊβ Flask API ββββββββββΊβ MySQL β β
β β β HTTP β β TCP β β β
β β - Login Form β β - Auth JWT β β β β
β β - Dashboard β β - Consultas β β β β
β β - Mapas β β - API Externas β β β β
β β - GrΓ‘ficos β β β β β β
β βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββ β
β β
β ComunicaciΓ³n: REST API JSON β
β AutenticaciΓ³n: Bearer Token JWT β
β CORS: Habilitado en Flask β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# En app/__init__.py, ya estΓ‘ configurado:
from flask_cors import CORS
cors.init_app(app, origins=[
'http://localhost:3000', # React dev
'http://localhost:8080', # Vue dev
'https://tu-dominio.com' # ProducciΓ³n
])| Funcionalidad Frontend | Endpoint Backend | MΓ©todo |
|---|---|---|
| Login | /api/auth/login |
POST |
| Registro | /api/auth/register |
POST |
| Dashboard datos | /api/consultas/mis-consultas |
GET |
| Nueva consulta | /api/consultas/tiempo-real |
POST |
| Ver detalle | /api/consultas/<id> |
GET |
| Descargar CSV | /api/consultas/<id>/descargar |
GET |
| EstadΓsticas | /api/reportes/estadisticas |
GET |
Este proyecto estΓ‘ bajo la licencia especificada en el archivo LICENSE.
- *Paradoja Devs
Para preguntas o sugerencias, por favor abre un issue en el repositorio.
Γltima actualizaciΓ³n: Febrero 2026