Récupérer des données d'une page web

oui, accès en clair, c’un en local

désolé mais je ne sais pas de quoi tu parles pour la suite

j’ai recherché sur un autre forum (récupérer des données dans un html - Réseau/Web Python) et l’on m’a donné le code suivant qui marche en ssh :

import pandas as pd
pd.set_option('display.max_rows', 6)
pd.set_option('display.max_columns', 6)
pd.set_option('display.width', 120)
html_tables = pd.read_html("http://192.168.3.131/index.php/realtimedata")
df = html_tables[0]
df.T # transpose to align
print(df)

j’obtiens un espèce de tableau, tout y est mais il faudra trier :

lorsque je met tout ca dans un bloc code précédé de #! /usr/bin/env python3
j’obtiens en log
image

des idées pour l’erreur et pour récupérer les bonnes données uniquement ?

Salut @bornich

Tu ne peut pas écrire directement du python dans un bloc code
tu est nativement en php …
cependant une alternative existe :

Bon 14 juillet

génial !! je n’avais pas compris ce « léger » détail !! lol

reste a trier et mettre dans des variables ou l’inverse ?

avec le code suivant gentiment fourni sur l’autre forum, j’arrive a afficher les valeurs voulues dans le log. Comment les mettre dans des variables que je pourrais récupérer sous Jeedom ?

$script = 'monpython.py';        //Nom du fichier python
$chemin = '/var/www/html/python'; // Dossier à utiliser

if (1){ //metre à 1 la 1er fois, une fois que le fichier existe et n'est plus modifier mettre a 0
// Script python
$python = <<<'EOD'
#! /usr/bin/env python3
import pandas as pd
pd.set_option('display.max_rows', 6)
pd.set_option('display.max_columns', 6)
pd.set_option('display.width', 120)
html_tables = pd.read_html("http://192.168.3.131/index.php/realtimedata")
df = html_tables[0]
df.T # transpose to align
print(df.iat[0, 0])
print(df.iat[1, 0])
print(df.iat[2, 0])
print(df.iat[3, 0])
print(df.iat[4, 0])
print(df.iat[5, 0])
print(df.iat[0, 1])
print(df.iat[1, 1])
print(df.iat[2, 1])
print(df.iat[3, 1])
print(df.iat[4, 1])
print(df.iat[5, 1])
print(df.iat[0, 4])
print(df.iat[2, 4])
print(df.iat[4, 4])
print(df.iat[0, 5])
print(df.iat[2, 5])
print(df.iat[4, 5])
EOD;
mkdir($chemin); // creation du dossier
file_put_contents($chemin.'/'.$script, $python); // Ecriture du fichier
}

$reponse = shell_exec('python3 '.$chemin.'/'.$script);  // execution du script 
$scenario->setLog($reponse); // recuperation des paramètres de retour du script 

j’obtiens :

[2021-07-15 19:25:54][SCENARIO] Start : Scenario lance manuellement.
[2021-07-15 19:25:54][SCENARIO] Exécution du sous-élément de type [action] : code
[2021-07-15 19:25:54][SCENARIO] Exécution d'un bloc code
[2021-07-15 19:25:57][SCENARIO] 408000137815-1
408000137815-2
408000139665-1
408000139665-2
408000140762-1
408000140762-2
42 W
42 W
42 W
42 W
41 W
42 W
19 °C
21 °C
22 °C
2021-07-15 19:22:19
2021-07-15 19:22:19
2021-07-15 19:22:19

[2021-07-15 19:25:57][SCENARIO] Fin correcte du scénario

salut @bornich

Chaque print en python que tu fait est contenu dans la variable $reponse

il faut re sortir cette variable du bloc code en passant par un tag

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

après ton bloc cote tu peut donc exploiter le tag #reponse# dans la suite de ton scenario

utilise par exemple un virtuel avec une commande info autre (ex rep)
puis dans la suite de ton scenario fait:
action
event rep #reponse#

celà aura pour effet de coller dans ta réponse tout ce que tu a print dans la commande info de ton virtuel

allez t’y est presque il va juste falloir formater tes print’s pour qu’a la sortie tu te retrouve avec un tableau de variables plus qu’un simple bloc de texte.

amuse toi, le plus important est d’y prendre du plaisir

Bonne soirée

ps:ils auraient du te mettre un interpréteur python plutôt qu’un microchiotte dans ton MO5 :rofl:
maintenant ton clavier est plein de cambouis :smile:

1 « J'aime »

le plaisir, mouais … ma patience naturelle m’en empeche, bref …
j’ajoute a la fin du scénario ceci

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

puis les blocs suivant :

je récupère une longue liste dans la variable et dans le tag mais tout est « en vrac ». Je comptais donc passer par un virtuel ou un scénario pour trrier suivant la position (qui, j’espere sera fixe dans la chaine) mais boum la fonction substr() ne semble pas marcher :

mieux, j’ai même une erreur de longueur ou je ne sais quoi lors de l’enregistrement

y a t il moyen de traiter des chaine de caractères dans un virtuel ? et avec quelles fonctions ? je n’arrive pas a trouver…

en gros, j’ai tout en vrac dans une variable au lieu de en vrac dans une page web … suis pas sûr d’avoir beaucoup avancé du coup… je n’ai pas le choix cette fois mais le cambouis me fait vraiment perdre du temps et de la patience, c’est pas pour moi

question qui me vient :
faut il trier dans la partie python, dans la partie php ou en aval par un virtuel ou scénario ?
je n’y arrive pas plus dans une partie que dans l’autre mais ton avis m’intéresse. Je ne parle pas de vitesse mais uniquement de facilité a mettre en place

Salut @bornich ,

Ben tout est possible et dans python et en php dans le block code

je partirai sur dans python coller toutes tes données séparées par une virgule et ne faire qu’un print …
print("donnée1,donnée2,donnée3 ...")
puis dans le bloc code re transformer ces données dans un tableau avec l’instruction explode
$tableau = explode(",", $reponse);
$tableau[0] sera = a donnée1
$tableau[1] sera = a donnée2
$tableau[3] sera = a donnée3
… etc
a ta charge de faire les tag correspondant a tes données et a leu donnée des noms plus parlant

...
$tags['#donnée1#'] = $tableau[0];
...
$scenario->setTags($tags);

Bon Samedi

ps: en python si tu veut faire qu’une seule ligne sur plusieurs print il te faut ajouter

end = ''

ce qui donnerai pour toi

print(df.iat[0, 0],",",end = '')
print(df.iat[1, 0],",",end = ')
...
...
print(df.iat[4, 5])

ne pas mettre au dernier print

allez au clavier :upside_down_face:

bon, ben ca prend forme pour de bon !!!

il ne me mâche pas trop le boulot ce cher @olive !!! il me fait bosser !! mais encore merci car sans toi, c’était voué a l’échec. Je n’ai pas tout compris a ce que j’ai fait mais, dans les grandes lignes … je vois le truc.
maintenant, il me reste de la mise en forme et a passer sur une VM de prod …
ci dessous un aperçu du résultat et le bloc code qui n’est certainement pas des plus beaux mais bon … ca marche !
image

$script = 'monpython.py';        //Nom du fichier python
$chemin = '/var/www/html/python'; // Dossier à utiliser

if (1){ //metre à 1 la 1er fois, une fois que le fichier existe et n'est plus modifier mettre a 0
// Script python
$python = <<<'EOD'
#! /usr/bin/env python3
import pandas as pd
pd.set_option('display.max_rows', 6)
pd.set_option('display.max_columns', 6)
pd.set_option('display.width', 120)
html_tables = pd.read_html("http://192.168.3.131/index.php/realtimedata")
df = html_tables[0]
df.T # transpose to align
print(df.iat[0, 0],",",df.iat[1, 0],",",df.iat[2, 0],",",df.iat[3, 0],",",df.iat[4, 0],",",df.iat[5, 0],",",df.iat[0, 1],",",df.iat[1, 1],",",df.iat[2, 1],",",df.iat[3, 1],",",df.iat[4, 1],",",df.iat[5, 1],",",df.iat[0, 4],",",df.iat[2, 4],",",df.iat[4, 4],",",df.iat[0, 5],",",df.iat[2, 5],",",df.iat[4, 5])

EOD;
mkdir($chemin); // creation du dossier
file_put_contents($chemin.'/'.$script, $python); // Ecriture du fichier
}
$reponse = shell_exec('python3 '.$chemin.'/'.$script);  // execution du script 
$scenario->setLog($reponse); // recuperation des paramètres de retour du script
$tableau = explode(",", $reponse);
$tags['#ondul1px1#'] = $tableau[0];
$tags['#ondul1px2#'] = $tableau[1];
$tags['#ondul2px1#'] = $tableau[2];
$tags['#ondul2px2#'] = $tableau[3];
$tags['#ondul3px1#'] = $tableau[4];
$tags['#ondul3px2#'] = $tableau[5];
$tags['#puissondul1px1#'] = $tableau[6];
$tags['#puissondul1px2#'] = $tableau[7];
$tags['#puissondul2px1#'] = $tableau[8];
$tags['#puissondul2px2#'] = $tableau[9];
$tags['#puissondul3px1#'] = $tableau[10];
$tags['#puissondul3px2#'] = $tableau[11];
$tags['#tempondul1#'] = $tableau[12];
$tags['#tempondul2#'] = $tableau[13];
$tags['#tempondul3#'] = $tableau[14];
$tags['#commondul1#'] = $tableau[15];
$tags['#commondul2#'] = $tableau[16];
$tags['#commondul3#'] = $tableau[17];
//$tags = $scenario->getTags();
//$tags['#reponse#'] = $reponse;
$scenario->setTags($tags);

je suis preneur si quelqu’un a des idées de simplification/amélioration ou autre.
merci @olive

:+1: Bravo je te voyait aussi mal parti au départ mais bon le principale c’est le résultat

après des optimisations on va dire qu’il y en a … tout ce que tu a écrit en python aurait pu certainement
s’écrire en php mais bon c’est un excellent exercice …

bonne journée j’espère voir une jolie copie d’écran quand tu aura fait la déco :wink:

1 « J'aime »

quel manque de confiance !!! j’avais le même sentiment, sauf que quand pas le choix, ben faut bien !!

mais je reviens a la charge car ca fait 2 heures que je butte sur une connerie. Les remontées date et heure se passent bien pour les 3 onduleurs. Pour 2, j’arrive a ressortir une ligne pour la date, une autre pour l’heure mais pas pour le 3eme !!! je ne comprend pas.
la variable semble stocker la meme chose que les autres


mais lorsque j’applique la moindre fonction, ca déconne :
image
alors que :
image

j’ai essayé de supprimer, de refaire, les copier-coller, rien a faire et toujours le pb avec la variable « commondul3 »
la création des variables est là :

$tags['#commondul1#'] = $tableau[15];
$tags['#commondul2#'] = $tableau[16];
$tags['#commondul3#'] = $tableau[17];
//$tags = $scenario->getTags();
//$tags['#reponse#'] = $reponse;
$scenario->setTags($tags);

je ne sais quoi ajouter… je loupe un truc bête, c’est sûr mais lequel ??

ta valeur 1626706445 est un timestamp —>> 19/7/2021 à 14:54:05
ta peut-être un espace ou une différence de présentation entre les 2

oui, je passe en timestamp pour en ressortir une fois la date et une fois l’heure pour afficher sur deux lignes différentes et ca donne la forme et surtout le positionnement des panneaux et onduleurs tel que :
image

mes variables sont appelées commondul1 à commondul3 et j’ai tout construit en copier-coller donc je ne vois pas où ca peut se situer car le code a été construit et reconstruit de la même manière …
la variable s’affiche de la même manière que les autres dans la fenêtre des variables et dans le testeur d’expressions, mais dès que je passe en timestamp : boum !!!
dans le code source de la page tout est bien aligné… si j’avais du latin a perdre …

test la longueur ce ce que tu récupère ou si c’est du texte ajoute un signe en début et fin
genre *2021-07-19 15:22:33*

pire que ca !! :
image
image

une histoire de format plutôt, non ? alors que tout est créé de façon semblable … sauf 3 a la place de 2

ahhhhhh il semble ne pas y avoir d’espace a la fin de la chaine contrairement aux autres … je vois ca en mettant mon curseur a la fin dans la fenêtre de visu des variables
mais comment ajouter un espace après la dernière donnée dans le print suivant ? j’ai des erreurs a chaque essai.

print(df.iat[0, 0],",",df.iat[1, 0],",",df.iat[2, 0],",",df.iat[3, 0],",",df.iat[4, 0],",",df.iat[5, 0],",",df.iat[0, 1],",",df.iat[1, 1],",",df.iat[2, 1],",",df.iat[3, 1],",",df.iat[4, 1],",",df.iat[5, 1],",",df.iat[0, 4],",",df.iat[2, 4],",",df.iat[4, 4],",",df.iat[0, 5],",",df.iat[2, 5],",",df.iat[4, 5])

en ajoutant ,""

print(df.iat[0, 0],",",df.iat[1, 0],",",df.iat[2, 0],",",df.iat[3, 0],",",df.iat[4, 0],",",df.iat[5, 0],",",df.iat[0, 1],",",df.iat[1, 1],",",df.iat[2, 1],",",df.iat[3, 1],",",df.iat[4, 1],",",df.iat[5, 1],",",df.iat[0, 4],",",df.iat[2, 4],",",df.iat[4, 4],",",df.iat[0, 5],",",df.iat[2, 5],",",df.iat[4, 5],"")

je crée bien l’espace mais ca ne donne rien de mieux

Au niveau de ta ,
" , " vs ","
ou
"*,*"

@olive encore vainqueur !!!

j’ai essayé « , », j’avais une * a la fin de ma variable et donc pas de calcul. Après essais hasardeux ou plutôt empirique, j’en suis arrivé a la ligne suivante qui marche :

print(df.iat[0, 0],",",df.iat[1, 0],",",df.iat[2, 0],",",df.iat[3, 0],",",df.iat[4, 0],",",df.iat[5, 0],",",df.iat[0, 1],",",df.iat[1, 1],",",df.iat[2, 1],",",df.iat[3, 1],",",df.iat[4, 1],",",df.iat[5, 1],",",df.iat[0, 4],",",df.iat[2, 4],",",df.iat[4, 4],",",df.iat[0, 5],",",df.iat[2, 5],",",df.iat[4, 5],",*")

image

Merkkkiiii !!!
que de labeur a cause de la syntaxe, voilà ce qui me gène dans le codage … un après midi sur un espace qu’on résous (que tu résous) avec une virgule et une étoile : c’est beau la magie !!

si c’est la dernière donnée il faut pas de ,

df.iat[4, 5],",*"

essai

df.iat[4, 5]"