Commandes en erreur 403

Bonjour,
De mon côté pas de changement… Plugin toujours non fonctionnel.
J’ai branché ma voiture a 15h30, le statut « info câble connecté » est passé a « engaged » a 16h00 sur ma Smart, et j’ai du changer la limite de charge sur mon Atlas depuis le plugin a 16h07 pour que ce statut se mette a jour, car même en faisant un refresh du plugin ça ne n’actualisait pas…
Donc j’ai désactivé tous mes scénarios… Je suis un peu blasé…

Certes je préférerai un retour de @vercors, il doit être en vacances :palm_tree:

En attendant j’ai amélioré le scénario pour redémarrer le démon une vingtaine de secondes après le refresh du token. J’ai eu une seule fois les warnings depuis une semaine que j’ai la modif.

Hello @Nipepsi
Quelle version as tu installé ?
Nicolas

tu aurais les 2 scenario qui check et qui reboot?
parce que j’ai continuellement :

0298|[2024-04-21 17:50:01]WARNING : teslapi:sendRequest(GET https://fleet-api.prd.eu.vn.cloud.tesla.com/api/1/vehicles(Array ( ) )) --> Array (     [error] => token expired (401) )
0299|[2024-04-21 17:50:01]WARNING : [Blitz] Error 401 - Connexion impossible, vérifiez vos identifiants: 'token expired (401)'
0300|[2024-04-21 17:50:01]WARNING : 'Blitz' Impossible de récupérer l'état de la voiture

manifestement mes scenar ne voient rien.

Salut,
Pour ma part je suis en version 3.2.7-beta.278.180 j’ai dû ajouter le script fournit par @3.14r qui permet de redémarrer le démon dès la détection de cette anomalie sur le token. Bientôt une dizaine de jours que ça fonctionne comme cela avec modification de l’ampérage, démarrer ou arrêter la charge, démarrer la clim, etc… et tout fonctionne bien (y compris les infos).

Hello,

J’ai les mêmes problèmes je suis en Version: 3.2.7-beta.278.180
Sur un Jeedom 4.4 dernière version.

Bonjour @vercors
Je suis sur la dernière bêta 3.2.7-beta.278.180.
Si tu le souhaites, je peux te donner un accès à ma Smart

Tu a fait précisément ce qu’il a écrit dans son message Commandes en erreur 403 - Plugins / Objets connectés - Communauté Jeedom ??

Bonjour,
Merci pour ton retour. Et tu avais le pb de remontée d’info avant la mise en place du script ?
De mon côté, je n’ai pas créé le scénario car a priori je n’ai pas de souci du perte du token…
Dans le doute, je vais créer le scénario de @3.14r pour tester.

1 « J'aime »

Je vous en avez parlé quelques posts plus haut, voici mon scénario amélioré.
En plus d’attendre une erreur éventuelle, il programme le redémarrage du démon peu après le renouvellement du token. Il n’y a pus le problème de devoir attendre au maximum 5 min avant de voir le problème, l’inconvénient étant que maintenant le démon redémarre systématiquement.

Le script étant maintenant :

$plugin = 'tesla';
$tags = $scenario->getTags();
$msgs = log::get($plugin,0,-1);
#$scenario->setLog("taille logs: ".count($msgs));
$size = count($msgs);
$delai = 120;
$max = min($size, 20);
# stocke la date actuelle
$now = strtotime("now");
# liste des logs à détecter
$warningsToFind = [
  "[WARNING] : refreshToken: Impossible de se connecter au serveur Tesla",
  "Connexion impossible, vérifiez vos identifiants: 'token expired (401)"
  ];
$warnCount = 0;
$pattern = "/Le token qui expire le .* sera mis à jour le ([0-5][0-9]) ([0-2][0-9]) ([0-3][0-9]) ([0-1][0-9]) \*/i";
for ($x = 0; $x < $max; $x++) {
  $msg = $msgs[$x];
  $dateTime = substr($msg, 1, 19);
  # convertit la date du message
  $timestamp = strtotime($dateTime);
  foreach ($warningsToFind as $key => $findme) {
    $pos = strpos($msg, $findme);
    if ($pos !== false) {
      # warning trouvé, est-il récent?
      if ($now - $timestamp < $delai) {
        # arrivé il y a moins de 2 min
        $warnCount++;
      }
      break;
    } else {
      # cherche prochain refresh
      $match = preg_match($pattern, $msg, $matches);
      if ($match === 1 && !$tags['#nextTokenRefresh#']) {
        $scenario->setLog("msg prochain refresh: ".$msg);
        $tags['#nextTokenRefresh#'] = $matches['2'].$matches['1'];
      }
    }
  }
}
$scenario->setLog("nombre warnings: ".$warnCount);
# stocke s'il y a un problème
$tags['#warning#'] = ($warnCount) > 3 ? 1 : 0;
$scenario->setTags($tags);
# copie les logs pour analyse
if ($tags['#warning#']) {  
  $log = "";
  for ($x = min($size, $max + 15); $x >= 0; $x--) {
    $log = $log."\n->   ".$msgs[$x];
  }
  $scenario->setLog("logs: ".$log);
}

@vercors en forçant le redémarrage du démon après chaque refresh du token je n’ai pas eu de perte du suivi depuis plus de 2 semaines.
A moins que tu sois sur le point de nous fournir une nouvelle bêta qui corrige le problème, peut-être pourrais-tu appliquer cette logique dans le plugin directement ?

3 « J'aime »

Oui, ça implique en revanche de créer un 2ème scénario qui ne fait que redémarrer le démon (« Relance Démon Tesla » dans l’exemple fournit).

Tu peux utiliser ce « code »:

$pluginId = "tesla";
$plugin = plugin::byId($pluginId);
$plugin->deamon_start(true); 
1 « J'aime »

J’utilise pas trop les remontés d’infos, en tout cas, pas pour faire quelque chose immédiatement, alors je ne saurais te dire si j’avais une latence ou non, mais en revanche avec ce script je n’ai pas de problème, j’ai vérifié en approchant de chez moi et le plugin l’a vu direct.

le scénario est créé avec une exécution toute les 5 minutes. Ce n’est pas bon ?

inclure les 3 lignes en plus au code dans le scénario servirai à quoi ?

Pour les 5 minutes, pour moi c’est ok.
Les 3 lignes sont pour redémarrer le démon. Tu peux les inclure dans le scénario directement ou en créer un 2eme que le 1er appellera.

1 « J'aime »

@vercors , tu sais quand tu implémenteras les fonctions de redémarrage du démon?

c’est pour savoir s’il faut que l’on mette en place le script plus haut, ou si tu vas déployer une mise à jour du plugin très prochainement (semaine prochaine?°

bonjour @3.14r
je viens de mettre ton bloc code dans un scénario pour l’exécuter tous les 5 minutes

ça suffit ou il faut vraiment mettre tout ton scénario?

Bonsoir @monfiston,

Le premier script avec son scénario lancé toutes les 5 min et suffisant pour ne pas avoir une perte de connexion trop longue. En effet si perte il y a ça ne sera que de 5 min maxi.

Le second script, et son scénario adapté, anticipe la perte de connexion en relançant le démon ; grâce à ça il n’y a plus que quelques secondes (le temps de redémarrer le démon) de perte de connexion toutes les 8 heures. 8 heures étant la durée entre 2 renouvellement de token.

Donc si tu n’es pas à 5 min de déconnexion prés, le premier scénario est suffisant.

Pierre

2 « J'aime »

bonjour
j’ai mis en place ton 1° script que je fais exécuter toutes les 5 minutes

$plugin = 'tesla';
$msgs = log::get($plugin,0,-1);
#$scenario->setLog("taille logs: ".count($msgs));
$size = count($msgs);
$max = min($size, 20); # limite les lignes à regarder
$delai = 120; # 2 min
# stocke la date actuelle
$now = strtotime("now");
# liste des logs à détecter
$warningsToFind = [
  "[WARNING] : refreshToken: Impossible de se connecter au serveur Tesla",
  "Connexion impossible, vérifiez vos identifiants: 'token expired (401)"
  ];
$warnCount = 0;
for ($x = 0; $x < $max; $x++) {
  $msg = $msgs[$x];
  $dateTime = substr($msg, 1, 19);
  # convertit la date du message
  $timestamp = strtotime($dateTime);
  foreach ($warningsToFind as $key => $findme) {
    $pos = strpos($msg, $findme);
    if ($pos !== false) {
      # warning trouvé, est-il récent?
      if ($now - $timestamp < $delai) {
        # arrivé il y a moins de 2 min
        $warnCount++;
      }
      break;
    }
  }
}
$scenario->setLog("nombre warnings: ".$warnCount);
$tags = $scenario->getTags();
# stocke s'il y a un problème
$tags['#warning#'] = ($warnCount) > 3 ? 1 : 0;
$scenario->setTags($tags);
# copie les logs pour analyse
if ($tags['#warning#']) {  
  $log = "";
  for ($x = min($size, $max + 15); $x >= 0; $x--) {
    $log = $log."\n->   ".$msgs[$x];
  }
  $scenario->setLog("logs: ".$log);
}

malheureusement, je perds quand même le token

pourtant quand je vais dans la configuration du plugin, il m’indique que le token est valable

mais pas dans les log

Bonjour @monfiston

Avec tes logs le scénario devrait relancer le démon, mais les logs du scénario montre qu’il ne se passe rien après avoir détecter :thinking:

As-tu bien mis le bloc SI/ALORS/SINON à la suite du bloc CODE ?

J’ai exactement les même soucis que @monfiston

@3.14r tu peux nous faire un screen /template de ton scénario s’il te plait ?