I write this post in English and Spanish because I think is mostly helpful for people living in Spain.
Where to get the data
The data of the gas stations are taken from the API shared by the Spanish Government, for get them go here:https://geoportalgasolineras.es/#/Descargas and then click on “Información actualizada de precios”. You will see examples of URLs to call, depending on the data you want.
In my case I have chosen the gas stations in my town already filtered by Gasoline fuel.
For this filter the URL is: https://sedeaplicaciones.minetur.gob.es/ServiciosRESTCarburantes/PreciosCarburantes/EstacionesTerrestres/FiltroMunicipioProducto/{IDMUNICIPIO}/{IDPRODUCTO}
You will hace to replace {IDMUNICIPIO}/{IDPRODUCTO}
for your city and fuel type you want. For getting {IDMUNICIPIO}
you will have to look on this url: https://sedeaplicaciones.minetur.gob.es/ServiciosRESTCarburantes/PreciosCarburantes/Listados/Provincias/ and for product here: https://sedeaplicaciones.minetur.gob.es/ServiciosRESTCarburantes/PreciosCarburantes/Listados/ProductosPetroliferos/
Setting up HA:
Add in configuration.yaml
rest: !include rest.yaml
Create the file rest.yaml in the root folder if doesn’t exist and copy this:
- resource: https://sedeaplicaciones.minetur.gob.es/ServiciosRESTCarburantes/PreciosCarburantes/EstacionesTerrestres/FiltroMunicipioProducto/1220/1
scan_interval: 43200
sensor:
- name: Gasolinera 1 nombre
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[0] %}
{{ item['Rótulo'] }}
- name: Gasolinera 1 precio
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[0] %}
{{ item['PrecioProducto'] }}
unit_of_measurement: "EUR"
device_class: monetary
- name: Gasolinera 1 dir
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[0] %}
{{ item['Dirección'] }}
- name: Gasolinera 2 nombre
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[1] %}
{{ item['Rótulo'] }}
- name: Gasolinera 2 precio
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[1] %}
{{ item['PrecioProducto'] }}
unit_of_measurement: "EUR"
device_class: monetary
- name: Gasolinera 2 dir
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[1] %}
{{ item['Dirección'] }}
- name: Gasolinera 3 nombre
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[2] %}
{{ item['Rótulo'] }}
- name: Gasolinera 3 precio
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[2] %}
{{ item['PrecioProducto'] }}
unit_of_measurement: "EUR"
device_class: monetary
- name: Gasolinera 3 dir
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[2] %}
{{ item['Dirección'] }}
- name: Gasolinera 4 nombre
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[3] %}
{{ item['Rótulo'] }}
- name: Gasolinera 4 precio
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[3] %}
{{ item['PrecioProducto'] }}
unit_of_measurement: "EUR"
device_class: monetary
- name: Gasolinera 4 dir
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[3] %}
{{ item['Dirección'] }}
- name: Gasolinera 5 nombre
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[4] %}
{{ item['Rótulo'] }}
- name: Gasolinera 5 precio
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[4] %}
{{ item['PrecioProducto'] }}
unit_of_measurement: "EUR"
device_class: monetary
- name: Gasolinera 5 dir
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[4] %}
{{ item['Dirección'] }}
Replace the resource URL for yours like I explain it before.
You will get the data for the 5 cheapest gas stations in your city updated every 12h. If you want more stations just duplicate the sensors.
Now to see it on the dasboard, I have used the plugin template-entity-row in HACS.
And the code for the entity-card:
type: entities
title: Gasolineras
entities:
- type: custom:template-entity-row
icon: mdi:gas-station-outline
entity: sensor.gasolinera_1_precio
name: '{{states(''sensor.gasolinera_1_nombre'')}}'
secondary: '{{states(''sensor.gasolinera_1_dir'')}}'
- type: custom:template-entity-row
icon: mdi:gas-station-outline
entity: sensor.gasolinera_2_precio
name: '{{states(''sensor.gasolinera_2_nombre'')}}'
secondary: '{{states(''sensor.gasolinera_2_dir'')}}'
- type: custom:template-entity-row
icon: mdi:gas-station-outline
entity: sensor.gasolinera_3_precio
name: '{{states(''sensor.gasolinera_3_nombre'')}}'
secondary: '{{states(''sensor.gasolinera_3_dir'')}}'
- type: custom:template-entity-row
icon: mdi:gas-station-outline
entity: sensor.gasolinera_4_precio
name: '{{states(''sensor.gasolinera_4_nombre'')}}'
secondary: '{{states(''sensor.gasolinera_4_dir'')}}'
- type: custom:template-entity-row
icon: mdi:gas-station-outline
entity: sensor.gasolinera_5_precio
name: '{{states(''sensor.gasolinera_5_nombre'')}}'
secondary: '{{states(''sensor.gasolinera_5_dir'')}}'
We will get:
I have done it with my resources, I am a newbie in everything
I am sure it can be optimice, so if you know how, just post it.
Any doubt, just ask.
Cheers!
**** IN SPANISH ****
I write this post in Spanish because I think is mostly helpful for people living in Spain, if this break some rule, I will translate it.
De donde coger los datos:
Los datos de las gasolineras se cogen de la API que comparte el Gobierno, para ellos vais aqui: https://geoportalgasolineras.es/#/Descargas veréis varias URLs en función de los datos que queráis encontrar.
En mi caso he elegido las gasolineras de mi municicipio filtradas ya por el combustible Gasolina, para este filtro corresponde esta URL: https://sedeaplicaciones.minetur.gob.es/ServiciosRESTCarburantes/PreciosCarburantes/EstacionesTerrestres/FiltroMunicipioProducto/{IDMUNICIPIO}/{IDPRODUCTO}
Para sacar {IDMUNICIPIO}/{IDPRODUCTO}
de la ciudad y el combustigle que querais sería así: Para {IDMUNICIPIO}
ir a esta url: https://sedeaplicaciones.minetur.gob.es/ServiciosRESTCarburantes/PreciosCarburantes/Listados/Provincias/ y para el tipo de compustible aquí: https://sedeaplicaciones.minetur.gob.es/ServiciosRESTCarburantes/PreciosCarburantes/Listados/ProductosPetroliferos/
Configurar HA:
Incluir en configuration.yaml
rest: !include rest.yaml
Crear el fichero rest.yaml en la raíz si no le tenemos y copiar esto:
- resource: https://sedeaplicaciones.minetur.gob.es/ServiciosRESTCarburantes/PreciosCarburantes/EstacionesTerrestres/FiltroMunicipioProducto/1220/1
scan_interval: 43200
sensor:
- name: Gasolinera 1 nombre
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[0] %}
{{ item['Rótulo'] }}
- name: Gasolinera 1 precio
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[0] %}
{{ item['PrecioProducto'] }}
unit_of_measurement: "EUR"
device_class: monetary
- name: Gasolinera 1 dir
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[0] %}
{{ item['Dirección'] }}
- name: Gasolinera 2 nombre
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[1] %}
{{ item['Rótulo'] }}
- name: Gasolinera 2 precio
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[1] %}
{{ item['PrecioProducto'] }}
unit_of_measurement: "EUR"
device_class: monetary
- name: Gasolinera 2 dir
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[1] %}
{{ item['Dirección'] }}
- name: Gasolinera 3 nombre
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[2] %}
{{ item['Rótulo'] }}
- name: Gasolinera 3 precio
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[2] %}
{{ item['PrecioProducto'] }}
unit_of_measurement: "EUR"
device_class: monetary
- name: Gasolinera 3 dir
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[2] %}
{{ item['Dirección'] }}
- name: Gasolinera 4 nombre
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[3] %}
{{ item['Rótulo'] }}
- name: Gasolinera 4 precio
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[3] %}
{{ item['PrecioProducto'] }}
unit_of_measurement: "EUR"
device_class: monetary
- name: Gasolinera 4 dir
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[3] %}
{{ item['Dirección'] }}
- name: Gasolinera 5 nombre
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[4] %}
{{ item['Rótulo'] }}
- name: Gasolinera 5 precio
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[4] %}
{{ item['PrecioProducto'] }}
unit_of_measurement: "EUR"
device_class: monetary
- name: Gasolinera 5 dir
value_template: >
{% set item = (value_json['ListaEESSPrecio'] | sort(attribute='PrecioProducto'))[4] %}
{{ item['Dirección'] }}
Tenéis que sustituir la URL de resource por la vuestra como os he epxlicado más arriba.
De esta manera salen las 5 gasolineras más baratas de vuestro municipio, si queréis mostrar más, sería creando mas sensores.
Ahora para verlo en el panel, yo he instalado el plugin template-entity-row en HACS.
Y el código de la entity-card:
type: entities
title: Gasolineras
entities:
- type: custom:template-entity-row
icon: mdi:gas-station-outline
entity: sensor.gasolinera_1_precio
name: '{{states(''sensor.gasolinera_1_nombre'')}}'
secondary: '{{states(''sensor.gasolinera_1_dir'')}}'
- type: custom:template-entity-row
icon: mdi:gas-station-outline
entity: sensor.gasolinera_2_precio
name: '{{states(''sensor.gasolinera_2_nombre'')}}'
secondary: '{{states(''sensor.gasolinera_2_dir'')}}'
- type: custom:template-entity-row
icon: mdi:gas-station-outline
entity: sensor.gasolinera_3_precio
name: '{{states(''sensor.gasolinera_3_nombre'')}}'
secondary: '{{states(''sensor.gasolinera_3_dir'')}}'
- type: custom:template-entity-row
icon: mdi:gas-station-outline
entity: sensor.gasolinera_4_precio
name: '{{states(''sensor.gasolinera_4_nombre'')}}'
secondary: '{{states(''sensor.gasolinera_4_dir'')}}'
- type: custom:template-entity-row
icon: mdi:gas-station-outline
entity: sensor.gasolinera_5_precio
name: '{{states(''sensor.gasolinera_5_nombre'')}}'
secondary: '{{states(''sensor.gasolinera_5_dir'')}}'
Y nos quedaría algo asi:
Lo he hecho con mi escaso conocimiento de todo, así que seguro que se puede mejorar, asi que si sabéis cómo compartidlo.
Cualquier duda pidéis decirme.
Un saludo a todos!