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

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'  

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

  #PRECIO CARBURANTE
  - sensor.gasolinera1
  - sensor.gasolinera2
  - sensor.gasolinera3
  - sensor.gasolinera4
  - sensor.gasolinera5
  - sensor.gasolinera6

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

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    

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'  

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