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

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 ><’

Vous avez ajouté .html à l’URL dans l’appel du script . Why?
Et avec les 7 /center de la capture d’écran, vous accédez au relay 9 ! qui n’existe pas. D’où le retour -1.
XPath du relay 8: /html/body/center/center/center/center/center/center/p[1]/font ( 6 /center )
Il faut le même nombre de /center pour accéder au relay 1 (URL: http://192.168.1.4/30000) et le relay 5 (URL: http://192.168.1.4/30000/43 )

Avec un petit script python c’est quand même moins galère …

J’avais pris model sur le fichier 3000.html
En faisant le test d’activer uniquement les relais 5 à 8 j’obtiens ça en retour:
(même resultat que si j’active uniquement 1 à 4)
image

avec comme config état relay 5:

mais en étant sur l’adresse 192.168.1.4/30000/42 ça revient pareil que d’être sur 192.168.1.4/30000/43, que je sois sur l’une ou l’autre dés que je fais F5 ça change les relais 1 à 4 ou 5 à 8 sans même changer d’adresse web.

je m’y connais encore moins en python alors que déjà je ne connais rien du php :smiley:

J’ai un bon tutoriel qui prend en charge depuis le niveau débutant …

ça traite une adresse qui parle du soleil et de la pluie mais ça pourrait être tes pages

C’est quel matériel ?
Ya une doc ?

@olive La galère c’est pas le langage, c’est la qualité du html fourni et les relais sur 2 pages html à la même URL sans maitriser totalement si la page des relais 1 à 4 est affichée ou celle des 5 à 8

Ben on vois bien qu’il y a 2 url differentes (42 et 43)
Même si les xpath sont identique d’une page a l’autre

http://192.168.1.4/30000/42
R1 /html/body/center/center/center/p[1]/font
R2 /html/body/center/center/center/center/p[1]/font
R3 /html/body/center/center/center/center/center/p[1]/font
R4 /html/body/center/center/center/center/center/center/p[1]/font

http://192.168.1.4/30000/43
R5 /html/body/center/center/center/p[1]/font
R6 /html/body/center/center/center/center/p[1]/font
R7 /html/body/center/center/center/center/center/p[1]/font
R8 /html/body/center/center/center/center/center/center/p[1]/font

Je vois pas ou ce situe le problème ?

En python ça donne ça je vous ait mis les nom des relais en plus :wink:

Python 3.7.3 (default, Dec 20 2019, 18:57:59) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> from sys import argv
>>> from bs4 import BeautifulSoup
>>> res = requests.get('http://192.168.1.4/30000/42')
>>> soupe=BeautifulSoup(res.content, "html.parser")
>>> soupe.find_all('p')[4].text.split()[0]
'Relay-01:'
>>> soupe.find_all('p')[4].text.split()[1]
'OFF'
>>> soupe.find_all('p')[6].text.split()[0]
'Relay-02:'
>>> soupe.find_all('p')[6].text.split()[1]
'OFF'
>>> soupe.find_all('p')[8].text.split()[0]
'Relay-03:'
>>> soupe.find_all('p')[8].text.split()[1]
'OFF'
>>> soupe.find_all('p')[10].text.split()[0]
'Relay-04:'
>>> soupe.find_all('p')[10].text.split()[1]
'OFF'
>>> 
>>> res = requests.get('http://192.168.1.4/30000/42')
>>> soupe=BeautifulSoup(res.content, "html.parser")
>>> soupe.find_all('p')[4].text.split()[0]
'Relay-05:'
>>> soupe.find_all('p')[4].text.split()[1]
'OFF'
>>> soupe.find_all('p')[6].text.split()[0]
'Relay-06:'
>>> soupe.find_all('p')[6].text.split()[1]
'OFF'
>>> soupe.find_all('p')[8].text.split()[0]
'Relay-07:'
>>> soupe.find_all('p')[8].text.split()[1]
'OFF'
>>> soupe.find_all('p')[10].text.split()[0]
'Relay-08:'
>>> soupe.find_all('p')[10].text.split()[1]
'OFF'
>>> 

Je n’ai volontairement pas mis de paramètres pour le test le script pourrait se résumer a ça

script N adresse

adresse = http://192.168.1.4/30000/42 pour les relais 1 à 4
adresse = http://192.168.1.4/30000/43 pour les relais 5 à 8
avec N=   4  pour relay 1 ou 5
avec N=   6  pour relay 2 ou 6
avec N=   8  pour relay 3 ou 7
avec N=  10  pour relay 4 ou 8

Avec le script Python3 suivant :

#! /usr/bin/env python3
import requests
from sys import argv
from bs4 import BeautifulSoup
res = requests.get(argv[2])
soupe=BeautifulSoup(res.content, "html.parser")
print(soupe.find_all('p')[int(argv[1]].text.split()[1])

on peut aussi modifier la dernière ligne si l’on veut obtenir un binaire 0 ou 1
en lieu et place de ON et OFF

0 if 'OFF'==soupe.find_all('p')[int(argv[1]].text.split()[1] else 1

Voilà 7 lignes de script c’est light quand même comparer au lourd php :wink:

ps: Au cas ou la librairie ne soit pas présente dans votre environnement python3.
passez en console ssh et tapez la commande suivante

sudo pip3 install beautifulsoup4

Hi @olive
Gros travail. Merci.

Dans la réponse de @vico au-dessus que je ne comprends pas :

Sinon que ça soit en python avec une lib à installer et les pbs py py3 ou en php même combat.

Le cœur du script php fait 6 lignes. Le reste c’est du traitement pour corriger le html qui fait planter le retour vers Jeedom. ( Les &nbsp; après le ON/OFF )

  $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;

Hi moi le coeur est en une ligne si tu compte pas ce qu’il y a avant :heart:
et les données sont traitées pas de &nbsp; même la conversion binaire !

Ce qui est avant ce que j’ai cité, c’est une vérif du nombre d’arguments passé au script.
Et ce qui est après pour retourner un valeur propre.
Je vois aussi que l’espace avant le ON est supprimé dans le retour de la soupe.

Python PHP même combat.

Ben oui le split() est très efficace.

1 « J'aime »

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.

et le shebang alors jpty … allez une ligne en plus :wink:

#!/usr/bin/env php

Il y a aussi une entête obligatoire dans le php : <?php

C’est bien ce que j’ai écrit php 6 lignes (J’ai omis echo $val; pour montrer que c nettement moins long)
Et tu as compté 7 lignes en python.

PHP 0 / PYTHON 0

Non non non tu essai de m’embourber …
Moi je compte 11 chez toi (sans compter les test d’arguments qui fait 5 en plus) !

Tu ne peux pas comparer un script qui traite les erreurs possibles avec un script qui ne fait que le cas kivabien

Sinon au concours de celui qui a la plus courte, il n’y a que 2 lignes en php.

  <?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); $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;

C’est illisible mais ça fonctionne.

Oui bien sur mais après chaque ; c’est une ligne …
je peut aussi la jouer comme ça …

#! /usr/bin/env python3
import requests
from sys import argv
from bs4 import BeautifulSoup
0 if 'OFF'==BeautifulSoup(requests.get(argv[2]).content, "html.parser").find_all('p')[int(argv[1]].text.split()[1] else 1

allez 2 lignes de moins

1 « J'aime »

La seule documentation fournie est celle ci

Woahou, un gros merci !
Je vais essayer ça aussi alors :slight_smile: