prixCarburant et fork(s)

Correction, je viens de voir qu’Aozhan ná pas mis une horaire…je vais voir avex lui car le mien (discontinué en faveur d’Aohzan) a eu l’option…j’ai besoin d’un maj intrajour

EDIT: sur son github c’est déjà marqué comme ‹ issue ›
Une solution partielle est aussi donné, une automation:

alias: UPDATE - Prix carburant
trigger:
  - platform: time
    at: "08:00:00"
  - platform: time
    at: "11:45:00"
  - platform: time
    at: "17:45:00"
action:
  - service: homeassistant.reload_config_entry
    target:
      entity_id: sensor.station_XXX
mode: single

Un autre solution:
j. ai mis ça dans custom_components/prix_carburant/sensor.py, linge 41

SCAN_INTERVAL = timedelta(seconds=3600)

Ça fait une maj tous les heures et pour toutes les stations…pas ‹ top › mais bon

@Aohzan t’as d’autres idées?

J’ai ça dans le code hass-prixcarburant/sensor.py at master · Aohzan/hass-prixcarburant · GitHub
Mais c’est trop court, il faudrait mettre à 1h et le rendre paramétrable

Personnellement je voulais un système simpliste (KISS) qui crée une entité par point de vente dans une zone circulaire et par carburant dans une liste. J’ai préféré utiliser l’API de https://data.economie.gouv.fr/ plutôt que http://prix-carburants.gouv.fr/ parce que ça m’a l’air plus robuste, et surtout je ne voulais pas avoir à parser https://donnees.roulez-eco.fr/opendata/instantane (qui est zippé en plus) ni maintenir d’historique.

Du coup mon idée a été d’utiliser MQTT, et tout spécialement MQTT discovery, ce qui a en plus l’avantage de rassembler toutes les entités sous un même « appareil » appelé « Carburant ». Autre avantage: les entités peuvent être renommées et éditées dans l’UI de Home Assistant comme des entités classiques avec unique_id. On peut aussi décider de masquer ou désactiver une entité, encore une fois avec le système intégré à Home Assistant.
Le truc intéressant c’est que je n’ai pas à maintenir à la main dans une config YAML la liste des points de vente que je veux ajouter.

J’ai ajouté les coordonnées GPS dans le JSON des attributs; l’API renvoie déjà l’info donc c’est juste une ligne à rajouter. J’ai aussi mis l’indication de distance, mais attention c’est par rapport au centre de la requête. S’il y a plusieurs requêtes de position comme dans mon exemple, les distances ne seront pas cohérentes entre les deux groupes renvoyés. Et si une même station est dans plusieurs zones, c’est la dernière zone dans laquelle elle est qui « gagne ».

Le code est disponible là: carburant.py · main · Home Assistant FrnchFrgg / Carburants · GitLab

L’idée est de mettre ça dans un fichier python, et de périodiquement l’appeler avec un shell_command et une automatisation time_pattern par exemple. Moi je mets à jour tous les quarts d’heure. L’API réagit vraiment vite.

shell_command:
  carburant: python3 /chemin/vers/carburant.py

Ensuite on peut mettre des trucs comme ça dans l’interface (ou bien plus évolué):

type: custom:auto-entities
card:
  type: entities
filter:
  include:
    - entity_id: sensor.carburant_*_gazole
      options:
        type: custom:multiple-entity-row
        secondary_info:
          attribute: maj
          format: relative
  exclude: []
sort:
  method: state
  numeric: true
  count: 6
1 « J'aime »

La solution prixCarburant maintenu pas Aohzan a les mêmes fonctionalités, soit rayon, soit ID et utilise la même source.
Les différences sont peu:

  • pas d’intégrations pour avoir le nom de station, mais la liste dispo avec des noms n’est pas maintenu non plus.
  • il faut avoir MQTT mais je pense que la plupart des gens sur HA l’utilisent.
  • au lieu de yaml, maintenant c’est un py a ‹ maintenir › et un command_line sensor pour declencher le script
  • il n’y pas une configuration par le GUI
    Pour moi… ce ne sont pas des soucis énormes

Ce que j’aime … c’est vraiment KISS, je ne savais pas l’existence de cet API et surtout la facilité de la calculation de distance et une nouveauté :slight_smile:

Je vais jouer un peu plus avec ça

C’est certain que je n’ai pas cassé trois pattes à un canard.

Au prix d’une configuration « dans le script » (pour les centres/distances et les carburants) et de moins de flexibilité (pour le moment le script récupère tous les carburants pour toutes les zones) j’ai quand même 7 fois moins de lignes de code, et pas de complications pour recharger la config non plus (normal vu que je profite des fonctionnalités de l’intégration MQTT).

Ça reste hyper simple, sans récupération des noms (mais de toutes façons j’ai renommé à la main les 20 entités qui m’intéressaient avec un descriptif qui me parle plus que le nom officiel). C’était l’idée: un truc très basique mais pas non plus aussi statique et pénible à configurer que les solutions à base de multiscrape.

Cela dit, la plupart des intégrations que j’ai vu se tapent le parsing et le filtrage des données brutes en XML, et l’existence d’une API qui contourne toute cette difficulté pourrait permettre de simplifier sacrément une solution à base de custom_component. Si j’ai pu aider à ça tant mieux.

En fait en y repensant mon truc est complètement stateless et c’est l’intégration MQTT de Home Assistant qui fait tout le boulot :wink:

Au passage, j’ai fait un truc similaire pour des TODO-list récurrentes en abusant de MQTT et ça donne todolist.yaml · main · Home Assistant FrnchFrgg / Recurrent tasks · GitLab il faut vraiment que je fasse un topic à propos un jour.

Je n’ai plus aucune entité MQTT configurée manuellement. Je fais tout en publiant des messages destinés au MQTT discovery, qui a plus de fonctionnalités, et n’a pas de problème de changement de syntaxe inopiné lors d’une mise à jour :wink:

salut, merci, j’ai mis en place cette solution car sinon en effet les prix ne se mettent pas à jour, ce qui fait perdre tout son intérêt au script.

Bonjour @frnchfrgg ,
J’ai tenté ta méthode mais sans succès. J’ai mis le fichier à la racine de config et j’ai fais ceci dans sensor :

  - platform: command_line
    name: Prix Carburant
    command: python3 "carburant.py"
    scan_interval: 120

J’obtiens :

Citation Logger: homeassistant.components.command_line
Source: components/command_line/init.py:48
Integration: command_line (documentation, issues)
First occurred: 17:36:14 (1 occurrences)
Last logged: 17:36:14

Command failed (with return code 1): python3 « carburant.py »

Une idée ?

@JeromeB
Le script ne fonctionne pas avec un command line sensor car il crée lui même les sensors. Il lui faut juste un shell_command comme montré ici:

Ensuite, si tu ne mets pas le chemin complet vers carburant.py je ne sais pas trop où Home Assistant va chercher le fichier (je dirais à la racine du dossier config mais je ne suis pas certain de mémoire).

Enfin, il est impératif d’avoir un serveur MQTT, et de renseigner correctement les identifiants en haut du fichier. Et aussi de changer les positions avec les zones qui t’intéressent.

Je me demande aussi si les dépendances Python (la librairie PAHO qui permet de communiquer avec MQTT) ne sont pas installées uniquement si l’intégration MQTT est ajoutée ou si c’est de base dans le HA core.

Si ça ne marche toujours pas il va me falloir des informations plus détaillées sur l’erreur parce que là on ne sait pas vraiment ce qui la cause.

Ah, et j’ai opéré des changements donc il faut s’assurer d’avoir la dernière version. En particulier dans mon coin certaines stations disparaissent de la base de donnée périodiquement (je pense quand il y a pénurie) et ma version initiale laissait la vieille valeur; j’ai ajouté un délai d’obsolescence dans MQTT du coup au bout d’un moment le capteur passe à «indisponible» dans ce cas.

Tout d’abord merci pour ta réponse @frnchfrgg .

Je suis repassé via shell_command (déjà essayé sans succès)

Citation Logger: homeassistant.components.sensor
Source: helpers/entity_platform.py:796
Integration: Capteur (documentation, issues)
First occurred: 21:50:03 (2 occurrences)
Last logged: 21:53:40
Updating command_line sensor took longer than the scheduled update interval 0:00:02
Updating command_line sensor took longer than the scheduled update interval 0:00:01

Je n’arrive pas à avoir plus de logs. J’ai bien paramétré le loggin de mon mqtt. Je n’ai pas modifié les coordonnés pour être sûr d’avoir des stations qui remontent.

@JeromeB Ton message d’erreur correspond toujours au sensor command line et pas au shell_command. Du coup je ne sais pas ce qu’il en est.

Je vois deux idées:

  1. Modifier la shell_command de sorte à ce qu’elle écrive les logs dans un fichier. Peut-être avec le code suivant ?
    shell_command:
      carburant: bash -c 'python3 /chemin/vers/carburant.py &>/chemin/vers/log'
    
  2. Utiliser le module complémentaire « SSH & Web Terminal » pour « entrer » dans l’environnement d’exécution de Home Assistant (auquel on n’a pas accès normalement, et pas avec l’add-on SSH classique).
    Une fois ce module installé et démarré, ouvrir un terminal en cliquant « Ouvrir l’interface utilisateur Web » dans les réglages du module, ou en choisissant le terminal dans le menu de gauche si l’option est activée. On doit obtenir
    | |  | |                          /\           (_)   | |            | |  
    | |__| | ___  _ __ ___   ___     /  \   ___ ___ _ ___| |_ __ _ _ __ | |_ 
    |  __  |/ _ \| '_ \ _ \ / _ \   / /\ \ / __/ __| / __| __/ _\ | '_ \| __|
    | |  | | (_) | | | | | |  __/  / ____ \\__ \__ \ \__ \ || (_| | | | | |_ 
    |_|  |_|\___/|_| |_| |_|\___| /_/    \_\___/___/_|___/\__\__,_|_| |_|\__|
    
    Welcome to the Home Assistant command line.
    
    System information
      IPv4 addresses for eth0:  xxx.xxx.xxx.xxx/24
      IPv6 addresses for eth0:  xxxx:xxxx:xxxx/64, fe80::xxxx:xxxx/64
      IPv4 addresses for wlan0: 
    
      OS Version:               Home Assistant OS 8.2
      Home Assistant Core:      2022.9.7
    
      Home Assistant URL:       http://jarvis.local:8123
      Observer URL:             http://jarvis.local:4357
    
    Alors il faut taper: docker exec -it homeassistant /bin/bash ce qui donne accès à Home Assistant lui même (attention, là tu as les mains dans le moteur).
    Et dans l’invite qui s’affiche, taper python3 /chemin/vers/carburant.py et voir ce qu’il se passe.
bash: docker: commant not found

Pour infos, je tourne sur une VM avec OS HA. Je tente de regarder un peu plus ce soir.

Pour avoir accès à docker dans l’add-on il faut sans doute décocher le « mode protégé ». Après vu que tu as une VM tu peux peut-être avoir accès au système de l’hôte HA sans l’add-on du coup (c’est seulement à ça qu’il me sert). C’est dans ce système que tu utilises docker

Perso quand je remet le mode protégé et que je tape docker j’obtiens

PROTECTION MODE ENABLED!

To be able to use this command, you'll need to disable
protection mode on this add-on. Without it, the add-on
is unable to access Docker.

Steps:
 - Go to the Configuration Panel.
 - Enter the 'Add-ons, Backups & Supervisor' menu.
 - Click on the SSH & Web Terminal add-on.
 - Set the 'Protection mode' switch to off.
 - Restart the add-on.

Access to Docker allows you to do really powerful things
including complete destruction of your system.
Please, be sure you know what you are doing before enabling
this feature!

Es-tu certain que tu utilises l’add-on « SSH & Web Terminal » des community add-ons ou plutôt l’add-on « SSH » de base ? Parce que ce dernier n’a pas docker ni python.

L’add-on « SSH & Web Terminal » a python préinstallé, mais n’a pas les bibliothèques supplémentaires de HA du coup pas possibilité de tester correctement mon script.

J’avais pas le bon addon, c’est le « mode portégé » qui m’a fait comprendre que j’utilisai le mauvais, les nom son fort proche.

2022-10-04 20_37_16-Terminal – Home Assistant — Mozilla Firefox

2022-10-04 20_40_56-File editor – Home Assistant — Mozilla Firefox

Je regarde demain, j’ai du atteindre la limite avec mon command line.

D’ailleurs combien de fois il génère ?
A quoi correspond la variable prix_nom ?

@frnchfrgg , le script reste bloqué. Cela fait 1h30 qu’il est lancé.

2022-10-05 10_58_30-Terminal – Home Assistant — Mozilla Firefox

C’est le for qui pose problème, si je le supprime en mettant directement le Carburant et les coordonnées cela fonctionne.

Le script fait une requête pour chaque position et chaque carburant, donc avec les réglages en l’état ça fait 4. Personnellement je le lance tous les 1/4 d’heure. prix_nom prend successivement les valeurs "Gazole" et "E10" et est remplacé dans la requête grâce à l’écriture f"...{prix_nom}...".

Le script a l’air de démarrer normalement, donc pas de souci de dépendance c’est déjà ça. On verra les résultats quand la limite de requêtes est réinitialisée.

Ah, et le coup du blocage c’est peut-être le read() qui bloque s’il n’y a qu’une erreur et pas de contenu ? Peut-être qu’il faut mettre un timeout explicite…

2022-10-05 12_29_59-Terminal – Home Assistant — Mozilla Firefox

Quand je kill la commande, j’ai le retour d’un time out.

Sans le for, tout fonctionne

« Fonctionne » c’est un bien grand mot car les valeurs sont unavailable et pas des montants… Ce qui est intéressant c’est que ça bloque au niveau de la publication MQTT et pas de la récupération des données dans l’API.

Quel est ton broker MQTT ?

Sorry, j’ai changé les coordonnées, c’est pour cela qu’ils sont passé unavialable. Sur ceux dans ma zone ils sont biens renseigné. J’utilise Mosquitto broker.