Problème Jeedom & Ajax

Bonjour,
tout d’abord, je m’excuse si mon français n’est pas parfaitement correct, car j’utilise un traducteur. Le français n’est pas ma langue maternelle.

Jusqu’à présent (littéralement ces tout derniers jours), j’ai réussi à installer Jeedom avec le plugin Ajax et tout fonctionnait parfaitement, de manière idéale pour moi et pour mon domicile.
Depuis le 30/12/2025, je rencontre cependant un problème : le plugin Ajax dans Jeedom ne synchronise pas l’ensemble des équipements depuis le cloud Ajax. Seuls quelques équipements sont détectés, puis le processus de synchronisation s’arrête et affiche une erreur — voir la capture d’écran jointe. Le problème est apparu spontanément.

N’arrivant pas à récupérer tous les équipements, j’ai dans un premier temps renouvelé l’API Ajax, sans succès. J’ai ensuite réinstallé Jeedom.
J’exécute Jeedom via Container Manager sur un NAS Synology. J’ai réinstallé le plugin Ajax, mais je rencontre toujours exactement le même problème que celui visible sur la capture d’écran.

Je n’arrive pas à résoudre ce problème par moi-même. ChatGPT indique qu’il pourrait s’agir d’un souci lié au plugin Ajax.

Merci d’avance à tous pour votre aide, et je vous souhaite à toutes et à tous une excellente nouvelle année.

Sebastian


Information Jeedom

Core : 4.5.1 (master)
DNS Jeedom : No

Plugin : Ajax Systems
Version : 2025-11-26 01:22:04 (stable)

Bonjour,

Installez la version 4.5.2 de Jeedom (c’est à dire la dernière version stable sur la branche Stable).

L’erreur semble indiquer que vous avez un équipement qui n’a pas de nom.

Merci, j’ai effectué la mise à jour vers la version 4.5.2. L’erreur est toujours présente.
Dans l’application Ajax sur le téléphone, tous les équipements ont bien un nom. Je ne comprends pas d’où peut venir le problème, car chaque appareil est nommé et, avant l’apparition du dysfonctionnement, je n’ai ajouté aucun nouvel équipement au système Ajax.

Les premiers symptômes sont apparus après avoir lancé une nouvelle synchronisation du plugin Ajax.
Étant donné que le système Ajax a été installé par une société de télésurveillance, je ne dispose que des droits utilisateur et je ne vois aucun équipement sans nom.

Bonjour,

J’ai le même soucis.
Récemment, j’ai ajouté 2 équipements à mon installation Ajax.
J’ai lancé la synchro du Plugin Ajax et j’obtiens la même erreur que Sebastian.
J’ai désinstallé le Plugin, j’ai supprimé les nouveaux équipements, j’ai supprimé tous les espaces dans les noms des équipements …et toujours le même message d’erreur :-(.

Version Plugin Ajax : 2025-11-26 01:22:04
Version Jeedom : 4.5.2

Frédéric.

Ci-dessous, tout ce que j’ai pu identifier concernant l’erreur rencontrée avec le plugin Ajax.
Le plugin AjaxSystem envoie des requêtes vers cloud.jeedom.com/service/ajaxSystem?...

Réponse : HTTP 401 + JSON : No param user apikey or header authorization provide

En conséquence, le plugin reçoit une valeur null, puis crée un eqLogic avec un nom vide → Jeedom lève alors une exception :
“The name of the equipment cannot be empty” (par exemple pour le logicalId 30BB4290).

De plus, les tentatives d’authentification via :

  • user_apikey dans la query
  • header Authorization: Bearer …
  • X-API-Key, X-Jeedom-ApiKey

échouent également — retour systématique en 401.

j’ai le même problème depuis la mise à jour, l’erreur "Le nom de l’équipement ne peut pas être vide " qui remonte pour un équipement Ajax (à priori aléatoire) et cela stoppe la synchronisation Ajax. Résultat, seule une partie de mes équipements Ajax apparait dans Jeedom alors que je les avais bien tous auparavant.

Bonjour,
N’auriez vous pas un équipement sans nom ou un groupe sans nom ? Dans tous les cas la beta qui sortira demain mettre un nom aléatoire dans ce genre de cas mais c’est’ l’idéal pour reconnaitre l’équipement en question

A priori non puisque je n’avais pas le problème avant la maj et je récupérais bien l’ensemble des équipements Ajax dans Jeedom :frowning:

Peut etre que le soucis vient pas de vous mais coté ajax c’est possible aussi, tous ce que je peux dire d’aprés le message d’erreur c’est qu’il y a un equipement ajax avec un nom vide.

Bonjour, de mon côté il n’y a aucun équipement sans nom. Tous les appareils ont bien un nom. Il s’agit donc peut-être d’un problème côté Ajax.
Est-ce que quelqu’un peut m’aider ou m’indiquer où trouver des informations sur la procédure d’installation de la version bêta ?
Merci et bonne fin d’après-midi.

Bonsoir,

Idem chez moi, aucun équipement avec un nom vide et aucun nom avec un espace.
Lors de l’installation en Juillet, la synchro avait fonctionné sans problème.

Pour l’instant, pas de version beta disponible sur le market.

Frédéric.

J’ai vu qu’il faut valider l’accès aux betas dans ton profil Jeedom Market.
Puis, dans la recherche, sélectionne beta au lieu de stable.

Bonjour, après la mise à jour vers la version bêta du plugin Ajax, la liste des capteurs est désormais récupérée sans problème — aucune erreur n’est plus remontée. En revanche, une partie des équipements perd ses noms, ses images et le type de périphérique n’est pas correctement identifié.
Je joins une capture d’écran montrant l’état des équipements après la synchronisation

Sebastian

C’est des équipements qui je pense sont une erreur d’ajax a mon avis il n’existe pas et je ne sais pas pourquoi ils les remontent

Désolé pour la traduction automatique en français. J’avais le même problème et j’ai découvert qu’il était lié au nombre de requêtes au serveur. Vous trouverez ci-dessous le code modifié dans ajaxSystem.class.php. Après l’avoir testé sur mon instance, j’ai constaté que cela réduisait le nombre de requêtes et que la liste complète des appareils ainsi que tous leurs détails étaient affichés.

J’ai également dû mettre à jour les règles de mon pare-feu, car les adresses IP des serveurs semblaient avoir changé.

  public static function sync() {
    $hubs = self::request('/user/{userId}/hubs');
    log::add('ajaxSystem', 'debug', json_encode($hubs));
    foreach ($hubs as $hub) {
      $hub_info = self::request('/user/{userId}/hubs/' . $hub['hubId']);
      log::add('ajaxSystem', 'debug', json_encode($hub_info));
      $eqLogic = eqLogic::byLogicalId($hub['hubId'], 'ajaxSystem');
      if (!is_object($eqLogic)) {
        $eqLogic = new ajaxSystem();
        $eqLogic->setEqType_name('ajaxSystem');
        $eqLogic->setIsEnable(1);
        $eqLogic->setName($hub_info['name']);
        $eqLogic->setCategory('security', 1);
        $eqLogic->setIsVisible(1);
      }
      $eqLogic->setConfiguration('type', 'hub');
      $eqLogic->setConfiguration('color', $hub_info['color']);
      $eqLogic->setConfiguration('device', $hub_info['hubSubtype']);
      $eqLogic->setConfiguration('ip', $hub_info['ethernet']['ip']);
      $eqLogic->setConfiguration('firmware', $hub_info['firmware']['version']);
      $eqLogic->setLogicalId($hub['hubId']);
      $eqLogic->save();
      $eqLogic->refreshData($hub_info); //give already obtained data to refresh function

      $devices = self::request('/user/{userId}/hubs/' . $hub['hubId'] . '/devices');
      log::add('ajaxSystem', 'debug', 'Number of devices found for hub: ' . $hub['hubId'] . ': ' . count($devices));
      foreach ($devices as $device) {
          if (!isset($device['id'])) {
              continue;
          }

          // Identify whether the device exists already in Jeedom
          $eqLogic = eqLogic::byLogicalId($device['id'], 'ajaxSystem');
    
          // Only obtain extra info if the data is not available in the original devices list
          $device_info = $device;
          if (!isset($device['deviceName']) || !isset($device['deviceType'])) {
              $device_info = self::request('/user/{userId}/hubs/' . $hub['hubId'] . '/devices/' . $device['id']);
              log::add('ajaxSystem', 'debug', 'Retrieve Extra info fo: ' . $device['id']);
               usleep(200000); // short brake to reduce impact on API
          }

          if (!$device_info || !isset($device_info['id'])) {
              log::add('ajaxSystem', 'warning', 'Not able to retrieve data for device with ID: ' . $device['id']);
              continue;
          }

          // Create only a new object if required
          if (!is_object($eqLogic)) {
              $eqLogic = new ajaxSystem();
              $eqLogic->setEqType_name('ajaxSystem');
              $eqLogic->setLogicalId($device_info['id']);
              $eqLogic->setIsEnable(1);
              $eqLogic->setIsVisible(1);
              $eqLogic->setCategory('security', 1);
          }

          // Update data (also for existing devices)
          $hasChanged = false;
    
          if ($eqLogic->getName() !== $device_info['deviceName']) {
              $eqLogic->setName($device_info['deviceName']);
              $hasChanged = true;
          }

          // Update config and check changes
          $configs = [
             'hub_id'   => $hub['hubId'],
              'type'     => 'device',
              'color'    => $device_info['color'] ?? '',
              'device'   => $device_info['deviceType'] ?? '',
              'firmware' => $device_info['firmwareVersion'] ?? ''
          ];

          foreach ($configs as $key => $value) {
              if ($eqLogic->getConfiguration($key) !== $value) {
                  $eqLogic->setConfiguration($key, $value);
                  $hasChanged = true;
              }
          }

          // Only store changes, not existing data to reduce impact on db
          if ($hasChanged || $eqLogic->getId() == null) {
              $eqLogic->save();
              log::add('ajaxSystem', 'info', 'Device updated/added: ' . $device_info['deviceName']);
          }
          $eqLogic->refreshData($device_info); //give already obtained data to refresh function
      }

      $groups = self::request('/user/{userId}/hubs/' . $hub['hubId'] . '/groups');
      log::add('ajaxSystem', 'debug', 'Number of groups: ' . count($groups));
      foreach ($groups as $group) {
        $eqLogic = eqLogic::byLogicalId($group['id'], 'ajaxSystem');
        if (!is_object($eqLogic)) {
          $eqLogic = new ajaxSystem();
          $eqLogic->setEqType_name('ajaxSystem');
          $eqLogic->setIsEnable(1);
          $eqLogic->setName($group['groupName']);
          $eqLogic->setCategory('security', 1);
          $eqLogic->setIsVisible(1);
        }
       $eqLogic->setConfiguration('hub_id', $hub['hubId']);
        $eqLogic->setConfiguration('type', 'group');
        $eqLogic->setConfiguration('device', 'group');
        $eqLogic->setLogicalId($group['id']);
        $eqLogic->save();
        $eqLogic->refreshData($group); //give already obtained data to refresh function
      }
    }
  }



  public function refreshData($_data = null) {
    $datas=$_data; //reuse data from sync function

    if (isset($datas['firmwareVersion']) && $datas['firmwareVersion'] != $this->getConfiguration('firmware')) {
      $this->setConfiguration('firmware', $datas['firmwareVersion']);
      $this->save(true);
    }
    foreach ($this->getCmd('info') as $cmd) {
      $paths = explode('::', $cmd->getLogicalId());
      $value = $datas;
      foreach ($paths as $key) {
        if (!isset($value[$key])) {
          continue 2;
        }
        $value = $value[$key];
      }
      $this->checkAndUpdateCmd($cmd, $value);
    }
    //Refresh batterie depuis trame de synchronisation / refresh
    $batteryChargeLevel = '-1';
    if (isset($datas['batteryChargeLevelPercentage'])) {
      $batteryChargeLevel = $datas['batteryChargeLevelPercentage'];  
    }
    if (isset($datas['battery']) && isset($datas['battery']['chargeLevelPercentage'])) {
      $batteryChargeLevel = $datas['battery']['chargeLevelPercentage'];
    }
    //Si niveau de charge numérique disponible, mise à jour de l'information
    if($batteryChargeLevel != '-1'){
      //Au niveau de l'équipement
      $this->batteryStatus($batteryChargeLevel);
      $this->checkAndUpdateCmd('battery::chargeLevelPercentage', $value);
    }
  }

Bonjour, j’ai appliqué les modifications dans le fichier ajaxSystem.class.php décrites ci-dessus. Les changements ont été effectués sur la version stable du plugin Ajax.
De mon côté, tout fonctionne désormais correctement : tous les équipements sont affichés correctement et la synchronisation est très rapide.

Je n’ai pas encore testé le fonctionnement avec Home Assistant ni vérifié si tout est correctement remonté, mais le code mentionné ci-dessus corrige le comportement du plugin.
Bonne journée à tous. »

1 « J'aime »

pas de lien vers des sites externes svp, collé la capture dans votre message


please no link to external sites, you can simply paste screenshots in your message

Bonjour
j’ai aussi des pbs avec les remontées AJAX
Certains modules inconnus
et des detecteurs d’ouverture qui ne remontent pas

image

(AUCUN = je ne les ai pas encore effecté)

Je vois que cette histoire de modules inconnu ca vous va pas, j’aime pas faire ca mais pour limiter les questions les modules inconnu ne seront plus créer (c’est dommage car je pense que certain des ces nouveaux modules pourrait contenir des informations intéressantes mais tant pis).

Bonjour Loic
Mon pb c’est pas trop les modules inconnus, on peut les « oublier »
Mais c’est surtout des détecteurs d’ouverture qui ne remontent pas dans jeedom
2 sur 9 ne remontent pas alors qu’ils ont strictement le meme paramétrage