L'état ne s'actualise et reste à 0 avec le message d'erreur: {"state":"ok","result":"0"}

Bonjour,
j’essaie de récupérer une info JSON à partir d’un url, la fonction fonctionne bien et elle renvoie la bonne chose.
La fonction :

public function getPhotoOfTheDayExplanation() {
	  // Clé API de la NASA
	  $api_key = 'ma_clé_api';
	  // URL de l'API de la NASA
	  $url = "https://api.nasa.gov/planetary/apod?api_key=$api_key";
	  // Récupération des données de l'API
	  $response = file_get_contents($url);
	  $data = json_decode($response, true);
	  // Récupération de l'explication de la photo
	  $explication = $data['explanation'];
	  // Affichage de l'explication
	  echo $explication;

et ensuite la fonction execute mets à jour la commande « Explication », cependant j’ai ce message d’erreur qui apparait :

The Great Carina Nebula is home to strange stars and iconic nebulas. Named for its home constellation, the huge star-forming region is larger and brighter than the Great Orion Nebula but less well known because it is so far south -- and because so much of humanity lives so far north. The featured image shows in great detail the northernmost part of the Carina Nebula. On the bottom left is the Gabriela Mistral Nebula consisting of an emission nebula of glowing gas (IC 2599) surrounding the small open cluster of stars (NGC 3324). Above the image center is the larger star cluster NGC 3293, while to its right is the emission nebula Loden 153. The most famous occupant of the Carina Nebula, however, is not shown. Off the image to the lower right is the bright, erratic, and doomed star known as Eta Carinae -- a star once one of the brightest stars in the sky and now predicted to explode in a supernova sometime in the next few million years.{"state":"ok","result":"0"}

en gros la description + un message d’erreur « {« state »:« ok »,« result »:« 0 »} ».
Et la commande explication reste à 0.


Ah oui, et pour info voici la fonction execute:

public function execute($_options = array()) {
	  $eqlogic = $this->getEqLogic(); //récupère l'éqlogic de la commande $this
	  switch ($this->getLogicalId()) { //vérifie le logicalid de la commande
	    case 'refresh': // LogicalId de la commande rafraîchir que l’on a créé dans la méthode Postsave de la classe vdm .
		$info = $eqlogic->getPhotoOfTheDayExplanation(); //On lance la fonction getPhotoOfTheDayExplanation() pour récupérer l'explication de la photo du jour et on la stocke dans la variable $info
		$eqlogic->checkAndUpdateCmd('explanation', $info); //on met à jour la commande avec le LogicalId "explanation"  de l'eqlogic
		break;
	  }
}

Des idées pour corriger ca ?
Merci d’avance :slight_smile:

Bonjour,
Sans plus d’explication et avec une fonction partielle, ça va être compliqué de vous aider.

  • Que retourne la fonction getPhotoOfTheDayExplanation() Si elle ne retourne rien, la commande Explication ne sera pas renseignée avec la valeur attendue.

  • The Great Carina Nebula is home to strange .... est dans un message d’erreur à cause de echo $explication; C’est cette valeur qu’il faudrait retourner pour la mettre dans la commande.

Le json que j’avais récupéré avec une api_key valide:

{"copyright":"Carlos Taylor","date":"2023-05-01","explanation":"The Great Carina Nebula is home to strange stars and iconic nebulas. Named for its home constellation, the huge star-forming region is larger and brighter than the Great Orion Nebula but less well known because it is so far south -- and because so much of humanity lives so far north.  The featured image shows in great detail the northernmost part of the Carina Nebula. On the bottom left is the Gabriela Mistral Nebula consisting of an emission nebula of glowing gas (IC 2599) surrounding the small open cluster of stars (NGC 3324). Above the image center is the larger star cluster NGC 3293, while to its right is the emission nebula Loden 153.  The most famous occupant of the Carina Nebula, however, is not shown. Off the image to the lower right is the bright, erratic, and doomed star known as Eta Carinae -- a star once one of the brightest stars in the sky and now predicted to explode in a supernova sometime in the next few million years.","hdurl":"https://apod.nasa.gov/apod/image/2305/CarNorth_Taylor_6179.jpg","media_type":"image","service_version":"v1","title":"Carina Nebula North","url":"https://apod.nasa.gov/apod/image/2305/CarNorth_Taylor_960.jpg"}

Et comme vous n’allez pas faire une autre requête à la Nasa pour récupérer l’URL de la photo du jour, le mieux serait que la fonction getPhotoOfTheDayExplanation interroge la Nasa une seule fois et renseigne toutes les commandes qui vous sont nécessaires.

Ah oui c’est vrai, je me serais bien rendu compte que ca ne servais à rien de faire plusieurs requets, j’ai bien corriger ca. Merci

Ci-dessous la fonction execute corrigée:

public function execute($_options = array()) {
    if ($this->getLogicalId() == 'refresh') {
      $this->getEqLogic()->getNasaData();
    }
  }

Il vous reste à faire la fonction getNasaData en vous basant sur votre fonction.
image

Pour l’instant j’ai fais ca :

  public function getAPOD() {
	  // Clé API de la NASA
	  $api_key = $this->getConfiguration('param1');
	  // URL de l'API de la NASA
	  $api_url = "https://api.nasa.gov/planetary/apod?api_key=$api_key";
	  // Récupération des données de l'API
	  $response = file_get_contents($api_url);
	  $data = json_decode($response, true);
	  // Récupération de l'explication de la photo
	  $explication = $data['explanation'];
	  $url = $data['url'];
	  $titre = $data['title'];
	  // Affichage de l'explication
	  return[$explication, $url, $titre];
  }

et ca :

  public function execute($_options = array()) {
	  $eqlogic = $this->getEqLogic(); //récupère l'éqlogic de la commande $this
	  switch ($this->getLogicalId()) { //vérifie le logicalid de la commande
	    case 'refresh': // LogicalId de la commande rafraîchir que l’on a créé dans la méthode Postsave de la classe vdm .
		$data = $eqlogic->getAPOD(); // Récupère les données de l'API de la NASA
        $eqlogic->checkAndUpdateCmd('explanation', $data[0]); // Met à jour la commande "explication" avec l'explication de la photo
        $eqlogic->checkAndUpdateCmd('url', $data[1]); // Met à jour la commande "url" avec l'URL de la photo
        $eqlogic->checkAndUpdateCmd('titre', $data[2]); // Met à jour la commande "titre" avec le titre de la photo
		break;
	    }
	}

Remontez les checkAndUpdateCmd dans la fonction getAPOD

Quand vous ferez les maj des cmd chaque jour, heure … par le cron, il suffira d’appeler getAPOD pour que tout se mette à jour

public static function cronDaily() {
  foreach (self::byType(__CLASS__,true) as $eqLogic) {
    $eqLogic->getAPOD();
  }
}

Yes merci, j’ai modifié ça un tout petit et je l’ai mis dans le cron Hourly on ne sait jamais si la photo s’actualise pas tout le temps a la même, comme ça dès qu’elle sort, maximum une heure après Jeedom l’obtient. Par contre la j’essaie depuis tout a l’heure de faire afficher l’image sur le dashboard et j’ai vue que vous aviez l’image sur la capture d’écran, des idées ?

Regardez dans la console du navigateur s’il y a des erreurs. ( CSP )

image

Hello,

Il faut que tu passes la fonction toHtml du plugin pour pouvoir faire ton propre widget. La doc Jeedom est bien faite et te permettra d’appréhender cette fonction :stuck_out_tongue_winking_eye:

A ta dispo si besoin

Xav

toHtml c’est l’étape suivante. Il y a une erreur de CSP si le navigateur va chercher l’image avec l’url de la NASA.
L’image doit etre stockée en local avant.

Ah yes, je ne pensais pas que le widget « core » permettait d’afficher une image ! Faudra que je teste !

Pas réussi à afficher une image avec un widget du core non plus.
J’ai fait un widget.

Mais pour le moment, il a un CSP et pas d’image à afficher.

1 « J'aime »

Mmh, qu’est-ce qu’un CSP ? Désoler si ça peux paraître bateau mais je ne connaissais pas avant ça.

Content Security Policy.

En 2 mots on indique au navigateur via un header spécifique quels sont les domaines autorisés sur lesquels faire des requêtes pour récupérer des ressources (images, CSS, js…)

Dans le cas de jeedom, cette déclaration est faite dans la config apache, le serveur Web.

Donc si une page tente de charger une ressource depuis un autre domaine, le navigateur va bloquer la requête car c’est signe d’une injection potentielle (donc de hack)

Ok merci, je vais voir comment faire ca :), ensuite merci @Mips pour les info, je vais voir ca du coup, et du coup j’ai comprsi pourquoi j’ai un message d’erreur depuis un moment sur mon dashboard. Mais ca na pas de conséquencce visible donc je m’en suis pas préoccuper.

Bonjour,
J’ai vu que vous étiez en train de déterrer des posts de 2 ans :-1: pour essayer de résoudre votre problème d’image. Insertion image dans le plugin - #7 par Teeflo

  • Avez-vous réussi à récupérer et stocker l’image localement ?
    La fonction php qui peut faire ça est file_get_contents.
    Vous pouvez vous inspirer du plugin meteofrance qui récupère les icones de météo.
  • Pour l’affichage sur le dashboard, il faut faire un widget dans votre plugin que vous affecterez à la commande qui aura comme valeur l’URL locale de l’image stockée.

Dites où vous en êtes, montrez ce que vous avez fait et l’on pourra vous aider plus précisément.

La NASA publie l’image du jour vers 6h05.
image

@jpty Bonjour, je me suis enfin remis à la conception de ce mini plugin, car les cours sont bientôt finie, u coup j’ai fais la fonction pour télécharger l’image :

public function downloadImage($url, $destinationPath) {
	  $filename = basename($url); // Récupère le nom du fichier à partir de l'URL
	  $destinationFile = $destinationPath . '/' . $filename; // Chemin complet du fichier de destination

      $imageContent = file_get_contents($url); // Télécharge le contenu de l'image à partir de l'URL
      if ($imageContent === false) {
        log::add(__CLASS__, 'debug', "Unable to download image from URL: $url");
        return false;
      }

      $imageSaved = file_put_contents($destinationFile, $imageContent); // Sauvegarde le contenu de l'image localement
      if ($imageSaved === false) {
        log::add(__CLASS__, 'debug', "Unable to save image to destination: $destinationFile");
        return false;
      }

      log::add(__CLASS__, 'debug', "Image downloaded and saved successfully: $destinationFile");
      return $destinationFile; // Retourne le chemin complet du fichier de destination
    }

et je l’appelle donc à la fin de ma fonction getAPOD():

public function getAPOD() {
	  // Clé API de la NASA
	  $api_key = $this->getConfiguration('param1');
	  // URL de l'API de la NASA
	  $api_url = "https://api.nasa.gov/planetary/apod?api_key=$api_key";
	  // Récupération des données de l'API
	  $response = file_get_contents($api_url);
	  $data = json_decode($response, true);
	  // Récupération de l'explication de la photo
	  $explication = $data['explanation'];
	  $url = $data['url'];
	  $titre = $data['title'];
	  // Affichage de l'explication
	  //return[$explication, $url, $titre];
	  
	  
	  $eqlogic = $this->getEqLogic(); //récupère l'éqlogic de la commande $this
	  switch ($this->getLogicalId()) { //vérifie le logicalid de la commande
	    case 'refresh': // LogicalId de la commande rafraîchir que l’on a créé dans la méthode Postsave de la classe vdm .
		$data = $eqlogic->getAPOD(); // Récupère les données de l'API de la NASA
        $eqlogic->checkAndUpdateCmd('explanation', $data[0]); // Met à jour la commande "explication" avec l'explication de la photo
        $eqlogic->checkAndUpdateCmd('url', $data[1]); // Met à jour la commande "url" avec l'URL de la photo
        $eqlogic->checkAndUpdateCmd('titre', $data[2]); // Met à jour la commande "titre" avec le titre de la photo
		
		$destinationPath = __DIR__ . "/../../image"; // Chemin de destination où l'image sera sauvegardée
        $imageFile = downloadImage($url, $destinationPath);
        if ($imageFile !== false) {
          // Mise à jour de la commande "image" avec le chemin local de l'image
          $eqlogic->checkAndUpdateCmd('image', $imageFile);
        }
		break;
	  }

cependant, aucune des commandes ne s’actualise, et l’image ne se télécharge pas non plus, je ne sais aps comment faire pour régler ce soucis, je vous mets le code en entier ci-dessous ci besoin :

<?php
/* This file is part of Jeedom.
*
* Jeedom is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Jeedom is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Jeedom. If not, see <http://www.gnu.org/licenses/>.
*/

/* * ***************************Includes********************************* */
require_once __DIR__  . '/../../../../core/php/core.inc.php';

class nasaapi extends eqLogic {
  /*     * *************************Attributs****************************** */
  public function getAPOD() {
	  // Clé API de la NASA
	  $api_key = $this->getConfiguration('param1');
	  // URL de l'API de la NASA
	  $api_url = "https://api.nasa.gov/planetary/apod?api_key=$api_key";
	  // Récupération des données de l'API
	  $response = file_get_contents($api_url);
	  $data = json_decode($response, true);
	  // Récupération de l'explication de la photo
	  $explication = $data['explanation'];
	  $url = $data['url'];
	  $titre = $data['title'];
	  // Affichage de l'explication
	  //return[$explication, $url, $titre];
	  
	  
	  $eqlogic = $this->getEqLogic(); //récupère l'éqlogic de la commande $this
	  switch ($this->getLogicalId()) { //vérifie le logicalid de la commande
	    case 'refresh': // LogicalId de la commande rafraîchir que l’on a créé dans la méthode Postsave de la classe vdm .
		$data = $eqlogic->getAPOD(); // Récupère les données de l'API de la NASA
        $eqlogic->checkAndUpdateCmd('explanation', $data[0]); // Met à jour la commande "explication" avec l'explication de la photo
        $eqlogic->checkAndUpdateCmd('url', $data[1]); // Met à jour la commande "url" avec l'URL de la photo
        $eqlogic->checkAndUpdateCmd('titre', $data[2]); // Met à jour la commande "titre" avec le titre de la photo
		
		$destinationPath = __DIR__ . "/../../image"; // Chemin de destination où l'image sera sauvegardée
        $imageFile = downloadImage($url, $destinationPath);
        if ($imageFile !== false) {
          // Mise à jour de la commande "image" avec le chemin local de l'image
          $eqlogic->checkAndUpdateCmd('image', $imageFile);
        }
		break;
	  }
	  
	  
  }
  public function downloadImage($url, $destinationPath) {
	  $filename = basename($url); // Récupère le nom du fichier à partir de l'URL
	  $destinationFile = $destinationPath . '/' . $filename; // Chemin complet du fichier de destination

      $imageContent = file_get_contents($url); // Télécharge le contenu de l'image à partir de l'URL
      if ($imageContent === false) {
        log::add(__CLASS__, 'debug', "Unable to download image from URL: $url");
        return false;
      }

      $imageSaved = file_put_contents($destinationFile, $imageContent); // Sauvegarde le contenu de l'image localement
      if ($imageSaved === false) {
        log::add(__CLASS__, 'debug', "Unable to save image to destination: $destinationFile");
        return false;
      }

      log::add(__CLASS__, 'debug', "Image downloaded and saved successfully: $destinationFile");
      return $destinationFile; // Retourne le chemin complet du fichier de destination
    }


  
  /*public function toHtml($_version = 'dashboard') {
	  $replace = $this->preToHtml($_version);
      if (!is_array($replace)) {
          return $replace;
      }
      $version = jeedom::versionAlias($_version);

      $url = $this->getConfiguration('url');
      $title = $this->getConfiguration('title');
      $explanation = $this->getConfiguration('explanation');
      
      $replace['#image#'] = $url;
      $replace['#title#'] = $title;
      $replace['#explanation#'] = $explanation;


      if ($version == 'v4') {
          $replace['#background#'] = $this->getDisplay('background', 'dashboard');
      }
      return $this->postToHtml($_version, template_replace($replace, getTemplate('core', $version, 'eqLogic', 'nasaapi')));//  retourne notre template qui se nomme eqlogic pour le widget	  

    }*/

  /*
  * Permet de définir les possibilités de personnalisation du widget (en cas d'utilisation de la fonction 'toHtml' par exemple)
  * Tableau multidimensionnel - exemple: array('custom' => true, 'custom::layout' => false)
  public static $_widgetPossibility = array();
  */

  /*
  * Permet de crypter/décrypter automatiquement des champs de configuration du plugin
  * Exemple : "param1" & "param2" seront cryptés mais pas "param3"
  public static $_encryptConfigKey = array('param1', 'param2');
  */

  /*     * ***********************Methode static*************************** */

  /*
  * Fonction exécutée automatiquement toutes les minutes par Jeedom
  public static function cron() {}
  */

  /*
  * Fonction exécutée automatiquement toutes les 5 minutes par Jeedom
  public static function cron5() {}
  */

  /*
  * Fonction exécutée automatiquement toutes les 10 minutes par Jeedom
  public static function cron10() {}
  */

  /*
  * Fonction exécutée automatiquement toutes les 15 minutes par Jeedom
  public static function cron15() {}
  */

  /*
  * Fonction exécutée automatiquement toutes les 30 minutes par Jeedom
  public static function cron30() {}
  */

  
  // Fonction exécutée automatiquement toutes les heures par Jeedom
  public static function cronHourly() {
	  foreach (self::byType(__CLASS__,true) as $eqLogic) {
    $eqLogic->getAPOD();
	  }
  }
  

  /*
  * Fonction exécutée automatiquement tous les jours par Jeedom
  public static function cronDaily() {}
  */

  /*     * *********************Méthodes d'instance************************* */

  // Fonction exécutée automatiquement avant la création de l'équipement
  public function preInsert() {
  }

  // Fonction exécutée automatiquement après la création de l'équipement
  public function postInsert() {
  }

  // Fonction exécutée automatiquement avant la mise à jour de l'équipement
  public function preUpdate() {
  }

  // Fonction exécutée automatiquement après la mise à jour de l'équipement
  public function postUpdate() {
  }

  // Fonction exécutée automatiquement avant la sauvegarde (création ou mise à jour) de l'équipement
  public function preSave() {
  }

  // Fonction exécutée automatiquement après la sauvegarde (création ou mise à jour) de l'équipement
  public function postSave() {
	  $info = $this->getCmd(null, 'explanation');
	  if (!is_object($info)) {
		  $info = new nasaapiCmd();
		  $info->setName(__('Explication', __FILE__));
	  }
	  $info->setLogicalId('explanation');
	  $info->setEqLogic_id($this->getId());
	  $info->setType('info');
	  $info->setSubType('string');
	  $info->save();
	  
	  $refresh = $this->getCmd(null, 'refresh');
	  if (!is_object($refresh)) {
		  $refresh = new nasaapiCmd();
		  $refresh->setName(__('Rafraichir', __FILE__));
	  }
	  $refresh->setEqLogic_id($this->getId());
	  $refresh->setLogicalId('refresh');
	  $refresh->setType('action');
	  $refresh->setSubType('other');
	  $refresh->save();
	  
	  $title = $this->getCmd(null, 'titre');
	  if (!is_object($title)) {
		  $title = new nasaapiCmd();
		  $title->setName(__('Titre', __FILE__));
	  }
	  $title->setEqLogic_id($this->getId());
	  $title->setLogicalId('titre');
	  $title->setType('info');
	  $title->setSubType('string');
	  $title->save();
	  
	  $urldelimage = $this->getCmd(null, 'url');
	  if (!is_object($urldelimage)) {
		  $urldelimage = new nasaapiCmd();
		  $urldelimage->setName(__('URL', __FILE__));
	  }
	  $urldelimage->setEqLogic_id($this->getId());
	  $urldelimage->setLogicalId('url');
	  $urldelimage->setType('info');
	  $urldelimage->setSubType('string');
	  $urldelimage->save();
	  
	  $image = $this->getCmd(null, 'image');
	  if (!is_object($image)) {
		  $image = new nasaapiCmd();
		  $image->setName(__('Image', __FILE__));
	  }
	  $image->setEqLogic_id($this->getId());
	  $image->setLogicalId('image');
	  $image->setType('info');
	  $image->setSubType('string');
	  $image->save();
  }

  // Fonction exécutée automatiquement avant la suppression de l'équipement
  public function preRemove() {
  }

  // Fonction exécutée automatiquement après la suppression de l'équipement
  public function postRemove() {
  }

  /*
  * Permet de crypter/décrypter automatiquement des champs de configuration des équipements
  * Exemple avec le champ "Mot de passe" (password)
  public function decrypt() {
    $this->setConfiguration('password', utils::decrypt($this->getConfiguration('password')));
  }
  public function encrypt() {
    $this->setConfiguration('password', utils::encrypt($this->getConfiguration('password')));
  }
  */

  /*
  * Permet de modifier l'affichage du widget (également utilisable par les commandes)
  public function toHtml($_version = 'dashboard') {}
  */

  /*
  * Permet de déclencher une action avant modification d'une variable de configuration du plugin
  * Exemple avec la variable "param3"
  public static function preConfig_param3( $value ) {
    // do some checks or modify on $value
    return $value;
  }
  */

  /*
  * Permet de déclencher une action après modification d'une variable de configuration du plugin
  * Exemple avec la variable "param3"
  public static function postConfig_param3($value) {
    // no return value
  }
  */

  /*     * **********************Getteur Setteur*************************** */

}

class nasaapiCmd extends cmd {
  /*     * *************************Attributs****************************** */

  /*
  public static $_widgetPossibility = array();
  */

  /*     * ***********************Methode static*************************** */


  /*     * *********************Methode d'instance************************* */

  /*
  * Permet d'empêcher la suppression des commandes même si elles ne sont pas dans la nouvelle configuration de l'équipement envoyé en JS
  public function dontRemoveCmd() {
    return true;
  }
  */

  // Exécution d'une commande
  public function execute($_options = array()) {
	}
  /*public function toHtml($_version = 'dashboard') {
	  $replace = $this->preToHtml($_version);
      if (!is_array($replace)) {
          return $replace;
      }
      $version = jeedom::versionAlias($_version);

      $url = $this->getConfiguration('url');
      $title = $this->getConfiguration('title');
      $explanation = $this->getConfiguration('explanation');
      
      $replace['#image#'] = $url;
      $replace['#title#'] = $title;
      $replace['#explanation#'] = $explanation;


      if ($version == 'v4') {
          $replace['#background#'] = $this->getDisplay('background', 'dashboard');
      }
      return $this->postToHtml($_version, template_replace($replace, getTemplate('core', $version, 'nasaapiwidget', 'nasaapi')));//  retourne notre template qui se nomme eqlogic pour le widget	  

    }*/

		 

  /*     * **********************Getteur Setteur*************************** */

}

Si vous avez besoin de renseignement en plus, n’hésitez pas, merci d’avance.

Bonjour,

Que disent les logs de l’exécution ?
Pour debugger, il faut ajouter des messages dans le code pour voir par où ca passe:

message::add(__CLASS__, "Start getAPOD");
...
message::add(__CLASS__, "Case refresh");
....
message::add(__CLASS__, "End getAPOD");

Avec ces messages bien placés, vous devriez voir qu’il ne passe jamais dans le case refresh. → pas de maj des commandes ni de téléchargement de l’image.

  • Heureusement que les commandes ne se mettent pas à jour. Ca ferait une boucle infinie. La fonction getApod se rappelle elle même…
    image

  • Le refresh de la tuile ne fait plus rien. Le code de la fonction execute s’est enfui dans getAPOD().Ce que j’ai surligné en bleu ci-dessus avec le break; doit être réintégré dans cette fonction.

  • Avez-vous re-sauvé l’équipement pour que la commande image soit créée?

  • Le répertoire image existe-t-il dans le répertoire du plugin? Ce n’est pas non plus un emplacement autorisé. Les données récupérées par le plugin doivent être mise dans un répertoire data à la racine du plugin.

  • Nettoyez le code. Respectez la structure d’un plugin.

Super ! Merci, suite a quelque bug j’ai mis plus de temps que prévue. Maintenant il ne me reste plus qu’a afficher l’image sur le widget et le tour est joué. Merci encore. Peut-être que j’aurais encore besoin de votre aide :).

Bonjour, du coup je reviens vers vous, j’ai fonc ma focntion getAPOD qui fonction tres bien, cependant ma fonction toHtml() a l’air de faire défaut :

  public function toHtml($_version = 'dashboard') {
	  $replace = $this->preToHtml($_version);
      if (!is_array($replace)) {
          return $replace;
      }
      $version = jeedom::versionAlias($_version);
	  
      $url = $this->getCmd('info', 'url');
	  $replace['#url#'] = (is_object($url)) ? $url->execCmd() : "";
	  
      $title = $this->getCmd('info','title');
	  $replace['#title#'] = (is_object($title)) ? $title->execCmd() : "";
	  
      $explanation = $this->getCmd('info','explanation');
	  $replace['#explanation#'] = (is_object($explanation)) ? $explanation->execCmd() : "";
	  
	  $image = $this->getCmd('info','image');
	  $replace['#image#'] = (is_object($image)) ? $image->execCmd() : "";
      


      if ($version == 'v4') {
          $replace['#background#'] = $this->getDisplay('background', 'dashboard');
      }
      return $this->postToHtml($_version, template_replace($replace, getTemplate('core', $version, 'eqLogic', 'nasaapi')));//  retourne notre template qui se nomme eqlogic pour le widget	  

    }

J’ai donc fait le code html du fichier core/template/dashboard/eqLogic.html associé:

<div class="nasaapiwidget" data-eqLogic_id="#id#" data-eqLogic_uid="#uid#" data-version="#version#" data-translate-category="#translate_category#" data-category="#category#" data-tags="#tags#" style="width:#width#;height:#height#;background-color:#BGEnedis#!important;">
  <div class="nasaapi_template text-center">
    <div id="nasaapiwidget">
      <div class="nasaapiImage"><img width='64' height='64' src=#image#></div>
      
      <div class="nasaapiWidget">Titre</div>
      <div class="nasaapiTitle"><span class="nasaapiInfo">#title#</span></div>
        
      <div class="nasaapiWidget">Explication</div>
      <div class="nasaapiExplication"><span class="nasaapiInfo">#explanation#</span></div>
      
      <div class="nasaapiWidget">URL</div>
      <div class="nasaapiUrl"><span class="nasaapiInfo">#url#</span></div>
    </div>
  </div>
</div>

mais la je bloque, je ne comprend pas où ca bloque, sur le dashboard j’ai ça:

le titre et la photo ne sont pas affiché, je ne sais pas pourquoi, si vous arriviez a m’aiguiller ca serait super cool :slight_smile:
Merci d’avance