Retour de la fonction wait dans scenario

Bonjour
Je cherche comment capturer l’état de sortie de la fonction wait dans les scenarios.

Example :
wait → valeurX == 0 → timeout 60

Comment puis je identifier que la sortie de wait est due au timeout ou à la condition sur la valeur sans tester la valeur. Quelque chose comme « wait_return »; if wait_return == 0 alors la condition valeur est ok sinon wait_return == 1 le timeout est atteint.

Merci pour votre aide

Ben si tu instancie une variable avant le wait et après le wait tu peut savoir si tu est dedans …
A moins que je n’ai pas compris ta question.

Bonjour @manuc0
Selon son code, la fonction wait() retourne 0 quand il y a un timeout et 1 sinon.
En v4:

	public static function wait($_condition, $_timeout = 7200) {
		$result = false;
		$occurence = 0;
		$limit = 7200;
		$timeout = jeedom::evaluateExpression($_timeout);
		$limit = (is_numeric($timeout)) ? $timeout : 7200;
		while ($result !== true) {
			$result = jeedom::evaluateExpression($_condition);
			if ($occurence > $limit) {
				return 0;
			}
			$occurence++;
			sleep(1);
		}
		return 1;
	}

Mon contact d’ouverture n’est jamais passé à 2 : ==> retour 0
image

Je vois le code du wait ci dessous, je trouve dommage que se soit le nombre de sleep de 1 sec qui compte et pas la diff entre le temps actuel et celui au démarrage du wait. Si l’évaluation dans le wait prend 100ms, au bout de 7200 occurrences on a attendu quasiment 8000 sec…

1 « J'aime »

Il est vrai que ce n’est pas un timeout mais un nombre d’exécutions.
Pour l’évaluation de l’état de mon capteur d’ouverture ça ne prend que 5ms.
Le total n’est donc pas 8000s mais 7236s A peine 36s de plus sur 2 heures d’exécution…

D’autre part même quand $result est true et qu’il devrait sortir il y a quand même le sleep(1).
En corrigeant tous ces défauts, ça donnerait :

  public static function MyWait($_condition, $_timeout = 7200) {
    $timeout = jeedom::evaluateExpression($_timeout);
    $limit = (is_numeric($timeout)) ? $timeout : 7200;
    $tLimit = microtime(true)+$limit;
    while (1) {
      $result = jeedom::evaluateExpression($_condition);
      if($result === true) break;
      if (microtime(true) > $tLimit) return 0;
      sleep(1);
    }
    return 1;
  }
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.