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

j’ai fait le test de copier/coller et accéder l’adresse 192.168.1.4/30000/42 plusieurs fois.
A chaque fois que je le fais, ça switch 1 fois sur 2 entre relais 1 à 4 et relais 5 à 8
Même effet pour 192.168.1.4/30000/43

OK donc, il ne reste plus qu’à faire un script plus global qui va aussi lire le texte Relay xx: pour contrôler la page où il est et faire appel à la page suivante si besoin. Puis retourner l’état du relais demandé.
Lancement sous cette forme: NC800status.php IPcarte numRelais
Le script peut aussi retourner l’état de tous les relais.

L’IP de la carte est modifiable ou elle utilise le DHCP de votre réseau ?

Par contre je suis désolé mais je suis vraiment largué en programmation moi :smiley:

Comment fait on sur Jeedom ?


Que dois-je renseigner dans requête ?

J’ai créé un nouveau fichier ‹ ‹ soupe › › avec dedans:

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

mais le reste, je n’ai pas compris

PS: Python est déjà installé apparemment

L’ip de la carte est modifiable:
image

Pour l’instant elle est en dhcp, mais en cas de plantage et après reset elle reprend toujours son adresse 192.168.1.4:30000

Non dans soupe tu ne met que ç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

et dans requête ?

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

Donc pour le relay 1 si ton script se nome soupe
soupe 4 http://192.168.1.4/30000/42

ok j’ai compris, mais comme dit @jpty , je pense qu’on va avoir le même problème avec le /42 et /43

Essai déjà aprés j’ai ma petite idée
on ajoutera ca dans le script
un truc du genre
si le premier relai est le 1 action1
si le premier relai est le 5 action2

J’ai peut etre pas bien fait comme il faut

Si le php vous intéresse encore, voici peut-être une solution qui consiste à rappeler une 2ème fois l’URL pour essayer d’atteindre la 2ème page:

Le code php
<?php
require_once __DIR__ .'/../../../core/php/core.inc.php';
  $url = $argv[1];
  $numRelay = $argv[2];
  $ret = array();

   getValuesFromPage($url .'/42',$ret);
  if(isset($ret[$numRelay])) {
    echo $ret[$numRelay];
    return;
  }
  getValuesFromPage($url .'/43',$ret);
  if(isset($ret[$numRelay])) {
    echo $ret[$numRelay];
    return;
  }
  else echo -1;
  // echo json_encode($ret);

  function getValuesFromPage($url,&$ret) {
    $dom = new DOMDocument();
    libxml_use_internal_errors(true); // disable warning
    $dom->loadHTMLFile($url);
    if( $dom !== false ) {
      $xpath = new DomXPath($dom);
      for($i=0;$i<4;$i++) {
        $queryBase = 'body'.str_repeat('/center', 3+$i);
        $node = $xpath->query($queryBase .'/p[1]/text()');
        $relay = substr($node[0]->nodeValue,8,1);
        $node = $xpath->query($queryBase .'/p[1]/font/text()');
        $status = $node[0]->nodeValue;
        if(strpos($status,"ON") !== false) $stat = 1;
        else if(strpos($status,"OFF") !== false) $stat = 0;
        else $stat = -1;
        $ret[$relay] = $stat;
      }
    }
  }

Appel depuis le plugin script avec en argument l’URL et le numéro du relais dont on veut récupérer l’état.
Sans message de diagnostic, puisqu’il faut faire court. :wink:

Bien sur, toutes les solutions m’intéressent :slight_smile:
J’aimais bien le diagnostic , en tout cas le -1 en cas de crash de la carte. Je garderai surement les premiers scripts pour le retour sur 1 relais juste pour avoir un retour en cas de défaut.
Du coup avec cette solution ci-dessus, que faut il mettre dans la requête ?

/var/www/html/plugins/script/data/nomDuScript.php http://192.168.1.4/30000 1
C’est le même fonctionnement que le script précédent. Seul l’état du relais demandé est retourné. Avec une vérif si c’est celui demandé.
Retours: 1 ON / 0 OFF / -1 si non trouvé

Résultat intéressant:

aucun relais activé:
image

relais 1 à 4 activés (même résultat quand tous les relais sont activés):
image

relais 5 à 8 activés:
image

On n’est vraiment pas loin du but :slight_smile:

Bonjour @vico

Apparemment il n’arrive pas encore à changer de page!

Pouvez-vous essayer en mettant l’URL: http://192.168.1.4/30000/42 ou 43 ?

Vous pouvez me montrer comment vous avez fait le lancement du script (sur 2 commandes SVP les relais 1 et 5 par exemple) ?

1 « J'aime »

Tout fonctionne en ajoutant le /42 et /43, super ! :slight_smile:
Un très très gros merci à vous pour votre implication dans ce sujet !

1 « J'aime »
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

il faut pas mettre 5 pour le relay 5 mais 4

J’ai mis exactement ceci dans la requête :

/var/www/html/plugins/script/data/Soupe 4 http://192.168.1.4/30000/42

Et j’ai cette erreur

Erreur dans l'exécution du terminal, la valeur retournée est : 1. Détails : File "/var/www/html/plugins/script/data/Soupe", line 5 0 if 'OFF'==BeautifulSoup(requests.get(argv[2]).content, "html.parser").find_all('p')[int(argv[1]].text.split()[1] else 1 ^ SyntaxError: invalid syntax

Reprend ce script la il manquait un print et une )

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

Resultats avec python:

Tous les relais activés:
image

Relais activés de 1 à 4:
image

Relais activés de 5 à 8:
image

Configuration:

Apparemment il ne fait pas de différence avec les 2 groupes