Expression non valide dans les scénarios avec "Si"

Bonjour à tous et à toutes,

J’ai actuellement un scénario qui fonctionne bien, dans celui-ci j’ai plusieurs test « Si », et plus particulièrement j’ai trois tests dans ce dernier à savoir :

(#timestamp# - lastCommunication(#[Appartement][Accu]#, U) > 300) || (#timestamp# - lastCommunication(#[Appartement][Teleinfo]#, U) > 600) || ( (#[Balcon][Balcon][Mode]# == 'Planté' ) && (#timestamp# - lastCommunication(#[Balcon][Arrosage Balcon]#, U) > 600) )

Le scénario s’exécute bien et il n’y a pas de message d’erreur ni quand je la passe au « testeur d’expression ».
Résultat du testeur d’expression :

Je vais évaluer : (1666756674 - " 1666756660" > 300) || (1666756674 - " 1666756668" > 600) || ( ("Non Planté" == 'Planté' ) && (1666756674 - " 1664291179" > 600) )
Résultat : false

J’ai rajouter un module et j’aimerai donc le monitorer comme les trois que j’ai déjà, en l’occurrence je voudrais rajouter ce test :

(#timestamp# - lastCommunication(#[Appartement][ECS-Linky]#, U) > 300)

Résultat du testeur d’expression :

Je vais évaluer : (1666756764 - " 1666756762" > 300)
Résultat : false

Je modifie donc mon expression comme ci-dessous pour l’intégrer (je l’insère en position « 3 » en dupliquant l’expression « 2 » puis en la modifiant) elle devient donc ceci :

(#timestamp# - lastCommunication(#[Appartement][Accu]#, U) > 300) || (#timestamp# - lastCommunication(#[Appartement][Teleinfo]#, U) > 600) || (#timestamp# - lastCommunication(#[Appartement][ECS-Linky]#, U) > 300) || ( (#[Balcon][Balcon][Mode]# == 'Planté' ) && (#timestamp# - lastCommunication(#[Balcon][Arrosage Balcon]#, U) > 600) )

Et là le scénario ainsi que le testeur d’expression ne sont pas content …

    Attention : il doit y avoir un souci, car le résultat est le même que l'expression
    Je vais évaluer : (1666757001 - " 1666756960" > 300) || (1666757001 - " 1666756999" > 600) || (1666757001 - " 1666756942" > 300) || ( (#[Balcon][Balcon][Mode]# == 'Planté' ) && (1666757001 - " 1664291179" > 600) )
    Résultat : (1666757001 - " 1666756960" > 300) || (1666757001 - " 1666756999" > 600) || (1666757001 - " 1666756942" > 300) || ( (#[Balcon][Balcon][Mode]# == 'Planté' ) && (1666757001 - " 1664291179" > 600) )

Mais si je supprime une des expression (la 1, la 2 ou la 4) ça refonctionne comme il faut …
Ici en supprimant la 1 :

(#timestamp# - lastCommunication(#[Appartement][Teleinfo]#, U) > 600) || (#timestamp# - lastCommunication(#[Appartement][ECS-Linky]#, U) > 300) || ( (#[Balcon][Balcon][Mode]# == 'Planté' ) && (#timestamp# - lastCommunication(#[Balcon][Arrosage Balcon]#, U) > 600) )

Je vais évaluer : (1666757072 - " 1666757060" > 600) || (1666757072 - " 1666757062" > 300) || ( ("Non Planté" == 'Planté' ) && (1666757072 - " 1664291179" > 600) )
Résultat : false

Ici en supprimant la 2 :

(#timestamp# - lastCommunication(#[Appartement][Accu]#, U) > 300) || (#timestamp# - lastCommunication(#[Appartement][ECS-Linky]#, U) > 300) || ( (#[Balcon][Balcon][Mode]# == 'Planté' ) && (#timestamp# - lastCommunication(#[Balcon][Arrosage Balcon]#, U) > 600) )

Je vais évaluer : (1666757106 - " 1666757104" > 300) || (1666757106 - " 1666757062" > 300) || ( ("Non Planté" == 'Planté' ) && (1666757106 - " 1664291179" > 600) )
Résultat : false

Ici en supprimant la 4 :

(#timestamp# - lastCommunication(#[Appartement][Accu]#, U) > 300) || (#timestamp# - lastCommunication(#[Appartement][Teleinfo]#, U) > 600) || (#timestamp# - lastCommunication(#[Appartement][ECS-Linky]#, U) > 300)

Je vais évaluer : (1666757125 - " 1666757104" > 300) || (1666757125 - " 1666757120" > 600) || (1666757125 - " 1666757123" > 300)
Résultat : false

Je ne comprends donc pas d’où vient l’erreur.
J’ai cherché sur le forum mais aucun résultat, la plupart son des erreurs de guillemet oublié ou autre qui ne passe pas déjà au testeur d’expression, les miennes le passe toutes séparément mais pas ensemble …

Merci par avance pour votre aide
Jeedom 4.2.21

Bonjour,

C’est un problème connu, Jeedom a du mal avec des expressions qui contiennent trop de parenthèses.

Il faut passer par des tag pour stocker le résultat de tes mini-expressions puis faire le SI en utilisant les tags.

Bonjour,

Supprimez aussi tous les espaces avant ou après les virgules et les parenthèses lors des appels de fonctions.

Il me semble déjà avoir eu ce pb. J’avais fait un post mais impossible de le retrouver.
Essayez de changer l’ordre des différents tests
(Je continue de chercher le post en question)

Norbert

Salut,

Pas convaincu que ça change grand chose mais tu peux essayer « d’aider » l’évaluation en ajoutant des parenthèses pour les blocs de ce type :

Mettre

((#timestamp# - lastCommunication(#[Appartement][Accu]#, U)) > 300)

Au lieu de

(#timestamp# - lastCommunication(#[Appartement][Accu]#, U) > 300)

enlève les espaces, comme tu peux le voir il évalue la valeur comme une chaine et pas comme une valeur, ça veut dire qu’il prend l’espace comme un string :

" 1666757104"

teste la syntaxe :
(#timestamp#-lastCommunication(#[Appartement][Accu]#,U)>300)

tu dois obtenir dans l’évaluation d’expression un truc sans guillemets ni espaces

Bonsoir,
@ArnaudA , peux-tu confirmé que ce test fonctionne :

( (#[Balcon][Balcon][Mode]# == 'Planté' ) && (#timestamp# - lastCommunication(#[Balcon][Arrosage Balcon]#, U) > 600) ) || (#timestamp# - lastCommunication(#[Appartement][Accu]#, U) > 300) || (#timestamp# - lastCommunication(#[Appartement][Teleinfo]#, U) > 600) || (#timestamp# - lastCommunication(#[Appartement][ECS-Linky]#, U) > 300)

Merci.

cette piste me semble pertinente

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

@ArnaudA ,
tu as mis ma réponse en solution, mais puis-je avoir plus d’info.
tu confirme que la méthode fonctionne ?
car si c’est le cas, il y a bien un soucis dans le testeur d’expression…

Re :
J’ai quand même analysé un peu plus loin le problème,
Si un membre de l’équipe peu valider ma conclusion.
Ce problème intervient quand on utilise un Eqlogic et une Cmd dans la même chaine du testeur d’expression ou scénario, et ce dans un ordre bien précis.
Sa démarre avec la fonction fromHumanReadable($_input) de la class jeedom qui fait appel cmd::humanReadableToCmd($_input).
dans cette dernière un preg_match_all("/#\[(.*?)\]\[(.*?)\]\[(.*?)\]#/", $_input, $matches); semble aussi matcher sur un mélange Eqlogic / Cmd :

En remplaçant la regex par #\[([^#]*)\]\[([^#]*)\]\[([^#]*)\]# sa semble être ok :

Edit : @Loic, si tu as quelques minutes pour jeter un œil, je ne suis pas très doué en Regex, il y a peut-être une autre façon de faire pour ‹ matcher › plus précisement.
Merci.

1 « J'aime »

Oui je te confirme que ça fonctionne avec ta méthode.
Je n’arrivais pas à réouvrir le sujet, j’ai validé la solution avant de répondre et le sujet c’est donc fermé.

Bonsoir, pour info la modification a été apporté en ALPHA, merci @Loic :wink:
elle sera donc disponible dans une future stable.

Bonne soirée.

1 « J'aime »

Cette discussion a été automatiquement fermée une minute après le dernier message. Aucune réponse n’est permise dorénavant.