Plugin virtuel IPX

Bonjour,

J’ai appliqué la procédure de @seb82 pour me passer du plugin ipx v3.
Je récupère bien les infos, j’ai créé les commandes pour les relais
la requête http://192.168.0.13/preset.htm?set1=1 fonctionne à partir du navigateur mais pas lors de l’exécution dans jeedom.
voici le contenu des commandes


le log dit

[2021-03-04 07:12:51][INFO] : Exécution de la commande [Local piscine][IPX800_script][R1_ON] avec les paramètres {"utid":"0"}

Quel est le problème?

Essai de la passer en commande info pour voir …

Si non code ta requette depuis un bloc de scenario !

$req  = 'curl "http://192.168.0.13/preset.htm?set1=1"';
$scenario->setLog('DEBUG REQUETTE : '.$req);
$resultat = shell_exec($req);
$scenario->setLog('DEBUG RETOUR : '.$resultat);

Si jamais tu avait un message du type

curl command not found

installe curl en ssh

sudo apt install curl

Bonjour,

Utilises tu un user/password pour accéder à ton IPX800 ?
Autrement la définition de la commande R1_ON me semble bonne. J’utilise exactement la même commande avec les informations user/password dans la requète http.
Voir les capture d’écran dans le fil: Problème avec ipx800 V3 - #93 par henribi

Ce serait un bonne raison si le user/pass est enregistré dans le navigateur …

merci @henribi et @olive
effectivement je croyais ne pas avoir de mot de passe mais il avait été oublié dans les profondeur de chrome.
il y a un relais qui n’obéit pas, bizarre, je creuse

Bonjour,

Je reprends ce sujet que j’avais délaissé.
J’ai réappliqué la procédure de @seb82
Voici


L’analogique se met bien à jour, pas les relais pourtant les commandes sont identiques
je ne comprends les message d’erreur du scénario avec le script de @seb82

`[2021-07-20 10:45:02][SCENARIO] Start : Scenario execute automatiquement sur programmation.
[2021-07-20 10:45:02][SCENARIO] Exécution du sous-élément de type [action] : code
[2021-07-20 10:45:02][SCENARIO] Exécution d'un bloc code
[2021-07-20 10:45:02][SCENARIO] Pas de tag push, lecture du fichier globalstatus.xml sur l'IPX800
[2021-07-20 10:45:02][SCENARIO] Url du fichier : http://192.168.0.13:80/globalstatus.xml
[2021-07-20 10:45:03][SCENARIO] Version : 3.05.47
[2021-07-20 10:45:03][SCENARIO] Mise à jour des valeurs analogiques depuis XML
[2021-07-20 10:45:03][SCENARIO] Mise à jour de l'état des relais depuis XML
[2021-07-20 10:45:03][SCENARIO] La commande n'a pas pu être trouvée : #[IPX800][IPX800_virtuel][R1]# => #[IPX800][IPX800_virtuel][R1]#
[2021-07-20 10:45:03][SCENARIO] Fin correcte du scénario`

Quelqu’un peut-il m’éclairer?

Bonjour,

Si tu veux récupérer une valeur il faut une commande info et pas une commande action.
Dans le premier exemple, la requête fonctionne certainement mais elle ne garde pas le résultat

Elle y était bien
J’ai supprimé la commande action c’est pareil

J’avais répondu sur le premier post et donc mon commentaire parlait du premier screen, je n’avais pas vu que ca datait d’il y a 5 mois:

Merci
J’ai bien les commandes R1_ON… pour actionner les relais mais là c’est le retour d’état que je veux.
Faut-il qu’il soit dans le même équipement?
Capture d’écran 2021-07-20 111919

Nota: s’il pleut chez toi, je m’excuse mais ma piscine est à 29° :grinning:

Je ne sais pas pour le retour d’état vu qu’il manque plein d’information dans la demande: aucune idée du « scénario » utilisé dont on voit le log, aucune idée de cette fameuse « procédure »

mais je me répète: si le script ou la requête derrière la commande action est sensé retourné une valeur, il faut que ce soit une commande info.

tu réponds à qui en fait?

Bonjour @yves273,
Le scenario avec lequel tu as un problème effectue la mise à jour des commandes infos présentent dans IPX800_virtuel.
Tu dois donc avoir dans le virtuel « IPX800_virtuel » une commande de type info binaire nommée R1.

Tu dis que cela fonctionne avec les analogiques. C’est pourtant le même fonctionnement pour les relais sauf que les analogiques sont du type info numérique et les relais info binaire.
Peux tu publier le code de ton scenario. Pense à masquer l’adresse IP et les identifiants.
Je ne saisi pas non plus la commande 419 Temp2 du type action Defaut avec la valeur R1.
Cette commande n’existe pas chez moi.

Pour @mips,
Vu les nom des équipements utilisés, je suppose qu’il utilise les infos que j’ai publié dans le lien au message 3.

Me revoilà
Bien sur, dès que je vois du code je copie bêtement sans comprendre,
il ne voit pas R1 qui a bien été créé par ailleurs?
voici le path du lien push de M2M de l’ipx:
/core/api/jeeApi.php?apikey=xxxx&type=scenario&id=1&action=start&tags=push%3De$O$I
et aussi le code

/* IPX800v3

Ce code permet de mettre à jour un objet virtuel réprésentant l'IPX800 de deux manières :
- Soit par lecture du fichier globalstatus.xml sur l'IPX
- Soit par lancement par le push de l'IPX de ce scénario en transmettant un tag nommé push (permet d'avoir un retour immédiat)

Plus d'informations ici : https://www.jeedom.com/forum/viewtopic.php?f=133&t=47112

*/

/* Configuration */

$IP_IPX800 = "192.168.0.13";	  // Changer par l'IP de l'IPX800
$PORT_IPX800 = "80"; 		  // Port de l'IPX800 si modifié, sinon laisser 80
$IDENTIFIANT = "";			  // Identifiant s'il y a en a un, sinon vide
$MOT_DE_PASSE = "";			  // Mot de passe s'il y a en a un, sinon vide

/* Pour le push, dans la configuration de l'IPX aller dans M2M > Push, mettre l'IP de Jeedom dans Server et dans Path mettre /core/api/jeeApi.php?apikey=CLE_API&type=scenario&id=XX&action=start&tags=push%3De$O$I
 CLE_API est à remplacer par le clé API de Jeedom (roue crantée en haut à droite > Configuration > API > Clef API )
 XX est à remplacer par l'ID de ce scénario
 $O contient l'état des 32 relais (8 de l'IPX800 et les éventuelles extensions)
 $I contient l'état des 32 entrées digitales (8 de l'IPX800 et les éventuelles extensions)
*/

// On récupère les tags du scénario
$tags = $scenario->getTags();
// On extrait l'éventuel tag push
$push = $tags['#push#'];

// S'il n'y a pas de tag "push", on lit le fichier xml de l'IPX800

if (!$push) {
  
  $scenario->setLog("Pas de tag push, lecture du fichier globalstatus.xml sur l'IPX800");

  // Url du fichier globalstatus.xml de l'IPX800
  $Url = "http://".(($IDENTIFIANT == "")?"":($IDENTIFIANT.":".$MOT_DE_PASSE."@")).$IP_IPX800.":".$PORT_IPX800."/globalstatus.xml";
  $scenario->setLog("Url du fichier : ".$Url);

  // Récupération du fichier avec curl
  $InitPage = curl_init();
  curl_setopt($InitPage, CURLOPT_URL, $Url);
  curl_setopt($InitPage, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($InitPage, CURLOPT_USERAGENT, 'Jeedom');
  $resultat = curl_exec ($InitPage);
  //$scenario->setLog($resultat); // Décommenter cette ligne pour vérifier dans le log du scénario le contenu récupéré 
  $response_code = curl_getinfo($InitPage,CURLINFO_RESPONSE_CODE); // Récupération du statut de réponse de la requête http
  curl_close($InitPage);
  
  if ($response_code == 200) { // Vérifie si la récupération s'est bien passée
    
    // Conversion du XML en objet PHP 
    $xml = simplexml_load_string($resultat);
    
    // Extraction de la version pour voir si le fichier est valide
    $version = (string)$xml->version;
    $scenario->setLog("Version : ".$version);
    
	if ($version == "") {
      $scenario->setLog("Fichier globalstatus.xml non valide");
      log::add('ipx800','error',"Fichier globalstatus.xml non valide");
    } else {

      // Extraction des valeurs analogiques depuis XML
      $scenario->setLog("Mise à jour des valeurs analogiques depuis XML");
      //cmd::byString("#[IPX800][IPX800_virtuel][AN1]#")->event((string)$xml->analog0);
      //cmd::byString("#[IPX800][IPX800_virtuel][AN2]#")->event((string)$xml->analog1);
      //cmd::byString("#[IPX800][IPX800_virtuel][AN3]#")->event((string)$xml->analog2);
      cmd::byString("#[Local piscine][IPX800_virtuel][AN4]#")->event((string)$xml->analog3);

      // Extraction des compteurs depuis XML
      //$scenario->setLog("Mise à jour des compteurs depuis XML");
      //cmd::byString("#[IPX800][IPX800_virtuel][C1]#")->event((string)$xml->count0);
      //cmd::byString("#[IPX800][IPX800_virtuel][C2]#")->event((string)$xml->count1);
      //cmd::byString("#[IPX800][IPX800_virtuel][C3]#")->event((string)$xml->count2);
      //cmd::byString("#[IPX800][IPX800_virtuel][C4]#")->event((string)$xml->count3);

      // Extraction des états des relais depuis XML
      $scenario->setLog("Mise à jour de l'état des relais depuis XML");
      cmd::byString("#[IPX800][IPX800_virtuel][R1]#")->event((string)$xml->led0);
      //cmd::byString("#[IPX800][IPX800_virtuel][R2]#")->event((string)$xml->led1);
      //cmd::byString("#[IPX800][IPX800_virtuel][R3]#")->event((string)$xml->led2);
      //cmd::byString("#[IPX800][IPX800_virtuel][R4]#")->event((string)$xml->led3);
      cmd::byString("#[IPX800][IPX800_virtuel][R5]#")->event((string)$xml->led4);
      //cmd::byString("#[IPX800][IPX800_virtuel][R6]#")->event((string)$xml->led5);
      //cmd::byString("#[IPX800][IPX800_virtuel][R7]#")->event((string)$xml->led6);
      //cmd::byString("#[IPX800][IPX800_virtuel][R8]#")->event((string)$xml->led7);

      // Extraction des entrées digitales depuis XML
      //$scenario->setLog("Mise à jour des entrées digitales depuis XML");
      //cmd::byString("#[IPX800][IPX800_virtuel][I1]#")->event(((string)$xml->btn0=="up")?0:1);
      //cmd::byString("#[IPX800][IPX800_virtuel][I2]#")->event(((string)$xml->btn1=="up")?0:1);
      //cmd::byString("#[IPX800][IPX800_virtuel][I3]#")->event(((string)$xml->btn2=="up")?0:1);
      //cmd::byString("#[IPX800][IPX800_virtuel][I4]#")->event(((string)$xml->btn3=="up")?0:1);
      //cmd::byString("#[IPX800][IPX800_virtuel][I5]#")->event(((string)$xml->btn4=="up")?0:1);
      //cmd::byString("#[IPX800][IPX800_virtuel][I6]#")->event(((string)$xml->btn5=="up")?0:1);
      //cmd::byString("#[IPX800][IPX800_virtuel][I7]#")->event(((string)$xml->btn6=="up")?0:1);
      //cmd::byString("#[IPX800][IPX800_virtuel][I8]#")->event(((string)$xml->btn7=="up")?0:1); 
    }
    
  } else {
    $scenario->setLog("Erreur lors de la récupération du fichier globalstatus.xml");
    log::add('ipx800','error',"Erreur lors de la récupération du fichier globalstatus.xml");
  }

} else {
  
  $scenario->setLog("Tag push détecté, information reçue : ".$push);
  
  if (substr($push,0,1) == 'e') {  // On vérifie que le tag push commence par un 'e' pour être sûr d'avoir une bonne information 
    
    // Extraction des états des relais depuis tag push - 
    $scenario->setLog("Mise à jour de l'état des relais depuis tag");
    cmd::byString("#[IPX800][IPX800_virtuel][R1]#")->event(substr($push,1,1));
    //cmd::byString("#[IPX800][IPX800_virtuel][R2]#")->event(substr($push,2,1));
    //cmd::byString("#[IPX800][IPX800_virtuel][R3]#")->event(substr($push,3,1));
    //cmd::byString("#[IPX800][IPX800_virtuel][R4]#")->event(substr($push,4,1));
    cmd::byString("#[IPX800][IPX800_virtuel][R5]#")->event(substr($push,5,1));
    //cmd::byString("#[IPX800][IPX800_virtuel][R6]#")->event(substr($push,6,1));
    //cmd::byString("#[IPX800][IPX800_virtuel][R7]#")->event(substr($push,7,1));
    //cmd::byString("#[IPX800][IPX800_virtuel][R8]#")->event(substr($push,8,1));

    // Extraction des entrées digitales depuis tag push
    $scenario->setLog("Mise à jour des entrées digitales depuis tag");
    //cmd::byString("#[IPX800][IPX800_virtuel][I1]#")->event(substr($push,32+1,1));
    //cmd::byString("#[IPX800][IPX800_virtuel][I2]#")->event(substr($push,32+2,1));
    //cmd::byString("#[IPX800][IPX800_virtuel][I3]#")->event(substr($push,32+3,1));
    //cmd::byString("#[IPX800][IPX800_virtuel][I4]#")->event(substr($push,32+4,1));
    //cmd::byString("#[IPX800][IPX800_virtuel][I5]#")->event(substr($push,32+5,1));
    //cmd::byString("#[IPX800][IPX800_virtuel][I6]#")->event(substr($push,32+6,1));
    //cmd::byString("#[IPX800][IPX800_virtuel][I7]#")->event(substr($push,32+7,1));
    //cmd::byString("#[IPX800][IPX800_virtuel][I8]#")->event(substr($push,32+8,1));
    
  }

}

Pour la température de la piscine c’était de l’humour, raté :unamused: …et ça montrait que cela marchait pour l’analogique

C’est très dangereux: vous n’avez aucune idée si certaines personnes de ma famille ou amis sont morts dans les inondations… alors venir se vanter du piscine à 29° en faisant allusions à une telle catastrophe, c’est dépasser la limite selon moi.

Stop
Hors sujet

« stop » ?!?

on ne parle pas ainsi, vous n’êtes pas le chef ici qui dit quand stopper…
vous auriez mieux fait de vous excuser d’avoir été maladroit.

1 « J'aime »

Bonsoir,

Quel est l’objet parent de ton IPX800_virtuel. Est-ce « Local piscine » ?
Ton objet parent, ne peut pas être dans un cas « IPX800 » et dans l’autre « Local piscine ».

Selon moi, tu devrais remplacer les itérations de [IPX800] par [Local piscine] dans le code du scenario.
Peux tu tester pour R1 et nous donner le résultat.

Merci @henribi pour ton aide

IPX_virtuel et IPX_script ont pour parent « local piscine »
le scénario IPX aussi

!

Capture d’écran 2021-07-21 071435!

Qu’en conclure?

La piste de @enribi était la bonne
Dans le scénario il fallait faire référence à l’équipement « local piscine »:
J’aurais du faire la modif.

cmd::byString("#[Local piscine][IPX800_virtuel][R1]#")->event((string)$xml->led0);

merci à tous

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