Appel de méthodes Jeedom dans la classe userFunction

Tags: #<Tag:0x00007f38551e3040>

Bonjour à tous …
J’ai un petit souci pour l’utilisation des méthodes Jeedom (scénario, cmd etc) dans la class User_function … par exemple :

require_once dirname(__FILE__) . '/../../core/php/core.inc.php';
class userFunction {
    public static function test($msg){
        scenario::setLog($msg);
    }
}

et dans mon code :

require_once dirname(__FILE__) . '/../../data/php/user.function.class.php';
userFunction::test("ceci est un test");

Ca ne fonctionne pas …

J’ai essayé de ré instancier dans user_function scénario :

    public static function test($msg){
        if (!is_object($scenario)) {
            $scenario = new scenario();                                 
        };
        $scenario->setLog($msg);
    }

Ca ne fonctionne pas non plus …

Quelqu’un a t-il une idée ?

Merci d’avance …

Salut,

$scenario->setLog('xxxxxxxx') ne fonctionne que quand tu es dans un (objet) scénario. L’idée étant de l’utiliser directement dans le scénario ce qui est très simple.

Si tu veux absolument l’utiliser dans une fonction perso il faut d’abord identifier le scénario avec par exemple scenario::byId('N°ID_SCENARIO')->setLog('xxxxxxxx') et ne surtout pas créer un nouvel objet scénario avec $scenario = new scenario();

Si tu ne sais pas exactement ce que tu fais il est préférable de setter les logs directement dans le scénario concerné.

Merci pour cette réponse rapide !

j’ai essayé par :

    public static function test($msg){
        scenario::byId(209)->setLog($msg);
    }

sans résultat …

Mon but étant de pouvoir débugger certaines fonctions dans user_function, j’ai besoin de ‹ sortir › des valeurs de variables ou des print_r(), à des endroits précis de mes scénarios … pour mes scénario classiques, je le fait par setLog … mais dans user_function ?

Je vais les sortir par mail …

        $cmd=cmd::byID(id_du_mail);
        $cmd->execCmd($options=array('title'=>'Jeedom', 'message'=> $msg), $cache=0);

mais pas super élégant …

Si tu veux débugger un bloc code dans un scénario autant utiliser $scenario->setLog('xxxxxxxx') dans le scénario, je ne vois pas ce que l’utilisation d’une fonction perso apporte de plus mis à part complexifier l’usage.

surtout qu’il faut aussi débugger la fonction perso du coup :wink:

Petu-être ajouter save() ?!?
scenario::byId(209)->setLog($msg)->save();

EDIT: je crois avoir compris en fait ça n’a pas de lien avec un scénario tu veux juste des logs pour ta fonction perso. Tu peux essayer ça :
log::add('user_function', 'error', 'Test de log');

Tu retrouveras les logs dans le menu analyse > Logs :
image

Merci !
Dans mes scénario j’utilise déja $scenario->setLog(); …
J’ai essayé avec ->save() … et j’ai ‹ call to a member on function save on null ›

Pour parler plus concrètement, je fais une fonction dans user_function pour me remplir un tableau avec les ID des fonction selon un object ou une fonction. Tableau qui serait retourné aux scénario classique.
Cela me permet par exemple pour un sonos que je change de pièce de na mas devoir modifier tous les scénario, ou pour les thermostats de la maison, de rendre pérène les scénarios si j’ajoute un thermostat ou si j’en supprime un …

    /**
     * Récupère un tableau de tous les éléments et ID d'un object et/ou fonction
     *
     * @param [type] $object : pièce à rechercher
     * @return void
     */
    public function getIDTable ($object = null, $fonction = null){
        if ($object == null and $fonction == null){return;}
        $retour = [];
        $eqLogics = eqLogic::all();
        foreach ($eqLogics as $eqLogic){
            $allCmds = $eqLogic->getCmd();
            if (count($allCmds) > 0) {
                foreach($allCmds as $cmd){  
                    $command_name = $cmd->getHumanName();
                    $explode_name = explode('][', $command_name); 

                    if ($fonction == null) { // object seul
                        if ((strpos($explode_name[0], $object) !== false)) {
                            $retour[substr($explode_name[0], 1)][substr($explode_name[2], 0, -1)] = $cmd->getId();
                        };
                    } elseif ($object == null) { // fonction seule
                        if ((strpos($explode_name[1], $fonction) !== false)) {
                            $retour[substr($explode_name[0], 1)][substr($explode_name[2], 0, -1)] = $cmd->getId();
                        };
                    } else { // object + fonction
                        if ((strpos($explode_name[0], $object) !== false) and 
                            (strpos($explode_name[1], $fonction) !== false)) {
                            $retour[substr($explode_name[0], 1)][substr($explode_name[2], 0, -1)] = $cmd->getId();
                        };
                    }
                }
            }
        }
        return $retour;
    }

et je veux pouvoir la débugger

nos messages se sont croisés … je vais tester merci !

Cool, il me le rajoute dans le centre de notification et dans le log … c’est plus élégant !
Merci

public static function debug($msg){
    if (is_array($msg)){
        $msg = print_r($msg,true);
    }
    log::add('Fonctions_Perso', 'error', $msg);
}

Je peux faire self::debug($msg); sur variables isolée …
Pas encore sur des tableaux … (ni print_r, ni var_dump …)
Mais j’ai bien avancé grace à toi !

Je viens cependant de découvrir que lors de l’execution d’un scénario avec print_r par exemple, jeedom faisait un l’impression tout seul dans un log appelé scenario_execution … donc plus la peine de fonction debug …

Merci pour l’aide …

Pour la fonction finale si cela intérresse qqn :

    /**
     * Récupère un tableau [object][element][fonction] = ID (Ex : [Salon][lampe][On])
     *
     * @param [string] $object : pièce à rechercher (ou * pour tous)
     * @param [string] $element : élément à rechercher (ou * pour tous)
     * @param [string] $fonction : fonction recherchée (ou * pour toutes)
     * @return [tableau] contenant tous les [object][element][fonction] => ID
     */
  
    public function getIDTable ($object = '*', $element = '*', $function = '*'){
        $table = [];
        $eqLogics = eqLogic::all();
        foreach ($eqLogics as $eqLogic){
            $allCmds = $eqLogic->getCmd();
            if (count($allCmds) > 0) {
                foreach($allCmds as $cmd){  
                    $command_name = $cmd->getHumanName();
                    $explode_name = explode('][', $command_name); 

                    $requested = 0;
                    // Test différent conditions
                    if (($object == '*') or ((strpos(strtolower($explode_name[0]), strtolower($object)) !== false))) { 
                        $requested +=1;
                    }
                    if (($element == '*') or ((strpos(strtolower($explode_name[1]), strtolower($element)) !== false))) { 
                        $requested +=1;
                    }
                    if (($function == '*') or ((strpos(strtolower($explode_name[2]), strtolower($function)) !== false))) { 
                        $requested +=1;
                    }
                    // if all conditions ... add to to the array
                    if ($requested == 3) {
                        $table[substr($explode_name[0], 1)][$explode_name[1]][substr($explode_name[2], 0, -1)] = $cmd->getId();
                    }
                }
            }
        }
      	 //  print_r($table);
        return $table;
    }

et s’utilise comme ca :

require_once dirname(__FILE__) . '/../../data/php/user.function.class.php';
$test = userFunction::getIDTable('*','sonos');

$scenario->setLog(print_r($test,true));

Encore merci salvialf !