Aide à la création commande on/off et Etat (commande lié)

Hello

J’ai vu le sujet getCmdByName existe? que @Mips et @sigalou ont fait sur pratiquement le même sujet.
J’arrive à créer mes commandes mais je n’arrive pas à lier

public static function addcommande() {
$info = $TEST->AddCommandeONOFF('ETAT',$Commande['ep_id'],"info","binary");
$info = $TEST->AddCommandeONOFF('ON',$Commande['ep_id'],"action","other");
$info = $TEST->AddCommandeONOFF('OFF',$Commande['ep_id'],"action","other");
}

Je créer mes commandes

public function AddCommandeONOFF($Name,$_logicalId, $Type="info", $SubType='binary') {
        $_eqName = $this->getid();

        if ($Name =="ETAT") {
            $_logicalId_COM = $_logicalId;
        } else {
            $_logicalId_COM = $Name .'_'.$_logicalId;
        }

    

        $Commande = $this->getCmd(null,$Name.'_'.$_logicalId_COM);

        if (!is_object($Commande)){
            $Commande = new roseeCmd();
            $Commande->setId(null);
            $Commande->setLogicalId($_logicalId_COM); // Id de la commande
            $Commande->setEqLogic_id($this->getId());

            $Commande->setName($Name);// nom de la commande;
            $Commande->setUnite(''); // Unité
            $Commande->setType($Type); // Type
            $Commande->setIsVisible(1); // Visibilité
            $Commande->setIsHistorized(0);
            $Commande->setSubType($SubType); // Sous type
            $Commande->setDisplay('generic_type','');

              if ($Name !="ETAT" && $Name =="ON"){
$Liaison = $this->getCmd(null, 'ETAT');
	$commande->setValue($Liaison->getId());

            } else if ($Name !="ETAT" && $Name =="OFF"){
               $Liaison = $this->getCmd(null, 'ETAT');
	$commande->setValue($Liaison->getId());
            } else{
            }
            $Commande->save();



        }
        return $Commande;
    }

si je fais cela dans la fonction AddCommandeONOFF je n’arrive pas à les lier. Je ne comprend pas pourquoi.
j’ai pourtant mis un « logicalId » mais là je bloque depuis plusieurs jours

merci de votre aide

Salut,

@Mips a expliqué comment lier une commande info à une commande action récemment:

Merci @Salvialf
cela m’a permis d’avancer, j’ai appliquer le code de @Mips mais cela bloque a la création de la première commande d’action
La commande info est bien créer

public function AddCommandeONOFF($Name,$_logicalId, $Type="info", $SubType='binary') {
        $actionlogicalId = 'ETAT';
        $infologicalId = $Name;
                
        $Cmd = $this->getCmd(null,$_logicalId);

        if (!is_object($Commande)){
            $Cmd= new roseeCmd();
            $Cmd->setId(null);
            $Cmd->setLogicalId($_logicalId);
            $Cmd->setEqLogic_id($this->getId());
            $Cmd->setName($Name);
            $Cmd->setUnite('');
            $Cmd->setType($Type);
            $Cmd->setIsVisible(1);
            $Cmd->setIsHistorized(0);
            $Cmd->setSubType($SubType);
            $Cmd->setDisplay('generic_type','');
            if ($Name !="ETAT"){
                $Cmd = $this->getCmd(null, $actionlogicalId);
                $infoCmd = $this->getCmd(null, $infologicalId);
                $Cmd>setValue($infoCmd ->getId());
            }
            $Cmd->save();

        }
        return $Cmd;
    }

C’est dans le plugin rosée?
parce que là c’est un peu compliqué de comprendre l’enchainement, tu es sur que ta commande info est créée avant la commande action? ca me parait un peu tout mélangé dans le code :upside_down_face:

En fait, rapport à ce genre de questions, j’ai commencé à réorganiser ce que j’avais développé pour mes plugin; principalement extraire ce genre de code des plugins pour le partager plus facilement et ne pas devoir refaire le boulot à chaque plugin;

je vous propose de faire un tour ici:

En gros, avec le code que je partage tu dois avoir un fichier de config avec les commandes que tu souhaites (voir la doc ci-dessus) par type d’équipement (si plusieurs type d’équipement pour un même plugin) et créer les commandes avec une ligne code dans le plugin, tout est géré derrière:

$eqLogic->createCommandsFromConfigFile(__DIR__ . '/../config/commands.json', 'lamp');

ps: pour le moment il n’y a « que » la création des commandes dans cette « toolbox », d’autres tools viendront probablement en fonction de mon avancement (ou des besoins émis par d’autres devs s’il y a des personnes intéressés)

Merci @Mips
Pour ce tools, c’est un peu compliqué pour moi mais je vais essayer de le traiter. En plus c’est en Anglais c’est un moyen pour moi de mettre en pratique mes cours :smiley:

Peut-on passer d’autres infos lors de la création des commandes, en particulier le logicalId ?

c’est pas pour le plugin rosee mais si cela fonctionne bien, je ferais surement pareil cela m’évitera de refaire tout à chaque fois et uniformiser

l’info est bien créer en premier car celle-ci se créer sans pb. c’est après les commandes qui ne passe pas

Ah oui, je n’ai pas pensé à ça j’avoue;
comme c’était de la doc pour développeur j’ai mis en anglais, je ne travaille qu’en anglais coté pro et c’est parti tout seul; après j’ai pas fait des tournures de phrases compliquées je pense.
S’il y a un soucis demande :slight_smile:

Ca peut paraitre compliqué au départ mais dans le fichier json c’est juste le standard jeedom, je n’ai rien inventé, donc tu vas retrouver les concepts connus si tu y plonge un peu.
Si tu ne connais pas composer, en vrai tu verras que c’est très simple, mais tu peux aussi simplement copier le ficher dans ton dossier core/class et faire le require à la main.

Passer à qui? tout est dans la config, y compris le logicalId.

si ce n’est pas pour le plugin rosee, va falloir changer cette ligne :wink:

$Cmd= new roseeCmd();

tu peux juste faire un $Cmd= new cmd(); ; il n’y a absolument pas besoin de créer la commande en tant que pluginIdCmd et ca permet d’éviter ce genre d’erreur de copier/coller (je l’ai faite aussi) sauf si dans la foulée tu veux utiliser une de ses méthodes mais généralement on ne fait pas ca :wink:

Autre erreur: je ne vois pas la déclaration de $name dans ton code :thinking:

$Cmd->setName($Name);

et cette partie est bizarre (et c’est pour ça que je disais que tout semblait mélangé):

  • pourquoi conditionner le setvalue sur le fait que le nom de la commande soit « ETAT »?
  • on ne sait pas trop si cela concerne une commande info ou action
  • dans le if tu récupères de nouveau les commandes alors qu’à priori tu es en train de créer l’une d’elle mais donc elle n’existe pas puisque le save est juste après
    donc soit $cmd soit $infoCmd est null (ca dépend où on en est dans la logique)
            if ($Name !="ETAT"){
                $Cmd = $this->getCmd(null, $actionlogicalId);
                $infoCmd = $this->getCmd(null, $infologicalId);
                $Cmd>setValue($infoCmd ->getId());
            }

aussi il manque un - après le $cmd à $Cmd>setValue($infoCmd ->getId());

c’est pas grave, j’ai compris et il faut que j’apprenne

si il y est bien

Justement c’est cette partie qui me bloque

si je comprend un peu et fais les diverses correction, tu appliquerais le setValue uniquement pour les commandes ON et OFF

public function AddCommandeONOFF($Name,$_logicalId, $Type="info", $SubType='binary') {


        // A Verifier si besoin
      $actionlogicalId = 'ETAT';
        $infologicalId = $Name;
//FIN A VERIFIER
 
        $Cmd = $this->getCmd(null,$_logicalId);
        if (!is_object($Commande)){
            $Cmd= new cmd();
            $Cmd->setId(null);
            $Cmd->setLogicalId($_logicalId);
            $Cmd->setEqLogic_id($this->getId());
            $Cmd->setName($Name);
            $Cmd->setUnite('');
            $Cmd->setType($Type);
            $Cmd->setIsVisible(1);
            $Cmd->setIsHistorized(0);
            $Cmd->setSubType($SubType);
            $Cmd->setDisplay('generic_type','');
            if ($Name !="ETAT"){
                $cmd->setValue ("ETAT");
            }
            $Cmd->save();

        }
        return $Cmd;
    }

Hello

Je me répondre et donner la solution et surtout remercier @Mips pour son aide

Je lance la création des commandes

public static function addcommande() {
$infoCmd = $Tile->AddCommandTiles('Etat', $Commande['ep_id'], 'info', 'binary', '', $Commande['ui']['unit'], 'LIGHT_STATE', 0,'',$Commande['ep_id'],'light');

$Tile->AddCommandTiles('On', 'PB_On', 'action', 'other', '', $Commande['ui']['unit'], 'LIGHT_ON', 1, $infoCmd,$Commande['ep_id'],'light');

$Tile->AddCommandTiles('Off', 'PB_Off', 'action', 'other', '', $Commande['ui']['unit'], 'LIGHT_OFF', 1, $infoCmd,$Commande['ep_id'],'light');

}

Après pour la création des commandes,

public function AddCommandTiles($Name, $_logicalId, $Type="info", $SubType='binary', $Template='default', $unite=null, $generic_type=null, $IsVisible=1, $linkedInfoCmd=null,$linkedlogicalId='NO_LINK',$Templatecore='default') {
log::add(__CLASS__, 'debug', '│ Type : ' .$Type .' -- LogicalID : '.$_logicalId.' -- Type de générique : '.$generic_type);

$Commande= $this->getCmd($Type, $_logicalId);
		if (!is_object($Commande)){
			$Commande = new cmd();
			$Commande->setLogicalId($_logicalId);
			$Commande->setEqLogic_id($this->getId());
			$Commande->setName($Name);

			$Commande->setType($Type);
			$Commande->setSubType($SubType);
			$Commande->setGeneric_type($generic_type);

			$Commande->setIsVisible($IsVisible);
			$Commande->setIsHistorized(0);

			$Commande->setUnite($unite);

			if ($Templatecore !='default') {
				$Commande->setTemplate('dashboard','core::'.$Templatecore);
				$Commande->setTemplate('mobile','core::'.$Templatecore);
			}

			if ($linkedlogicalId >= 0 && $Type=="action" ) {
				$Commande->setconfiguration('logicalId',$linkedlogicalId);
			}

			if (is_object($linkedInfoCmd) && $Type=='action') {
				$Commande->setValue($linkedInfoCmd->getId());
			}
			$Commande->save();
		}
		return $Commande;
	}

Si cela peut aider d’autres personnes

Juste pour info,

Cette partie:

if ($linkedlogicalId >= 0 && $Type=="action" ) {
	$Commande->setconfiguration('logicalId',$linkedlogicalId);
}

n’est pas techniquement obligatoire pour lier des commandes et le core ne l’utilisera pas, le plugin virtuel le fait mais juste pour une histoire de display dans la config de mémoire

Mais il y en a p-e également une utilité dans ce plugin pour autre chose, je n’ai pas vu tout le code du plugin :wink:

Oui il y a une utilité derriere pour passer la commande on et off j’ai obligatoirement besoin du logicalID à la Freebox

Je reviendrais peut être vers toi pour d’autres evolutions
mais pour ce soir se sera bon

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.