Easy-to-manage touch screens
Free, open-source touch screens. Guided USB setup, a drag-and-drop editor and local control. Made for Home Assistant.
Map of charging stations on the Iberian Peninsula with power filter
AI translation
Mapa de electrolineras en la península ibérica con filtro por potencia
LifestylePython · TypeScriptGitHub @jualasOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Mapa de ~22.000 cargadores de VE en España y Portugal (datos oficiales DATEX II): búsqueda en corredor de ruta, plan de carga y asistente IA. FastAPI + React + Docker.
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Electrolineras ⚡ — cargadores de VE en España y Portugal Mapa unificado de los ~22 000 puntos de recarga de España y Portugal a partir de los datos abiertos oficiales (DATEX II), con estado en tiempo real, búsqueda de cargadores en el corredor de una ruta y planificador de paradas de carga. Pensado para usarse desde el móvil y desde el navegador del coche (Tesla). La información de recarga está dispersa y el navegador del coche suele proponer paradas malas: desvíos largos a cargadores «de paso» o paradas que obligan a salir de la autovía, cambiar de sentido y volver a incorporarse.Read the full README ↗
Demo en producción: https://electro.jualas.es
Mapa unificado de los ~22 000 puntos de recarga de España y Portugal a partir de los datos abiertos oficiales (DATEX II), con estado en tiempo real, búsqueda de cargadores en el corredor de una ruta y planificador de paradas de carga. Pensado para usarse desde el móvil y desde el navegador del coche (Tesla).
| Escritorio | Móvil |
|---|---|
La información de recarga está dispersa y el navegador del coche suele proponer paradas malas: desvíos largos a cargadores «de paso» o paradas que obligan a salir de la autovía, cambiar de sentido y volver a incorporarse.
Caso típico: desde Granada con 44 % de batería hacia Cartagena, encontrar en segundos cargadores ≥ 100 kW en la carretera, en sentido de marcha y con el menor desvío posible. Detalle: docs/ROUTE_CORRIDOR_SEARCH.md.
Zona pública
Zona privada (login con usuario + código TOTP)
docs/CHARGING_AGENT.md).| Capa | Tecnología |
|---|---|
| Backend | Python 3.12, FastAPI, Pydantic v2, httpx, lxml (DATEX II), SQLite |
| Frontend | React 19 + TypeScript, Vite, MapLibre GL, Vitest |
| Rutas y geocodificación | OSRM y Nominatim autoalojados (península ibérica) |
| Seguridad | Sesión firmada (itsdangerous), TOTP (pyotp), bcrypt, rutas privadas protegidas |
| IA | Dify (workflow con herramientas HTTP sobre la API) y Cursor CLI como agente local |
| Infraestructura | Docker Compose (API + nginx + OSRM + Nominatim), Cloudflare Tunnel, cron de ingestión |
| Calidad | pytest (230+ tests), Ruff, oxlint, GitHub Actions (lint, tests, build Docker) |
flowchart LR
subgraph fuentes [Fuentes oficiales]
ES[NAP DGT · DATEX II]
PT[MOBI.E · DATEX II]
REVE[REVE · estado en vivo]
end
subgraph servidor [Servidor · Docker Compose]
ING[Ingestión programada<br/>fetch → parse → normaliza]
DB[(SQLite)]
API[FastAPI]
OSRM[OSRM]
NOM[Nominatim]
NGINX[nginx + SPA React]
end
DIFY[Dify · agente IA]
TM[TeslaMate · MQTT]
ES & PT --> ING --> DB --> API
REVE --> API
API --> OSRM
API --> NOM
TM -.zona privada.-> API
DIFY -->|herramientas HTTP| API
NGINX --> API
USER[Móvil / navegador del coche] -->|Cloudflare Tunnel| NGINX
lxml.iterparse del XML de ~180 MB de Portugal) normalizada a un modelo común ES/PT y exportada a SQLite + GeoJSON.make deploy construye las imágenes, guarda una etiqueta :previous para rollback y verifica /health antes de dar el despliegue por bueno. Staging separado en otro puerto.| País | Fuente oficial | Formato | Actualización |
|---|---|---|---|
| España (estático) | NAP DGT / MITECO | DATEX II v3 | ~24 h |
| España (dinámico) | REVE / mapareve.es (Red Eléctrica) | Web + OCPI entre operadores | Tiempo real |
| Portugal | MOBI.E NAP | DATEX II | Tiempo real |
Detalle técnico en docs/DATA_SOURCES.md.
docs/VISION.md — visión, funcionalidades y fasesdocs/DATA_SOURCES.md — URLs, formatos y estrategia de ingestióndocs/FILTERS.md — potencia elegible y acceso públicodocs/NAVIGATION.md — envío de paradas y rutas al coche (Tesla, Google Maps)docs/ROUTE_CORRIDOR_SEARCH.md — búsqueda en corredor de rutadocs/ARCHITECTURE.md — arquitectura propuestadocs/STORAGE.md — persistencia SQLite / SpatiaLite / PostGISdocs/STATUS.md — fase actual, roadmap con IDs de tareaTASKBOARD.md — espejo del backlog en TaskBoard (proyecto id=7)docs/ENV.md — variables de entorno, secretos y plantillas (#6043)docs/CI_CD.md — GitHub Actions, deploy y rollback (#6044)docs/NOMINATIM.md — geocodificación self-hosted ES+PT (#6046)docs/DEPLOYMENT.md — runbook despliegue mini PCElectrolineras/
├── data/
│ ├── raw/ # XML DATEX descargados (gitignore)
│ ├── processed/ # GeoJSON exportado
│ └── db/ # stations.db (gitignore)
├── docs/
├── scripts/ # ingest_all.py, etc.
├── src/
│ ├── api/ # FastAPI
│ ├── db/ # persistencia (#6026)
│ ├── ingest/ # fetch + parser DATEX
│ ├── models/
│ └── web/ # Frontend Vite + React
├── tests/
├── pyproject.toml
├── Makefile
└── .env.example # dev — ver docs/ENV.md y .env.production.example
make (opcional, atajos de desarrollo)# 1. Variables de entorno
cp .env.example .env
Configuración prod y secretos: [`docs/ENV.md`](docs/ENV.md) · validación: `make env-check-prod ENV_FILE=…`
# 2. Backend (venv + dependencias + tests)
make install-dev
# 3. Terminal A — API
make api
# → http://127.0.0.1:8000/health
# → http://127.0.0.1:8000/docs (OpenAPI / Swagger)
# 4. Terminal B — frontend
make web
# → http://127.0.0.1:5173
Comandos útiles:
| Comando | Descripción |
|---|---|
make install | Solo Python (venv + pip install -e .) |
make install-dev | Python + dependencias dev + npm install en src/web |
make api | Uvicorn con recarga (electrolineras-api) |
make web | Vite dev server (src/web, proxy API) |
make web-build | Build estático → src/web/dist/ |
make test | pytest |
make lint | ruff sobre src/ y tests/ |
make fetch-es | Descarga feed NAP España → data/raw/es/ |
make fetch-pt | Descarga feed NAP Portugal (streaming ~180 MB) → data/raw/pt/ |
make parse-es / make parse-pt | Parsear último XML DATEX → resumen JSON |
make load-db | Re-parsear XML existente → SQLite + GeoJSON (sin descargar) |
make ingest | Pipeline completo: descarga ES+PT → SQLite → GeoJSON |
make ingest-es / make ingest-pt | Pipeline de un solo país (ideal para cron) |
Flujo: descarga DATEX → parse → SQLite → GeoJSON.
make ingest # ES + PT completo
make ingest-es # solo España (cron diario)
make ingest-pt # solo Portugal (cron cada 6 h)
.venv/bin/electrolineras-ingest --skip-fetch # sin red, usa XML en data/raw/
.venv/bin/electrolineras-ingest --summary # resumen JSON
Salidas: data/raw/{es,pt}/, data/db/stations.db, data/processed/stations.geojson.
Cron producción (#6040): scripts/cron/ — make cron-install, make cron-test-es, make cron-test-reve. Ver docs/DEPLOYMENT.md.
Pasos individuales (depuración):
make fetch-es && make fetch-pt && make load-db
Documentación interactiva: http://127.0.0.1:8000/docs
| Endpoint | Descripción |
|---|---|
GET /health | Estado del servicio |
GET /api/v1/stations | Lista paginada (format=json|geojson, min_kw, max_kw, country, bbox, limit, offset) |
GET /api/v1/stations/{id} | Detalle de una estación |
GET /api/v1/stations/nearby | Ciudad: lat/lon, q (geocode), bbox, radius_m (default 1 km), kW, filtros acceso |
GET /api/v1/stations/along-route | Búsqueda en corredor (origin_lat/lon, dest_lat/lon, min_kw, corridor_km, behind_margin_km) |
GET /api/v1/meta/geocode | Autocompletado de lugares (q, limit) vía Nominatim |
GET /api/v1/meta/stats | Conteos por país y bandas de potencia |
GET /api/v1/meta/operators | Top operadores (country, limit) |
Ejemplos:
curl 'http://127.0.0.1:8000/api/v1/stations?min_kw=100&country=ES&format=geojson&limit=50'
curl 'http://127.0.0.1:8000/api/v1/stations/along-route?origin_lat=37.18&origin_lon=-3.60&dest_lat=37.60&dest_lon=-0.99&min_kw=100&corridor_km=10'
curl 'http://127.0.0.1:8000/api/v1/meta/stats'
En producción en https://electro.jualas.es desde la v0.2.0. Hecho: mapa ES+PT, búsqueda en corredor, plan de carga, estado en vivo, zona privada con TOTP, telemetría TeslaMate, asistente IA y despliegue con staging y rollback.
Avance detallado: docs/STATUS.md · backlog: TASKBOARD.md · operación: docs/DEPLOYMENT.md
jualas · proyecto personal posterior al ciclo de DAM · GitHub @jualas
Licencia MIT.