Plugin permettant d’exécuter des scripts (shell, php, ruby…), des requêtes http, de récupérer des informations dans du XML ou JSON.
La configuration est très simple, après téléchargement du plugin, il vous suffit de l’activer et c’est tout.
La seule option est l’endroit où Jeedom met les scripts par défaut, il est conseillé de ne pas y toucher.
La configuration des équipements Script est accessible à partir du menu plugin/Programmation
Voilà à quoi ressemble la page du plugin Script (ici avec déjà un équipement) :
Vous retrouvez ici la liste de vos Scripts. Une fois que vous cliquez sur un équipement vous obtenez :
Vous retrouvez ici toute la configuration de votre équipement :
Vous retrouvez ici la liste des commandes :
Ce champ doit contenir la requête en elle-même, ou le chemin du script si le champ “type de script” est script. Le bouton “parcourir” : permet de sélectionner le fichier contenu dans le dossier interne à Jeedom.
> Ce dossier est accessible en SSH dans ``/var/www/html/plugins/script/data/``. Pour info, la commande SSH pour attribuer les droits ``www-data`` à un fichier est : ``sudo chown www-data:www-data NOMDUSCRIPT.EXTENSION``. A savoir que pour exécuter un script, celui-ci doit avoir les droits www-data.
Le bouton Nouveau : permet de créer un fichier de commande.
> Ne pas oublier de saisir le nom du fichier ainsi que son extension complète sous peine de voir votre superbe script ne pas fonctionner. Sans extension Jeedom ne saura pas reconnaître le langage associé à votre fichier. CF : Généralité
Important
Il faut éviter, autant que possible, dans le chemin du script ou dans les paramètres de celui-ci les caractères spéciaux. Les caractères autorisés étant : les chiffres, les lettres (majuscule ou minuscule)
Important
Vous pouvez dans le champs requete (pour http, json, xml) mettre du json, il faut juste le faire preceder de
json::
, exemplejson::{"clef":"valeur"}
Permet d’appeler une url ou de récupérer le retour d’une URL.
Permet de passer une page Web (fichier HTML) pour récupérer une valeur dessus. La syntaxe est la même que pour jQuery.
Le champ option possède un champ “URL du fichier HTML” : ce champ contient donc le lien vers la machine hébergeant le fichier HTML en question.
Permet de récupérer du XML et d’aller chercher spécifiquement une valeur dedans.
Le champ option possède un champ “URL du fichier XML” : ce champ contient donc le lien vers la machine hébergeant le fichier XML en question.
Important
Il n’est possible de récupérer que des valeurs, les attributs ne peuvent être récupérés.
Permet de récupérer du JSON et d’aller chercher spécifiquement une valeur dedans.
Le champ option possède un champ “URL du fichier JSON” : ce champ contient donc le lien vers la machine hébergeant le fichier JSON en question.
L’exemple est basé sur une Vera et consiste à piloter une ampoule dimmable. Je ne vais pas m’étendre sur la manière de piloter une Vera par requête http, le forum TLD est rempli de réponses. De plus, l’exemple correspond à mon type de matériel et devra être adapté au vôtre.
Tip
Une méthode pour ceux qui tâtonnent pour l’écriture de requêtes http, valider d’abord la syntaxe dans votre navigateur et seulement ensuite passer à la configuration sous Jeedom. Quand un script Action ne fonctionne pas, passer en script Info/Autre permet de voir l’erreur retournée.
Allons-y :
Explications :
http://<IP_VERA>:3480/data_request?id=lu_action&output_format=json&DeviceNum=12&serviceId=urn:upnp-org:serviceId:Dimming1&action=SetLoadLevelTarget&newLoadlevelTarget=100
Tip
le “100” à la fin de la requête correspond au pourcentage de puissance à affecter donc mettre “0” à la fin de la requête correspond à éteindre l’ampoule.
Le bouton “test” vous permet de tester votre commande !
Vous pouvez donc multiplier les commandes dans le même équipement en mettant par exemple une commande à 60 % pour une lumière tamisée, créer une troisième à 30 % pour les déplacements nocturnes à associer dans un scénario, …
Il est aussi possible de créer une commande de type slider en mettant le tag #slider#
dans la requête :
http://<IP_VERA>:3480/data_request?id=lu_action&output_format=json&DeviceNum=12&serviceId=urn:upnp-org:serviceId:Dimming1&action=SetLoadLevelTarget&newLoadlevelTarget=#slider#
Tip
Si votre commande est de type message vous pouvez utiliser les tags
#message#
et#title#
, idem pour une commande de type couleur avec le tag#color#
, ou de type slider avec#slider#
ou liste avec#select#
But : Envoyer une notification vers XBMC lors de l’ouverture d’une porte d’entrée.
http://IP_DE_XBMC:8080/jsonrpc?request={ %22jsonrpc%22:%222.0%22,%22method%22:%22GUI.ShowNotification%22,%22params%22:{ %22title%22:%22Mouvement%20Détecté%22,%22message%22:%22Porte%20Entrée%22},%22id%22:1}
A vous de tester ça dans un scénario par exemple !
API XBMC ici (seuls les champs notés “required” sont obligatoires)
But : Envoyer une notification vers XBMC lorsque la température tombe sous un certain seuil
Prenez l’exemple ci-dessus :
Mouvement%20Détecté
par Risque%20de%20gel
Porte%20Entrée
par Température%20extérieur%20:%20#[EXTERIEUR][EXTERIEUR][TEMPERATURE]#
Testez sur un scénario #[EXTERIEUR][EXTERIEUR][TEMPERATURE]# < 5
par exemple
Action : Lancez le script, via un équipement virtuel, lié à votre script !
Le plus sympa mais pas le plus simple à expliquer.
Prérequis : savoir développer un script en php, python, perl ou ruby.
IMPORTANT
L’extension de votre script doit absolument correspondre à son type. En effet Jeedom se base sur l’extension du script pour l’exécutable à lancer
Si le nom de votre fichier ne contient pas :
- .php .py .pl .rb
Le plugin script lancera un shell qui l’exécutera en se basant sur la directive de la 1ère ligne ( shebang ). Exemple :
#!/bin/csh -f
#!/bin/ksh
#!/usr/bin/env python3
#!/usr/bin/env php
#!/usr/bin/env node
etc ...
Le script de monitoring température du Raspberry va servir d’exemple pour l’utilisation du type de script : Script
Après avoir téléchargé le script, le bouton “Parcourir” vous permet de sélectionner le fichier temp_rasp.php.
Par curiosité, vous pouvez aller voir le contenu du fichier en appuyant sur le bouton “Editer”, vous devriez obtenir le code suivant :
Ceci est un script php qui peut tout à fait être réutilisé hors Jeedom !
<?php
$temp = shell_exec("cat /sys/class/thermal/thermal_zone0/temp");
$temp = $temp / 1000;
$temp = round($temp,1);
echo $temp;
?>
Note : concrètement, c’est la fonction php “echo” qui va donner la valeur à Jeedom
Récupérer les infos de Jeedom pour les exploiter dans un script. La récupération dépend du type de script utilisé :
/var/www/html/plugins/script/data/my_script.php my_value
, l’argument my_value
est une chaîne de caractères (fixe) récupérée dans le script php dans le tableau d’arguments $argv
voir https://www.php.net/manual/fr/reserved.variables.argv.php pour plus de détails.Dans la ligne : /var/www/html/plugins/script/data/radio.py VOL #slider#
, l’argument #slider#
est récupéré de cette façon $argv[2]
. Au moment de l’exécution du script par Jeedom, il remplacera automatiquement #slider#
par la valeur (numérique) du slider. cf Google pour plus de détails sur la récupération de paramètres en Python.
#[MAISON][CUISINE][Température]#
comme paramètre au script et Jeedom le remplacera par la valeur lue lors de l’envoi.Préconisation pour tester les paramètres dans le script php :
if (isset($argv)) {
foreach ($argv as $arg) {
$argList = explode('=', $arg);
if (isset($argList[0]) && isset($argList[1])) {
$_GET[$argList[0]] = $argList[1];
}
}
}
Voici le format du XML type :
<root>
<led0>1</led0>
<leds>
<led1>toto</led1>
</leds>
</root>
Si vous voulez la valeur de la led0 dans requête vous mettez led0. Si vous voulez la valeur de la led1 qui est le fils de leds vous mettez leds > led1.
Notez que l’élément racine <root> n’est pas à préciser dans le champ requête.
<root>
<led0>1</led0>
<leds>
<led1>toto</led1>
</leds>
<leds>
<led1>tata</led1>
</leds>
</root>
la syntaxe est :
leds > 1 > led1
qui donne en réponse tata, 1 étant le numéro de rang du tableau !
<AKT_Data ID="SMS-Liste" ZeitSt="01.05.2017 18:55">
<MesPar DH="HBCHa" StrNr="2167" Typ="02" Var="02">
<Name>Tresa - Ponte Tresa, Rocchetta</Name>
<Datum>01.05.2017</Datum>
<Zeit>18:50</Zeit>
<Wert>268.56</Wert>
<Wert dt="-24h">268.51</Wert>
<Wert Typ="delta24">0.051</Wert>
<Wert Typ="m24">268.52</Wert>
<Wert Typ="max24">268.56</Wert>
<Wert Typ="min24">268.50</Wert>
</MesPar>
<MesPar DH="HBCHa" StrNr="2265" Typ="03" Var="02">
<Name>Inn - Tarasp</Name>
<Datum>01.05.2017</Datum>
<Zeit>18:50</Zeit>
<Wert>4.85</Wert>
<Wert dt="-24h">7.98</Wert>
<Wert Typ="delta24">-3.130</Wert>
<Wert Typ="m24">6.15</Wert>
<Wert Typ="max24">7.98</Wert>
<Wert Typ="min24">4.85</Wert>
</MesPar>
<MesPar DH="HBCHa" StrNr="2270" Typ="02" Var="32">
<Name>Doubs - Combe des Sarrasins</Name>
<Datum>01.05.2017</Datum>
<Zeit>18:00</Zeit>
<Wert>500.65</Wert>
<Wert dt="-24h">500.65</Wert>
<Wert Typ="delta24">0.000</Wert>
<Wert Typ="m24">500.65</Wert>
<Wert Typ="max24">500.65</Wert>
<Wert Typ="min24">500.64</Wert>
</MesPar>
</AKT_Data>
Pour récupérer l’information du champ Wert du 1er bloc:
MesPar>0>Wert>0
qui retourne donc “268.56 “
Pour retourner l’élément suivant dans la “structure” Wert, il faut simplement indiquer le numéro d’ordre dans la structure. Ce qui donne pour l’élément <Wert Typ="delta24">0.051</Wert>
le code suivant :
MesPar>1>Wert>2
Pour passer au bloc “MesPar” suivant, il faut donc changer l’index en conséquence : le 1 par 2, par exemple.
ATTENTION : Si dans le fichier XML l’ordre change, la requête ne fonctionne plus. Il faudra réadapter la requête en fonction de l’ordre retourné.
A l’instar du type XML, il est possible de lire des informations issues d’un retour JSON.
Pour expliquer, je vais me baser sur les informations JSON avec l’application Sickbeard (bouh … cpasbien) mais ici seule la technique prime, pas l’outil!
L’accès à ce fichier est possible grâce à l’URL suivante :
http://<IP_DELAMACHINEQUIEBERGESICKBEARD>:8083/api/XXXX/?cmd=history&limit=3
NOTE : XXXX est le numéro de clef api propre à chaque SICKBEARD.
Tout d’abord, avant de se lancer dans la configuration du plugin script JSON, il s’agit d’identifier correctement les infos à récupérer., car ici nous allons intégrer une notion de tableau dans les retours.
Valider l’affichage des informations à partir de votre navigateur (test sous Chrome).
Exemple de retour :
{
"data": [
{
"date": "2014-09-10 01:37",
"episode": 4,
"provider": "RNT",
"quality": "SD TV",
"resource": "XXX",
"resource_path": "XXXX",
"season": 2,
"show_name": "Totovaalaplage S2E4",
"status": "Downloaded",
"tvdbid": XXXXX
},
{
"date": "2014-09-10 01:36",
"episode": 3,
"provider": "RNT",
"quality": "SD TV",
"resource": "XXXX",
"resource_path": "XXX",
"season": 2,
"show_name": "Totovaalaplage S2E3",
"status": "Downloaded",
"tvdbid": XXXXX
},
{
"date": "2014-09-10 01:21",
"episode": 1,
"provider": "Cpasbien",
"quality": "SD TV",
"resource": "XXXX",
"resource_path": "XXXX",
"season": 1,
ICI --> "show_name": "Totovaplusauski mais Totovaalaplage S1E1",
"status": "Snatched",
"tvdbid": XXXX
}
],
"message": "",
"result": "success"
}
Dans l’hypothèse où nous voudrions retourner le show_name du 3ème élément en php (repéré ICI) , il faudrait faire : data > 2 > show_name, l’index du tableau de retour commençant à Zéro.
Dans cet exemple, le bouton “Tester” nous retournera “Totovaplusauski mais Totovaalaplage S1E1”.
Précisions :
Notez la syntaxe de la commande Requête, elle est de type élément0 > index du tableau > élément1
Inconvénients :
Ici nous allons essayer de récupérer la dernière VDM.
Tout d’abord il faut configurer l’url :
http://www.viedemerde.fr
Ensuite il faut trouver le “chemin” de la dernière VDM. Pour ce faire, il faut aller sur le site puis faire clic droit sur l’élément voulu puis inspecter l’élément, on obtient :
Là c’est la partie la plus complexe et qui demande un peu d’analyse. Ici mon texte est dans une balise “a” qui est lui dans un élément de type p qui est une div de class “post article”. Il faut donc que je sélectionne le premier élément div de class “post” et “article” puis le premier élément p et que je récupère tout ce qui est dans les balises “a” qu’il contient. J’ai donc : “div.post.article:first p:first a”.
On obtient donc :
Pour une actualisation en temps réel, il est possible de mettre un Cron de mise à jour.
Tip
Lors de la mise en place d’un Cron de mise à jour, Jeedom va automatiquement cocher la case Évènement, c’est tout à fait normal.
Voilà ensuite vous pouvez imaginer un scénario qui vous envoie par SMS la dernière VDM.