Limite des 10 requêtes atteinte à 10h45

Bonjour,
J’ai installé il y a 2 jours ce plugin. J’ai les paramètres par défaut mais les 10 requêtes sont faites de 1h45 à 10h45, ensuite le log indique « error_code »:« TooManyRequests »,« message »:« You have exceeded your free daily limit. ».
Je suis pourtant bien configuré à 1 requête toutes les 2 h avec début à 7h et fin à 21h.
J’ai demandé les prévisions sur 3jours, est-ce que ça a une influence sur le nombre de requêtes?
Je suis en Jeedom 4.4.18 et la dernière version du plugin solcast (stable 2024-11-14 08:06:47).
Quel pourrait être le problème?
Merci,

Bonjour,

La limite est sur 24h tournant, il n’y a pas de remise à zéro à minuit par l’API de solcast.

Le plugin fait aussi 2 requêtes dans la nuit (à 00h05) pour avoir quelque chose à afficher une fois minuit passé mais également à 5h45 pour enregistrer la prévision à 6h.

Du coup si tu as installé le plugin vers midi : 12h45, 14h45, 16h45, 18h45, 20h45, 00h05, 05h45, 06h45, 08h45, 10h45 et on arrive à 10 requêtes.

Ou alors tu veux dire que tu as regardé les logs en debug et que tu vois vraiment 10 récupération de données entre 1h45 et 10h45 ? ça ferait un peu beaucoup.

Si tu ne veux pas te prendre la tête avec ça, configure ton login/pass dans la partie « contournement de l’API », tant que ça marche …

Bonjour,

Oui c’est bien dans les logs que je vois les 10 requêtes entre 1h45 et 10h45. Et a partir de 11h45, ça indique « TooManyRequests ». Celle de 0h05 et de 0h45 sont aussi indiquées « TooManyRequests ».
J’ai un compte limité à 10 requêtes par jour. Si je note le login/mdp, ça fera sauté cette limite?

Il serait bien quand même comprendre ce qui ne va pas, non? A moins que je sois le seul…
J’ai une installation fraiche du plugin, c’est étonnant d’avoir ce comportement.
Le log étant « très verbeux », est-ce qu’une partie du log pourrait t’intéresser?
Ci joint ma config :

Je regarderais de mon coté, j’ai touché à un bout de code récemment pour faire un refresh à 00h05 afin de voir des informations après le passage à la nouvelle journée (pour les couches tard). J’ai peut-être introduit un problème qui n’a pas encore été signalé …

Oui, c’est prévu pour ça :shushing_face:

Merci de ta réponse, je te laisse regarder de ton coté.
Ci joint un bout de mon log, on voit bien que l’option « 2h » est bien prise en compte, mais pas appliqué par le code :
cfg_CmdRefreshDataFrequency 2

Quand ça fonctionne :

[2024-11-24 10:45:15][DEBUG] : eqLogic ID : 271
[2024-11-24 10:45:15][INFO] : #####---------------------------------------------------------#####
[2024-11-24 10:45:15][INFO] : [Solcast] Lecture des paramètres
[2024-11-24 10:45:15][DEBUG] : [Solcast] getInformations cfg_resource_id : info_masqué_ici ;-)
[2024-11-24 10:45:15][DEBUG] : [Solcast] getInformations cfg_api_key (length) : 32
[2024-11-24 10:45:15][DEBUG] : [Solcast] getInformations cfg_bypassAPI : 0
[2024-11-24 10:45:15][DEBUG] : [Solcast] getInformations cfg_email (length) : 0
[2024-11-24 10:45:15][DEBUG] : [Solcast] getInformations cfg_password (length) : 0
[2024-11-24 10:45:15][DEBUG] : [Solcast] getInformations cfg_selectNBJourPrevision : 3
[2024-11-24 10:45:15][DEBUG] : [Solcast] getInformations cfg_selectStartPrevision : 7
[2024-11-24 10:45:15][DEBUG] : [Solcast] getInformations cfg_selectEndPrevision : 21
[2024-11-24 10:45:15][DEBUG] : [Solcast] getInformations cfg_CmdRefreshDataFrequency 2
[2024-11-24 10:45:15][DEBUG] : [Solcast] getInformations cfg_isGlobalEquipement 0
[2024-11-24 10:45:15][DEBUG] : [Solcast] target_day : 2
[2024-11-24 10:45:15][DEBUG] : [Solcast] limit_target_day : 2
[2024-11-24 10:45:15][DEBUG] : [Solcast] UTC offset : 1
[2024-11-24 10:45:15][INFO] : [Solcast] Récupération des données
[2024-11-24 10:45:16][DEBUG] : [Solcast] response -> {"forecasts":[{"pv_estimate":0.3261,"pv_estimat..............period_end":"2024-11-27T10:00:00.0000000Z","period":"PT30M"}]}
[2024-11-24 10:45:16][INFO] : [Solcast] Données récupérées avec succès
[2024-11-24 10:45:16][INFO] : [Solcast] Lancement de la mise à jour des commandes

Quand la limite est atteinte :

[2024-11-24 11:45:18][DEBUG] : eqLogic ID : 271
[2024-11-24 11:45:18][INFO] : #####---------------------------------------------------------#####
[2024-11-24 11:45:18][INFO] : [Solcast] Lecture des paramètres
[2024-11-24 11:45:18][DEBUG] : [Solcast] getInformations cfg_resource_id : info_masqué_ici ;-)
[2024-11-24 11:45:18][DEBUG] : [Solcast] getInformations cfg_api_key (length) : 32
[2024-11-24 11:45:18][DEBUG] : [Solcast] getInformations cfg_bypassAPI : 0
[2024-11-24 11:45:18][DEBUG] : [Solcast] getInformations cfg_email (length) : 0
[2024-11-24 11:45:18][DEBUG] : [Solcast] getInformations cfg_password (length) : 0
[2024-11-24 11:45:18][DEBUG] : [Solcast] getInformations cfg_selectNBJourPrevision : 3
[2024-11-24 11:45:18][DEBUG] : [Solcast] getInformations cfg_selectStartPrevision : 7
[2024-11-24 11:45:18][DEBUG] : [Solcast] getInformations cfg_selectEndPrevision : 21
[2024-11-24 11:45:18][DEBUG] : [Solcast] getInformations cfg_CmdRefreshDataFrequency 2
[2024-11-24 11:45:18][DEBUG] : [Solcast] getInformations cfg_isGlobalEquipement 0
[2024-11-24 11:45:18][DEBUG] : [Solcast] target_day : 2
[2024-11-24 11:45:18][DEBUG] : [Solcast] limit_target_day : 2
[2024-11-24 11:45:18][DEBUG] : [Solcast] UTC offset : 1
[2024-11-24 11:45:18][INFO] : [Solcast] Récupération des données
[2024-11-24 11:45:19][DEBUG] : [Solcast] response -> {"response_status":{"error_code":"TooManyRequests","message":"You have exceeded your free daily limit.","errors":[]}}
[2024-11-24 11:45:19][WARNING] : [Solcast] ECHEC de la récupération des données

Je ne connais pas le php, mais dans ton code (et dans le cas ou $CmdRefreshDataFrequency = 2), $forceRefresh n’est jamais initialisé
=> On ne passe jamais dans if ($forceRefresh == 1) {}
=> Donc on demande à chaque passage une requête à l’API sans jamais passer par « return; » pour quitter la fonction avant la requête.
Je me trompe peut-être car je ne connais pas le code php et je ne comprends pas tout ce qui est codé, mais c’est peut-être une piste.

    switch ($CmdRefreshDataFrequency) {
      case "1": // Toutes les 1 heures
        $OKtoRefresh = 1; // OK pour refresh des données
        break;
      case "2": // Toutes les 2 heures
        if ($heure_en_cours % 2 == 0) { // l'heure en cours est paire, OK pour refresh des données
          $OKtoRefresh = 1;
        } else {
          $OKtoRefresh = 0; // Ne pas refresh les données pour ne pas charger les comptes à faible nombre de request sur l'API
        }
        break;
      default:
        if ($heure_en_cours == '00' && $minutes_en_cours == '05') {
          $forceRefresh = 1; // Pour refresh juste après le reset des données à 00h05
        } else {
          $forceRefresh = 0;
          $OKtoRefresh = 0; // Ne pas refresh les données pour ne pas charger les comptes à faible nombre de request sur l'API
        }
        break;
    }

    if ($forceRefresh == 1) {
      if (($heure_en_cours > $selectEndPrevision || $heure_en_cours < $selectStartPrevision - 2 || $OKtoRefresh == 0) && $heure_en_cours != $heure_stockage_forecast_6h) { // Pas de traitement pour ne pas solliciter l'API pour rien
        $h = $heure_en_cours + 2;
        $cmd = $this->getCmd(null, 'd0h' . $h);
        if (is_object($cmd)) {
          $cmd_value = $cmd->execCmd();
          $cmd_value = $cmd_value == '' ? 0 : $cmd_value;
          $cmd2 = $this->getCmd(null, 'forecastnexthour');
          $this->checkAndUpdateCmd('forecastnexthour', $cmd_value); // Mise à jour de la commande estimant l'heure suivante
          log::add(__CLASS__, 'debug', $eqLogicName . 'Commande mise à jour : ' . 'forecastnexthour' . ' --> ' . $cmd_value . ' W');
        }
        log::add(__CLASS__, 'info', '#####---------------------------------------------------------#####');
        //log::add(__CLASS__, 'info', '// Fin du traitement du site ' . $eqLogicName . ' //');
        return;
      }
    }


    //////////////////////////////////////////////////////////////////
    //		  RECUPERATION DES INFORMATIONS DE PREVISION (H-15mn)		  //
    //////////////////////////////////////////////////////////////////

    log::add(__CLASS__, 'info', $eqLogicName . 'Récupération des données');
    if ($bypassAPI) {
      $url = 'https://api.solcast.com.au/rooftop_sites/' . $resource_id . '/recent?view=Toolkit';
      $response = $this->fetchHTML($url);
    } else {
      $nbhourstoget = $target_day * 24 + 24; // Utilisation de $target_day pour ne pas dépendre de la selection Minimal/Maximal
      $url = 'https://api.solcast.com.au/rooftop_sites/' . $resource_id . '/forecasts?format=json&hours=' . $nbhourstoget;
      $response = $this->fetchAPI($url, $api_key, 'online'); // online (normal) or offline (pour dev)
    }

Je pense que ma piste est la bonne, j’ai modifié le code (retrait du if{} et ajout d’un log) juste pour voir :

//    if ($forceRefresh == 1) {
      if (($heure_en_cours > $selectEndPrevision || $heure_en_cours < $selectStartPrevision - 2 || $OKtoRefresh == 0) && $heure_en_cours != $heure_stockage_forecast_6h) { // Pas de traitement pour ne pas solliciter l'API pour rien
        log::add(__CLASS__, 'info', 'PERSO pas de requête pour cette fois');
        $h = $heure_en_cours + 2;
        $cmd = $this->getCmd(null, 'd0h' . $h);
        if (is_object($cmd)) {
          $cmd_value = $cmd->execCmd();
          $cmd_value = $cmd_value == '' ? 0 : $cmd_value;
          $cmd2 = $this->getCmd(null, 'forecastnexthour');
          $this->checkAndUpdateCmd('forecastnexthour', $cmd_value); // Mise à jour de la commande estimant l'heure suivante
          log::add(__CLASS__, 'debug', $eqLogicName . 'Commande mise à jour : ' . 'forecastnexthour' . ' --> ' . $cmd_value . ' W');
        }
        log::add(__CLASS__, 'info', '#####---------------------------------------------------------#####');
        //log::add(__CLASS__, 'info', '// Fin du traitement du site ' . $eqLogicName . ' //');
        return;
      }
//    }

Le log indique clairement qu’aucune requête n’a été faite à 0h45 contrairement à d’habitude :

[2024-11-25 00:45:18] DEBUG  : eqLogic ID : 271
[2024-11-25 00:45:18] INFO  : #####---------------------------------------------------------#####
[2024-11-25 00:45:18] INFO  : [Solcast] Lecture des paramètres
[2024-11-25 00:45:18] DEBUG  : [Solcast] getInformations cfg_resource_id : info_masqué_ici ;-)
[2024-11-25 00:45:18] DEBUG  : [Solcast] getInformations cfg_api_key (length) : 32
[2024-11-25 00:45:18] DEBUG  : [Solcast] getInformations cfg_bypassAPI : 0
[2024-11-25 00:45:18] DEBUG  : [Solcast] getInformations cfg_email (length) : 0
[2024-11-25 00:45:18] DEBUG  : [Solcast] getInformations cfg_password (length) : 0
[2024-11-25 00:45:18] DEBUG  : [Solcast] getInformations cfg_selectNBJourPrevision : 3
[2024-11-25 00:45:18] DEBUG  : [Solcast] getInformations cfg_selectStartPrevision : 7
[2024-11-25 00:45:18] DEBUG  : [Solcast] getInformations cfg_selectEndPrevision : 21
[2024-11-25 00:45:18] DEBUG  : [Solcast] getInformations cfg_CmdRefreshDataFrequency 2
[2024-11-25 00:45:18] DEBUG  : [Solcast] getInformations cfg_isGlobalEquipement 0
[2024-11-25 00:45:18] DEBUG  : [Solcast] target_day : 2
[2024-11-25 00:45:18] DEBUG  : [Solcast] limit_target_day : 2
[2024-11-25 00:45:18] DEBUG  : [Solcast] UTC offset : 1
[2024-11-25 00:45:18] INFO  : PERSO pas de requête pour cette fois
[2024-11-25 00:45:18] INFO  : #####---------------------------------------------------------#####

Hello,

Oui c’est bien cette partie que j’avais modifié, je regarderais ce matin, visiblement je me suis loupé.

EDIT : En effet, il y bien un truc qui ne va pas, merci pour l’alerte.
J’ai retravaillé le code (c’est évidemment pas aussi simple que de faire ce que tu as fait pour voir mais tu peux laisser comme ça pour le moment).
Je regarde chez moi ce que ça donne dans la journée et dans la nuit et je pousserais une correction en bêta demain matin.

Bonjour,

J’ai poussé une nouvelle version bêta. Pourrais-tu l’installer et me valider ça de ton coté stp ?
Objectif : Mise à jour en stable demain soir

Bonjour,

Passage de la correction en version stable, peux-tu vérifier et Solutionner le post ?

Bonjour et merci pour le correctif.
J’ai bien les requêtes toutes les 2h.

[2024-11-28 18:45:17][INFO] : [Solcast] Données récupérées avec succès
[2024-11-28 20:45:20][INFO] : [Solcast] Données récupérées avec succès
[2024-11-29 05:45:16][INFO] : [Solcast] Données récupérées avec succès
[2024-11-29 06:45:19][INFO] : [Solcast] Données récupérées avec succès
[2024-11-29 08:45:16][INFO] : [Solcast] Données récupérées avec succès
[2024-11-29 10:45:18][INFO] : [Solcast] Données récupérées avec succès
[2024-11-29 12:45:18][INFO] : [Solcast] Données récupérées avec succès
[2024-11-29 14:45:18][INFO] : [Solcast] Données récupérées avec succès
[2024-11-29 16:45:17][INFO] : [Solcast] Données récupérées avec succès
[2024-11-29 18:45:16][INFO] : [Solcast] Données récupérées avec succès
[2024-11-29 20:45:20][INFO] : [Solcast] Données récupérées avec succès

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.