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
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:
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
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
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.
Bien sur, toutes les solutions m’intéressent
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é:
relais 1 à 4 activés (même résultat quand tous les relais sont activés):
relais 5 à 8 activés:
On n’est vraiment pas loin du but
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) ?
Tout fonctionne en ajoutant le /42 et /43, super !
Un très très gros merci à vous pour votre implication dans ce sujet !
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)