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

Bonjour,

J’utilise le plugin script depuis plusieurs mois pour extraire les valeurs de plusieurs sondes Mobile Alerts/La crosse (extraction du site https://measurements.mobile-alerts.eu dans une commande info de type html.

Depuis ce matin je n’ai plus aucune valeur alors que le site est toujours accessible et ne semble pas avoir changé quand je m’y rend avec un navigateur.

Afin de comprendre le problème j’ai programmé la requête dans un scénario/code PHP par la fonction file_get_contents et je n’obtiens rien. J’ai alors spécifié un User-Agent et la ca fonctionne sans problème :

stream = stream_context_create(Array("http" => Array("method"  => "GET",
                                                      "header"  => "User-agent: PHP",
                                ))); 
$res = file_get_contents("https://measurements.mobile-alerts.eu/Home/SensorsOverview?phoneid=XXXXXX",false,$stream); 

J’ai lors modifié le fichier php.ini pour prendre en compte user_agent=« PHP » mais rien n’y fait mon script de fonctionne pas.

Peut-être que quelqu’un de Jeedom en charge du plugin script peut-il me dire si un moyen peut me permettre de paramétrer le User-Agent utilisé par le plugin script ?

Merci

1 « J'aime »

j’ai remplacer les « » par " "
pour moi ton code fonctionne… :grinning:
reste à récupérer les valeur, ça se complique …

Slt les gars…
Le plus simple c’est de mettre le résultat dans une variable …

$stream = stream_context_create(Array("http" => Array("method" => "GET","header" => "User-agent: PHP",)));
$res = file_get_contents("https://measurements.mobile-alerts.eu/Home/SensorsOverview?phoneid=XXXXXX",false,$stream);
#$scenario->setlog("retour: ".$res);
$scenario->setData('MesureMobileAlertes', $res);

après on fait le tri

Pour @laurent.da-col essai de mettre le code entre des balises , pour ne pas avoir de problème avec certain caractere

Le plus direct c’est de mettre dans un virtuel du coup …

$stream = stream_context_create(Array("http" => Array("method" => "GET","header" => "User-agent: PHP",)));
$resultat = file_get_contents("https://measurements.mobile-alerts.eu/Home/SensorsOverview?phoneid=TON ID TELEPHONE",true,$stream);
cmd::byId('ID DU VIRTUEL')->event($resultat);

et après tu refais le tri avec ton script ( sur Url de ton ID) ou autres …

1 « J'aime »

C’est le copier/coller qui m’a remplacé les " par <<>>. Mon code PHP fonctionne sans problème c’est l’utilisation d’une commande de type « html » (avec extraction jquery) qui ne fonctionne plus car le plugin script ne doit rien envoyer dans le user-agent lorsqu’il fait la requête http.

J’ai donc commencé à réécrire tout cela en PHP dans un scénario et finalement ce n’est pas plus mal !

Aucun problème pour récupérer les valeurs avec xpath :

$html = file_get_contents("https://measurements.mobile-alerts.eu/Home/SensorsOverview?phoneid=XXX",false,$stream); 
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXpath($dom);
$elements = $xpath->query("/html/body/div[2]/div[1]/div/div/div[4]/h4");

Merci pour les réponses.

1 « J'aime »

C’est bien pour cela que @Doubledom demandait d’utiliser la balise Texte préformaté via l’outils </>.
J’ai édité vos deux posts pour l’exemple.

1 « J'aime »

Une autre solution était d’appeler un script Php via le plug-in script au lieu d’appeler l’URL directement (donc type script Php au lieu de type html) et dans le script vous pouviez mettre votre code custom avec le user-agent voulu.

Il n’est pas possible de le spécifier via une commande script de type html

le retour
$xpath->query("/html/body/div[2]/div[1]/div/div/div[4]/h4");
me génère une erreur, j’ai essayer en changent les valeurs numériques ?

mon selecteur jquery google me retourne une valeur suivant mon ordre de sonde
ex: la 3eme et le champ à lire le premier
a quoi correspondent les 3 valeurs de ta requête ?

div.body-content>div:nth-child(3)>div>div>div:nth-child(1)>div>h4

extrait du code HTML de ma sonde frigo

<div class="sensor-header">
    <h3>
        <a href="/Home/MeasurementDetails?deviceid=026A0764C0ED&amp;vendorid=4c53e230-d64b-43a0-94e9-dc769499587b&amp;appbundle=eu.mobile_alerts.mobilealerts">Frigo</a>
    </h3>
    <div class="sensor-component">
        <h5>ID</h5>
        <h4>026A0764C0ED</h4>
    </div>
</div>

<div class="nofloat"></div>

    <div class="sensor-component">
        <h5>Relev&#233;s avec date</h5>
        <h4>15/04/2021 08:12:30</h4>
    </div>
    <div class="sensor-component">
        <h5>Temp&#233;rature</h5>
        <h4>3,8 C</h4>
    </div>
        </div>
    </div>
</div>

<div class="panel panel-default">
    <div class="panel-body">
        <div class="sensor">


Merci pour ton aide

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 .