userFonction dans scénario et/ou bloc code

Bonjour,

Je n’arrive pas à faire fonctionner mes userFonctions ni directement dans mes commandes, ni dans le bloc code scénario… malgré la doc que j’ai bien suivie ça ne marche pas :cry:
Mon but est de gérer une ampoule z-wave via mqtt, la couleur à lui envoyer est au format json - je n’ai pas réussi à lui donner directement le code couleur hexa.

{"warmWhite":255,"coldWhite":255,"red":40,"green":54,"blue":5}

Donc, pour modifier la couleur, sur la commande je vais rajouter 5 actions pour donner les 5 valeurs du json:

Et voici les 3 fonctions de conversion des couleurs:

<?php

/* * ***************************Includes********************************* */
require_once __DIR__ . '/../../core/php/core.inc.php';

class userFunction {

	public static function hex2Blue($_arg1) {
        $_rgb = hex2rgb(self::stripQuotes($_arg1));
        log::add('scenario', 'info', var_export($_rgb, 1));
		return isset($_rgb[2]) ? $_rgb[2] : 0;
	}

	public static function hex2Green($_arg1) {
        $_rgb = hex2rgb(self::stripQuotes($_arg1));
		return isset($_rgb[1]) ? $_rgb[1] : 0;
	}

	public static function hex2Red($_arg1) {
        $_rgb = hex2rgb(self::stripQuotes($_arg1));
		return isset($_rgb[0]) ? $_rgb[0] : 0;
	}

	/* INTERNAL FUNCTIONS */
	static function stripQuotes($text) {
		return preg_replace('/(^[\"\']|[\"\']$)/', '', $text);
	}
}

Impossible donc d’utiliser ces fonctions, que ce soit via les actions ou via le scénario, le remplacement ne se fait pas, il n’évalue pas la fonction:
image
ici et pour le scénario j’ai dû créer un widget couleur pour mes tests.

En bloc code dans un scénario j’arrive à appeler mes fonctions, avec ce code:

$scenario->setLog('__ RGB : #[salon][Couleur][Etat couleur]# ==> '.(userFunction::hex2Red( '#[salon][Couleur][Etat couleur]#')) . '-' . (userFunction::hex2Green( '#[salon][Couleur][Etat couleur]#')) . '-' . (userFunction::hex2Blue( '#[salon][Couleur][Etat couleur]#')));
$sc->setCmd('#[salon][Ampoule2][SetRed]#', userFunction::hex2Red( "#[salon][Couleur][Etat couleur]#"));
$sc->setCmd('#[salon][Ampoule2][SetGreen]#', userFunction::hex2Green( "#[salon][Couleur][Etat couleur]#"));
$sc->setCmd('#[salon][Ampoule2][SetBlue]#', userFunction::hex2Blue( "#[salon][Couleur][Etat couleur]#"));

Voici le log du scénario, ici l’appel aux 3 fonctions a bien fonctionné, mais par contre c’est le remplacement de la couleur qui n’est pas bon: le scénario est provoqué par l’état du virtuel #[salon][Couleur][Etat couleur]# mais pourtant, quelle que soit la couleur du virtuel, le scénario fini toujours avec #28365# qu’il transforme en 40-54-5


[2021-12-22 18:50:32][SCENARIO]  - /* - Execution du Bloc code n°1 - DEBUG NATIF ACTIF (php >= v7) */
[2021-12-22 18:50:32][SCENARIO]  - - - 
[2021-12-22 18:50:32][SCENARIO] __ RGB : #28365# ==> 40-54-5
[2021-12-22 18:50:32][SCENARIO]  - Exécution d'une commande: #[salon][Ampoule2][SetRed]# de type [action]
[2021-12-22 18:50:32][SCENARIO]  - Commande de sous-type: [slider]  | options: ( [slider] => 40 )
[2021-12-22 18:50:32][SCENARIO]  - Exécution d'une commande: #[salon][Ampoule2][SetGreen]# de type [action]
[2021-12-22 18:50:32][SCENARIO]  - Commande de sous-type: [slider]  | options: ( [slider] => 54 )
[2021-12-22 18:50:32][SCENARIO]  - Exécution d'une commande: #[salon][Ampoule2][SetBlue]# de type [action]
[2021-12-22 18:50:32][SCENARIO]  - Commande de sous-type: [slider]  | options: ( [slider] => 5 )
[2021-12-22 18:50:32][SCENARIO]  - - - 
[2021-12-22 18:50:32][SCENARIO]  - /* - Fin du Bloc code n°1 - */
[2021-12-22 18:50:32][SCENARIO]  - - - 
[2021-12-22 18:50:32][SCENARIO] Durée d'exécution (depuis le 1er bloc code) : 43.74 millisecondes

Il me manque quelque chose mais je ne vois pas quoi ?

Salut,

Tu ne peux pas utiliser directement la commande #[salon][Couleur][Etat couleur]#

Il ne manquerait pas qq chose du style :

$color = cmd::byString('#[salon][Couleur][Etat couleur]#')->execCmd();

Puis utiliser la variable $color.

Alors en effet, je supposais à tort que la chaine était remplacé par sa valeur mais à priori non.

Du coup, dans le scénario ça marche bien mieux, je récupère la bonne valeur. Je vais donc passer par un scénario c’est le plus simple, parce que sinon, impossible d’appeler une ‹ userFonction › depuis le testeur d’expression ou tout autre équipement…

J’ai modifié les fonctions ainsi:

	public static function hex2Blue($_arg1) {
        log::add('scenario', 'info', "calcul blue pour $_arg1");
        $_rgb = hex2rgb(cmd::byString(self::stripQuotes($_arg1))->execCmd());
        log::add('scenario', 'info', var_export($_rgb, 1));
		return isset($_rgb[2]) ? $_rgb[2] : 0;
	}

mais le testeur d’expression ne la trouve pas.

Hello,

public static function plop($_arg1 = '') {
	return 'Argument 1 : ' . $_arg1;
}

image

→ Essaye de renommer ta fonction en hexBlue (pas hex2Blue)

J’ai voulu essayer mais tu as mis une fonction hex2rgb et je ne sais pas ce qu’elle fait :slight_smile:

Moi j’utilisais une fonction user dans des virtuels, ça marchait bien.

1 « J'aime »

Merci !! ça marche !! il semblerait donc que s’il y a un chiffre dans le nom de la fonction, celle-ci est ignorée… ?

hex2rgb est une fonction du core, ça aurait dû marcher chez toi aussi

	public static function hexBlue($_arg1) {
        $_rgb = hex2rgb($_arg1);
		return isset($_rgb[2]) ? $_rgb[2] : 0;
	}

	public static function hexGreen($_arg1) {
        $_rgb = hex2rgb($_arg1);
		return isset($_rgb[1]) ? $_rgb[1] : 0;
	}

	public static function hexRed($_arg1) {
        $_rgb = hex2rgb($_arg1);
		return isset($_rgb[0]) ? $_rgb[0] : 0;
	}

Je m’en sors bien parce que je n’ai plus besoin de remplacer le tag par la valeur, je n’ai plus besoin du scénario non plus, et je l’utilise directement dans les commandes à appliquer avant la commande :

Absolument ! Sûrement un effet non voulu à cause de diverses fonctions de filtrage des caractères du core !

Très propre comme ça :+1:

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