Plugin Regaz (récupération conso gaz agglo Bordelaise)

Bonjour à tous,
Je suis habitant de l’agglo Bordelaise, agglomération qui nous impose un monopole pour la distribution de gaz de ville par un seul ELD (Entreprises Locales de Distribution) : « Gaz de Bordeaux ».
Autrement dit, nous n’avons pas le choix que de prendre ce fournisseur, comme c’est le cas dans une vingtaines de régions en France.

De fait, tous les plugin existant liés à la récupération de la conso de gaz via des API (comme GRDF) ne sont pas applicables pour nous. C’est pourquoi il faut passer par un plugin dédié.

Il est possible de récupérer ses propres conso à deux conditions : avoir un compteur gazpar communicant (son installation est gratuite sur simple demande si vous possédez un ancien compteur), et avoir créé son espace regaz sur le site dédié.

Pour ma part, j’ai déjà implémenté un scenario code qui effectue tous les appels API nécessaires pour récupérer les données json de consommation.
Votre mission (si toute fois vous l’acceptez), consisterait donc à écrire un plugin en s’inspirant de mon code pour les appels API, puis gérer la donnée de consommation récupérée pour la mettre à dispo à l’utilisateur jeedom.

Je n’ai pas les compétences php pour me plonger dans l’écriture d’un plugin, et pas non plus le temps de m’investir dans la doc jeedom et dans php pour le faire.
Néanmoins, voici le code du scenario qui permet de récupérer les données API, qui pourra être utile à un développeur charitable.
Le scenario nécessite trois tag : « login », « mdp » et « pce ».

function sendPostRequest($url, $headers, $body) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    
    curl_close($ch);
    
    if ($httpCode != 200) {
        $scenario->setLog('HTTP request failed with code $httpCode and response: $response');
      	$scenario->stop();
    }
    
    return $response;
}

function sendGetRequest($url, $headers) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    
    curl_close($ch);
    
    if ($httpCode != 200) {
        $scenario->setLog('HTTP request failed with code $httpCode and response: $response');
      	$scenario->stop();
    }
    
    return $response;
}

try {
  	$tags = $scenario->getTags();
  	$login = $tags['#login#'];
  	$mdp = $tags['#mdp#'];
  	$pce = $tags['#pce#'];  
  
    // Première requête POST pour récupérer le token
    $loginUrl = 'https://monespace.regaz.fr/api/login_check';
    $loginHeaders = ['Content-Type: application/json'];
    $loginBody = json_encode(['username' => $login, 'password' => $mdp]);

    $loginResponse = sendPostRequest($loginUrl, $loginHeaders, $loginBody);
    $loginData = json_decode($loginResponse, true);
    
    if (isset($loginData['token'])) {
        $token = $loginData['token'];
      	$scenario->setLog('Token :'.$token);
    } else {
        $scenario->setLog("Token not found in login response: $loginResponse");
      	$scenario->stop();
    }

   // Deuxième requête GET avec le token dans l'en-tête d'autorisation
    $consumptionUrl = 'https://monespace.regaz.fr/api/consumption/'.$pce.'/level/all';
    $consumptionHeaders = [
        'Content-Type: application/json',
        "Authorization: Bearer $token"
    ];

    $consumptionResponse = sendGetRequest($consumptionUrl, $consumptionHeaders);
    
    // Afficher ou traiter la réponse
    $scenario->setLog("Response: $consumptionResponse");

} catch (Exception $e) {
    $scenario->setLog('Error: ' . $e->getMessage());
}

Les données récupérés (contenu de la variable $consumptionResponse) sont de la forme :

{
   "year":{
      "2019":12756,
      "2020":11396,
      ...
   },
   "month":{
      "2019-01":"2659",
      "2019-02":"1679",
      "2019-03":"1384",
      ...
   },
   "day":{
      "2023-06-12":".5102",
      "2023-06-13":"5.72432",
      "2023-06-14":"8.41648",
      ...
   },
   "history":[
      {
         "year":"2019",
         "total":"12756"
      },
      {
         "year":"2020",
         "total":"11396"
      },
      ...
   ]
}

Voilà, si une âme charitable serait assez gentille pour implémenter ce plugin, je lui en serait très reconnaissant :pray:!
Merci d’avance !

1 « J'aime »

Hello @Dreaky,
J’avais fait la même chose pour ainsi dire.
Je filtre juste la valeur de la veille que j’envoi dans un virtuel info que j’historise.

    $obj = json_decode($consumptionResponse, true);

    $today = date("Y-m-d", strtotime("1 day ago" ));

    $scenario->setLog('Date du jour :'.$today);
    // Extraction valeurs
    $ind_day = $obj['day'][$today];

    $scenario->setLog('Valeur du jour :'.$ind_day);

    $maCmd =  cmd::byString('#[Tests][Gaz][conso]#');
    $maCmd->event($ind_day);

Je précise que le scénario s’exécute à 20h chez moi les données sont récupérés par Regaz qu’à 19h.

1 « J'aime »

Hello, :wave:

Si vous utilisez le petit script au dessus :point_up: pour récupérer les valeurs de conso RéGaz, vous aurez constaté que depuis le 5 février 2025 celui-ci tombe en erreur.

RéGaz a fait évoluer son portail, et sa méthode d’authentification.
Il n’est plus possible de forger simplement un bearer, de plus ils ont ajouté ReCaptcha.

J’ai réussi à passer outre tout ça, mais je ne le posterai pas là. :see_no_evil:
Si quelqu’un est intéressé je peux l’aider à mettre en place (en MP), il faudra un node selenium pour récupérer un captcha Google valide :innocent:

1 « J'aime »