Avant toute chose merci de (re)prendre connaissance de la charte et de la respecter.
Pour résumer :
- Avant de poser une question, je cherche si la réponse existe
- Je suis poli, courtois et je respecte tout un chacun sur le forum
- Si un post m'agace : je m'en éloigne plutôt que de répondre d'une façon qui pourrait être mal interprétée


Il n'est jamais du luxe que de rappeler des choses simples :
Courtoisie, amabilité, politesse et bonne humeur sont les maîtres mots pour un forum sympathique, bienveillant et accueillant :)

Le groupe des Helpers est present pour vous aidez, n'hésitez pas à poser des questions ;)

Toute la communauté vous remercie

/!\ L’ancien forum passera en lecture seule en janvier 2020 (Si community a bien pris le relais) puis nous le fermerons définitivement en janvier 2021./!\
Merci de vous rendre sur https://community.jeedom.com maintenant pour vos prochains postes ;)

[tuto] bloc code PHP scénario (petite commande simple)

Réservé à la création de scénarios dans JEEDOM
chryss
Timide
Messages : 17
Inscription : 28 déc. 2017, 11:17

Re: [tuto] bloc code PHP scénario (petite commande simple)

Message par chryss » 30 déc. 2017, 12:13

Personne pour m'aider :-(

Je sais faire ça

Code : Tout sélectionner

$Variable_J = "Condition_semaine";
$cmd = cmd::byString("#[Domicile][Météo][Condition semaine]#");
$value1 = $cmd->execCmd();
$scenario->setData($Variable_J, $value1);
Faire ça

Code : Tout sélectionner

$Variable_h = "Test";
$value2 = "Cöte d'Ivoire de la forêt d'une";
$value2 = iconv('UTF-8', 'ISO-8859-1', $value2);
$scenario->setData($Variable_h, $value2);
Alors pourquoi ça ca marche pas ça ... Grrrrr.

Code : Tout sélectionner

$Variable_J = "Condition_semaine";
$cmd = cmd::byString("#[Domicile][Météo][Condition semaine]#");
$value1 = $cmd->execCmd();
$value2 = iconv('UTF-8', 'ISO-8859-1', $value1);
$scenario->setData($Variable_J, $value2);
Pitié ..

winhex
Actif
Messages : 3743
Inscription : 23 janv. 2015, 01:41

Re: [tuto] bloc code PHP scénario (petite commande simple)

Message par winhex » 30 déc. 2017, 18:34

Code : Tout sélectionner

$Variable_h = "Test";
// $value = "Côte d’Ivoire";
$cmd = cmd::byString("#[Météo][Météo1][Condition +2]#");
$value1 = $cmd->execCmd();

// $value2 = iconv('UTF-8', 'ASCII//TRANSLIT', $value);
$value2 = mb_convert_encoding($value1, 'UTF-8', 'ISO-8859-1');


$scenario->setData($Variable_h, $value2);
ou en testeur d'expression

Code : Tout sélectionner

mb_convert_encoding(Côte d’Ivoire, 'UTF-8', 'ISO-8859-1')
//

Code : Tout sélectionner

mb_convert_encoding(#[Météo][Météo1][Condition +2]#, 'UTF-8', 'ISO-8859-1')
Résultat
Je vais évaluer : "Légères pluies"
Résultat : Légères pluies
j'ai eu pitié mais ça ne fait pas de moi un pro j'ai cherché
trouvé
et ensuite
http://php.net/manual/fr/function.mb-co ... coding.php

chryss
Timide
Messages : 17
Inscription : 28 déc. 2017, 11:17

Re: [tuto] bloc code PHP scénario (petite commande simple)

Message par chryss » 30 déc. 2017, 23:51

Merci pour ton aide, mais j'ai testé avec

Code : Tout sélectionner

$Variable_J = "Condition_semaine";
$cmd = cmd::byString("#[Domicile][Météo][Condition semaine]#");
$value1 = $cmd->execCmd();
//$value2 = iconv('UTF-8', 'ISO-8859-1', $value1);
$value1 = mb_convert_encoding($value1, 'UTF-8', 'ISO-8859-1')
$scenario->setData($Variable_J, $value1);
Et j'ai comme résultat :
------------------------------------
[2017-12-30 23:44:10][SCENARIO] Start : 'Scenario lance manuellement'.
[2017-12-30 23:44:10][SCENARIO] Exécution du sous-élément de type [action] : code
[2017-12-30 23:44:10][SCENARIO] Exécution d'un bloc code
[2017-12-30 23:44:10][SCENARIO] syntax error, unexpected '$scenario' (T_VARIABLE)
[2017-12-30 23:44:10][SCENARIO] Exécution du sous-élément de type [action] : action
[2017-12-30 23:44:10][SCENARIO] Exécution d'un bloc élément : 91
[2017-12-30 23:44:10][SCENARIO] Fin correcte du scénario

mb_convert fonctionne aussi bien que iconv mais j'arrive au même résultat :-(

Avatar de l’utilisateur
tomdom
Actif
Messages : 921
Inscription : 14 nov. 2016, 05:46

Re: [tuto] bloc code PHP scénario (petite commande simple)

Message par tomdom » 31 déc. 2017, 00:04

Bonjour,

Il te manque un ; à l'avant dernière ligne.
Il y a 10 catégories de personnes, celles qui connaissent le binaire et les autres
.

Avatar de l’utilisateur
HerveL
Timide
Messages : 478
Inscription : 11 sept. 2015, 22:46
Localisation : Nantes

Re: [tuto] bloc code PHP scénario (petite commande simple)

Message par HerveL » 31 déc. 2017, 00:39

Salut,

J'ai trouvé en début de ce fil comment récupérer la valeur d'une variable dans le cadre d'un scénario :
récupérer la valeur d'une variable

Code : Tout sélectionner

$Variable_J = "#nom#";
$tabJ = $scenario->getData($Variable_J);
Ma question est comment adapter ce code pour pourvoir l'utiliser dans le plugin script ?

J'ai tenté

Code : Tout sélectionner

$variable='test';
$cmd = cmd::byString($variable);
$value=$cmd->execCmd();
echo $value;
Mais il me hurle
PHP Fatal error: Uncaught exception 'Exception' with message 'La commande n'a pas pu être trouvée : test => test'

J'ai essayé avec
$variable='#test#';
$variable="#test#";

et c'est la même chose ...
Quelqu'un aurait une idée svp ?

Donc ce n'est pas correct
Hervé
Utilisateur Mini+ et SMART passionné
Zwave, IPX800V3, IPX800V4, Rfxcom, RFP1000

Avatar de l’utilisateur
tomdom
Actif
Messages : 921
Inscription : 14 nov. 2016, 05:46

Re: [tuto] bloc code PHP scénario (petite commande simple)

Message par tomdom » 31 déc. 2017, 06:58

Bonjour,

Comme ça (normalement) :

Code : Tout sélectionner

$variable=dataStore::byTypeLinkIdKey('scenario',-1,'test');
echo $variable->getKey()."=".$variable->getValue();
Il y a 10 catégories de personnes, celles qui connaissent le binaire et les autres
.

Avatar de l’utilisateur
HerveL
Timide
Messages : 478
Inscription : 11 sept. 2015, 22:46
Localisation : Nantes

Re: [tuto] bloc code PHP scénario (petite commande simple)

Message par HerveL » 31 déc. 2017, 11:16

tomdom a écrit :
31 déc. 2017, 06:58
Comme ça (normalement) :

Code : Tout sélectionner

$variable=dataStore::byTypeLinkIdKey('scenario',-1,'test');
echo $variable->getKey()."=".$variable->getValue();
Salut tomdom,
Merci encore une fois tu me débloques une situation. J'avais passé de longues heures de recherches et de tests :D

J'ai 2 questions ;

- est-il possible de récupérer par une commande dans un script php le nom de l'équipement a partir duquel s'exécute la commande du script ? équipement au sens [objet][equipement][commande].
L'idée est de pouvoir créer des scripts et des commandes plus génériques dans le cas de duplication d'équipements. Certes, on peut parser des paramètres à chaque commande, mais cela oblige à modifier chaque commande du script. Or si par exemple l'équipement est "personnalisé" par 1 information unique, on peut la faire afficher dans la première commande du script, et l'utiliser ensuite pour toutes les autres automatiquement.

- existe-t-il une base de connaissance ou la syntaxe des commandes propres à Jeedom soit expliquée ?
Je veux dire en dehors du php générique, de ce que l'on trouve dans la doc des scénarios et de ce fil ou les commandes sont très typées scripts scénarios ?
Hervé
Utilisateur Mini+ et SMART passionné
Zwave, IPX800V3, IPX800V4, Rfxcom, RFP1000

Avatar de l’utilisateur
tomdom
Actif
Messages : 921
Inscription : 14 nov. 2016, 05:46

Re: [tuto] bloc code PHP scénario (petite commande simple)

Message par tomdom » 31 déc. 2017, 11:42

Bonjour,

Pour ta seconde question, ma documentation est le code source de Jeedom ( /var/www/html/core/class entre autre).
Pour la 1ère question, tu voudrais récupérer dans un script le nom de l'appelant/déclencheur ?
Il y a 10 catégories de personnes, celles qui connaissent le binaire et les autres
.

Avatar de l’utilisateur
HerveL
Timide
Messages : 478
Inscription : 11 sept. 2015, 22:46
Localisation : Nantes

Re: [tuto] bloc code PHP scénario (petite commande simple)

Message par HerveL » 31 déc. 2017, 12:20

Imaginons que tu as un script dont le nom est Multiroom1, c'est ce nom que je souhaites récupérer.
Sachant que la commande script qui doit me donner cette réponse est lancée à partir du script en question.
Pour pourvoir ensuite utiliser comme paramètre des commandes suivantes par exemple [Audio][Multiroom1][AdresseIP]. (sans avoir à te taper la modification de toutes les commandes)

La même question peut être également intéressante pour un virtuel (une commande du virtuel qui permet d'obtenir son propre nom)

L'idée derrière tout ca est de pouvoir rendre génériques mes périphériques multiples et obtenir un fonctionnement similaire à un plugin qui te permet de créer autant d'équipements clones que tu veux, sans pour autant avoir la complexité de développement d'un plugin, qui me parait trop complexe à aborder au vu du peu de documentation disponible.
Hervé
Utilisateur Mini+ et SMART passionné
Zwave, IPX800V3, IPX800V4, Rfxcom, RFP1000

Avatar de l’utilisateur
tomdom
Actif
Messages : 921
Inscription : 14 nov. 2016, 05:46

Re: [tuto] bloc code PHP scénario (petite commande simple)

Message par tomdom » 31 déc. 2017, 12:40

Le nom du script est contenu dans $argv[0] . Donc tu peux faire une commande qui te retourne

Code : Tout sélectionner

basename ($argv[0],".php");
Tu auras le nom de ton script sans le chemin et sans l'extension '.php' (si j'ai bien compris ton besoin)
Il y a 10 catégories de personnes, celles qui connaissent le binaire et les autres
.

Avatar de l’utilisateur
HerveL
Timide
Messages : 478
Inscription : 11 sept. 2015, 22:46
Localisation : Nantes

Re: [tuto] bloc code PHP scénario (petite commande simple)

Message par HerveL » 31 déc. 2017, 13:55

Ben pas vraiment,
Le nom du script php n'étant pas lié à l'équipement de type script qui l'exécute.
Pour reprendre mon exemple, tu peux avoir un "equipement" de type script ( dans le plugin script) qui s'appelle [Multiroom1], qui exécutera dans une de de ses commandes un script "/var/www/html/plugins/script/core/ressources/microtest.php"
Or $argv[0] me retournera dans ce cas microtest et pas [Multiroom1]
Hervé
Utilisateur Mini+ et SMART passionné
Zwave, IPX800V3, IPX800V4, Rfxcom, RFP1000

chryss
Timide
Messages : 17
Inscription : 28 déc. 2017, 11:17

Re: [tuto] bloc code PHP scénario (petite commande simple)

Message par chryss » 31 déc. 2017, 14:06

Merci TomDom pour ta correction.
J'avais l'erreur "Call to undefined function mb_convert_encoding()"

J'ai donc creusé un peu plus et j'ai trouvé.

Code : Tout sélectionner

$Variable_J = "Condition_semaine";
$cmd = cmd::byString("#[Domicile][Météo][Condition semaine]#");
$value1 = $cmd->execCmd();
$value1 = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $value1);
$scenario->setData($Variable_J, $value1);
Ca marche nickel

Maintenant je coince car je souhaite envoyé ce texte dans un url et j'ai un petit problème de "".
En effet l'url doit contenir le texte entre "".

Code : Tout sélectionner

$html = file_get_contents("http://ip/control?cmd=meteo2.txt=$value1");
Et malheureusement même en faisant comme ca, ca ne marche pas.

Code : Tout sélectionner

$html = file_get_contents("http://ip/control?cmd=meteo2.txt="$value1"");

chryss
Timide
Messages : 17
Inscription : 28 déc. 2017, 11:17

Re: [tuto] bloc code PHP scénario (petite commande simple)

Message par chryss » 31 déc. 2017, 14:36

Bon je me réponds à moi même, j'ai trouvé.

Code : Tout sélectionner

$html = file_get_contents("http://ip/control?cmd=meteo2.txt=%22$value1%22");
Ce qui donne au complet si ça peut servir

Code : Tout sélectionner

$Variable_J = "Condition_semaine";
$cmd = cmd::byString("#[Domicile][Météo][Condition semaine]#");
$value1 = $cmd->execCmd();
$value1 = urlencode(iconv("UTF-8", "ISO-8859-1//TRANSLIT", $value1));
$scenario->setData($Variable_J, $value1); //pour voir ce qui est encodé sans les % car Jeedom les interprète 
$html = file_get_contents("http://ip/control?cmd=meteo2.txt=%22$value1%22");
Me reste la récupération de la date en Français, genre Dimanche 31 Décembre 2017, quelqu'un a une idée ?
J'ai essayé :

Code : Tout sélectionner

$Variable_i = "Jour";
setlocale(LC_TIME, 'fr_FR');
$value = date('l d F');
$scenario->setData($Variable_i, $value);
Mais ca reste en anglais :-(

Avatar de l’utilisateur
tomdom
Actif
Messages : 921
Inscription : 14 nov. 2016, 05:46

Re: [tuto] bloc code PHP scénario (petite commande simple)

Message par tomdom » 31 déc. 2017, 15:16

Bonjour,
chryss a écrit :
31 déc. 2017, 14:36

Me reste la récupération de la date en Français, genre Dimanche 31 Décembre 2017, quelqu'un a une idée ?
Essaie :

Code : Tout sélectionner

$old=setlocale(LC_TIME,0);
setlocale(LC_TIME, 'fr_FR');
$valeur=strftime('%A %e %B');
setlocale(LC_TIME,$old);
ou

Code : Tout sélectionner

$old=setlocale(LC_TIME,0);
setlocale(LC_TIME, 'fr_FR.UTF8');
$valeur=strftime('%A %e %B');
setlocale(LC_TIME,$old);
Il y a 10 catégories de personnes, celles qui connaissent le binaire et les autres
.

chryss
Timide
Messages : 17
Inscription : 28 déc. 2017, 11:17

Re: [tuto] bloc code PHP scénario (petite commande simple)

Message par chryss » 01 janv. 2018, 16:40

Merci infiniment Tomdom

J'ai donc mis en pratique et impec

Code : Tout sélectionner

//jour
setlocale(LC_TIME, 'fr_FR.UTF8');
$date = strftime('%A %e %B');
$date = urlencode(iconv("UTF-8", "ISO-8859-1//TRANSLIT", $date));
$html = file_get_contents("http://ip/control?cmd=jour.txt=%22$date%22");
Merci encore

Avatar de l’utilisateur
Jeandhom
Actif
Messages : 1351
Inscription : 20 oct. 2015, 17:32

Re: [tuto] bloc code PHP scénario (petite commande simple)

Message par Jeandhom » 07 janv. 2018, 11:27

Récupérer des valeurs d'un équipement : exemple avec un module extérieur d'une station Netatmo.

Code : Tout sélectionner

$firmmodext = eqLogic::byId(32)->getConfiguration('firmware');
$scenario->setLog("Firmware module extérieur : $firmmodext");
$batmodext = eqLogic::byId(32)->getConfiguration('batteryStatus');
$scenario->setLog("Batterie module extérieur : $batmodext");
$recepresmodext = eqLogic::byId(32)->getConfiguration('rf_status');
$scenario->setLog("Réception réseaux module extérieur : $recepresmodext");
Pièces jointes
Netatmo Module extérieur.png
Netatmo Module extérieur.png (113.71 Kio) Consulté 1430 fois

winhex
Actif
Messages : 3743
Inscription : 23 janv. 2015, 01:41

Re: [tuto] bloc code PHP scénario (petite commande simple)

Message par winhex » 07 janv. 2018, 20:33

merci pour le partage
je mettrai à jour la 1er page
cette possibilité peux intéressé du monde

Avatar de l’utilisateur
Jeandhom
Actif
Messages : 1351
Inscription : 20 oct. 2015, 17:32

Re: [tuto] bloc code PHP scénario (petite commande simple)

Message par Jeandhom » 07 janv. 2018, 21:44

De rien, j'ai galéré plusieurs mois pour trouver cette solution, donc si d'autres peuvent en profiter, tant mieux...

viewtopic.php?f=168&t=174&start=580#p568721

TIKETAC
Timide
Messages : 202
Inscription : 26 août 2015, 17:07

Re: [tuto] bloc code PHP scénario (petite commande simple)

Message par TIKETAC » 12 févr. 2018, 16:06

Bonjour,

Je n'arrive pas à faire fonctionner ce qui est indiqué en 1 ere page :

Code : Tout sélectionner

$scenario->setData("test_php", scenario::byString("#[test expression]#)->getIsVisible());
Le nom du scénario est bien [test expression] ?

Cette commande sert bien à stocker dans la variable test_php l'etat visible du scénario [test expression] ?

Avatar de l’utilisateur
Jeandhom
Actif
Messages : 1351
Inscription : 20 oct. 2015, 17:32

Re: [tuto] bloc code PHP scénario (petite commande simple)

Message par Jeandhom » 26 avr. 2018, 20:49

dric a écrit :
26 août 2016, 20:04
J'ai enfin trouvé comment récupérer la dernière valeur d'une commande "hier", voilà le code pour exemple :

Code : Tout sélectionner

$cmdId = cmd::byString("#[Z][X][value]#")->getId();
$debut = date("Y-m-d H:i:s", strtotime("Yesterday"));
$fin = date("Y-m-d H:i:s", strtotime("Today"));  

$all = history::all($cmdId, $debut, $fin);
$value = count($all) ? $all[count($all) - 1]->getValue() : null;
Merci pour cette "petite commande simple".
Je cherchais à connaitre la dernière et l'avant dernière valeur pour savoir si j'étais en front montant ou en front descendant.
Je me suis largement inspiré de ton exemple.
Il y a, peut-être, plus simple.

Code : Tout sélectionner

$cmdId = cmd::byString("#[Z][X][value]#")->getId();
$debut = date("Y-m-d H:i:s", strtotime("Yesterday"));
$fin = date("Y-m-d H:i:s", strtotime("now"));  

$all = history::all($cmdId, $debut, $fin);
$dervalue = count($all) ? $all[count($all) - 1]->getValue() : null;
$avdervalue = count($all) >=2 ? $all[count($all) - 2]->getValue() : null;
EDIT
Suite au conseil de tomdom :

Remplacement de

Code : Tout sélectionner

$avdervalue = count($all) ? $all[count($all) - 2]->getValue() : null;
Par

Code : Tout sélectionner

$avdervalue = count($all) >=2 ? $all[count($all) - 2]->getValue() : null;
Dernière édition par Jeandhom le 27 avr. 2018, 09:12, édité 1 fois.

Répondre

Revenir vers « Scénarios »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 2 invités