Calcul dans la commande time_op

Bonjour,
J’ai un virtuel nuit comme ceci:
image
Il est composé de 2 commandes (action & info) Durée (curseur) et Timer (info texte):

Et un scenario qui doit lancer une action sur mon chauffe eau à 5h du mat moins la valeur du virtuel nuit:

time_op(500, -60*#[Chauffe Eau][Nuit][Timer]#)

Le problème est que le calcul 60*#[Chauffe Eau][Nuit][Timer]# n’est pris en compte dans la commande time_op… Seulement 60 est pris en compte.
Dans mon cas j’ai 400 comme résultat du time_op!!! curieux alors que je devrais avoir 200.

Une idée svp !?

NB: Je ne suis pas sur d’avoir posté dans la bonne section

Bonjour,

Transforme le type en « numérique » plutôt que « autre »
image

Oui ok mais ça ne résout rien !!!
C’est une modif qui est rester lors de mon debug

[2022-12-05 12:08:26][SCENARIO] Start : Scenario lance manuellement.
[2022-12-05 12:08:26][SCENARIO] Exécution du sous-élément de type [condition] : if time_op(500, -60*#[Chauffe Eau][Nuit][Timer]#)
[2022-12-05 12:08:26][SCENARIO] Evaluation de la condition : [400] = 400
[2022-12-05 12:08:26][SCENARIO] Exécution du sous-élément de type [action] : then
[2022-12-05 12:08:26][SCENARIO] Fin correcte du scénario

C’est comme si pour le time_op, seulement la 1ere valeur du paramètre 2 était pris en compte :face_with_raised_eyebrow:
car si je fais time_op(500, -#[Chauffe Eau][Nuit][Timer]#*60) alors la c’est #[Chauffe Eau][Nuit][Timer]# (=3) qui est pris en compte :exploding_head: car j’ai 457 = 500 - 3 :

[2022-12-05 12:16:24][SCENARIO] Start : Scenario lance manuellement.
[2022-12-05 12:16:24][SCENARIO] Exécution du sous-élément de type [condition] : if time_op(500, -#[Chauffe Eau][Nuit][Timer]#*60)
[2022-12-05 12:16:24][SCENARIO] Evaluation de la condition : [457] = 457
[2022-12-05 12:16:24][SCENARIO] Exécution du sous-élément de type [action] : then
[2022-12-05 12:16:24][SCENARIO] Fin correcte du scénario

Ok du coup le core ne fait pas le calcul sur la valeur d’ajout ou retrait (2eme paramètre)

Passe alors par un tag « operation » pour enregistrer le calcul -60*#[Chauffe Eau][Nuit][Timer]# puis time_op(500, tag(operation))

Ok merci, mais peux-tu m’en dire plus sur le tag.
Comment configurer un tag dans mon virtuel ?
Par exemple dans les paramètres avancés de ma commande curseur:

Je pensais que tu utiliserais un scénario mais tu peux le faire comme ça aussi et donc ajouter une autre action pour dire ce qu’il faut faire à time_op(500, -tag(duration_min))

Le hic c’est que le tag est vide dans le scenario.
C’est normal car le tag « n’a pas de durée de vie »

Si on utilise un scénario le tag est à définir dans le scénario et il existe le temps de l’exécution du scénario

Exemple :

Ah yes je savais ça mais tu viens de me donner l’idée :sweat_smile: :grin:
Merci :hugs:

De rien, n’oublie pas de fermer ton sujet en cliquant sur le bouton Solution du post qui va bien et si tu considères ta question comme résolue

Pour le moment j’ai un workaround…
Oui je compte bien fermé ce sujet quand j’aurais une vrai réponse au problème de base qui est que la fonction time_op n’accepte pas de calcul en paramètres.
Par exemple :

time_op(500, -60*#[Chauffe Eau][Nuit][Timer]#)

La vraie réponse est que ce n’est pas pris en charge dans la fonction time_op du core

	public static function time_op($_time, $_value = 0) {
		$_time = self::setTags($_time);
		$_value = self::setTags($_value);
		$_time = trim($_time);
		$t = explode(":", $_time);
		if (count($t) >= 2) {
			$_time = $t[0] . sprintf("%02d", $t[1]);
		}
		if (($lg = strlen($_time)) < 4) {
			$_time = str_repeat("0", 4 - $lg) . $_time;
		} else {
			$_time = substr($_time, 0, 4);
		}
		$date = DateTime::createFromFormat('Gi', $_time);
		if ($date === false) {
			return -1;
		}
		if ($_value > 0) {
			$date->add(new DateInterval('PT' . abs($_value) . 'M'));
		} else {
			$date->sub(new DateInterval('PT' . abs($_value) . 'M'));
		}
		return $date->format('Gi');
	}

La fonction attend un nombre et ne fait que regarder si elle est supérieure ou pas à zéro pour savoir s’il faut retirer ou ajouter du temps

Je suis une pipe en php, mais si je comprends bien, il n’y a pas de pre-processing avant d’exécuter le time_op!!
Par exemple:

time_op(#time, x*y)

Le produit x*y n’est pas calculé puis passé comme argument $_value…
Tu confirmes ?

Si c’est ça, rien à voir avec du C/C++…

1 « J'aime »

Bonjour,

Non ce n’est pas correcte.
De plus c’est du code php mais qui passe par jeedom avant donc il peut y avoir des subtilités

Déjà supprimez l’espace après la virgule; de manière générale, jamais d’espace avant ou après virgules, parenthèses… dans le code écrit sous jeedom (dans les actions de scénarios)

Ensuite testez

1 « J'aime »

Salut
oui c’est ce @Bison te répète deouis plusieurs messages

tu ne peux pas faire le calcul dans le time_op

tu ajoutes une action tag avant tu lui donne la valeur -60*[ta-commande]
et tu rappelles le tag dans le time_op comme @bison l’a proposé

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