Creación de un sensor del precio del carburante

Vamos a crear un sensor del precio del carburante , para ello hay que añadir un custom_component ya que HA solo permite trabajar con JSON de 256 bytes , creáis una carpeta custom_components si no la tenéis creada. luego creáis una carpeta llamada jsonrest y ponéis el contenido del siguiente fichero :

Os deberia quedar algo similar a esto

En esta url encontrareis todos los metodos del webservice , yo utilizo esta direccion https://sedeaplicaciones.minetur.gob.es/ServiciosRESTCarburantes/PreciosCarburantes/EstacionesTerrestres/FiltroProvincia/08 para que solo me devuelva los resultados de la provincia de Barcelona que es lo que me interesa ,este seria el sensor que se encarga de descargar los datos de la url

- platform: jsonrest resource: https://sedeaplicaciones.minetur.gob.es/ServiciosRESTCarburantes/PreciosCarburantes/EstacionesTerrestres/FiltroProvincia/08 name: gasolinera scan_interval: 21600
Lenguaje del código: YAML (yaml)

Para rascar entre los resultados os recomiendo la pagina https://jsonformatter.org/json-editor , en esta pagina desde la opcion load data pondremos la URL mencionada arriba para que descargue y formatee los datos

Y en la parte derecha nos aparecerán los datos ordenados y formateados correctamente

Localizaríamos el IDEESS que es el identificador único de cada estación de servicio , en rotulo os aparecerá el nombre y luego tenéis cada uno de los productos

Una vez que hemos localizado los IDEESS de todas las estaciones que queremos monitorizar pasaríamos a definir estos sensores en sensors.yaml o en vuestro configuration.yaml

- platform: template sensors: gasolinera1: friendly_name: Alcampo (Sant Boi) value_template: >- {%- for petrol in states.sensor.gasolinera.attributes.ListaEESSPrecio -%} {%- if petrol["IDEESS"] | int == 3011 -%} {{ petrol["Precio Gasoleo A"] | capitalize | replace(",",".") }} {%- endif -%} {%- endfor -%} unit_of_measurement: '€/L' - platform: template sensors: gasolinera2: friendly_name: CEPSA Solanas (L'H) value_template: >- {%- for petrol in states.sensor.gasolinera.attributes.ListaEESSPrecio -%} {%- if petrol["IDEESS"] | int == 2977 -%} {{ petrol["Precio Gasoleo A"] | capitalize | replace(",",".") }} {%- endif -%} {%- endfor -%} unit_of_measurement: '€/L' - platform: template sensors: gasolinera3: friendly_name: Petronieves (Collbato) value_template: >- {%- for petrol in states.sensor.gasolinera.attributes.ListaEESSPrecio -%} {%- if petrol["IDEESS"] | int == 10694 -%} {{ petrol["Precio Gasoleo A"] | capitalize | replace(",",".") }} {%- endif -%} {%- endfor -%} unit_of_measurement: '€/L' - platform: template sensors: gasolinera4: friendly_name: EsclatOil (Collbato) value_template: >- {%- for petrol in states.sensor.gasolinera.attributes.ListaEESSPrecio -%} {%- if petrol["IDEESS"] | int == 12825 -%} {{ petrol["Precio Gasoleo A"] | capitalize | replace(",",".") }} {%- endif -%} {%- endfor -%} unit_of_measurement: '€/L' - platform: template sensors: gasolinera5: friendly_name: Petronieves (Esparreguera) value_template: >- {%- for petrol in states.sensor.gasolinera.attributes.ListaEESSPrecio -%} {%- if petrol["IDEESS"] | int == 10693 -%} {{ petrol["Precio Gasoleo A"] | capitalize | replace(",",".") }} {%- endif -%} {%- endfor -%} unit_of_measurement: '€/L' - platform: template sensors: gasolinera6: friendly_name: Saras (Prat) value_template: >- {%- for petrol in states.sensor.gasolinera.attributes.ListaEESSPrecio -%} {%- if petrol["IDEESS"] | int == 1744 -%} {{ petrol["Precio Gasoleo A"] | capitalize | replace(",",".") }} {%- endif -%} {%- endfor -%} unit_of_measurement: '€/L'
Lenguaje del código: YAML (yaml)

En la seccion recorder: añadir los siguientes sensores :

#PRECIO CARBURANTE - sensor.gasolinera1 - sensor.gasolinera2 - sensor.gasolinera3 - sensor.gasolinera4 - sensor.gasolinera5 - sensor.gasolinera6
Lenguaje del código: YAML (yaml)

En customize.yaml añadir :

sensor.gasolinera1: icon: mdi:gas-station sensor.gasolinera2: icon: mdi:gas-station sensor.gasolinera3: icon: mdi:gas-station sensor.gasolinera4: icon: mdi:gas-station sensor.gasolinera5: icon: mdi:gas-station sensor.gasolinera6: icon: mdi:gas-station
Lenguaje del código: YAML (yaml)

Con esta automatización haremos que dos minutos después de arrancar HA actualice el sensor :

- alias: Actualizar info carburantes initial_state: 'on' trigger: - platform: homeassistant event: start action: - delay: "00:02:00" - service: homeassistant.update_entity entity_id: sensor.gasolinera
Lenguaje del código: YAML (yaml)

Como bonus extra os dejo el código que yo uso para que me envíe a demanda los precios por Telegram

- id: 'telegram bot carburante' alias: 'telegram bot carburante' initial_state: 'on' # hide_entity: true trigger: - platform: event event_type: telegram_callback event_data: data: '/carburante' action: - service: telegram_bot.answer_callback_query data_template: callback_query_id: '{{ trigger.event.data.id }}' message: 'Precios de Gasoleo A' - service: notify.notif_telegram_bot data_template: # title: 'Menú' message: | {{ "\U000026FD" }}{{ "\U000026FD" }} *Precios de Gasoleo A* {{ "\U000026FD" }}{{ "\U000026FD" }} *Alcampo Sant Boi*:{{(states.sensor.gasolinera1.state )}} €/L., {{(((states.sensor.gasolinera2.state | float ) - (states.sensor.gasolinera1.state | float )) | round(2)) }} €/L. Diferencia al mas caro (50lts.): {{((((states.sensor.gasolinera2.state | float ) - (states.sensor.gasolinera1.state | float ))*50) | round(2) ) }}€ *Saras (Prat)*:{{(states.sensor.gasolinera6.state ) }} €/L., {{(((states.sensor.gasolinera2.state | float ) - (states.sensor.gasolinera6.state | float )) | round(2)) }} €/L. Diferencia al mas caro (50lts.): {{((((states.sensor.gasolinera2.state | float ) - (states.sensor.gasolinera6.state | float ))*50) | round(2) ) }}€ *Petronieves Collb.*:{{(states.sensor.gasolinera3.state ) }} €/L., {{(((states.sensor.gasolinera2.state | float ) - (states.sensor.gasolinera3.state | float )) | round(2)) }} €/L. Diferencia al mas caro (50lts.): {{((((states.sensor.gasolinera2.state | float ) - (states.sensor.gasolinera3.state | float ))*50) | round(2) ) }}€ *EsclatOil Collb.*:{{(states.sensor.gasolinera4.state ) }} €/L., {{(((states.sensor.gasolinera2.state | float ) - (states.sensor.gasolinera4.state | float )) | round(2)) }} €/L. Diferencia al mas caro (50lts.): {{((((states.sensor.gasolinera2.state | float ) - (states.sensor.gasolinera4.state | float ))*50) | round(2) ) }}€ *Petronieves Esp.*:{{(states.sensor.gasolinera5.state ) }} €/L., {{(((states.sensor.gasolinera2.state | float ) - (states.sensor.gasolinera5.state | float )) | round(2)) }} €/L. Diferencia al mas caro (50lts.): {{((((states.sensor.gasolinera5.state | float ) - (states.sensor.gasolinera1.state | float ))*50) | round(2) ) }}€ *CEPSA Solanas (L'H)*:{{(states.sensor.gasolinera2.state ) }} €/L. data: inline_keyboard: - 'Principal:/cancel'
Lenguaje del código: YAML (yaml)

En vuestra sección lovelace podéis añadir un par de gráficas que siempre quedan genial :

- type: entities title: Precios Gasoil-A show_name: true show_state: false show_header_toggle: false columns: 3 entities: - sensor.gasolinera1 - sensor.gasolinera2 - sensor.gasolinera3 - sensor.gasolinera4 - sensor.gasolinera5 - sensor.gasolinera6 hours_to_show: 24 refresh_interval: 3000 - type: history-graph title: 'Precio Gasoil-A 30 dias' entities: - sensor.gasolinera1 - sensor.gasolinera2 - sensor.gasolinera3 - sensor.gasolinera4 - sensor.gasolinera5 - sensor.gasolinera6 hours_to_show: 720 refresh_interval: 3000
Lenguaje del código: YAML (yaml)

Deja un comentario