Function php dans un scenario

Bonjour,

J’essai d’ajouter une fonction php dans user.function;class.php pour formatter un email.
Function très simple de rajouter un leading 0 si le nombre est < 10.

J’appelle la fonction dans le mail : fg_int2string_on_2char(#minute#) et ça fonctionne j’arrive dans ma function. Mais le paramètre que je récupère est une string de 8 caractères pour la valeur 45 envoyé. Je ne sais pas quoi faire pour convertir ce paramètre en entier.
Et la function php is_numeric($x) me répond que ce n’est pas une velur numérique.
Que faire pour nettoyer cette valeur et pourvoir l’utiliser.
Lorsque je fais le return, je retrouve bien la chaine de caractère dans le mail, ça ça marche bien.

Je sais que je peux faire ça autrement, mais de manière générale, j’ai d’autre function à écrire et je veux comprendre comment nettoyer la valeur reçu dans la function.
Merci pour votre aide.

Frank

Pour être plus précis, voici le code :


ou sous forme plus utile:
public static function fg_int2string_on_2char($x) {

  //return '--'.$x.'--';
	$t = gettype($x);
  	$res = ' value='.$x.'  type:'.$t.'----';
  	if ( is_object($x) ) { $res = $res.'objet.'; } else { $res = $res.'Not an objet.'; }
  	if ( ! is_numeric($x) ) { $res = $res . ' Valeur non numérique '; }
  	$x = trim($x);			// clean up the string
  	$len = strlen($x);
  	$res = $res .' strlen='.$len;
  	$x = intval($x);
  	$res = $res . ' value entier ='.$x.' ';
  	$str = strval($x);
  	if ( $x < 10 ) { $str = '0' . $str;} 
  	return  $res.'----'.$str.'----';
}

Et voici le résultat pour #minute# = 44

value=44 type:string----Not an objet. Valeur non numérique strlen=8 value entier =0 ----00----

J’ai ajouté plein de test pour essayer de retrouver mes petits, sans succès pour l’instant.
Je n’ai pas de soucis avec PHP, c’est la compréhension de ce que donne Jeedom en paramètre qui me pose problème.

Merci à ceux qui connaissent de m’aider,
Bonne soirée,

Salut

C’est quoi cette fonction ? Qui a pondu ça ?

Pour faire un padding pas besoin d’écrire une fonction, ca existe déjà PHP: str_pad - Manual

c’est moi !
Oui, je suis d’accord, comme je l’ai signalé, je veux faire d’autre chose avec la valeur que je récupère dans la fonction, et pour l’instant je n’arrive pas à la récupérer.
comment faire pour récupérer une donnée exploitable en php ?

Merci,

Jeedom ne fait rien de particulier
Si votre code tourne en php, ca fonctionnera

Le problème n’est pas le passage de valeur ou un quelquonque nettoyage à faire

oui, mais la valeur que je récupère est une string de 8 caractères quelque soit sa valeur, ce n’est pas un entier reconnu par php, et je ne peux pas la convertir en entier.
Je ne comprends pas ce que je récupère, il y a quelque chose que je ne doit pas bien faire.
Pourquoi php me répond que ne n’est pas un entier ?
et ill y a certaine fonction php qui ne sont pas disponible, comme ord(), ou mb_strlen()… est-ce volontaire que Jeedom n’autorise pas certaine fonction php?
Merci pour votre aide.

Si j’appelle ma fonction directement avec une valeur numérique, ça fonctionne parfaitement. mais lorsque je l’appelle avec #minute# je récupère cette chaine de caractère de 8 caractères qui est inutilisable par php.
C’est le #minute# qui semble être traduit bizarrement, et que php ne comprend pas.

« #minute# » est une chaine de 8 caractères, c’est donc parfaitement logique que vous récupériez cette valeur.

Je vous invite à lire ceci et d’arrêter de parler de votre solution Y, exprimez votre besoin à la place (non vous ne l’avez pas fait):

la bonne solution pour :

c’est PHP: str_pad - Manual comme déjà dit.

et pour obtenir, en PHP, les minutes de l’heure courante, c’est aussi ici que ca se passe: https://www.php.net, vous n’avez pas besoin de passer un tag qui n’existe pas à votre fonction;

Bonne continuation, j’arrête ici

Ok, merci.

Pour vérifier ce que la fonction reçoit comme paramètre, ajoutez au début de la fonction:

log::add(__CLASS__, 'debug', "Paramètre recu: $x");

Vous allez alors trouver dans le log userFunction: Paramètre recu: #minute#

Si vous utilisez le testeur d’expression pour vos tests, l’interface remplace #minute# par la minute courante.

Hello,

Je ne sais pas comment tu as transmis ton information mais si tu le fait par exemple dans un scénario classique tu peux t’en sortir en passant par un tag (en revanche le type reste un string).

Honnêtement je sais pas trop pourquoi ça ce comporte comme ça …

    public static function franjeed($_arg1 = '') {      
	   	$t = gettype($_arg1);
      	$len = strlen($_arg1);
        return $_arg1 . ' : type ' . $t . ' | longueur : ' . $len;
	}

[2025-08-21 20:05:04][SCENARIO] -- Début : Scenario lance manuellement.
[2025-08-21 20:05:04][SCENARIO] - Exécution du sous-élément de type [action] : action
[2025-08-21 20:05:04][SCENARIO]    Log : Minute : 5
[2025-08-21 20:05:04][SCENARIO]    Log : 5 : type string | longueur : 8
[2025-08-21 20:05:04][SCENARIO] Mise à jour du tag #m# => 5
[2025-08-21 20:05:04][SCENARIO]    Log : 5 : type string | longueur : 1
[2025-08-21 20:05:04][SCENARIO] Fin correcte du scénario

Merci Bison,

mon scénario est un scénario qui envoie un mail. Dans le contenu du mail, Je veux changer certains tag en chaine de caractères plus explicite que juste o ou 1 par exemple.
J’ai pris un exemple qui peut se résoudre autrement, mais le problème persiste, comment changer la valeur d’un tag comme " #[Extérieur][Controle Piscine][Pompe]# " qui est 0 ou 1 en OFF ou ON, ou encore mieux par une icone dans mon mail. L’appel à la fonction se fait bien en intégrant la fonction directement dans le texte du mail, mais dans la fonction je récupère une chaine de caractère de 8 caractères mais qui affiche bien la valeur 5 (dans ton exemple). Je ne comprend pas.
Que ça soit une chaine de caractères ne me gêne pas, je veux juste pouvoir la manipuler.

Et comment tu expliques dans ton log 4ème ligne que la valeur 5 s’affiche alors que c’est une chaine de 8 caractères. C’est exactement ce que j’obtiens, merci de l’avoir dupliquer, et que je comprends pas.
Merci.

Merci jpty,

je ne dois pas ajouter la ligne au bon endroit, parce que le log::add reste en blanc.
image

du coup il ne le prend pas en compte.
Merci,

C’est l’éditeur de fichiers qui colorise le texte et il ne connait pas cette syntaxe → blanc

Elle est prise en compte mais votre niveau de log est > debug
Changez debug en error.

  • Et bien sur quand on reçoit un tag dans un paramètre de fonction, c’est à la fonction de le parser avant de l’utiliser. Voir scenarioExpression::setTags()
  public static function fg_int2string_on_2char($x) {
    log::add(__CLASS__, 'debug', "Paramètre recu: $x");
    $x = scenarioExpression::setTags($x);
    log::add(__CLASS__, 'debug', "Paramètre transformé: $x");

donne:
image
et dans le testeur d’expression:
image

  • Idem avec les id de commande traités par setTags:
    image
    Le log correspondant:
    image

Merci jpty !

Je teste demain matin, mais c’est la réponse à ma question. Il y a bien quelque chose à faire pour récupérer la valeur d’un paramètre !

Mais non ! Vous n’avez rien compris au fonctionnement

Vous passez un string et vous voulez en faire un tag

Vous n’avez RIEN dû faire pour récupérer le paramètre.

Cette fonction n’a aucun sens et vouloir utiliser le tag minute pour récupérer cette valeur non plus

Merci jpty, c’est bien la solution que je cherchais !
Ou peut-on trouver cette instruction ? elle n’est pas documenté dans la page https://doc.jeedom.com/fr_FR/core/4.4/scenario
dans laquelle on trouve de la documentation php, il me manque de la documentation pour pouvoir utiliser php correctement dans Jeedom.
Et je ne sais pas comment récupérer les logs, je ne sais pas ou chercher !
Merci !

Bonjour Mips,

Je pense que c’est le contraire, je passe un tag, et je veux en faire une string pour l’utiliser dans la fonction php.
Oubliez que c’est le tag minute, je veux faire des fonctions php sur d’autres tag du genre #[Extérieur][Controle Piscine][Pompe]# que je veux pouvoir analyser dans uns fonction php. Comment dois-je procéder ?
Merci.

ceci n’est pas un tag, c’est une commande d’un équipement

Ok, c’est une info d’un équipement, et comment je récupère sa valeur dans une fonction php ?