Supprimer des équipements Mqtt

Bonjour,
Bien que la question porte sur plus sur la base de donnée que le plugin-Mqtt je n’arrive pas à mettre le bon tag.
Voila: Suite à des tâtonnement sur un équipement qui se connecte à Jeedom via un broker Mosquito, le plugin Mqtt m’a créé une centaine (au moins) d’équipement dont le nom commence pour tous par:

homeassistantswitch

suivi par de nombreux chiffres variables.
Ces équipements, dont le topic a été renommé depuis n’existe donc plus, mais supprimer un à un ces équipements fantômes sur la page équipement du plugin MQTT est épouvantablement chronophage, existe-il un moyen en BdD de faire une commande en SQL pour supprimer d’un coup tous ces équipements ?
N’étant absolument pas top en SQL, je préfère demander avant pour ne pas faire une C… supplémentaire.
Merci du coup de main

Voici tous les traitements à faire pour effacer un équipement.

	public function remove() {
		foreach (($this->getCmd()) as $cmd) {
			$cmd->remove();
		}
		viewData::removeByTypeLinkId('eqLogic', $this->getId());
		dataStore::removeByTypeLinkId('eqLogic', $this->getId());
		$this->emptyCacheWidget();
		cache::delete('eqLogicCacheAttr' . $this->getId());
		cache::delete('eqLogicStatusAttr' . $this->getId());
		jeedom::addRemoveHistory(array('id' => $this->getId(), 'name' => $this->getHumanName(), 'date' => date('Y-m-d H:i:s'), 'type' => 'eqLogic'));
		return DB::remove($this);
	}

Vouloir le faire directement dans la base de données avec des commandes SQL va être difficile surtout qu’il y a aussi des traitements à faire dans le cache (hors base de données).

Il vaut mieux passer par le core qui a tous les outils pour faire ce que l’on fait avec l’interface web.

Dans un bloc code de scénario.
La ligne « remove » est à décommenter une fois que tu es sur de ton coup.

$exclure = array(816, 815, 821); //id des équipements à exclure du traitement
$allEqLogic = eqLogic::byType('jMQTT'); //jMQTT est l'id du plugin jMQTT, je ne connais pas l'id du plugin MQTT
foreach ($allEqLogic as $eqLogic) {
  if (in_array($eqLogic->getId(), $exclure)) {
    continue;
  }
  $scenario->setLog('Equipement à effacer : ' . $eqLogic->getId() . ' ==> ' . $eqLogic->getHumanName());
  //$eqLogic->remove();
}

ATTENTION, je n’ai pas testé ce code sur la partie « remove », à faire valider par un développeur.

Super, merci,
je vais donc faire du code dans un scénario, et avant une sauvegarde donc avec parachute !! :grinning:

1 « J'aime »

Une variante qui permet d’avoir dans les logs, l’array avec toutes les id des équipements.
Il suffit de faire un copier/coller dans le code puis supprimer les id des équipements à supprimer.
ATTENTION ne pas décommenter « remove » tant que le bon array n’est pas mis en place dans le code.

$exclure = array(); //id des équipements à exclure du traitement
$array = 'array(';
$allEqLogic = eqLogic::byType('jMQTT'); //jMQTT est l'id du plugin jMQTT, je ne connais pas l'id du plugin MQTT
foreach ($allEqLogic as $eqLogic) {
  $array .= $eqLogic->getId() . ', ';
  if (in_array($eqLogic->getId(), $exclure)) {
    continue;
  }
  $scenario->setLog('Equipement à effacer : ' . $eqLogic->getId() . ' ==> ' . $eqLogic->getHumanName());
  //$eqLogic->remove();
}
$array = substr($array, 0, -2);
$array .= ');';
$scenario->setLog($array);
1 « J'aime »

Merci pour ton temps
Bien compris, enfin un compris le principe :grinning:
Je remplace jMQTT par MQTT qui est l’id du plugin MQTT, ça c’est ok
mais la syntaxe exacte pour les id à exclure, par exemple je veut exclure donc conserver 3 id : 11751 , 11753 et 11753
dois je mettre à la première ligne du code:
$exclure = array( 11751 , 11753 , 11753 );
ma syntaxe est elle ok ?
(et je décommente $eqLogic->remove();
avant de lancer avec effaccement .

Oui

Relance une fois le scénario sans décommenter et vérifie dans les logs que tu as bien les bons équipements à effacer.

Si c’est ok, tu décommentes $eqLogic->remove(); et tu relances le scénario.

super merci avec en plus une sauvegarde préalable je suis bordé du boulot pour demain , avec le log du scénario j’ai compté 257 équipements en trop, MQTT marche bien mais enregistre sans demander tout ce qui est publié sur le broker et décompose le json publié en une multitude d’équipement contrairement à jMQTT qui ne fait que ce qu’on lui demande de faire. Merci encore du coup de main.

Ça a fonctionné impeccablement, merci encore.

1 « J'aime »

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.