Hello, suite à mon post ici j’avance doucement sur mon bloc code pour supprimer un message du centre de messages (alerte ouvrant à supprimer quand je ferme l’ouvrant).
Ma problématique est que le texte du message à chercher (que je ne peux pas modifier car généré par le plugin thermostat) possède une apostrophe et ma comparaison de strings est ko: l’apostrophe est transformé en d'.
Comment faire fi de cet apostrophe ? J’ai essayé addslashes mais ça ne fonctionne pas.
Le code et les logs ci-dessous.
$strings = array("[Salon][Thermostat salon] Attention le thermostat est suspendu à cause d'une fenêtre ouverte depuis : 15 minutes");
// Chaine de caractère à rechercher pour supprimer la ligne correspondante. Separer les differentes chaines de caractère par une ,
$tags = $scenario->getTags(); // Recup des tags passés en paramètre de lancement du scenario
$tagPlugin = 'thermostat' ; // recup du tag plugin
$msgs = message::byPlugin($tagPlugin) ;
foreach ($msgs as &$msg) { // Pour chaque message remonté pour ce plugin
$scenario->setLog('message: '.$msg->getMessage());
foreach ( $strings as $string ) { // pour chaque chaine de caractère à filtrer
$scenario->setLog('string à chercher: '.$string);
if ( stristr( $msg->getMessage() , $string ) ) {
message::removeAll($tagPlugin, $msg->getLogicalId()); // si une chaine de caractère est trouvée, je supprime le message
}
}
}
[2025-05-25 15:35:41][SCENARIO] -- Début : Scenario lance manuellement.
[2025-05-25 15:35:41][SCENARIO] - Exécution du sous-élément de type [action] : code
[2025-05-25 15:35:41][SCENARIO] Exécution d'un bloc code
[2025-05-25 15:35:41][SCENARIO] message: [Salon][Thermostat salon] Attention le thermostat est suspendu à cause d'une fenêtre ouverte depuis : 15 minutes
[2025-05-25 15:35:41][SCENARIO] string à chercher: [Salon][Thermostat salon] Attention le thermostat est suspendu à cause d'une fenêtre ouverte depuis : 15 minutes
[2025-05-25 15:35:41][SCENARIO] message: [Chambre Parents][Thermostat ch. parents] Attention le thermostat est suspendu à cause d'une fenêtre ouverte depuis : 15 minutes
[2025-05-25 15:35:41][SCENARIO] string à chercher: [Salon][Thermostat salon] Attention le thermostat est suspendu à cause d'une fenêtre ouverte depuis : 15 minutes
[2025-05-25 15:35:41][SCENARIO] message: [Chambre Louise][Thermostat ch. Louise] Attention le thermostat est suspendu à cause d'une fenêtre ouverte depuis : 15 minutes
[2025-05-25 15:35:41][SCENARIO] string à chercher: [Salon][Thermostat salon] Attention le thermostat est suspendu à cause d'une fenêtre ouverte depuis : 15 minutes
[2025-05-25 15:35:41][SCENARIO] Fin correcte du scénario
Soit vous mettez dans $strings' à la place de l’apostrophe '
Soit vous convertissez les ' en ' dans le message avec htmlspecialchars_decode avec en 2ème paramètre ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401Doc PHP
Le test sur le retour de stristr n’est pas correct. if ( stristr( $msg->getMessage() , $string ) )
A remplacer par:
if ( stristr( $msg->getMessage() , $string ) !== false)
Merci pour votre retour rapide, j’ai pensé à la première solution entre temps mais je trouvais pas ça propre slight_smile: A l’inverse votre deuxième proposition semble propre mais complexe
Et merci pour votre dernière proposition, je m’étais fait la réflexion en effet en regardant la doc de stristr mais ça a fonctionné (après avoir mis ' dans la string bien sûr).
Edit : en fait la solution d’ajouter ' dans la string n’est pas pérenne car Jeedom le remplace aor l’apostrophe lors de la sauvegarde du scénario Je ne sais pas comment j’ai fait pour qu’il fonctionne une fois
Je dois rater qqch, peut-être une histoire de langue car ' n’est pas remplacé (je suis passé par une variable intermédiaire $message pour l’afficher dans les logs):
$strings = array("[Chambre Parents][Thermostat ch. parents] Attention le thermostat est suspendu à cause d'une fenêtre ouverte depuis : 15 minutes");
// Chaine de caractère à rechercher pour supprimer la ligne correspondante. Separer les differentes chaines de caractère par une ,
$tags = $scenario->getTags(); // Recup des tags passés en paramètre de lancement du scenario
$tagPlugin = 'thermostat' ; // recup du tag plugin
$msgs = message::byPlugin($tagPlugin) ;
foreach ($msgs as &$msg) { // Pour chaque message remonté pour ce plugin
$message = htmlspecialchars_decode($msg->getMessage(),ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401);
$scenario->setLog('message: '.$message);
foreach ( $strings as $string ) { // pour chaque chaine de caractère à filtrer
$scenario->setLog('string à chercher: '.$string);
if (stristr( $message , $string ) !== false) {
message::removeAll($tagPlugin, $msg->getLogicalId()); // si une chaine de caractère est trouvée, je supprime le message
}
}
}
[2025-05-25 18:17:27][SCENARIO] -- Début : Scenario lance manuellement.
[2025-05-25 18:17:27][SCENARIO] - Exécution du sous-élément de type [action] : code
[2025-05-25 18:17:27][SCENARIO] Exécution d'un bloc code
[2025-05-25 18:17:27][SCENARIO] message: [Chambre Parents][Thermostat ch. parents] Attention le thermostat est suspendu à cause d'une fenêtre ouverte depuis : 15 minutes
[2025-05-25 18:17:27][SCENARIO] string à chercher: [Chambre Parents][Thermostat ch. parents] Attention le thermostat est suspendu à cause d'une fenêtre ouverte depuis : 15 minutes
[2025-05-25 18:17:27][SCENARIO] message: [Chambre Louise][Thermostat ch. Louise] Attention le thermostat est suspendu à cause d'une fenêtre ouverte depuis : 15 minutes
[2025-05-25 18:17:27][SCENARIO] string à chercher: [Chambre Parents][Thermostat ch. parents] Attention le thermostat est suspendu à cause d'une fenêtre ouverte depuis : 15 minutes
[2025-05-25 18:17:27][SCENARIO] Fin correcte du scénario
Désolé je réponds un peu à coté mais pourquoi faire du code pour supprimer automatiquement le message ?
Si il ne t’interesse pas pourquoi tu ne le désactives juste pas ?
A priori avec une valeur à 0, le plugin n’émettra pas de message.
Hello,
Tout simplement parce qu’il ne m’intéresse pas tout le temps !
Je préfère le recevoir à chaque fois, et l’ignorer la plupart du temps, et parfois qu’il me serve à me rappeler de fermer la fenêtre quand c’est un réel oubli.
Et donc, la plupart du temps j’ignore le message, et mon scénario l’effacera quand je refermerai la fenêtre sans même que j’ai à le faire moi-même en allant dans le centre de messages.