Repository navigation
Conversation
…u un hub illisible Une réponse non JSON pour un seul équipement levait une exception qui arrêtait sync() : les équipements suivants, les groupes du hub et les hubs suivants n'étaient jamais traités. - chaque équipement est lu dans un try/catch : warning puis équipement suivant ; - chaque hub est synchronisé dans syncHub(), isolé des autres hubs ; - une exception finale indique le nombre d'erreurs une fois tout traité ; - request() trace en debug le début (200 octets) de la réponse invalide. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…quêtes Le log d'une synchronisation réelle montre que les réponses non JSON sont un texte brut « Too many requests, please try again later. » : la rafale de requêtes de sync() dépasse le quota Ajax, et toutes les requêtes suivantes échouent (fin du premier hub, groupes, second hub). - request() met en pause 5, 10 puis 15 s avant de renvoyer un GET limité ; - le compteur d'erreurs de sync() est passé par référence à syncHub() pour ne plus perdre les erreurs d'équipements quand le hub échoue ensuite. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Depuis #52,
request()lève une exception quand la réponse du relais n'est pas du JSON valide. C'est une bonne chose : en stable, ce cas renvoyaitnullsans bruit. Mais danssync()cette exception n'est pas capturée. Une seule réponse invalide interrompt donc toute la synchronisation.Cas réel, sur la beta à jour (4d43290), avec deux hubs : la synchro s'arrête vers la fin des 49 équipements du premier hub (
000BF237) avec le toast « Réponse JSON invalide pour la requête à Ajax System ». Les derniers équipements, les groupes de ce hub (le correctif #56 ne peut donc pas s'appliquer) et tout le second hub (0014B92D) ne sont pas traités.Avec le premier commit de cette PR, le log montre enfin la réponse brute :
La cause est donc la limite de requêtes d'Ajax, et non un équipement particulier. La rafale de
sync()(une requête de détail par équipement, espacées de 200 ms) dépasse le quota. À partir de là, toutes les requêtes suivantes échouent : fin du premier hub, groupes, second hub. Cela explique aussi lefalserenvoyé par/groupspour ce hub dans les logs de #43 : les groupes sont lus en dernier, après tous les équipements.Changements
request()reçoit « Too many requests » sur un GET, il fait une pause de 5, 10 puis 15 s avant de renvoyer la requête. Ces nouvelles tentatives ne comptent pas comme des tentatives de renouvellement de session. Au-delà de trois pauses, l'erreur habituelle est levée.try/catch. En cas d'échec, un warning est logué avec l'identifiant et le nom, puis la synchro passe à l'équipement suivant. L'équipement existant n'est pas modifié.syncHub(), appelé dans untry/catch. Une erreur sur un hub (infos, liste des équipements, groupes) n'empêche plus les autres hubs d'être synchronisés.sync()lève une exception qui indique le nombre total d'erreurs. Le compteur est passé par référence, pour que les erreurs d'équipements restent comptées si le hub échoue ensuite.request()écrit en debug le message d'erreur JSON, la taille et les 200 premiers octets de la réponse invalide.Le diff est surtout un décalage d'indentation dû à l'extraction de
syncHub();git diff -wmontre les lignes réellement modifiées.Suggested changelog entry
La synchronisation continue malgré un équipement ou un hub illisible, attend et réessaie quand Ajax limite le nombre de requêtes, et trace la réponse invalide dans le log.
Related issues/external references
Types of changes
Validation
Quatre tests ajoutés dans
tests/groups.php:php -lOK.tests/groups.php: 9/9.tests/session.php: 16/16 en local (PHP 8.5). La CI couvrira 7.4 et 8.3.git diff --checkOK.Testé sur l'installation réelle à deux hubs (49 + 19 équipements) :
À noter : avec les pauses, une synchronisation complète d'une grosse installation dépasse une minute. Derrière un reverse proxy dont le délai est de 60 s (cas du proxy Synology par défaut), le navigateur affiche une page d'erreur du proxy alors que la synchronisation continue côté serveur. Lancer la synchronisation en tâche de fond depuis le bouton serait plus robuste ; je laisse ce choix au mainteneur.
🤖 Generated with Claude Code