Script et variables globales

Bonjour,

Je travaille avec des script shell pour piloter mon chauffage et mes têtes thermostatique (Tado°), remonter les infos de températures, etc etc.

Après avoir cherché, je ne trouve pas de réponse à mes questions :

  • peut-on, depuis un script shell, alimenter une variable globale jeedom (visible dans les variables de l’interface web), pour ensuite les utiliser en scénarios ou dans des virtuels ?
  • peut-on, dans un scénario, n’exécuter qu’une seule des commandes présente dans un objet script ?

Concrètement, pour piloter 2 têtes thermostatiques, j’ai créé 4 objets scripts (ouvre vanne 1, ferme vanne 1, ouvre vanne 2, ferme vanne 2), et dans chaque scénario je demande un refresh de l’objet script pour passer ma commande shell.
Il serait plus « propre » de tout avoir dans un seul objet, et appeler les commandes désirées.

J’espère avoir été clair.

Merci pour le coup de main

A priori oui, c’est ce que semble indiquer la documentation de l’api.

Voici l’URL = http://#IP_JEEDOM#/jeedom/core/api/jeeApi.php?apikey=#APIKEY#&type=variable&name=#NAME#&value= VALUE

  • name : nom de la variable dont on veut la valeur (lecture de la valeur)
  • value [optionnel] : si “value” est précisé alors la variable prendra cette valeur (écriture d’une valeur)

Je pense qu’il faut une commande de type curl dans ton script shell. Tu peux aussi mettre à jour un virtuel, ou même passer une valeur à un scénario en utilisant un tag.

Il me semble que c’est le fonctionnement de base. Tu crées un bloc Action puis tu cliques sur le deuxième icône « Sélectionner la commande ». La commande refresh, tu as dû la sélectionner de cette manière de toutes façons.

Par hasard, tu n’aurais pas créé des commandes de type Info dans ton objet script ? Si oui, change Info par Action dans la colonne Type, et tu pourras sélectionner ce que tu veux depuis un scénario ensuite.

Hello

Effectivement, en passant les commande en mode « action », c’est bien mieux… merci :slight_smile:

Pour les commande curl, je vais me pencher dessus, j’avais vu dans la doc mais je pensais qu’il existait une autre méthode.

1 « J'aime »

Il y a sûrement d’autres méthodes. D’ailleurs, je ne comprends pas pourquoi tu as besoin de réinjecter la valeur. Si tu crées avec le plugin script une commande de type info et qui appelle ton script shell, une commande genre « echo valeur » à la fin du script doit suffire. Et après tu récupères dans ton scénario la valeur en allant chercher la commande.

bonjour comment je vois le truc

1 c’est pas vraiment conseillé les script en ssh
(si tu lances ton script sh et que ton equipement est injoingnable tu peux l’arrêté qu’avec un ctrl-c)
« si tu regardes le market script de mémoire il y a un script backup qui fait une vérification »
On peut lancé un script sh dans un script php qui lui a un time out (tue le processus au bout d’un certain temps)

2 pour la variable
on peut dans le script php avec 2 lignes avoir l’accés api php
« si tu regardes le market script … »
autant passé par un scenario « fonction code » qui lance ton script sh afin d’incrémenté une variable

3 tu peux trés bien avoir 1 seul script info/action et les arguments qui suivent le lancement en seront la demande de retour d’infos, ou l’execution d’une actions.

un vieille exemple pour ma box sfr « les leds »
si je lance en info
/var/www/html/core/php/…/…/plugins/script/core/ressources/NeufBox.sh led info

ou en action
/var/www/html/core/php/…/…/plugins/script/core/ressources/NeufBox.sh led on
ou
/var/www/html/core/php/…/…/plugins/script/core/ressources/NeufBox.sh led off

un seul est unique script

#!/bin/bash
action=$2
Type=$1
login=admin
password="xxx"
ip=192.168.1.1
ssid=NEUF_D010


wget -q --keep-session-cookies --save-cookies cookie --delete-after --post-data="login=$login&password=$password"  http://$ip/login

if [[ $Type == "led" ]];
then
#echo "led ok"

		if [[ $action == "on" ]] || [[ $action == "off" ]];
		then
			#echo "led on/off"
			wget -q --keep-session-cookies --load-cookies cookie --delete-after --post-data="leds_state=$2&submit=" http://$ip/state
		fi

		if [[ $action == "info" ]];
		then
			#echo "led info"
			Led=`wget -O- --load-cookies cookie "http://$ip/state" 2>/dev/null | grep '"selected">' | awk -F ">" '{print $2}' | sed 's/<.*//g'`; echo $Led
		fi

#echo "fin led"
#rm cookie


elif [[ $Type == "wifi" ]];
then
#echo "wifi ok"

		if [[ $action == "on" ]] || [[ $action == "off" ]];
        then
			#echo "wifi on/off"
			wget -q --keep-session-cookies --load-cookies cookie --delete-after --post-data="ap_active=$2&ap_ssid=$ssid&ap_closed=0&ap_channel=11&ap_mode=auto&submit=" http://$ip/wifi/config
		fi

		if [[ $action == "info" ]];
       	then

       		#echo "wifi info"
		Wifi=`wget -O- --load-cookies cookie "http://$ip/wifi" 2>/dev/null | grep -A 2 'Etat' | sed -n '7p' | awk ' { print $1}'`; echo $Wifi

		fi

#echo "fin wifi"
#rm cookie
fi

je crois que le market script doit disparaître

un exemple
https://forum.jeedom.com/viewtopic.php?f=59&t=38112&p=645827#p645827

C’est juste du confort, pour avoir le dernier état accessible en un clic. J’ai contourné en créant un virtuel.

Le script ne contient que des commandes curl pour exploiter une API, donc pas bloquant si la requête n’aboutie pas

Je regarde ça asap

J’utilise les arguments, notamment pour la gestion du token d’accès à l’API (valable 10 minutes) que je passe en argument pour mes commandes curl
J’ai fait des scripts « simples » pour tester les requêtes à l’API Tado°. Je travaille en parallèle sur un script plus complet pour regrouper tous mes besoins. Après c’est toujours la même histoire : il faut du temps !

Merci pour les échanges et idées en tous cas :+1:

Hello,
Je relance mon sujet avec quelques mises à jour :

J’ai changé de méthode, exit le shell, bienvenue au php.

Le fonctionnement est le suivant :

  • je récupère un fichier JSON via l’API constructeur : OK
  • Je le traite en php (json_decode) : OK
  • j’extrait les valeurs qui m’intéressent du json (ex: [‹ setting ›][‹ temperature ›]) : OK

Je souhaite extraire 3 valeurs du JSON, et je voudrais réduire le nombre de requêtes à l’API constructeur. L’idée est donc de sortir les 3 valeurs avec un seul script, et là, je ne m’en sort pas avec l’utilisation de l’API pour interagir avec les variables globales.

J’essaye avec un script simple d’aller lire une valeur dans un premier temps, sans succès :

<?php
http://localhost/jeedom/core/api/jeeApi.php?apikey=123456789i&type=variable&name=TestScript
?>
<?php
$obj = shell_exec('curl -s http://localhost/jeedom/core/api/jeeApi.php?apikey=123456789&type=variable&name=TestScript');
echo $obj;
?>

Je ne suis pas à l’aise avec la programmation, je tâtonne mais sans succès.

Merci pour l’aide

Est-ce que déjà la requête http fonctionne dans le navigateur ?
Ensuite, dans le code php tu peux directement utiliser la fonction curl sans passer par un appel shell.
Mais tant qu’à faire, je te conseille d’abandonner le plugin script et de passer par un bloc code dans un scénario. Cela te donne accès à l’api de Jeedom, ce sera beaucoup plus simple. Une simple ligne comme celle-ci et tu as récupères la variable globale :

$var = $scenario->getData("mavariable");

1 « J'aime »

J’ai pensé au bloc code, mais les tags ne sont pas supportés, et dans mon cas je dois inclure dans ma requête de récupération du JSON un token (valable 600 sec) que je passe en argument :

$json = shell_exec('curl -s https://my.tado.com/api/v2/homes/123456/zones/6/state -H "Authorization: Bearer "'.#[montoken]#.'""');

Je vais essayer de refaire toute ma chaîne en bloc code directement dans un scénario, mais pour ma culture perso je voudrais y arriver via mes scripts :slight_smile:

Et du coup, je n’avais pas testé l’api directement dans un navigateur, et il y a un loup :
The requested URL /jeedom/core/api/jeeApi.php was not found on this server.

Je ne crois pas sur lien soit bon, normalement il n’y a pas ‹ /jeedom ›. Et il faut remplacer localhost par l’ip de jeedom aussi. Le plus simple, c’est dans la configuration d’une commande de cliquer sur ‹ URL ›, ça donne le lien direct renseigné avec l’api, à adapter ensuite pour une variable.

Hello,

c’est tout bon, effectivement le /jeedom n’a pas lieu d’être, la doc de l’API n’est pas correcte.
La lecture/écriture vers les variables depuis le script fonctionne, merci pour les conseils !

Je clôture le sujet

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.