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);
}
}