@@ -468,21 +468,28 @@ public static function maxBetween($_cmd_id, $_startDate, $_endDate, $_round = 1)
468468 return round ($ historyStatistique ['max ' ], $ _round );
469469 }
470470
471- public static function wait ($ _condition , $ _timeout = 7200 ) {
471+ public static function wait ($ _condition , $ _timeout = null , $ _scenario = null ) {
472472 $ result = false ;
473473 $ occurence = 0 ;
474- $ limit = 7200 ;
475- $ timeout = jeedom::evaluateExpression ($ _timeout );
476- $ limit = (is_numeric ($ timeout )) ? $ timeout : 7200 ;
477- while ($ result !== true ) {
478- $ result = jeedom::evaluateExpression ($ _condition );
479- if ($ occurence > $ limit ) {
480- return 0 ;
474+
475+ $ limit = (int )config::byKey ('scenario::element::maxExecutionTime ' , 'core ' , 3600 );
476+ $ timeout = is_string ($ _timeout ) ? jeedom::evaluateExpression ($ _timeout , $ _scenario ) : $ _timeout ;
477+
478+ if (is_numeric ($ timeout ) && $ timeout > 0 ) {
479+ $ limit = min ((int ) $ timeout , $ limit );
480+ }
481+ if ($ _scenario !== null && is_object ($ _scenario )) {
482+ $ _scenario ->setLog (sprintf (__ ('[Wait] Début du wait, timeout: %ss ' , __FILE__ ), $ limit ));
483+ }
484+ while ($ occurence < $ limit ) {
485+ $ result = jeedom::evaluateExpression ($ _condition , $ _scenario );
486+ if ($ result === true ) {
487+ return 1 ;
481488 }
482489 $ occurence ++;
483490 sleep (1 );
484491 }
485- return 1 ;
492+ return 0 ;
486493 }
487494
488495 public static function minBetween ($ _cmd_id , $ _startDate , $ _endDate , $ _round = 1 ) {
@@ -1435,40 +1442,29 @@ public function execute(?scenario &$scenario = null) {
14351442 if (!isset ($ options ['condition ' ])) {
14361443 return ;
14371444 }
1438- $ result = false ;
1439- $ occurence = 0 ;
1440- $ limit = 7200 ;
1441- if (isset ($ options ['timeout ' ])) {
1442- $ timeout = jeedom::evaluateExpression ($ options ['timeout ' ]);
1443- $ limit = (is_numeric ($ timeout )) ? $ timeout : 7200 ;
1444- }
1445- while (!$ result ) {
1446- $ expression = self ::setTags ($ options ['condition ' ], $ scenario , true );
1447- $ result = evaluate ($ expression );
1448- if ($ occurence > $ limit ) {
1449- $ this ->setLog ($ scenario , __ ('[Wait] Condition valide par dépassement de temps : ' , __FILE__ ) . ' ' . $ expression . ' => ' . $ result );
1450- return ;
1451- }
1452- $ occurence ++;
1453- sleep (1 );
1445+ $ result = self ::wait ($ options ['condition ' ], $ options ['timeout ' ], $ scenario );
1446+ $ expression = self ::setTags ($ options ['condition ' ], $ scenario , true );
1447+ if ($ result === 0 ) {
1448+ $ this ->setLog ($ scenario , sprintf (__ ('[Wait] Dépassement du timeout: %s ' , __FILE__ ), $ expression ));
1449+ } else {
1450+ $ this ->setLog ($ scenario , sprintf (__ ('[Wait] Condition valide: %s ' , __FILE__ ), $ expression ));
14541451 }
1455- $ this ->setLog ($ scenario , __ ('[Wait] Condition valide : ' , __FILE__ ) . ' ' . $ expression . ' => ' . $ result );
14561452 return ;
14571453 } elseif ($ this ->getExpression () == 'sleep ' ) {
14581454 if (isset ($ options ['duration ' ])) {
14591455 try {
1460- $ options ['duration ' ] = floatval (evaluate ($ options ['duration ' ]));
1461- } catch (Exception $ e ) {
1462- } catch (Error $ e ) {
1463- }
1464- if ((is_float ($ options ['duration ' ]) || is_int ($ options ['duration ' ])) && $ options ['duration ' ] > 0 ) {
1465- $ this ->setLog ($ scenario , __ ('Pause de ' , __FILE__ ) . ' ' . $ options ['duration ' ] . ' ' . __ ('seconde(s) ' , __FILE__ ));
1466- if ($ options ['duration ' ] < 1 ) {
1467- usleep ($ options ['duration ' ] * 1000000 );
1456+ $ duration = floatval (jeedom::evaluateExpression ($ options ['duration ' ], $ scenario ));
1457+ if ($ duration > 0 ) {
1458+ $ seconds = min ($ duration , (int )config::byKey ('scenario::element::maxExecutionTime ' , 'core ' , 3600 ));
1459+ $ this ->setLog ($ scenario , sprintf (__ ('Pause de %s seconde(s) ' , __FILE__ ), $ seconds ));
1460+ if ($ seconds < 1 ) {
1461+ usleep ((int ) round ($ seconds * 1000000 ));
1462+ return ;
1463+ }
1464+ sleep ((int ) floor ($ seconds ));
14681465 return ;
14691466 }
1470- sleep ($ options ['duration ' ]);
1471- return ;
1467+ } catch (\Throwable $ e ) {
14721468 }
14731469 }
14741470 $ this ->setLog ($ scenario , $ GLOBALS ['JEEDOM_SCLOG_TEXT ' ]['invalidDuration ' ]['txt ' ] . $ options ['duration ' ]);
0 commit comments