Récupération de données html plugin script

Bonjour,
j’ai récemment acheté une carte relais ip chinoise 8 sorties et je souhaiterai la contrôler avec le plugin script, (seul plugin permettant je pense de communiquer avec facilement).
Pour l’envoie de commande, une simple requête http avec le port qui change en fonction des sorties fonctionne bien :

Ma seule interrogation est la suivant:
Comment récupérer l’état du relais dans ce même plugin script ?


ci-dessus, la capture d’écran de la page web de la carte en question, avec l’analyse html.

Pourriez-vous m’indiquer quoi mettre comme requête dans script, car ne je suis pas du tout un expert dans le html…

Merci beaucoup pour votre aide :slight_smile:

Bonjour @vico,

Il faudrait la réponse html complète pour voir sa structure. Là il y a trop de balises fermées.

D’accord, comment puis je avoir ça ?

En sauvant la page où vous avez fait l’analyse html ( Enregistrer sous ) et en changeant l’extension en .txt vous pourrez le poster ici

Normalement dans la partie de droite, en faisant un clic droit sur la balise sélectionnée - « font » en l’occurrence - et en choisissant Copy > Copy Selector cela donne directement la séquence à mettre. Je pense que tu auras le même enchaînement qu’on voit en bas, à savoir body > center > center > center > p > font

Voici:

30000.txt (1,7 Ko)

j’ai essayé, mais pas de retour apparemment…

Vous n’avez pas choisi le bon type de script pour les 2 premiers. Il faut prendre HTML et mettre l’URL http://192.168.1.4/30000 dans Options


Le résultat de la requête est du texte qu’il faudra interpréter OFF   ou ON   C’est pour cela que rien ne s’affiche quand vous cliquez Tester. En passant par les engrenages à gauche de Tester, il y a image

Pour accéder au relay suivant, il faut ajouter center > à chaque fois

Bien vu pour la valeur. J’avais testé et je ne voyais rien non plus, surtout que ça faisait même planter l’affichage dans le dashboard. Il faut dire que le code html de la page de départ est bien pourri.

Par contre, la commande génère une erreur dans le testeur d’expression. J’ai réussi à avoir quelque chose qui semble fonctionner en choisissant une commande de type binaire ou numérique, puis dans Configuration > Formule de calcul en mettant (substr(#value#,0,2) == "ON")?1:0

Avec votre formule dans un virtuel, je n’arrive pas à faire fonctionner.
Bien que OFF je récupère toujours 1 sur le virtuel.
Compte-tenu de l’excellente qualité du html (structure et data ) :rofl: je serais plutot parti sur un script dédié.

Super, merci beaucoup pour vos retours,

Avec cette méthode j’ai ‹ ‹ un retour › ›, en revanche j’ai l’impression qu’après un certain temps (moins de 1 min) la valeur 1 ou 0 du retour disparaît pour ne rien avoir.

Au pire, je corrigerai ça avec de l’écriture dans des variables, mais par curiosité savez-vous pourquoi ?

C’est sur qu’avec une carte à 30e sur amazon j’imagine qu’ils ont fait des économies sur ça aussi :smiley:

Si je ne dis pas de bêtises, c’est parce qu’en fait en remplissant en face des actions la colonne « Divers » cela vient écrire directement la valeur dans l’info :

  • Relay 01 on exécute la commande http puis met la commande Relay 01 à 1
  • Le script se rafraichit et la commande Relay 01 va chercher l’info en html mais renvoie une valeur vide

En fait, on fait plutôt cela quand on ne peut pas avoir de retour, on simule un état. Dans un tel cas, on ne remplirait rien pour la partie requête de la commande Relay 01. En fait, cela donne l’impression d’avoir un retour, mais je pense qu’il est faussé. Enfin, ça semble être ce qu’il se passe mais pas 100% sûr.

Effectivement y’a un soucis. Je viens de tester en rajoutant des guillemets et ça semble bon (substr(#value#,0,2) == "ON")?"1":"0"

Tout à fait d’accord sur la qualité :smile:
Comme ça m’énervait tout à l’heure, j’avais commencé à partir d’un autre script que j’utilise, de type bloc code dans un scénario. J’étais arrivé à cela qui fonctionnait :

  $url = "http://192.168.1.50/test";
  $data = file_get_contents($url);
  @$dom = new DOMDocument();
  $dom->loadHTML($data);
  $xpath = new DomXPath($dom);
  
  // Relai 1
  $node = $xpath->query("/html/body/center/center/center/p[1]/font/text()");
  $val = $node[0]->nodeValue;
  $scenario->setLog("Relai 1:".($val));
  if (stripos($val," ON") !== FALSE) {
    cmd::byString("#[Tests][VIRTUEL essai][Relai 1]#")->event("1");
  } else {
    cmd::byString("#[Tests][VIRTUEL essai][Relai 1]#")->event("0");
  }

Mais c’est tout de suite un petit peu plus complexe même si là ça marche bien.

Je suis resté dans le plugin script.
Compte-tenu de la m… que fait l’extraction de données de ce html le mieux est que seul 1(ON) 0(OFF) -1(Inconnu,pb xPATH) -2(erreur nombre d’arguments) remonte

Mon script HtmlBoolean.php dans plugins/script/data

<?php
require_once __DIR__ .'/../../../core/php/core.inc.php';
if ($argc != 3)  {
  message::add('script', "Usage:" .$argv[0] ." URL XPath");
  echo -2;
  exit();
}

  $dom = new DOMDocument();
  libxml_use_internal_errors(true); // disable warning on screen
  $dom->loadHTMLFile($argv[1]);
  $xpath = new DomXPath($dom);
  
  $node = $xpath->query($argv[2]);
  $val = $node[0]->nodeValue;
  if(strpos($val,"ON") !== false) echo 1;
  else if(strpos($val,"OFF") !== false) echo 0;
  else echo -1;

L’appel dans le plugin script:


Le résultat sur le dashboard en affichant l’équipement script
image

2 « J'aime »

Ah oui si on pouvait rester dans le plugin script comme ici c’est le top,
Cette solution à l’air vraiment bien,
J’ai voulu l’a tester mais j’ai ces erreurs lors de l’enregistrement :

J’ai pourtant repris votre code:

En adaptant ici :

J’imagine que pour avoir les autres retours de relais, on incrémente le ''center>center>… ‹  ›?

Si je ne dis pas de bêtises, c’est parce qu’en fait en remplissant en face des actions la colonne « Divers » cela vient écrire directement la valeur dans l’info :

  • Relay 01 on exécute la commande http puis met la commande Relay 01 à 1
  • Le script se rafraichit et la commande Relay 01 va chercher l’info en html mais renvoie une valeur vide

En fait, on fait plutôt cela quand on ne peut pas avoir de retour, on simule un état. Dans un tel cas, on ne remplirait rien pour la partie requête de la commande Relay 01. En fait, cela donne l’impression d’avoir un retour

Oui c’était la ‹ ‹ solution de facilité › ›, car en théorie seul l’envoi de requête pour les relais peut les actionner, donc si lors de l’envoi de cette dernière on commande le retour d’état au passage… ça passe même si ça manque de fiabilité …

Il faut que le fichier ait une extension .php sinon le plugin script ne sait quoi en faire et le fait exécuter par le shell unix.
image

C’est un XPath, on passe au relais suivant en ajoutant /center dans le cas de votre html.

Super, ça marche hyper bien !
Encore merci

Seul petit dernier problème, les 4 derniers relais se trouve sur une 2 eme page mais avec la même adresse ip local et même port, et je n’ai pas leurs retour, je pense que l’ajout /center est limité à la 1ere moitié de relais

j’ai nommé le fichier 30001 de la 2eme page mais sinon il a le même nom
30001.txt (1,7 Ko)

Sur la 1ère page, le lien vers la seconde page est http://192.168.1.4/30000/43
N’accédez-vous pas aux relais 5 à 8 avec cette URL ?

En effet, et si je rafraîchi la page en enlevant le /43 je reste sur la page des relais de 5 à 8, c’est pour cela que je précisais que c’était la même adresse, /42 sert a revenir sur les relais de 1 à 4.

Bon j’ai quand même tenté ceci pour le Etat relay 5:

en ajoutant /43 à l’adresse mais la valeur reste en -1, j’imagine du coup que ce n’est pas aussi simple que cela ><’