DANS ou A en bloc code

Un petit bonsoir aux bloc-codeurs …

Je cherche à faire un DANS ou un A en bloc code, mais impossible de trouver la fonciton dans la doc …
une idée de la fonction et de la manière de l’utiliser

EDIT : Et l’equivalent du remove_inat :grin:
Merci

norbert

Dans les 2 cas c’est un cron qui est créé. La source est dans core/class/scenarioElement.class.php
La source du DANS:

 else if ($this->getType() == 'in') {
			if ($this->getSubElement('in')->getOptions('enable', 1) == 0) {
				return true;
			}
			$time = ceil(str_replace('.', ',', $this->getSubElement('in')->execute($_scenario)));
			if (!is_numeric($time) || $time < 0) {
				$time = 0;
			}
			if ($time == 0) {
				$cmd = __DIR__ . '/../../core/php/jeeScenario.php ';
				$cmd .= ' scenario_id=' . $_scenario->getId();
				$cmd .= ' scenarioElement_id=' . $this->getId();
				$cmd .= ' tags=\'' . json_encode($_scenario->getTags()).'\'';
				$cmd .= ' >> ' . log::getPathToLog('scenario_element_execution') . ' 2>&1 &';
				$_scenario->setLog($GLOBALS['JEEDOM_SCLOG_TEXT']['task']['txt'] . $this->getId() . $GLOBALS['JEEDOM_SCLOG_TEXT']['sheduleNow']['txt'] );
				system::php($cmd);
			} else {
				$crons = cron::searchClassAndFunction('scenario', 'doIn', '"scenarioElement_id":' . $this->getId() . ',');
				if (is_array($crons)) {
					foreach ($crons as $cron) {
						if ($cron->getState() != 'run') {
							$cron->remove();
						}
					}
				}
				$cron = new cron();
				$cron->setClass('scenario');
				$cron->setFunction('doIn');
				$cron->setOption(array('scenario_id' => intval($_scenario->getId()), 'scenarioElement_id' => intval($this->getId()), 'second' => date('s'), 'tags' => $_scenario->getTags()));
				$cron->setLastRun(date('Y-m-d H:i:s'));
				$cron->setOnce(1);
				$next = strtotime('+ ' . $time . ' min');
				$cron->setSchedule(cron::convertDateToCron($next));
				$cron->save();
				$_scenario->setLog($GLOBALS['JEEDOM_SCLOG_TEXT']['task']['txt'] . $this->getId() . $GLOBALS['JEEDOM_SCLOG_TEXT']['sheduledOn']['txt'] . date('Y-m-d H:i:s', $next) . ' (+ ' . $time . ' min)');
			}
			return true;
		} 

Le A est en dessous.

remove_inat est dans scenarioExpression.class.php C’est la suppression de tous les crons A et DANS du scenario:

elseif ($this->getExpression() == 'remove_inat') {
					if ($scenario === null) {
						return;
					}
					$this->setLog($scenario, __('Suppression des blocs DANS et A programmés du scénario', __FILE__) . ' ');
					$crons = cron::searchClassAndFunction('scenario', 'doIn', '"scenario_id":' . $scenario->getId() . ',');
					if (is_array($crons)) {
						foreach ($crons as $cron) {
							if ($cron->getPID() == getmypid()) {
								continue;
							}
							$cron->remove();
						}
					}
					return;
				}

J’avais trouvé cela, mais je n’ai jamais essayé :

$scenario ="#[Ton][sce][nario]#";
$DateTime = date(‹ d-m à H:i ›);
$cmd = cmd::byString($scenario);
$cmd->event(($DateTime));

Fais nous un retour !

ouch ! ca me parait compliquer.
Je vais du coup peut-etre voir à le faire à l’exterieur du bloc code.
En fait, je souhaite juste planifier un cron pour une commande en ayant l’heure (au format jeedom) et la commande dans 2 variables php.

Norbert

1 « J'aime »

Oui, tout en bloc code est compliqué.
Je fais les calculs en bloc code et le reste par l’interface.

Oui ce n’est pas possible car tu dois donner l’id du bloc de ton scénario que tu veux exécuter.

Donc tu pourrais créer une 2eme bloc code dans le scénario, récupérer l’id et programmer un doin du bloc mais c’est bien tous le bloc qui sera exécuté.

Perso, en tant que dev, je ne comprends pas pourquoi les bloc codes sont tant utilisés par les utilisateurs… je ne dois pas en avoir plus que 2 ou 3 et c’est seulement parce que je ne savais vraiment pas faire autrement :sweat_smile:

En même temps si ça devient trop complexe je fais un plugin :innocent: :grimacing:

1 « J'aime »

Perso je fais des blocs de codes pour plusieurs raisons :

  • Quand j’ai des switch case à faire et que ça fait trop long/compliqué avec des if/then/else
  • Dans certains cas quand je veux faire des boucles et pouvoir sortir de la boucle avant la fin : oui pour ça on peut tricher mais bon je trouve que c’est dommage qu’il n’y ait pas une simple commande pour sortir de la boucle.
  • Quand je veux écrire dans un log spécifique et pas forcément celui du scénario courant (pas faisable en IHM à priori).
  • Quand j’ai plusieurs conditions qui s’enchainent et qu’un copier/coller de code est plus simple qu’avec des blocs.

Quand je peux éviter d’en faire j’évite, mais y a des moments où on à pas trop le choix :slight_smile:
Après pour moi c’est aussi la force de jeedom la possibilité d’être accessible à la fois au grand public et aux nerds :nerd_face:

Voir plugin-logmanager :wink:

Je ne connaissais pas, merci pour l’info :wink:

Bonjour @Mips

Du coup je suis effectivement sorti du bloc- code pour le faire en mode bloc normal. Ça marche très bien.

En l’occurrence, j’essaie effectivement de reproduire ce que le plugin pool fait, ce dernier marche de moins en moins bien, pas de retour du dev.

J’ai bien essayé à plusieurs reprises de me mettre dans le plugin mais c’est trop compliqué, sans être développeur.

Du coup, pas trop le choix que de faire des blocs code. Et puis sur le fond ça m’intéresse aussi de comprendre un petit peu le PHP.

Norbert

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.