Con el nivel tan disparatado de precios que están alcanzando los combustibles en estas fechas, es interesante tener una manera rápida de consultar los precios en diferentes estaciones de servicio, a fin de poder reposar en la que más nos convenga. Por razones de trabajo y sus subsecuentes desplazamientos, hay varias gasolineras que nos interesa a Ana y a mí tener monitorizadas. Existe una página del Ministerio para la Transición Ecológica (Geoportal de Gasolineras) que permite acceder a los precios de todas las estaciones de servicio de España, pero que no es especialmente usable para hacer consultas rápidas y recurrentes de las mismas estaciones, ya que lo que hace es desplegar un mapa y un buscador, pero que no proporciona URLs de acceso directo ni nada que se le parezca.
Al menos, no lo hace a la vista del usuario. Pero si trasteas un poco con el funcionamiento de la página, es posible ver que sí se hace uso a nivel interno de URLs únicas que proporcionan en el mapa los valores de cada una de las gasolineras en formato XML, para poder reflejar dichos valores al pulsar sobre las gasolineras, con un aspecto como este:
Y ya teniendo esta información, haciendo uso de Node Red es sencillo procesar los parámetros, jugar un poco con ellos, e insertarlos en topics MQTT. En mi caso, me quedo con el valor de la gasolina sin plomo 95, de tres estaciones de servicio determinadas, realizando consultas una vez a la hora para cada una de ellas.
Por último, al existir esta información en un topic MQTT, es sencillo consumirla desde Home Assistant. En mi caso, he optado por mostrarla en tres diales, para que sea sencillo comparar los precios entre estaciones. Además, como valor añadido, me guarda el histórico de cotizaciones y cuándo se produjeron cambios en las mismas.
Con todo esto, es sencillo comprobar el precio de los combustibles en nuestro Home Assistant, al que accedemos desde nuestro móvil, de un solo vistazo, y escoger el sitio óptimo para repostar. Estoy pensando en darle una vuelta de tuerca, e integrar un sistema de consulta en los sistemas de infoentretenimiento de los coches, pero eso quedará para otra ocasión.
Etiquetas: home assistant, mqtt, node-red
Buenas, me parece muy interesante, muchas gracias! Podrias exportar el flujo de Node Red? Muchas gracias de nuevo! Un saludo.
Hola, Javi. Me alegra que te haya parecido interesante. Te pego el flujo por aquí:
[
{
"id": "cedb77e.8151288",
"type": "tab",
"label": "Gasolineras",
"disabled": false,
"info": ""
},
{
"id": "4bf097d3.91c9c8",
"type": "http request",
"z": "cedb77e.8151288",
"name": "Forcarey Petrol Station",
"method": "GET",
"ret": "txt",
"paytoqs": false,
"url": "https://geoportalgasolineras.es/rest/10535/busquedaEstacionPrecio",
"tls": "",
"persist": false,
"proxy": "",
"authType": "",
"x": 160,
"y": 240,
"wires": [
[
"82d2847b.287278"
]
]
},
{
“id”: “9bb52fac.228a”,
“type”: “inject”,
“z”: “cedb77e.8151288″,
“name”: “Request petrol price each hour”,
“topic”: “”,
“payload”: “”,
“payloadType”: “date”,
“repeat”: “3600″,
“crontab”: “”,
“once”: true,
“onceDelay”: “”,
“x”: 162.99998474121094,
“y”: 142.99999713897705,
“wires”: [
[
"4bf097d3.91c9c8",
"af3087a2.147a88",
"80cd5818.e0d808"
]
]
},
{
“id”: “edaa287b.f245d8″,
“type”: “mqtt out”,
“z”: “cedb77e.8151288″,
“name”: “”,
“topic”: “system/petrol/forcarey”,
“qos”: “0″,
“retain”: “”,
“broker”: “96bfde3d.44d32″,
“x”: 820,
“y”: 280,
“wires”: []
},
{
“id”: “dfa8a753.8f8eb8″,
“type”: “debug”,
“z”: “cedb77e.8151288″,
“name”: “”,
“active”: true,
“tosidebar”: true,
“console”: false,
“tostatus”: false,
“complete”: “false”,
“x”: 650,
“y”: 200,
“wires”: []
},
{
“id”: “52a126c1.f4c088″,
“type”: “function”,
“z”: “cedb77e.8151288″,
“name”: “Parse Petrol 95 data”,
“func”: “var gas_data = {\n \”town\”:msg.payload.EstacionPrecioVO.municipio[0],\n \”petrol95\”:Number(msg.payload.EstacionPrecioVO.precioGasolina95E5[0])\n }\n//msg.payload=msg.payload[54].toString().split(\” \”)[0], \nmsg.payload=gas_data;\n\nreturn msg;”,
“outputs”: 1,
“noerr”: 0,
“x”: 520,
“y”: 280,
“wires”: [
[
"2bd39b92.ab4a34"
]
]
},
{
“id”: “82d2847b.287278″,
“type”: “xml”,
“z”: “cedb77e.8151288″,
“name”: “”,
“property”: “payload”,
“attr”: “”,
“chr”: “”,
“x”: 350,
“y”: 280,
“wires”: [
[
"52a126c1.f4c088"
]
]
},
{
“id”: “1612ab1a.72a175″,
“type”: “mqtt out”,
“z”: “cedb77e.8151288″,
“name”: “”,
“topic”: “system/petrol/bueu”,
“qos”: “0″,
“retain”: “”,
“broker”: “96bfde3d.44d32″,
“x”: 810,
“y”: 340,
“wires”: []
},
{
“id”: “af3087a2.147a88″,
“type”: “http request”,
“z”: “cedb77e.8151288″,
“name”: “Bueu Petrol Station”,
“method”: “GET”,
“ret”: “txt”,
“paytoqs”: false,
“url”: “https://geoportalgasolineras.es/rest/300/busquedaEstacionPrecio”,
“tls”: “”,
“persist”: false,
“proxy”: “”,
“authType”: “”,
“x”: 150,
“y”: 280,
“wires”: [
[
"82d2847b.287278"
]
]
},
{
“id”: “fbc3960.79a3f68″,
“type”: “mqtt out”,
“z”: “cedb77e.8151288″,
“name”: “”,
“topic”: “system/petrol/santiponce”,
“qos”: “0″,
“retain”: “”,
“broker”: “96bfde3d.44d32″,
“x”: 830,
“y”: 420,
“wires”: []
},
{
“id”: “80cd5818.e0d808″,
“type”: “http request”,
“z”: “cedb77e.8151288″,
“name”: “Santiponce Petrol Station”,
“method”: “GET”,
“ret”: “txt”,
“paytoqs”: false,
“url”: “https://geoportalgasolineras.es/rest/6481/busquedaEstacionPrecio”,
“tls”: “”,
“persist”: false,
“proxy”: “”,
“authType”: “”,
“x”: 170,
“y”: 320,
“wires”: [
[
"82d2847b.287278"
]
]
},
{
“id”: “2bd39b92.ab4a34″,
“type”: “switch”,
“z”: “cedb77e.8151288″,
“name”: “”,
“property”: “payload.town”,
“propertyType”: “msg”,
“rules”: [
{
"t": "eq",
"v": "Forcarei",
"vt": "str"
},
{
"t": "eq",
"v": "Bueu",
"vt": "str"
},
{
"t": "eq",
"v": "Santiponce",
"vt": "str"
}
],
“checkall”: “true”,
“repair”: false,
“outputs”: 3,
“x”: 610,
“y”: 420,
“wires”: [
[
"edaa287b.f245d8"
],
[
"1612ab1a.72a175"
],
[
"fbc3960.79a3f68"
]
]
},
{
“id”: “96bfde3d.44d32″,
“type”: “mqtt-broker”,
“z”: “”,
“name”: “”,
“broker”: “192.168.0.3″,
“port”: “1883″,
“clientid”: “”,
“usetls”: false,
“compatmode”: false,
“keepalive”: “60″,
“cleansession”: true,
“birthTopic”: “”,
“birthQos”: “0″,
“birthPayload”: “”,
“closeTopic”: “”,
“closeQos”: “0″,
“closePayload”: “”,
“willTopic”: “”,
“willQos”: “0″,
“willPayload”: “”
}
]