Comme annoncé, ce forum est passé en lecture seule au 1er janvier 2020. Désormais nous vous invitons à vous rendre sur notre nouvelle page communauté :
Image

A très bientôt !

Vous avez dit 'Expression'

Réservé à la création de scénarios dans JEEDOM
Laurent91
Timide
Messages : 6
Inscription : 15 janv. 2019, 11:09

Vous avez dit 'Expression'

Message par Laurent91 » 02 mai 2019, 00:05

Bonjour,

j'ai une question générale sur les expressions.
Je n'arrive pas bien à cerner quel est le comportement de l'évaluateur d'expression.

Par exemple, dans un scénario, je veux faire démarrer une action à une certaine heure, et utilise donc un bloc 'A' avec l'expression suivante:

Code : Tout sélectionner

time_op(#[Exterieur][soleil][Coucher_Soleil]#,-15-30)
quelle n'a pas été ma surprise de voir que cette expression était équivalente à:

Code : Tout sélectionner

time_op(#[Exterieur][soleil][Coucher_Soleil]#,-15)
ou

Code : Tout sélectionner

time_op(#[Exterieur][soleil][Coucher_Soleil]#,-15nimportequoi)
là où je m'attendais évidement à ce que -15-30 soit évalué à -45 !

j'avais cru comprendre que l'on pouvait mettre du code PHP dans les expressions. C'est d’ailleurs ce que je fait dans un virtuel en utilisant la fonction date():

Code : Tout sélectionner

date_sunrise(#timestamp#,1,48.656,2.26883,90+35/60, date("Z",#timestamp#)/3600)
Pouvez-vous m’éclairer, une expression est-elle du code PHP, un pseudo code PHP ou autre chose ?

Et l'évaluation à priori incorrecte de cette expression

Code : Tout sélectionner

time_op(#[Exterieur][soleil][Coucher_Soleil]#,-15-30)
, est-ce un bug ? comment la faire fonctionner (autrement qu'en remplaçant -15-30 par -45 ;-) ?

Merci pour vos lumières.

Je profite de ce premier poste pour saluer l’excellent travail réalisé par l'équipe de Jeedom, faisant partie des décédés de la dernière heure de la Zibase, j'étais tenté dans un premier temps de partir sur une solution diy à base de Node RED, je ne regrette finalement pas le choix de Jeedom ! pas forcément facile à prendre en main au début mais très bien pensé et capable je pense de répondre à toutes les problématiques.

Avatar de l’utilisateur
kerdale
Actif
Messages : 1644
Inscription : 25 sept. 2016, 11:38
Localisation : Penn-ar-Bed

Re: Vous avez dit 'Expression'

Message par kerdale » 02 mai 2019, 20:11

time_op ne fonctionne pas comme ça.
si il y a après la virgule -15-30 avec ou sans parenthèse ça bloque par contre avec une variable ça marche par exemple
time_op(#[Exterieur][soleil][Coucher_Soleil]#,variable(ma_variable))
avec ma_variable ayant pour valeur -15-30 soit -45
1 NUC & 1 RPI3/Msata V3.3.31, EnOcean, Z-wave,
Rflink, IPX800V3, carte 8 rl IP, IR_V3, Xiaomi gateway, JPI/APK/tel Android dédié, Somfy RTS, Rf433Mhz, Xiaomi, Bm280 , Broadlink,WifiLights

Bosquetia
Actif
Messages : 6783
Inscription : 10 mai 2016, 07:54

Re: Vous avez dit 'Expression'

Message par Bosquetia » 02 mai 2019, 20:41

Hello

La doc scénario donne le fonctionnement de time_op... c'est une valeur ou une variable après la virgule.
Donc essayer de faire une opération et suspecter un bug car mauvaise utilisation n'est pas approprié.

Si il y a une doc pour expliquer comment utiliser ces fonctions c'est bien pour vous montrer comment les utiliser alors pourquoi tenter des choses non supportées et suspecter un bug ?!

Laurent91
Timide
Messages : 6
Inscription : 15 janv. 2019, 11:09

Re: Vous avez dit 'Expression'

Message par Laurent91 » 02 mai 2019, 21:48

Bosquetia a écrit :
02 mai 2019, 20:41
Hello

La doc scénario donne le fonctionnement de time_op... c'est une valeur ou une variable après la virgule.
Donc essayer de faire une opération et suspecter un bug car mauvaise utilisation n'est pas approprié.

Si il y a une doc pour expliquer comment utiliser ces fonctions c'est bien pour vous montrer comment les utiliser alors pourquoi tenter des choses non supportées et suspecter un bug ?!
Peut être parce que j'essai de comprendre comment marche l'évaluation des expressions... le codage par copier-coller n'a jamais été ma pratique.

Dans la doc en effet on a :

time_op(time,value) : Permet de faire des opérations sur le temps, avec time=temps (ex : 1530) et value=valeur à ajouter ou à soustraire en minutes.

quand je lis ça, habitué à de multiples langage de développement, je comprend que value est égale à une valeur mais aussi de façon implicite à une expression qui sera évaluée.

Ainsi, si je suis ton conseille dans la doc on a aussi:

variable(mavariable,valeur par défaut) : Récupère la valeur d’une variable ou de la valeur souhaitée par défaut :

tu vas donc me dire que

variable(notexists,-15-30)

ne fonctionne pas puisque l'on doit passer une valeur en deuxième argument (et non une expression), mais là ça retourne bien -45 !

comment l'explique tu ? ;-) c'est la fonction variable() qui est buguée ou le mot 'valeur' n'a pas toujours la même signification dans la doc ?

Bref, la question plus globale de mon poste était :

Pouvez-vous m’éclairer, une expression est-elle du code PHP, un pseudo code PHP ou autre chose ?

Et là j'aimerai bien en effet une référence à la doc qui l'explique ... ou une explication.

Merci
Dernière édition par Laurent91 le 03 mai 2019, 00:54, édité 1 fois.

Laurent91
Timide
Messages : 6
Inscription : 15 janv. 2019, 11:09

Re: Vous avez dit 'Expression'

Message par Laurent91 » 03 mai 2019, 00:52

bon, après une rapide lecture du code de jeedom:

Pouvez-vous m’éclairer, une expression est-elle du code PHP, un pseudo code PHP ou autre chose ?

NON, il ne s'agit pas de code PHP ! Tout au plus il existe des passerelles entre du texte présent dans l'expression et des functions PHP.

Donc pour solutionner mon problème:

Code : Tout sélectionner

time_op(#[Exterieur][soleil][Coucher_Soleil]#,-15-30)
j'ai fait ça:

Code : Tout sélectionner

time_op(#[Exterieur][soleil][Coucher_Soleil]#,my_eval(-15-30))
avec

Code : Tout sélectionner

class userFunction {
	public static function my_eval($_arg1 = '') {
		return eval('return '.$_arg1.';');
	}
}
ça marche.

Une autre façon pour éviter de créer une user function est d'utiliser une fonction 'identité' selon son contexte. Dans mon cas de calcul sur des nombre entier, la fonction PHP round() fait l'affaire. On peut donc juste faire:

Code : Tout sélectionner

time_op(#[Exterieur][soleil][Coucher_Soleil]#,round(-15-30))
L'évaluateur d'expression jeedom évaluera bien le code PHP 'round(-15-30)' , le calcul -15-30 étant fait pas PHP.

Mon incompréhension initiale vient donc du fait que l'évaluateur jeedom n'évalue pas automatiquement les expressions comme -15-30.
Je ne pense pas que ce soit un choix délibéré, mais plutôt une contrainte du fait que les chaînes de caractères ne soient pas entourées de guillemets dans les expressions jeedom... du coup il n'est pas capable de faire la différence entre -15-30 et '-15-30' et ne fait donc rien !
En PHP on a du typage faible, en jeedom on a pas de typage du tout, dommage.

Répondre

Revenir vers « Scénarios »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 3 invités