Scenario : recherche dans la BD jeedom

Bonjour à tous

Question, j’ai remarqué pour une raison encore obscure que dans certaines scenario, certains espace avaient disparus

exemple :

#[Electricité][Mode Prises][Mode]#matches"/Absent/"

j’ai donc fait une recherche dans la BD pour trouver les autres erreurs

SELECT * FROM scenarioExpression WHERE expression LIKE « %#matches% »

4 cas trouvés :

14539	0	7990	condition	null	not(#4451#matches"/Présent/")||not(#14029#matches"/Présent/")||not(#18361#matches"/Présent/")||(not(#3273#matches"/OFF/")&¬(#3273#matches"/Périmétrique/")&¬(#3273#matches"/Regard/"))||(not(#4712#matches"/ON/")&¬(#4712#matches"/Périmétrique/"))	[]	null
14544	0	7996	condition	null	not(#4451#matches"/Nuit/")||not(#14029#matches"/Nuit/")||not(#3273#matches"/OFF/")||not(#4712#matches"/ON/")||not(#18361#matches"/Nuit/")	[]	null
14549	0	8002	condition	null	not(#4451#matches"/Absent/")||not(#14029#matches"/Absent/")||not(#3273#matches"/OFF/")||not(#4712#matches"/ON/")||not(#18361#matches"/Absent/")	[]	null
15861	0	8632	condition	null	#13993#matches"/NUIT-Couchage/"	[]	null

j’ai essayé de remonter la chaine pour trouver le scenario en question

SELECT * FROM scenarioSubElement WHERE id = 7990

7990	0	3226	if	condition	null	{"enable":"1","allowRepeatCondition":"0","collapse":"0"}

puis

SELECT * FROM scenario WHERE scenarioElement LIKE « %3226% »

mais là aucun résultat

soit une information doit me manquer dans la chaine des tables soit j’ai des entrées dans des tables qui ne sont plus liées à un scenario…

si qqun peut m’aider :slight_smile:

Salut

Pas sur de comprendre, mais depuis quelques versions les espaces double sont automatiquement corrigés en simple dans les commandes des scénarios.
C’est le point que vous remontez?

Antoine

Bonjour

Non, là il 'y a plus d’espace du tout…

Mais je ne cherche pas a comprendre pourquoi, je cherche à pouvoir identifier les cas et les scénarios liés pour pouvoir corriger manuellement

Sinon tu sais qu’avec l’outil de recherche de jeedom, tu peux chercher dans des scénarios sans passer par la BDD ? :wink:

Bonjour

Oui j’ai testé une recherche du type « #matches » mais il ne trouve rien…

Bonsoir.

Il faut supprimer le #

Hello,

Si tu veux directement trouver tes coupables tu peux créer ce scénario et l’exécuter :

$search = "matches";

$id = $scenario->getId();
$found = 0;
$scenarioExpressions = scenarioExpression::all();
foreach ($scenarioExpressions as $scenarioExpression) {
    if (is_object($scenarioExpression) && $scenarioExpression->getSubElement()->getElement()->getScenario()->getId() != $id) {  
  		if (strpos($scenarioExpression->getExpression(), $search) !== false) {
          	if (strpos($scenarioExpression->getExpression(), ' ' . $search) === false || strpos($scenarioExpression->getExpression(), $search . ' ') === false) {
              	$found = 1;
   				$scenario->setLog('Scenario : ' . $scenarioExpression->getSubElement()->getElement()->getScenario()->getHumanName());
   				$scenario->setLog('Expression : ' . $scenarioExpression->getExpression());
            }
    	}
    }
}

if ($found == 0) {
  $scenario->setLog('Aucune anomalie trouvée');
}
1 « J'aime »

Non, j’ai plein de test avec la fonction matches, je cherche ceux dont l’espace a disparu entre la commande et le fonction

Bonjour @Bison , je vais tester ça, merci

Super ton script merci, pour les cas que j’avais avec les « matches », je pense que la BD doit se nettoyer la nuit, j’ai rien trouvé avec le script mais pas non plus avec la requête SQL

j’ai testé avec un autre cas, les « == »

avec la requête, pas mal de cas :frowning:
je comprends pas ce qui a pu supprimer ces espaces…

avec ton script c’est parfait

[2026-01-25 15:30:13][SCENARIO] Scenario : [Alertes][Scenario][Alerte DisjoncteurOFF]
[2026-01-25 15:30:13][SCENARIO] Expression : #12883#==0
[2026-01-25 15:30:16][SCENARIO] Scenario : [Chauffage][Scenario][Ctrl TempPourChauffage]
[2026-01-25 15:30:16][SCENARIO] Expression : #23790#==0&&#15141#<variable(TempChauffage_seuilMinInt,0)&&#15142#<variable(TempChauffage_seuilMinExt,0)&&#15143#<variable(TempChauffage_seuilMoyInt,0)&&#15144#<variable(TempChauffage_seuilMoyExt,0)
[2026-01-25 15:30:16][SCENARIO] Scenario : [Chauffage][Scenario][Ctrl TempPourChauffage]
[2026-01-25 15:30:16][SCENARIO] Expression : #23790#==1&&#15141#>variable(TempChauffage_seuilMinInt,0)&&#15142#>variable(TempChauffage_seuilMinExt,0)&&#15143#>variable(TempChauffage_seuilMoyInt,0)&&#15144#>variable(TempChauffage_seuilMoyExt,0)
[2026-01-25 15:30:17][SCENARIO] Scenario : [Alertes][Scenario][Alerte Ampoules déphasées]
[2026-01-25 15:30:17][SCENARIO] Expression : #32051#==1
[2026-01-25 15:30:17][SCENARIO] Scenario : [Controle][Scenario][Ctrl Equipements]
[2026-01-25 15:30:17][SCENARIO] Expression : #40755#==1

merci beaucoup

je suis le seul à avoir ce ménage des espaces ?

J’ai complété ton script pour bien gérer tous les cas.

$cpt = 0;
$search = "||";

/**
 * Caractères AUTORISÉS collés à Search
 * (avant ou après)
 */
$allowedAdjacentChars = array('=', '!', '-');

// Nombre de caractères affichés avant / après l'erreur
$contextLength = 20;

$id = $scenario->getId();
$scenarioExpressions = scenarioExpression::all();

foreach ($scenarioExpressions as $scenarioExpression) {

    if (!is_object($scenarioExpression)) {
        continue;
    }

    $subElement = $scenarioExpression->getSubElement();
    if (!is_object($subElement)) {
        continue;
    }

    $element = $subElement->getElement();
    if (!is_object($element)) {
        continue;
    }

    $sc = $element->getScenario();
    if (!is_object($sc)) {
        continue;
    }

    // Ne pas analyser le scénario courant
    if ($sc->getId() == $id) {
        continue;
    }

    $expr = $scenarioExpression->getExpression();

    if (strpos($expr, $search) === false) {
        continue;
    }

    // Position de search
    $pos = strpos($expr, $search);

    $before = ($pos > 0) ? $expr[$pos - 1] : '';
    $nbrcaract = strlen($search);
    $after = ($pos + $nbrcaract < strlen($expr)) ? $expr[$pos + $nbrcaract] : '';

    // Cas autorisé via la liste
    if (in_array($before, $allowedAdjacentChars, true)
        || in_array($after, $allowedAdjacentChars, true)) {
        continue;
    }

    // Logique originale : espaces autour de ==
    if (strpos($expr, ' ' . $search) === false
        || strpos($expr, $search . ' ') === false) {

        // Extraction d'un extrait autour de l'erreur
        $start = max(0, $pos - $contextLength);
        $length = $nbrcaract + ($contextLength * 2);

        $excerpt = substr($expr, $start, $length);

        #if ($start > 0) {
        #    $excerpt = '...' . $excerpt;
        #}
        #if ($start + $length < strlen($expr)) {
        #    $excerpt .= '...';
        #}

        $cpt++;
        $scenario->setLog(
            'Scenario : ' . $sc->getHumanName()
        );
        $scenario->setLog(
            'Expression (erreur) : ' . $excerpt
        );
    }
}

if ($cpt == 0) {
    $scenario->setLog('## Aucune anomalie trouvée');
} else {
    $scenario->setLog('## ' . $cpt . ' anomalies trouvées');
}

j’ai pu nettoyer mes scénario

merci beaucoup @Bison

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.