Récupérer son prix de carburant (encore) avec le multiscraping

Salut,
Si le site d’origine ne fournie pas les données, le comportement de la carte est normal.
Ici j’ai pas de souci données à jour entre le 07 et le 10/10

Quant au site gouvernental, c’est pas exploitable tellement c’est lent. J’ai un beau 404 /timeout

Ah ok, moi la carte ne s’affiche plus quand j’ai cette erreur :

Cette erreur provient d'une intégration personnalisée

Logger: custom_components.multiscrape.entity
Source: custom_components/multiscrape/entity.py:80
Integration: Multiscrape scraping component (documentation, issues)
First occurred: 10:07:25 (2 occurrences)
Last logged: 10:07:25

carburants_leclerc_lux # Multiscrape Sensor # sp95_name # Unable to extract data from HTML
carburants_leclerc_lux # Multiscrape Sensor # sp95_price # Unable to extract data from HTML

Sauf si tu as fait une modification récente, ça veut dire que qu’il ne trouve pas le bloc html correspondant

Ah oui, cette station n’a plus de SP95 ou de SP95-E10 !
Donc erreur dans le multiscraping et donc carte qui ne s’affiche pas…
J’ai rajouté un # dans le fichier multiscraping et dans le group. et c’est tout bon.

1 « J'aime »

Bonjour

Non pas de problème avec la carte.
Le seul problème c’est que les cuves sont vides…:scream:.

Pensez vous qu’il soit possible d’avoir l’information station cuve vide ?
Et de l’ajouter à la carte carburant et ou de créer une autre carte.

Merci

Il y a toujours moyen de tout faire… Là, la question c’est de savoir quand la cuve est vide ou pleine, il n’y a pas moyen de l’inventer/déduire. Carbu par exemple affiche un prix et une date… rien de plus. Et une date un peu vieille de quelques jours en temps normal, ça veut pas dire cuve vide.
Après pour les quelques jours où ça va être compliqué…

Bonjour Pulpy

Oui j’ai vu que sur carbu.com il affiche le prix ou prix inconnu.
Mais sur l’application Gasoil now de mon mobile, l’application indique les prix et si la station est fermé ou en pénurie.
Je me suis dit que peut être un site référence ce type d’information.

Sans doute, mais comme je le dis : il faut le trouver. De plus, il soit accessible (si c’est un truc dédié à l’application c’est mort)

Oui c’est pas évident, le seul site que j’ai trouvé c’est : https://penurie.mon-essence.fr/w/
Je suis même pas sur que cela soit exploitable…

Quand tu vois la carte sa fait peur…

Au vu de la carte sur le val d’oise, c’est simple 70% des stations sont vide…si c’est pas plus :scream:

Mouais… la liste de stations n’est même pas exhaustive de par chez moi …

Voici ma petite contribution.
Je me suis inspiré de la card de @Clemalex
J’ai une card custom:mushroom-template-card pour afficher le lieu de la station la moins chère :

card

Code
type: custom:mushroom-template-card
primary: DIESEL
secondary: '{{ states(''sensor.gazole_best_price'')}}'
icon: mdi:gas-station
entity: input_select.carburant
layout: vertical
icon_color: yellow

Un tap_action sur un card ouvre un popup :

Code
tap_action:
  action: fire-dom-event
  haptic: heavy
  browser_mod:
    service: browser_mod.popup
    data:
      style: |-
        --popup-header-background-color: black;
        --popup-background-color: transperant;
        --popup-border-radius: 15px;
        --popup-border-color: transparent;
        --popup-padding-x: 5px;
      size: normal
      content:
        type: custom:button-card
        show_entity_picture: false
        entity: template
        name: Diesel (B7)
        show_icon: false
        show_name: true
        tap_action:
          action: navigate
          navigation_path: '#empty'
        styles:
          card:
            - height: 400px
            - top: 0px
            - border-radius: 10px
            - background-color: transparent
            - '--mdc-ripple-press-opacity': 0
          name:
            - z-index: 2
            - position: absolute
            - font-size: 45px
            - font-weight: lighter
            - justify-self: start
            - color: white
            - left: 25px
            - top: 20px
          icon:
            - width: 50%
          img_cell:
            - z-index: 2
          custom_fields:
            blur:
              - z-index: 1
              - top: 0%
              - left: 0%
              - width: 100%
              - height: 100%
              - border-radius: 10px
              - position: absolute
              - background-color: rgba(0, 0, 0, 0.1)
              - backdrop-filter: blur(10px)
              - '-webkit-backdrop-filter': blur(20px)
            temp:
              - z-index: 2
              - position: absolute
              - top: 30%
              - left: 5%
              - height: 100%
              - width: 90%
        custom_fields:
          blur: |
            <div></div>
          temp:
            card:
              type: vertical-stack
              cards:
                - color_type: icon
                  custom_fields:
                    price: |
                      [[[
                       return `
                         <span style="color: var(--text-color-sensor);">${states['sensor.auchan_diesel_price'].state}</span>`
                      ]]]
                    date: |
                      [[[
                       return `
                         <span style="color: var(--text-color-sensor);">${states['sensor.auchan_diesel_date'].state}</span>`
                      ]]]
                  name: Auchan
                  show_icon: false
                  show_last_changed: false
                  show_name: true
                  styles:
                    card:
                      - border: 2px solid var(--primary-color)
                      - border-radius: 5px
                      - height: 2em
                    custom_fields:
                      price:
                        - background-color: rgba(0, 0, 0, 0)
                        - position: absolute
                        - bottom: '-10px'
                        - right: 5px
                        - font-size: 15px
                        - line-height: 20px
                        - '--text-color-sensor': |
                            [[[
                              if ( (states['sensor.gazole_best_price'].state == 'Auchan') ) return 'green';
                              else return 'var(--primary-color)';
                            ]]]
                      date:
                        - background-color: rgba(0, 0, 0, 0)
                        - position: relative
                        - right: 10em
                        - bottom: '-1px'
                        - font-size: 12px
                        - line-height: 20px
                    grid:
                      - position: relative
                    name:
                      - font-variant: small-caps
                      - justify-self: start
                      - padding: 0 15px
                      - color: |
                          [[[
                            if ( (states['sensor.gazole_best_price'].state == 'Auchan') ) return 'green';
                            else return 'var(--primary-color)';
                          ]]]
                  type: custom:button-card
                - color_type: icon
                  custom_fields:
                    price: |
                      [[[
                       return `
                         <span style="color: var(--text-color-sensor);">${states['sensor.bien_diesel_price'].state}</span>`
                      ]]]
                    date: |
                      [[[
                       return `
                         <span style="color: var(--text-color-sensor);">${states['sensor.bien_diesel_date'].state}</span>`
                      ]]]
                  name: Bien
                  show_icon: false
                  show_last_changed: false
                  show_name: true
                  styles:
                    card:
                      - border: 2px solid var(--primary-color)
                      - border-radius: 5px
                      - height: 2em
                    custom_fields:
                      price:
                        - background-color: rgba(0, 0, 0, 0)
                        - position: absolute
                        - bottom: '-10px'
                        - right: 5px
                        - font-size: 15px
                        - line-height: 20px
                        - '--text-color-sensor': |
                            [[[
                              if ( (states['sensor.gazole_best_price'].state == 'Bien') ) return 'green';
                              else return 'var(--primary-color)';
                            ]]]
                      date:
                        - background-color: rgba(0, 0, 0, 0)
                        - position: relative
                        - right: 10em
                        - bottom: '-1px'
                        - font-size: 12px
                        - line-height: 20px
                    grid:
                      - position: relative
                    name:
                      - font-variant: small-caps
                      - justify-self: start
                      - padding: 0 15px
                      - color: |
                          [[[
                            if ( (states['sensor.gazole_best_price'].state == 'Bien') ) return 'green';
                            else return 'var(--primary-color)';
                          ]]]
                  type: custom:button-card
                - color_type: icon
                  custom_fields:
                    price: |
                      [[[
                       return `
                         <span style="color: var(--text-color-sensor);">${states['sensor.colryut_diesel_price'].state}</span>`
                      ]]]
                    date: |
                      [[[
                       return `
                         <span style="color: var(--text-color-sensor);">${states['sensor.colryut_diesel_date'].state}</span>`
                      ]]]
                  name: Colryut
                  show_icon: false
                  show_last_changed: false
                  show_name: true
                  styles:
                    card:
                      - border: 2px solid var(--primary-color)
                      - border-radius: 5px
                      - height: 2em
                    custom_fields:
                      price:
                        - background-color: rgba(0, 0, 0, 0)
                        - position: absolute
                        - bottom: '-10px'
                        - right: 5px
                        - font-size: 15px
                        - line-height: 20px
                        - '--text-color-sensor': |
                            [[[
                              if ( (states['sensor.gazole_best_price'].state == 'Colryut') ) return 'green';
                              else return 'var(--primary-color)';
                            ]]]
                      date:
                        - background-color: rgba(0, 0, 0, 0)
                        - position: relative
                        - right: 10em
                        - bottom: '-1px'
                        - font-size: 12px
                        - line-height: 20px
                    grid:
                      - position: relative
                    name:
                      - font-variant: small-caps
                      - justify-self: start
                      - padding: 0 15px
                      - color: |
                          [[[
                            if ( (states['sensor.gazole_best_price'].state == 'Colryut') ) return 'green';
                            else return 'var(--primary-color)';
                          ]]]
                  type: custom:button-card
                - color_type: icon
                  custom_fields:
                    price: |
                      [[[
                       return `
                         <span style="color: var(--text-color-sensor);">${states['sensor.feillens_diesel_price'].state}</span>`
                      ]]]
                    date: |
                      [[[
                       return `
                         <span style="color: var(--text-color-sensor);">${states['sensor.feillens_diesel_date'].state}</span>`
                      ]]]
                  name: Feillens
                  show_icon: false
                  show_last_changed: false
                  show_name: true
                  styles:
                    card:
                      - border: 2px solid var(--primary-color)
                      - border-radius: 5px
                      - height: 2em
                    custom_fields:
                      price:
                        - background-color: rgba(0, 0, 0, 0)
                        - position: absolute
                        - bottom: '-10px'
                        - right: 5px
                        - font-size: 15px
                        - line-height: 20px
                        - '--text-color-sensor': |
                            [[[
                              if ( (states['sensor.gazole_best_price'].state == 'Feillens') ) return 'green';
                              else return 'var(--primary-color)';
                            ]]]
                      date:
                        - background-color: rgba(0, 0, 0, 0)
                        - position: relative
                        - right: 10em
                        - bottom: '-1px'
                        - font-size: 12px
                        - line-height: 20px
                    grid:
                      - position: relative
                    name:
                      - font-variant: small-caps
                      - justify-self: start
                      - padding: 0 15px
                      - color: |
                          [[[
                            if ( (states['sensor.gazole_best_price'].state == 'Feillens') ) return 'green';
                            else return 'var(--primary-color)';
                          ]]]
                  type: custom:button-card
                - color_type: icon
                  custom_fields:
                    price: |
                      [[[
                       return `
                         <span style="color: var(--text-color-sensor);">${states['sensor.fleureville_diesel_price'].state}</span>`
                      ]]]
                    date: |
                      [[[
                       return `
                         <span style="color: var(--text-color-sensor);">${states['sensor.fleureville_diesel_date'].state}</span>`
                      ]]]
                  name: Fleureville
                  show_icon: false
                  show_last_changed: false
                  show_name: true
                  styles:
                    card:
                      - border: 2px solid var(--primary-color)
                      - border-radius: 5px
                      - height: 2em
                    custom_fields:
                      price:
                        - background-color: rgba(0, 0, 0, 0)
                        - position: absolute
                        - bottom: '-10px'
                        - right: 5px
                        - font-size: 15px
                        - line-height: 20px
                        - '--text-color-sensor': |
                            [[[
                              if ( (states['sensor.gazole_best_price'].state == 'Fleureville') ) return 'green';
                              else return 'var(--primary-color)';
                            ]]]
                      date:
                        - background-color: rgba(0, 0, 0, 0)
                        - position: relative
                        - right: 10em
                        - bottom: '-1px'
                        - font-size: 12px
                        - line-height: 20px
                    grid:
                      - position: relative
                    name:
                      - font-variant: small-caps
                      - justify-self: start
                      - padding: 0 15px
                      - color: |
                          [[[
                            if ( (states['sensor.gazole_best_price'].state == 'Fleureville') ) return 'green';
                            else return 'var(--primary-color)';
                          ]]]
                  type: custom:button-card
                - color_type: icon
                  custom_fields:
                    price: |
                      [[[
                       return `
                         <span style="color: var(--text-color-sensor);">${states['sensor.replonges_diesel_price'].state}</span>`
                      ]]]
                    date: |
                      [[[
                       return `
                         <span style="color: var(--text-color-sensor);">${states['sensor.replonges_diesel_date'].state}</span>`
                      ]]]
                  name: Replonges
                  show_icon: false
                  show_last_changed: false
                  show_name: true
                  styles:
                    card:
                      - border: 2px solid var(--primary-color)
                      - border-radius: 5px
                      - height: 2em
                    custom_fields:
                      price:
                        - background-color: rgba(0, 0, 0, 0)
                        - position: absolute
                        - bottom: '-10px'
                        - right: 5px
                        - font-size: 15px
                        - line-height: 20px
                        - '--text-color-sensor': |
                            [[[
                              if ( (states['sensor.gazole_best_price'].state == 'Replonges') ) return 'green';
                              else return 'var(--primary-color)';
                            ]]]
                      date:
                        - background-color: rgba(0, 0, 0, 0)
                        - position: relative
                        - right: 10em
                        - bottom: '-1px'
                        - font-size: 12px
                        - line-height: 20px
                    grid:
                      - position: relative
                    name:
                      - font-variant: small-caps
                      - justify-self: start
                      - padding: 0 15px
                      - color: |
                          [[[
                            if ( (states['sensor.gazole_best_price'].state == 'Replonges') ) return 'green';
                            else return 'var(--primary-color)';
                          ]]]
                  type: custom:button-card
4 « J'aime »

Bonjour @Pulpy-Luke J’ai repris ton code, mais le sensor ne s’affiche pas.
Je présume qu’il faut créer une entité, mais je ne sais pas laquelle choisir.
C’est la seule étape que tu n’as pas détaillée je pense.

Salut,

Il n’y a besoin de rien de plus

ça doit créer un sensor avec le nom, si c’est pas le cas, alors il faut regarder ce qu’il se passe dans les logs

Je pense que c’est parce que je ne procède pas tout à fait comme toi.
Tous mes sensors sont dans un fichier sensors.yaml, appelé dans le fichier de configuration.
Et si je ne mets pas d’indentation à « multiscrape », j’ai des erreurs :

.
Et si j’en mets, pas d’erreur mais pas de sensor (j’ai repris ton modèle pour comprendre, j’adapterais ensuite).
Comment n’activer les logs que pour ce composant ?

C’est un fichier à part (pas dans sensor)
image

Ok, j’ai fait la modification, plus d’erreurs mais toujours pas de sensor dans les entités.
Comment déclencher les logs pour ce cas précis, alors ?

Au démarrage, ça trace…

Au cas ou, tu as bien installé l’intégration depuis HACS

@Lesuperlolo
Bonjour,
Dans ton configuration.yaml tu as bien c’est ligne:

group: !include groups.yaml
automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
sensor: !include sensor.yaml
template: !include template.yaml
recorder: !include recorder.yaml
multiscrape: !include multiscrape.yaml  #c'est ligne
utility_meter: !include utility_meter.yaml

Dans le dossier /config/ ta le fichier multiscrape.yaml.

dans multiscrape.yaml:

- name: carburants_carrefour_xxxxxx
  resource: "https://carbu.com/france/index.php/station/carrefour-contact/xxxxxx/xxxxx/12345"
  scan_interval: 3600
  sensor:
    - unique_id: carburants_carrefour_xxxxxx
      select: "[itemprop='name']"
      value_template: "<img src='/local/images/carrefour.png' style='height:20px;'> {{ value }}"
      attributes:
        - name: b7_name
          select: ".col-xs-12:nth-of-type(3) h2.title"
        - name: b7_price
          select: ".col-xs-12:nth-of-type(3) h1"
          value_template: "{{ value|replace(',','.') }}"
        - name: b7_date
          select: ".col-xs-12:nth-of-type(3) p.sources"
          value_template: "{{ value.split(' ')[0] }}"

Tout est bon pour toi ?

Si tout est bien configurer et qu’il y a des erreurs, tu les verra dans les logs

2023-05-08 09:36:09.274 ERROR (MainThread) [custom_components.multiscrape.coordinator] carburants_eleclerc_xxxxxxxx # Updating failed with exception:
2023-05-08 09:36:09.420 ERROR (MainThread) [custom_components.multiscrape.coordinator] carburants_geant_xxxxxxxxxx # Updating failed with exception:

J’étais justement en train de penser à ça en faisant les courses…
Ça fonctionne, mais il ne faut pas que mon code démarre par multiscrape: car c’est déjà dans le fichier concerné.
@Pulpy-Luke doit l’avoir indiqué autrement

Si tu split ta configuration avec multiscrape: !include multiscrape.yaml , ta pas besoin de mettre dans le fichier multiscrape.yaml en début de ligne multiscrape:.
tu commence directement par:

- name: carburants_carrefour_xxxxxx
  ...

Oui, sur son exemple du tuto c’est dans configuration.yaml.
la capture qu’il ta faite, c’est splitter avec le fichier multiscrape.yaml.
Il est fatiguer, faut l’excuser tellement il aide les gens :wink:

1 « J'aime »