Extraction données de sondes Mobile-Alerts/La Crosse

le code php génère une erreur quand il est appelé dans le script.


Slt @Mips
La question est de savoir pourquoi depuis hier à partir de 8 / 9 H la requête ne passe plus ?
Même si je l’ai refait dans un scénario en bloc code .

Un changement côté serveur probablement qui fait qu’à présent une requête sans user-agent est bloquée.
Impossible à savoir.
Mais qu’importe si ça passe avec le user-agent définit c’est bon non ?

Oui impec…
Oui doit venir de chez eux, car d’autres requêtes sur d’autres sites passent du coup !
Merci…

Oui effectivement mais comme j’ai plusieurs extractions à faire dans la même page html j’ai préféré mettre tout cela dans un unique scénario.

Pour avoir le paramètre XPath j’ai utilisé le menu Outils de développement de Chrome, il permet de récupérer directement le chemin xpath.

Voici mon code :

$stream = stream_context_create(Array("http" => Array("method"  => "GET",
                                                      "header"  => "User-agent: PHP",
                                ))); 

$html = file_get_contents("https://measurements.mobile-alerts.eu/Home/SensorsOverview?phoneid=XXXXXXXXX",false,$stream); 

//$scenario->setLog(strlen($html));

$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXpath($dom);

if ( $xpath->query("/html/body/div[2]/div[5]/div/div/div[1]/h3/a")[0]->childNodes[0]->nodeValue == "Piscine" ) {
   	$value=$xpath->query("/html/body/div[2]/div[5]/div/div/div[5]/h4")[0]->childNodes[0]->nodeValue;//Température Piscine
    if ($value!="---" && $value!="OFL") cmd::byId(2934)->event($value);

   	$value=$xpath->query("/html/body/div[2]/div[5]/div/div/div[4]/h4")[0]->childNodes[0]->nodeValue;//Température Jardin
    if ($value!="---" && $value!="OFL") cmd::byId(2996)->event($value);

   	$value=$xpath->query("/html/body/div[2]/div[5]/div/div/div[6]/h4")[0]->childNodes[0]->nodeValue;//Hygrométrie Jardin
    if ($value!="---" && $value!="OFL") cmd::byId(2998)->event($value);
}

2 « J'aime »

C’est sûr, c’est propre et simple, et ça évite les commandes script. OK, je vais l’intégrer !

Bravo, super boulot !
Ok ça marche pour moi.
j’ai une vingtaine de mesures temp, hyro, météo…
les temp gère les température par pièce au travers de robinet thermostatiques zwave.
les hygro des salles de bain gère la vmc.
la météo (soleil ou tempête) et lumandar gère les volets.
Je cherchais a les intégrer en php, pour m’éviter tous les scripts.
Grand merci :grinning:

:smiley: :smiley::smiley::smiley::smiley::smiley:

Bonjour, @mick37 @HermioneG @Mips @laurent.da-col
Le site et de nouveau accessible par la méthode ! depuis un script .
Mais cela fonctionne avec un bloc code dans le scénario, donc on reste comme çà . :upside_down_face:
Merci à tous .

L’avantage du bloc code est que lorsqu’une sonde ne fonctionne pas (— ou OFL) la commande Jeedom n’est pas mise à jour avec une valeur égale à 0 d’une part et en plus le mécanisme de surveillance des équipements fonctionne, si un équipement n’a pas eu de transmission depuis un certain temps une alerte se produit.

Bonjour et merci pour le bloc code.
Malheureusement je ne comprends pas très bien comment récupérer les valeurs dan un virtuel.
Comment procéder ?
Par avance merci de votre aide.

Bonjour,
Il te faut créer autant de virtuel (au moins) que le nombre de mesures de tes capteurs.
Puis récupérer les ID de ces virtuels et y faire référence dans le code du scénario .

   	$value=$xpath->query("/html/body/div[2]/div[5]/div/div/div[5]/h4")[0]->childNodes[0]->nodeValue;//Température Piscine
    if ($value!="---" && $value!="OFL") cmd::byId(2934)->event($value);

Dans l’exemple de @laurent.da-col , correspond à la mesure de son capteur qui se trouve être le 5éme capteur qu’il récupère dans le virtuel avec l’ID « 2934 » cmd::byId(2934) qui se trouve sur la 5éme donnée de ce capteur .

Effectivement c’est la fonction cmd::byId(X)->event($value) qui envoie à Jeedom la valeur. X est l’identifiant de la commande (et non du virtuel). Un équipement Jeedom peut contenir plusieurs commandes de type info. Par exemple dans mon cas j’ai un virtuel Cave qui contient deux commandes infos (témpérature et hygrométrie) qui sont toutes deux mises à jour par deux appels cmd::byId().

Merci de m’avoir répondu mais je ne sais pas encore très bien comment procéder.
J’ai bien récupéré le xpath de la valeur que je souhaite afficher mais quelle est la valeur de X dans cmd::byId(X) ? J’ai fait un copier collé de votre code ajusté pour mon Mobil-Alerts et je suppose que je que je dois trouver quelque part cette valeur X, mais où ?
Ensuite comment tester que tout soit ok pour l’intégrer dans un virtuel par l’appel d::byId() ?
Merci encore de bien vouloir m’assister…

Dans le virtuel vous avez les ID dans l’onglet équipement :

Que voulez vous dire par tester sur tout soit ok ?

if ( $xpath->query("/html/body/div[2]/div[2]/div/div/div[4]/h5")[0]->childNodes[0]->nodeValue == "Piscine" ) {
   	$value=$xpath->query("/html/body/div[2]/div[2]/div/div/div[4]/h4")[0]->childNodes[0]->nodeValue;//Température Piscine
    if ($value!="---" && $value!="OFL") cmd::byId(26030)->event($value);

Si j’appuie sur le bouton ‹ Tester › à droite sur la copie d’ écran ne devrai-je pas voire la valeur de la sonde s’afficher ?

Non impossible ce n’est pas la commande qui va chercher la valeur c’est un scénario qui l’alimente. Vous ne devez rien mettre dans la zone Valeur de la commande.

Vous devez créer un scénario avec le bloc code suivant :

$stream = stream_context_create(Array("http" => Array("method"  => "GET",
                                                      "header"  => "User-agent: PHP",
                                ))); 

$html = file_get_contents("https://measurements.mobile-alerts.eu/Home/SensorsOverview?phoneid=XXXXXXX",false,$stream); 

//$scenario->setLog(strlen($html));

$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXpath($dom);

if ( $xpath->query("/html/body/div[2]/div[1]/div/div/div[1]/h3/a")[0]->childNodes[0]->nodeValue == "Cave" ) {
   	$value=$xpath->query("/html/body/div[2]/div[1]/div/div/div[4]/h4")[0]->childNodes[0]->nodeValue;//Température
    if ($value!="---" && $value!="OFL") cmd::byId(3011)->event($value);
}

Vous remplacez dans ce code XXXXXXX par votre phoneid et bien sur les xpath et le 3011 par votre identifiant (26030).

Le scénario est de type Programmé et doit se lancer par exemple toutes les 15 minutes pour envoyer les valeurs au virtuel régulièrement.

Je viens de refaire le test sans rien rien mettre dans la zone valeur et bien sur programmé un scénario toutes les 15 minutes avec les bonnes valeurs phoneid et identifiant (26030), mais comment faire pour visualiser la valeur dans le virtuel ?
Désolé, mais il doit me manquer une information :thinking:

Slt , Quelqu’un sait’il si c’est possible de récupérer les données sur le serveur local de la station météo plutôt que le serveur mobile-alerts ?