Bonjour,
J’aurai besoin d’aide pour un scénario qui supprime l’historique et les commandes MQTT.
Cela fait quelques années que j’utilise avec plaisir Jeedom.
Dernièrement j’ai palié au probleme du bluetooth qui n’est plus disponible depuis Debian 11 avec MQTT
(Antenne Bluetooth avec un ESP32, Open MQTT Gateway et jMQTT)
Depuis j’essuie des lenteurs de la part du systeme et même une impossibilité d’utiliser certains modules.
En parcourant les forums, j’ai trouvé d’abord un code qui reduisait sensiblement certaines historiques.
(Tuto - analyser les archives pour détecter des pbs (lenteurs / espaces disques))
Même si j’ai apprécié cette méthode, cela n’a pas résolu le problème mais amélioré certaines commandes et reduit la taille de mon backup.
J’ai compris que le probleme venait du MQTT quand le dernier équipement intégré avait un ID très élevé.
J’ai créé un script qui liste mes équipement MQTT et verifie son utilisation.
J’ai été supris de voir qu’il avait créé 325 000 équipements ?!
Pour ceux qui sont interessé, voici le code :
// Lister tous les equipements dans jeedom venant du plugins (j)MQTT et verification de leur utilisation => CSV
log::add('scenario', 'info', "🔍 Début du script optimisé de sauvegarde MQTT en CSV");
$debugPath = '/var/www/html/backup/debug_mqtt_';
// file_put_contents($debugPath . 'step1_start.txt', "Début du script\n");
// Fichier CSV de sortie
$filePath = '/var/www/html/backup/' . date('Ymd_His') . '_commandes_Mqtt.csv';
$content = "Source;Equipement;ID Equipement;Commande;ID Commande;Utilisation\n"; // En-tête CSV
// 📌 **Précharger tous les scénarios et équipements**
$allScenarios = scenario::all();
$allEqLogics = eqLogic::all();
// 📌 **Préparer une liste de toutes les commandes utilisées**
$usedCmds = [];
// 🔎 Parcourir les scénarios une seule fois
foreach ($allScenarios as $scenario) {
$scenarioConfig = json_encode($scenario->getConfiguration());
preg_match_all('/"cmd::(\d+)"/', $scenarioConfig, $matches);
if (!empty($matches[1])) {
foreach ($matches[1] as $cmdId) {
$usedCmds[$cmdId]['scenario'] = true;
}
}
}
// 🔎 Parcourir tous les équipements une seule fois
foreach ($allEqLogics as $eq) {
foreach ($eq->getCmd() as $cmd) {
$cmdConfig = json_encode($cmd->getConfiguration());
preg_match_all('/#(\d+)#/', $cmdConfig, $matches);
if (!empty($matches[1])) {
foreach ($matches[1] as $cmdId) {
$usedCmds[$cmdId]['equipment'] = true;
}
}
}
}
// 📌 **Sélectionner les équipements MQTT uniquement**
$eqLogics = [];
foreach ($allEqLogics as $eqLogic) {
$eqType = strtolower($eqLogic->getEqType_name());
if ($eqType === 'mqtt' || $eqType === 'jmqtt') {
$eqLogics[] = $eqLogic;
}
}
// file_put_contents($debugPath . 'step3_mqtt_eq.txt', "Nombre d'équipements MQTT détectés : " . count($eqLogics) . "\n");
if (empty($eqLogics)) {
$content .= "Aucun équipement MQTT trouve;;;;;\n";
} else {
foreach ($eqLogics as $eqLogic) {
$eqName = $eqLogic->getName();
$eqId = $eqLogic->getId();
$source = (strpos(strtolower($eqLogic->getEqType_name()), 'jmqtt') !== false) ? 'jMQTT' : 'MQTT';
$cmds = $eqLogic->getCmd();
if (!empty($cmds)) {
foreach ($cmds as $cmd) {
$cmdId = $cmd->getId();
$cmdName = $cmd->getName();
$isUsedScenario = isset($usedCmds[$cmdId]['scenario']);
$isUsedVirtual = isset($usedCmds[$cmdId]['equipment']);
$status = "Non utilisee";
if ($isUsedScenario && $isUsedVirtual) {
$status = "Utilise dans Scenarios & Virtuels";
} elseif ($isUsedScenario) {
$status = "Utilise dans un Scenario";
} elseif ($isUsedVirtual) {
$status = "Utilise dans un Virtuel";
}
$content .= "$source;$eqName;$eqId;$cmdName;$cmdId;$status\n";
}
} else {
$content .= "$source;$eqName;$eqId;Aucune commande;;;;\n";
}
}
}
// Sauvegarde du fichier CSV
if (file_put_contents($filePath, $content) !== false) {
// file_put_contents($debugPath . 'step7_success.txt', "✅ Fichier CSV généré avec succès.\n");
log::add('scenario', 'info', "✅ Fichier CSV généré : " . $filePath);
} else {
// file_put_contents($debugPath . 'step7_error.txt', "❌ Échec de l'écriture du fichier CSV.\n");
log::add('scenario', 'error', "❌ Échec de l'écriture du fichier CSV.");
}
log::add('scenario', 'info', "🏁 Fin du script optimisé en CSV.");
// file_put_contents($debugPath . 'step8_end.txt', "🏁 Fin du script.\n");
J’ai donc fait une recherche sur la supression et suis tombé sur ce post : Supprimer des équipements Mqtt - #2 par Jeandhom
Cependant, en le passant dans chatgpt, il me suggere que l’historique ne serait pas supprimée et me propose ce code.
// Liste des IDs des équipements à supprimer
$equipementsASupprimer = array(1, 2, 3); // Remplacez par les IDs réels
foreach ($equipementsASupprimer as $equipId) {
// Chargement de l'équipement
$eqLogic = eqLogic::byId($equipId);
if (is_object($eqLogic)) {
// Suppression de l'historique des commandes associées
foreach ($eqLogic->getCmd() as $cmd) {
$cmd->removeHistory();
}
// Suppression de l'équipement
$eqLogic->remove();
$scenario->setLog("Équipement ID $equipId supprimé avec succès.");
} else {
$scenario->setLog("Équipement ID $equipId introuvable.");
}
}
N’aimant pas supprimer quelque chose qui risque de perturber la stabilité du systeme et n’étant pas programmeur, je recherche un bonne ame pour me dire ce qu’il en pense.
Merci,
Benjamin.