Bonjour à tous,
Je suis en train de développer un plugin (pour les lampes Hao Deng) et je bute sur un problème persistant lors de la création automatique des commandes dans la fonction postSave().
Malgré plusieurs tentatives de vérification pour voir si la commande existe déjà (par LogicalID ou par Nom), je reçois systématiquement une erreur SQL Duplicate entry lors de la sauvegarde de l’équipement, comme si Jeedom tentait de recréer la commande alors qu’elle existe déjà en base.
Le problème : À chaque sauvegarde de l’équipement, j’obtiens cette erreur bloquante : [MySQL] Error code : 23000 (1062). Duplicate entry '11-Allumer' for key 'unique' : INSERT INTO cmd SET ...
Cela indique que la commande « Allumer » existe déjà pour l’équipement ID 11, mais mon code semble ne pas la « voir » avant d’essayer de la créer.
Mon code actuel (dans la classe de l’équipement) :
public function postSave() {
if ($this->getId() == '') { return; }
// Liste des commandes à créer
$commands_config = array(
'on' => array('name' => 'Allumer', 'icon' => '<i class="fas fa-lightbulb"></i>', 'type' => 'action', 'subtype' => 'other'),
'off' => array('name' => 'Eteindre', 'icon' => '<i class="far fa-lightbulb"></i>', 'type' => 'action', 'subtype' => 'other'),
'status' => array('name' => 'Etat', 'icon' => '', 'type' => 'info', 'subtype' => 'binary')
);
foreach ($commands_config as $logicalId => $data) {
// 1. Tentative de récupération par ID Logique
$cmd = $this->getCmd(null, $logicalId);
// 2. Si pas trouvé, tentative par Nom (pour éviter le doublon de nom)
if (!is_object($cmd)) {
$cmd = $this->getCmd(null, null, $data['name']);
}
// 3. Si toujours pas trouvé, instanciation d'une nouvelle commande
if (!is_object($cmd)) {
$cmd = new haodengCmd();
$cmd->setEqLogic_id($this->getId());
$cmd->setLogicalId($logicalId);
$cmd->setName(__($data['name'], __FILE__));
$cmd->setType($data['type']);
$cmd->setSubType($data['subtype']);
$cmd->setIsVisible(1);
if (isset($data['icon'])) {
$cmd->setDisplay('icon', $data['icon']);
}
// C'est ici que ça plante avec le Duplicate Entry
$cmd->save();
}
// Si la commande existait déjà, je ne fais rien (ou je mets à jour sans save pour l'instant pour éviter l'erreur).
}
}
Ce que j’ai essayé :
- Utiliser
cmd::byEqLogicIdCmdNamepour chercher spécifiquement par nom. - Utiliser
try { $cmd->save(); } catch...pour ignorer l’erreur (mais l’erreur s’affiche quand même dans les logs et bloque parfois l’interface). - Utiliser un itérateur sur
cmd::byEqLogicId($this->getId())pour scanner manuellement la liste réelle.
On dirait qu’il y a une désynchronisation entre le cache de Jeedom (qui me dit que la commande n’existe pas) et la base de données SQL (qui contient bien la commande).
Est-ce que l’un d’entre vous aurait la « bonne pratique » officielle pour gérer cette création de commandes dans postSave sans déclencher de conflit SQL ?
Merci d’avance pour votre aide !
Voila une capture de ma page santé
