6ad82167bb
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3.9 KiB
3.9 KiB
name, id, status, created, updated, priority, risk, related_issues, apps, trigger, schedule, expected_runtime_s, tags
| name | id | status | created | updated | priority | risk | related_issues | apps | trigger | schedule | expected_runtime_s | tags | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| aemet-madrid | 0002 | pending | 2026-05-16 | 2026-05-16 | medium | low |
|
|
cron | 0 * * * * | 10 |
|
Goal
Probar path HTTP-only (sin Chrome/CDP). Extractor REST -> data_factory -> sink geo (PostGIS via footprint_geo_stack). Demuestra que el stack tambien sirve para APIs publicas + datos georeferenciados.
Pre-requisitos
- API key AEMET (gratis, signup). Guardar en
pass insert aemet/api-key. footprint_geo_stackcorriendo (PostGIS :5432 + Martin tiles :3000).- dag_engine activo.
Flow
- Crear funcion del registry
aemet_get_weather_py_infra(o usarhttp_get_json_py_infradirectamente si la API responde JSON simple). - Endpoint AEMET observacion convencional:
GET https://opendata.aemet.es/opendata/api/observacion/convencional/datos/estacion/<id>con headerapi_key. - Schema esperado:
[{ts, temp, humidity, pressure, wind_speed, lat, lon}, ...]. - Sink: INSERT en PostGIS tabla
weather_madrid (ts, temp, humidity, pressure, geom geometry(Point, 4326)). - Crear node en data_factory:
{kind: 'database', label: 'postgis_weather'}(sink declarado). - DAG
aemet_madrid_hourly.yaml:name: aemet-madrid schedule: "0 * * * *" steps: - name: extract function: aemet_get_weather_py_infra args: ["--station", "3195", "--out", "/tmp/aemet.json"] - name: load_postgis function: db_insert_row_go_infra args: ["--db", "postgres://...", "--table", "weather_madrid", "--from-json", "/tmp/aemet.json"] depends: [extract] - Verificar Martin tiles renderiza overlay (opcional).
Acceptance
- Funcion AEMET extractor existe (creada o reusada
http_get_json_*). - DAG corre 2x consecutivas via scheduler.
- PostGIS tabla
weather_madridtiene >=2 filas. - data_factory muestra node
aemet_madridkind=extractor + nodepostgis_weatherkind=database conlast_seen_atreciente. - Martin tile server sirve overlay weather (opcional).
Telemetria esperada
function_stats.http_get_json_py_infraoaemet_get_weather_py_infra: calls_24h += 24 (1/hora).data_factory.runs: 24 entries/dia.data_factory.databases.last_seen_atactualizado por sink.
Definition of Done
Ver README.md seccion DoD + user-facing.
Generico
- Repetibilidad: cron
0 * * * *corre 3h consecutivas sin error. - Observabilidad: extractor en
call_monitor.calls, runs endata_factory.runs, fila endatabases.last_seen_at. - Error-path: AEMET 5xx → 3 reintentos exp-backoff, despues marca run failed (no crash).
- Idempotencia: re-run mismo timestamp = upsert PostGIS, sin duplicar puntos.
- Secrets: API key AEMET en
pass aemet/api-key, nunca en el DAG. - Docs:
## Notascon comandos + onboarding. - Registry-first: extractor AEMET creado como funcion del registry (
aemet_get_madrid_observations_py_*o reuso dehttp_get_json_*), nada inline. - INDEX + status:
status: done+ INDEX + movido.
User-facing
- User-facing: usuario abre
footprint_geo_stack→ presetmadrid-weather→ ve overlay tiles con puntos meteo + tooltip (temp/humidity). - User-facing repeat: mismo preset manana muestra datos refrescados; tooltip ultima hora.
- User-facing onboarding: parrafo en
## Notas: "Para ver weather Madrid:footprint_geo_stack.exe→ File → Open presetmadrid-weather. Tile server local en :3000." - User-facing latencia: cron 1h → mapa refleja datos en <61 min.
Custom
- PostGIS schema via
migrations/NNN_*.sql(noCREATE TABLEinline). - Tile overlay sirve en <3s desde click.
Notas
- Sin LLM/CDP. Mas barato que flow 0001.
- Caso minimal para servicios geo. Si funciona, sirve de plantilla para mas extractores API.