Skip to content

fcavero/dgt-envlabel

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

API de distintivos ambientales de la DGT

API vitaminada para consultar los distintivos ambientales del parque móvil de España; a partir de su matrícula, podemos saber qué distintivo ambiental tiene un vehículo, o, incluso, qué distintivos ambientales ha ido teniendo a lo largo del tiempo. Sí, amiguitos, los distintivos ambientales mutan, de acuerdo a las mejoras que los propietarios hagan a sus vehículos (v.g. cambiar un motor diesel Euro5 por un GNC o GLP)[¹].

Pero, ¿esto no es lo que ya se hace aquí? Sí, pero ahora sin web scrapping, y accediendo al histórico, y porque podemos, y si podemos, lo hacemos.

Los datos servidos tienen su origen en un fichero espantoso que la DGT, esto es, la Dirección General de Tráfico, genera de manera periódica —con una periodicidad que solo ellos conocen—, publica, y luego esconde en su espeluznante portal de datos estadísticos (esta horrendez, que pagan nuestros impuestos).

El fichero no es más que un CSV con este formato: MATRÍCULA|ETIQUETA AMBIENTAL

Ahí va una cata del fichero:

0003LWZ|16MC
0003LXB|16TC
0003LXC|16TC
0003LXD|16TC
0003LXF|16TC
0003LXG|16TC
0003LXH|16MC
0003LXJ|16M0
0003LXK|16TC
0003LXL|16TC
[...]

Los literales de las etiquetas tienen su propia semántica atroz para llegar a diferenciar los siguientes tipos, de menos a más contaminante:

  • CERO EMISIONES: Etiquetas 16M0 y 16T0
  • ECO: Etiquetas 16ME y 16TE
  • C: Etiquetas 16MC y 16TC
  • B: Etiquetas 16MB y 16TB
  • SIN DISTINTIVO: No existe etiqueta, o etiqueta SIN DISTINTIVO, conocidos a pie de calle como vehículos A.

[¹]: En ocasiones es importante tener clara la evolución cronológica de cambios, pues la DGT no practica la sublimación de un ditintivo C o B al gas natural o el petróleo licuado, esto es, al ECO. El flujo, por poco lógico que parezca, es el siguiente: de un C o un B pasa a ser, por un tiempo indeterminado, un vehículo SIN DISTINTIVO, y ya desde este «estado-intermedio-sin-etiqueta», a un vehículo ECO. Imaginaos ahora que en un municipio cualquiera (pongamos que hablo de Madrid), los vehículos SIN DISTINTIVO tienen el acceso restringido y son sancionados; el propietario del vehículo, que ya es tecnológicamente ECO, ignora por completo que, oficialmente, su vehículo es un paria SIN DISTINTIVO, y si no somos cuidadosos, podría ser injustamente sancionado (o más injustamente sancionado, quicir).

Pero, ¿por qué carallo se hace esto?

Es una funcionalidad añadida para los sistemas de control de accesos que emplean los policías locales y municipales en el correctísimo desempeño de su importante labor. ¿Les importan los distintivos ambientales a las fuerzas y cuerpos de seguridad del Estado? Lo mismo que a mí: nada de nada. Al menos, hasta que circular con un vehículo SIN DISTINTIVO por su jurisdicción sea constitutivo de delito. How dare you?

Sin embargo, a mis queridos y estimados concejales de movilidad ─un saludo afectuoso desde aquí; Fernando Cavero, un admirador, un amigo, un esclavo, un sieeervo─, no es que les gusten los distintivos ambientales, no. Es que les erotizan. Imaginaos un Excel de accesos a su municipio con los datos agregados por «etiqueta de la DGT». Por días. Semanas. Meses. Años. Mmmmm

En algunos municipios, además, siguiendo a pies juntillas las agendas europeas del pensamiento correctísimamente correcto, se veta la entrada en determinadas calles a vehículos de contribuyentes cuyas emisiones no sean «las adecuadas» (de los vehículos, no de los contribuyentes), llegando a sancionar administrativamente a los ciudadanos a la par que violan el artículo 19 de la Constitución Española de 1978 🤡

Recapitulando, contar con un mecanismo automático que realice el mantenimiento de los datos de los distintivos ambientales, parece que viene a ser necesario. La alternativa manual es tan pesadillesca que, cuando lo has tenido que hacer un par de veces, solo piensas en sacártelo de encima.

Stack tecnológico detrás de este tinglado

Este pequeño proyecto utiliza, todo convenientemente dockerificado, los siguientes componentes:

  • La API está desarrollada en PHP 8.2 con Symfony (versión 5.4 LTS, de acuerdo al roadmap oficial) y API Platform.
  • Los scripts que manejan el fichero son comandos de Symfony, esto es, más PHP.
  • La base de datos es PostgreSQL, con un modelo de datos bien sencillo a la par de eficaz.
  • Para la comunicación asíncrona entre servicios se utiliza RabbitMQ.

Descripción general del proceso de mantenimiento de distintivos ambientales

Los pasos, grosso modo, son los siguientes:

  1. Un comando descarga el fichero ZIP de la página de estadísticas de la DGT. El fichero es de alrededor de 90 MB.
  2. Otro comando descomprime el fichero (más de 500 MB), e invoca al comando split del sistema operativo con el fin de poder manejar n ficheros pequeños en lugar de uno enorme. Divide et impera.
  3. Un tercer comando es el encargado de enviar al bróker de mensajería un mensaje con la ruta de cada fichero a importar en la base de datos.
  4. Una aplicación se encuentra en permanente escucha de mensajes de ficheros, procesándolos de a poquito; son muchos millones de registros, y no queremos quedarnos sin memoria.

Como no hay prisa y el número de registros a tratar es muy grande (más de 30 millones), el proceso completo se demora varias horas, durante las cuales la API sigue siendo por completo funcional.

Hablar es fácil. Enséñame la API

Sin ser el único, el EndPoint más útil es el de recuperar un distintivo ambiental a partir de una matrícula:

GET /v1/vehicles/latest/0000KKK

{
    "id": "72dd88f8-7ffb-4482-82f8-f5d785257fd1",
    "plate": "000KKK",
    "createdAt": "2023-01-20T09:31:43+01:00",
    "label": {
        "id": 6,
        "tag": "16ME",
        "description": "ECO"
    }
}

En el README.md del componente de la API se detalla este y el resto de EndPoints de la API.

Estructura

.
├── dgt-envlabel-api
├── dgt-envlabel-db
├── dgt-envlabel-settler
├── rabbitmq
└── tmp
    └── splits

Donde:

  • dgt-envlabel-api → API de Symfony/API Platform y comandos de descarga y procesado del fichero de datos.
  • dgt-envlabel-dbScripts que despliegan, con Sqitch, el modelo de datos.
  • dgt-envlabel-settler → Aplicación que procesa los mensajes y ejecuta la persistencia de datos en PostgreSQL.
  • rabbitmqRabbitMQ dockerificado, con el plugin Management para mayor comodidad.
  • tmp/splits → Rutas donde se descarga el fichero de datos, se descomprime y se trocea. Son convenientemente limpiadas tras cada ejecución.

Licencia

DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE (WTFPL). Por favor, revisad el fichero de licencia para más información.

About

Tiny API to fetch the Spanish General Directorate of Traffic environmental label for a given vehicle's license plate.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published