Affichage de variable API dans un virtuel

Bonjour à tous,

Je souhaite afficher sur un design la valeur d’une cryptomonnaie. Pour cela, je passe par le site suivant coinmarketcap qui détaille comment utiliser la clé API et récupérer les valeurs souhaitées.
Donc je suis parti du code php exemple donné sur le site, j’ai modifié avec ma clé API et j’ai mis start et limit à 1 pour n’avoir en retour que la monnaie qui m’intéresse. En l’occurrence le Bitcoin.

<?php
$url = 'https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest';
$parameters = [
  'start' => '1',
  'limit' => '1',
  'convert' => 'EUR'
];

$headers = [
  'Accepts: application/json',
  'X-CMC_PRO_API_KEY: [remplacer par la clé API]'
];
$qs = http_build_query($parameters); // query string encode the parameters
$request = "{$url}?{$qs}"; // create the request URL


$curl = curl_init(); // Get cURL resource
// Set cURL options
curl_setopt_array($curl, array(
  CURLOPT_URL => $request,            // set the request URL
  CURLOPT_HTTPHEADER => $headers,     // set the headers 
  CURLOPT_RETURNTRANSFER => 1         // ask for raw response instead of bool
));

$response = curl_exec($curl); // Send the request, save the response
print_r(json_decode($response)); // print json decoded response
curl_close($curl); // Close request
?>

Seulement je ne sais pas, à partir de là, comment récupérer la valeur pour la mettre dans l’info d’un virtuel et l’afficher sur mon design.
Je tourne sous Jeedom 4.1.27 sur un Raspberry Pi 4.

Merci pour votre aide.

Bonjour @Tabb
Utilise le plugin script pour exécuter ton code php et récupérer ton printf.

J’ai déjà le plugin Script. Je ne comprends pas ce que tu me dis de faire.
Mon code php se trouve dans un bloc code dans mon scénario. Ce n’est pas suffisant pour que le scénario l’exécute ?
Quoi qu’il en soit, ça ne me dit pas comment faire passer le résultat du script à la variable info de mon virtuel.

Bonjour
dans ton bloc code
si ton resultat est par exemple dans la variable $resultat

$tags = $scenario->getTags();
$tags['#montag#'] = $resultat;
$scenario->setTags($tags);

puis dans la suite de ton scenario
tu pourra utiliser montag

ex:
event tacommandeinfo tag(montag,[defaut])

OK, on va faire simple, on va tout mettre dans ton scénario.

Cadeau :gift: :

$tags['#DEBUG#'] = 1;
$scenario->setTags($tags);

$tags = $scenario->getTags();
$DEBUG = $tags['#DEBUG#'];

if($DEBUG) { $scenario->setLog('[DEBUG] : DEBUT'); }

$url = 'https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest';
$parameters = [
  'start' => '1',
  'limit' => '1',
  'convert' => 'EUR'
];

$headers = [
  'Accepts: application/json',
  'X-CMC_PRO_API_KEY: [remplacer par la clé API]'
];
$qs = http_build_query($parameters); // query string encode the parameters
$request = "{$url}?{$qs}"; // create the request URL


$curl = curl_init(); // Get cURL resource
// Set cURL options
curl_setopt_array($curl, array(
  CURLOPT_URL => $request,            // set the request URL
  CURLOPT_HTTPHEADER => $headers,     // set the headers 
  CURLOPT_RETURNTRANSFER => 1         // ask for raw response instead of bool
));

$data = curl_exec($curl); // Send the request, save the response
//print_r(json_decode($data)); // print json decoded response
curl_close($curl); // Close request

$scenario->setLog('  [INFO] : MAJ des infos MON-EQUIPEMENT');
// on decode le contenu des infos JSON de la variable $data
$resultat_data = json_decode($data); 

if($DEBUG) { $scenario->setLog('[DEBUG] : DATA : ' . $resultat_data); }

// 1ere - Methode avec TAG si besoin de réutiliser les données ailleurs dans le scénario
// recupere les infos du fichier en TAG
$tags['#etat_porte#']=$resultat_data->{'doorOpen'};
$tags['#oxygen_level#']=$resultat_data->{'oxygen_level'};
$tags['#hours#']=$resultat_data->{'hours'};
$tags['#minutes#']=$resultat_data->{'minutes'};
$scenario->setTags($tags);
// Met à jour le virtuel
cmd::byString('#[Maison][porte][etat]#')->event($tags['#etat_porte#']);
cmd::byString('#[Maison][vmc][oxygene]#')->event($tags['#oxygen_level#']);
cmd::byString('#[Maison][info][heure]#')->event($tags['#hours#']);
cmd::byString('#[Maison][info][minutes]#')->event($tags['#minutes#']);

///////////////////////////////////////////////////////
// OU
///////////////////////////////////////////////////////

// 2eme - Methode qui met à jour directement les infos de ton virtuel
cmd::byString('#[Maison][porte][etat]#')->event($resultat_data->{'doorOpen'});
cmd::byString('#[Maison][vmc][oxygene]#')->event($resultat_data->{'oxygen_level'});
cmd::byString('#[Maison][info][heure]#')->event($resultat_data->{'hours'});
cmd::byString('#[Maison][info][minutes]#')->event($resultat_data->{'minutes'});

if($DEBUG) { $scenario->setLog('[DEBUG] : FIN'); }

Dans le code, j’ai fait 2 méthodes pour mettre à jour les infos du virtuel à toi de choisir, celle qui te convient.

Je connais pas l’arborescence de ton JSON donc toutes les clefs sont à la racine du fichier et je ne teste pas les valeurs.
Si tu galères pour récupérer les infos, met la trace du scénario.

ça fonctionne comme ça
cmd::byString('#[Maison][porte][etat]#')
mais c’est pas propre et pas dynamique
si tu modifie [Maison][porte][etat] en [Maison][porte][état] ton bloc ne le sais pas …
et plus rien ne fonctionne surtout 6 mois après :thinking:
c’est pour cela que j’exporte toujours les tags depuis le bloc vers la suite scénario.

tu peut a la limite by id mais la lecture deviens pénible

pareil pour les paramètres en entrée du bloc si il y en a …

Oui je sais bien mais en face tu ne connais pas le niveau des gens…

perso moi tout ce que je peux faire, je le fais en plugin.

quel que soit le niveau il faut faire l’effort de leur apprendre ce qu’il est bien de faire …

Hello @olive
Excuse moi mais je ne comprends pas ce que tu préconises de faire … je suis d’accord avec toi que c’est pas dynamique et pas propre … mais comment faire pour que cela le soit ? que va changer le tag du scenario ?
Pour contre carrer les potentiels problèmes de noms en dur j’ai tout factorisé dans une class perso et je jette une exception si la commande n’est pas existante … comme ça je suis averti en direct si changement de nom d’une commande…ex :

public static function executeCommande($commandName,$scenario=NULL) {
          self::log($scenario,"executeCommande | $commandName");
          try {
            $cmd=cmd::byString('#'.$commandName.'#');
            return $cmd->execCmd();
          } catch (Exception $e) {
            self::manageError($scenario,$e);
          }
    }

public static function manageError($scenario=null,$e) {
        self::log($scenario,"		* Erreur execution commande : " . $e->getMessage());
        $message=self::getScenarioName($scenario) . ' - erreur : ' . $e->getMessage();
      	self::log($scenario,$message);
        notificationFunction::sendJeedomConnectMessage($scenario,self::exceptionReceiver,'Notification','','Erreur scenario : ',$message);
      	self::log($scenario,'after');
        throw $e;
    }

Si y a plus simple je suis preneur … :slight_smile:
@chris94440

salut @chris94440 ,
j’avais échangé avec Salviaf justement sur ce point et il n’y a pas grand chose à faire.
Apres perso je ne change pas le nom des variables/commandes quand je les ai créer.

tu pourrais aussi faire un clone de ta fonction ‹ executeCommande › en ‹ SetInfoCommande › car :
cmd::byString('#'.$commandName.'#')->execCmd(); Récupère la valeur d’une commande info si on met le résultat dans une variable OU sinon exécute l’action

alors que si tu veux mettre à jour une commande info (ce que veut faire @Tabb) c’est avec even :
cmd::byString('#[Maison][infos][test]#')->event(29); Mettre à jour une commande info
donc pareil si tu modifie le nom de ta commande ca ne met pas à jour…

je fais comme ca dans mes plugins

Hello @cstan77
Oui c’est ce que je fais … j’ai pas mis toutes mes class perso … :upside_down_face:

public static function setCommandeValue($commandName,$scenario=NULL,$value) {
          self::log($scenario,"executeCommande | $commandName");
      	  if (self::IsNullOrEmptyString($value)) {
            	notificationFunction::sendJeedomConnectMessage($scenario=null,self::exceptionReceiver,'Notification','','Erreur scenario : ' . $scenario->getName(),'	* aucune valeur passée en entrée');
          } else {
            try {
              $cmd=cmd::byString('#'.$commandName.'#');
              return $cmd->event($value);
            } catch (Exception $e) {
              self::manageError($scenario,$e);
            }
          }
    }
1 « J'aime »