Bonjour,
Je cherche un moyen simple de créer des commandes en masse sur le plugin Virtuel de plusieurs capteurs virtuels.
Exemple :
Ajouter une commande action de type slider sur l’ensemble des virtuels créés.
Est-ce possible de le faire via bloc code ? Si oui, avez vous un exemple de code ?
Merci,
Informations Jeedom
Core : 4.4.19 (master)
DNS Jeedom : oui
Plugin : Virtuel
Version : 2024-12-25 01:18:55 (stable)
Bonjour,
oui c’est possible. Quel serait le nom de la commande que vous souhaitez ajouter ?
Le principe serait de vérifier l’existence de la commande et si elle n’existe pas, la créer. C’est pourquoi le nom doit être défini.
La commande action doit-elle être liée à une commande info ?
Quelle est la plage du slider ? Quelle unité ? (ça peut être repris de la commande info liée)
Est-ce qu’il faut définir un pas pour le slider ?
Avec ces infos, je peux vous proposer un script pour faire ça.
A+
Michel
1 « J'aime »
Bonjour,
Merci pour ton retour.
La commande info n’existe pas, mais je souhaiterais qu’elle soit liée et créée en même temps que la commande slider.
Exemple :
Nom commande: test
Nom retour info: etatTest
Type: slider
Pas:0.01
Echelle: 0-1000 Litres
Le retour d’info aura donc les memes echelles
D’avance merci !
Un pas de 0,01 sur une échelle de 0 a 1000 n’est absolument pas réaliste…
Bon là je suis sur le téléphone et ne peux que te montrer comment créer la commande action.
Voilà un script exemple avec création de la commande info si elle n’existe pas et idem pour la commande action qui est liée à la commande info corespondante.
Pour identifier les commandes, le logicalId est utilisé, juste pour info.
$nameInfo = 'etatTest';
$nameAction = 'test';
$min = 0;
$max = 1000;
$unite = 'Litres';
$step = 1;
foreach (eqLogic::byType('virtual') as $eqVirtual) { // boucle sur les équipements
$eq_name = $eqVirtual->getHumanName();
if (strpos($eq_name, 'testMax') !== false) {
$scenario->setLog('test : ' . $eq_name);
$cmdInfoTest = $eqVirtual->getCmd('info', $nameInfo);
if (!is_object($cmdInfoTest)) {
$scenario->setLog('test2 : '.$eq_name);
$cmdInfo = (new virtualCmd)
->setEqLogic_id($eqVirtual->getId())
->setName($nameInfo)
->setType('info')
->setSubType('numeric')
->setConfiguration('minValue', $min)
->setConfiguration('maxValue', $max)
->setUnite($unite);
// ->setConfiguration('historizeRound', 1); // Sauvegarde des valeurs avec une résolution de 0.1. ATTENTION au ';' en fin de ligne si cette ligne est décommentée
$scenario->setLog('test3 : ' . $eq_name);
$cmdInfo->save();
}
$scenario->setLog('test1 : ' . $eq_name);
$cmdInfo = $eqVirtual->getCmd('info', $nameInfo);
$scenario->setLog('** TEST ** ' . $eq_name . ' Nom et ID de la commande info : ' . $cmdInfo->getName() . ' - ' . $cmdInfo->getId());
$cmdActionTest = $eqVirtual->getCmd('action', $nameAction);
if (!is_object($cmdActionTest)) {
$cmdAction = (new virtualCmd)
->setEqLogic_id($eqVirtual->getId())
->setName($nameAction)
->setType('action')
->setSubType('slider')
->setConfiguration('minValue', $min)
->setConfiguration('maxValue', $max)
->setUnite($unite);
$cmdAction->setValue($cmdInfo->getId());
$cmdAction->setDisplay('parameters', ['step' => $step]);
$cmdAction->save();
}
}
}
Je regarderai demain sur le PC pour faire la commande info à lier.
Merci pour ton retour je tente debut d’après midi.
Je ne vois pas le paramètre du Pas sur ton code, est-ce normal ?
Merci !
Attention, ce que @Michel_F t’a envoyé c’est pour exemple (très bon au demeurant) mais là tu vas créer une commande info pour tous tes virtuels. Est ce que tu as d’autres virtuels qui ne seront pas concernés par l’ajout de cette commande? Si oui alors tu dois tester si le virtuel est concerné ou pas
1 « J'aime »
Je viens de le rajouter mais…
EDIT: script de mon premier post mis à jour avec tout ce qu’il vous faut.
Ce n’est pas testé, mais le principe est là.
Merci d’avance je teste ça cette après midi et reviens vers toi. Je ferai un essai en conditionnant des virtuels de test 
Merci !
J’ai testé ton code, pas de problème coté info.
Coté curseur, la commande ne se crée pas et bloc à ce niveau :
J’ai cette erreur lorsque je supprime ces lignes :
Le nom de la commande ne peut être vide
Lorsque je laisse ces lignes j’ai cette erreur :
Call to a member function getId() on bool
Merci pour ton retour.
J’ai tenté une modification, dis-moi ce que ça donne comme ça STP.
Si tu fais des adaptations, il faudrait les poster pour que je sache exactement de quoi l’erreur peut venir.
J’espère que ça te va si je modifie le post original, c’est pour éviter de mettre du code partout, pour un lecteur futur, c’est plus simple de n’avoir qu’une réponse à consulter j’imagine.
1 « J'aime »
Ça me va de cette façon 
Je ne fais aucune adaptation je tente le code que tu me donnes en copier/coller directement sans modification.
J’ai toujours une erreur :
Call to a member function getId() on bool
Merci
Tu veux bien poster le log complet entre balise de </>
texte préformaté STP ?
Est-ce que la commande info est créée ?
Tu peux me montrer les paramètres de cette commande info STP ?
Ca doit ressembler à ceci :
> ----------------------------------- [2025-02-28 14:20:46][SCENARIO] **-- Début :** Scenario lance manuellement. [2025-02-28 14:20:46][SCENARIO] - Exécution du sous-élément de type [action] : action [2025-02-28 14:20:46][SCENARIO] Exécution d'un bloc élément : 1853 [2025-02-28 14:20:46][SCENARIO] - Exécution du sous-élément de type [action] : code [2025-02-28 14:20:46][SCENARIO] Exécution d'un bloc code [2025-02-28 14:20:46][SCENARIO] test : [Aucun][testMax1] [2025-02-28 14:20:46][SCENARIO] test2 : [Aucun][testMax1] [2025-02-28 14:20:46][SCENARIO] test3 : [Aucun][testMax1] [2025-02-28 14:20:46][SCENARIO] test1 : [Aucun][testMax1] [2025-02-28 14:20:46][SCENARIO] Call to a member function getId() on bool [2025-02-28 14:20:46][SCENARIO] Fin correcte du scénario
Le bloc code au complet:
> $nameInfo = 'etatTest';
> $nameAction = 'test';
> $min = 0;
> $max = 1000;
> $unite = 'Litres';
> $step = 1;
>
> foreach (eqLogic::byType('virtual') as $eqVirtual) { // boucle sur les équipements
> $eq_name = $eqVirtual->getHumanName();
> if (strpos($eq_name, 'testMax') !== false) {
> $scenario->setLog('test : '.$eq_name);
>
> $nameInfo = 'etatTest';
> $nameAction = 'test';
> $min = 0;
> $max = 1000;
> $unite = 'Litres';
> $step = 0.01;
>
>
> $cmdInfoTest = $eqVirtual->getCmd('info', $nameInfo);
> if (!is_object($cmdInfoTest)) {
> $scenario->setLog('test2 : '.$eq_name);
> $cmdInfo = (new virtualCmd)
> ->setEqLogic_id($eqVirtual->getId())
> ->setName($nameInfo)
> ->setType('info')
> ->setSubType('numeric')
> ->setConfiguration('minValue', $min)
> ->setConfiguration('maxValue', $max)
> ->setUnite($unite);
> // ->setConfiguration('historizeRound', 1); // Sauvegarde des valeurs avec une résolution de 0.1. ATTENTION au ';' en fin de ligne si cette ligne est décommentée
> $scenario->setLog('test3 : '.$eq_name);
> $cmdInfo->save();
> }
> $scenario->setLog('test1 : '.$eq_name);
>
>
>
>
>
>
>
>
> $cmdInfo = $eqVirtual->getCmd('info', $nameInfo);
>
> $cmdActionTest = $eqVirtual->getCmd('action', $nameAction);
> if (!is_object($cmdActionTest)) {
> $cmdAction = (new virtualCmd)
> ->setEqLogic_id($eqVirtual->getId())
> ->setName($nameAction)
> ->setType('action')
> ->setSubType('slider')
> ->setConfiguration('minValue', $min)
> ->setConfiguration('maxValue', $max)
> ->setUnite($unite);
> $cmdAction->setValue($cmdInfo->getId());
> $cmdAction->setDisplay('parameters', ['step' => $step]);
> $cmdAction->save();
> }
>
>
>
>
>
>
>
>
>
> }
> }
Pour l’info:
C’est ça qu’il faut utiliser pour le code et les log :

Sans quoi c’est inutilisable pour moi.
Desolé je suis au boulot, sur Iphone c’est très compliqué, voici les infos en texte preformaté
Code:
$nameInfo = 'etatTest';
$nameAction = 'test';
$min = 0;
$max = 1000;
$unite = 'Litres';
$step = 1;
foreach (eqLogic::byType('virtual') as $eqVirtual) { // boucle sur les équipements
$eq_name = $eqVirtual->getHumanName();
if (strpos($eq_name, 'testMax') !== false) {
$scenario->setLog('test : '.$eq_name);
$nameInfo = 'etatTest';
$nameAction = 'test';
$min = 0;
$max = 1000;
$unite = 'Litres';
$step = 0.01;
$cmdInfoTest = $eqVirtual->getCmd('info', $nameInfo);
if (!is_object($cmdInfoTest)) {
$scenario->setLog('test2 : '.$eq_name);
$cmdInfo = (new virtualCmd)
->setEqLogic_id($eqVirtual->getId())
->setName($nameInfo)
->setType('info')
->setSubType('numeric')
->setConfiguration('minValue', $min)
->setConfiguration('maxValue', $max)
->setUnite($unite);
// ->setConfiguration('historizeRound', 1); // Sauvegarde des valeurs avec une résolution de 0.1. ATTENTION au ';' en fin de ligne si cette ligne est décommentée
$scenario->setLog('test3 : '.$eq_name);
$cmdInfo->save();
}
$scenario->setLog('test1 : '.$eq_name);
$cmdInfo = $eqVirtual->getCmd('info', $nameInfo);
$cmdActionTest = $eqVirtual->getCmd('action', $nameAction);
if (!is_object($cmdActionTest)) {
$cmdAction = (new virtualCmd)
->setEqLogic_id($eqVirtual->getId())
->setName($nameAction)
->setType('action')
->setSubType('slider')
->setConfiguration('minValue', $min)
->setConfiguration('maxValue', $max)
->setUnite($unite);
$cmdAction->setValue($cmdInfo->getId());
$cmdAction->setDisplay('parameters', ['step' => $step]);
$cmdAction->save();
}
}
}
Log:
[2025-02-28 14:20:46][SCENARIO] -- Début : Scenario lance manuellement.
[2025-02-28 14:20:46][SCENARIO] - Exécution du sous-élément de type [action] : action
[2025-02-28 14:20:46][SCENARIO] Exécution d'un bloc élément : 1853
[2025-02-28 14:20:46][SCENARIO] - Exécution du sous-élément de type [action] : code
[2025-02-28 14:20:46][SCENARIO] Exécution d'un bloc code
[2025-02-28 14:20:46][SCENARIO] test : [Aucun][testMax1]
[2025-02-28 14:20:46][SCENARIO] test2 : [Aucun][testMax1]
[2025-02-28 14:20:46][SCENARIO] test3 : [Aucun][testMax1]
[2025-02-28 14:20:46][SCENARIO] test1 : [Aucun][testMax1]
[2025-02-28 14:20:46][SCENARIO] Call to a member function getId() on bool
[2025-02-28 14:20:46][SCENARIO] Fin correcte du scénario
Merci
1 « J'aime »
Merci pour la mise en forme, c’est bien plus pratique pour moi.
J’ai mis à jour le script complet avec une ligne de log qui m’intéresse si tu veux bien tester etme dire ce que retourne les log (avec la même mise en forme STP)
Merci,
Voilà le résultat, on ne voit pas le log « * TEST * » je suppose qu’il y a un kwak avec cette ligne:
$cmdInfo = $eqVirtual->getCmd('info', $nameInfo);
resultat complet:
[2025-02-28 17:35:36][SCENARIO] -- Début : Scenario lance manuellement.
[2025-02-28 17:35:36][SCENARIO] - Exécution du sous-élément de type [action] : action
[2025-02-28 17:35:36][SCENARIO] Exécution d'un bloc élément : 1853
[2025-02-28 17:35:36][SCENARIO] - Exécution du sous-élément de type [action] : code
[2025-02-28 17:35:36][SCENARIO] Exécution d'un bloc code
[2025-02-28 17:35:36][SCENARIO] test : [Aucun][testMax1]
[2025-02-28 17:35:36][SCENARIO] test2 : [Aucun][testMax1]
[2025-02-28 17:35:36][SCENARIO] test3 : [Aucun][testMax1]
[2025-02-28 17:35:36][SCENARIO] test1 : [Aucun][testMax1]
[2025-02-28 17:35:36][SCENARIO] Call to a member function getName() on bool
[2025-02-28 17:35:36][SCENARIO] Fin correcte du scénario
Hello,
Commente ou supprime la ligne
$scenario->setLog('** TEST ** ' . $eq_name . ' Nom et ID de la commande info : ' . $cmdInfo->getName() . ' - ' . $cmdInfo->getId());
J’ai exactement le même soucis, ça fonctionne chez toi ?
J’ai pas testé mais le code fourni par @Michel_F semble correct. Sauf cette ligne de log qu’il faut supprimer ou commenter.
Post le log quand même stp