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

Bonjour,

La passerelle ne crypte pas les données lors de l’envoi à leur serveur ?

A vérifier évidemment , mais tu peux renvoyer tel que de toute façon, l’interception est assez compliqué du coup.
Il y a un programme chez eux pour modifier les adresses IP et le routeur, mais pas le serveur !
Je suis avec « Pihole » pour détourner intercepter le DNS
Info de la page de la Passerelle modifiée

Mais si la passerelle envoi des données cryptées je ne vois pas comment on peut les extraire pour les intégrer dans Jeedom.

L’idéale serait de pouvoir se passer de cette passerelle et de récupérer les infos par le rfplayer mais pour le moment il ne gère pas le protocole LaCrosse.

peut être avec un module passerelle 868 mhz / wifi 2.4 ghz / lora autre que rfplayer, mais il faudrait connaitre le protocole MA + gros boulot pour mettre en œuvre !

bizarre pour moi tout fonctionnait bien jusqu’au 25/06 et depuis plus rien. j’ai bien pensé au user agent mais je ne voyais pas comment faire…

MERCI LAURENT !

bon j’ai quand même un peu galéré a adapter ton code à ma config mais ca roule !

Bonjour à tous,

Voici ci-dessous un code un peu plus intelligent que mon code initial. Il permet de renseigner les différentes sondes à extraire dans une variable liste unique et prend en compte l’heure du relevé (la commande n’est mise à jour que si la mesure à moins de 15 minutes), ce qui permet à Jeedom de gérer les alertes communications.

$phoneid="PHONE ID";

$tabmodules = [
    ["Cave","/html/body/div[2]/div[1]/div/div/div[1]/h3/a","/html/body/div[2]/div[1]/div/div/div[3]/h4",[//Titre du capteur, Chemin xpath du titre, Chemin xpath de la date/heure du relevé
		["/html/body/div[2]/div[1]/div/div/div[4]/h4",3011],//Chemin xpath de la mesure, Id. de la commande
		["/html/body/div[2]/div[1]/div/div/div[6]/h4",3012]]],
    ["Piscine","/html/body/div[2]/div[5]/div/div/div[1]/h3/a","/html/body/div[2]/div[5]/div/div/div[3]/h4",[
		["/html/body/div[2]/div[5]/div/div/div[4]/h4",2996],
		["/html/body/div[2]/div[5]/div/div/div[6]/h4",2998]]],
    ["Piscine 2","/html/body/div[2]/div[6]/div/div/div[1]/h3/a","/html/body/div[2]/div[6]/div/div/div[3]/h4",[
		["/html/body/div[2]/div[6]/div/div/div[5]/h4",2934]]],
    ["Maison","/html/body/div[2]/div[4]/div/div/div[1]/h3/a","/html/body/div[2]/div[4]/div/div/div[3]/h4",[
		["/html/body/div[2]/div[4]/div/div/div[5]/h4",3003],
		["/html/body/div[2]/div[4]/div/div/div[6]/h4",3005],
		["/html/body/div[2]/div[4]/div/div/div[4]/h4",3015],
		["/html/body/div[2]/div[4]/div/div/div[7]/h4",3000]]],
    ["Etage","/html/body/div[2]/div[3]/div/div/div[1]/h3/a","/html/body/div[2]/div[3]/div/div/div[3]/h4",[
		["/html/body/div[2]/div[3]/div/div/div[4]/h4",3007]]]
];

$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=".$phoneid,false,$stream); 
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXpath($dom);

$now_timestamp=time();

foreach ($tabmodules as list($module_titre,$module_titre_xpath,$module_dateheure_xpath,$tabcapteurs)) {

  $module_timestamp=date_format(date_create_from_format("d/m/Y H:i:s",$xpath->query($module_dateheure_xpath)[0]->childNodes[0]->nodeValue),'U');
  
  if (( $xpath->query($module_titre_xpath)[0]->childNodes[0]->nodeValue == $module_titre ) && ($now_timestamp-$module_timestamp<900)) {
  
  	foreach ($tabcapteurs as list($capteur_xpath,$capteur_cmdid)) {
    
       	$value=$xpath->query($capteur_xpath)[0]->childNodes[0]->nodeValue;
    	if ($value!="---" && $value!="OFL") {

          cmd::byId($capteur_cmdid)->event($value);
          
          $scenario->setLog($module_titre." (".($now_timestamp-$module_timestamp).") "."->".$value);
          
        };
  	};
  
  };
  
};

Problème de connexion sur mobile alerts eu depuis le 2 janvier connexions très lentes ou bloquées !

Chez moi aussi mais sur l’application iPhone cela semble fonctionner normalement…

Sur Mobile Alerts dans mon Smartphone Galaxy sous Android no problème,
par contre sur le cloud https://measurements.mobile-alerts.eu c’est très variable.
Du cout je test la longueur de retour du string HTML et abandonne si longueur = 0.

$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); 
$sonde = 1;

// ----------------- Controle Reception longueur de trame Html ----------- Si trame à zéro abandon -----------------------
$lenhtml = strlen($html);
if ($lenhtml<1) $sonde=0;
$scenario->setLog("taille html=".$lenhtml." Sonde=".$sonde);
cmd::byId(4340)->event($sonde);
if ($lenhtml<1) goto end;

La variable sonde donne le chronogramme ci-dessous
depuis qq jours c’est presque redevenu normale (interrogation toute les 7mn).

En cas de blocage le log attend 1 minute sur le « file_get ».
Dans ce cas j’ai testé manuellement en me connectant en directe avec Firefox sur le lien https://measurement… , idem le site met plusieurs minutes a répondre voir pas du tout !
A quoi sert l’option « false » du « file_get », exist il un moyen php d’attendre plus longtemps le « file_get » sans faire une boucle bloquante ?

L’option false indique à file_get qu’il ne doit pas aller chercher le flux dans le PATH d’inclusion, cela n’est utile que pour lire dans un fichier mais il s’agit d’une requête http.

En ce qui concerne le réglage de l’attente maximum c’est possible ainsi :

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

timeout = 10 secondes par exemple.

Mais l’attente est bloquante, que voulez vous dire par « sans faire une boucle bloquante » ?

je pensais relancer l’instruction « file_get » tant que le retour était à zéro, avec risque de boucle infinie… si le site ne répond pas…

Merci pour la solution « timeout » du « stream_context », je vais tester voir si ça améliore en cas d’attente du site

Je viens de tester à 120s, sur une non réponse effectivement le log continue au bout de 2mn, mais pas mieux en ce moment. je laisse comme ça pour l’instant.

Ces problèmes commencent à durer et pour ma part je pense sérieusement à remplacer mes équipements Mobile-Alerts et abandonner ce protocole qui ne m’a jamais vraiment donné satisfaction. J’avais fait ce choix en particulier pour avoir des sondes de qualité de l’air et de température de l’eau de ma piscine qui n’existaient alors pas en z-wave, rf433 ou zigbee mais ce n’est plus le cas. Et il ne semble pas que Mobile-Alerts puisse s’interfacer mieux à Jeedom prochainement. Leur API est limitée et n’est pas supportée par tous les équipements et cette solution d’extraction, même quand elle fonctionne, ne me donne pas entière satisfaction. Par ailleurs je préfère limiter les passerelles quand c’est possible, j’ai déjà des clés zwave, enocean, bluetooth, rfplayer et zigbee et un pont hue et si je peux me passer de la passerelle Mobile-Alerts ce n’est pas plus mal !

Je comprends parfaitement dans ton cas !
En ce qui me concerne j’ai 11 sondes Temp/hygro avec une station Météo pour les tempêtes (j’habite en font de mer). Anémomètre Pluviomètre Mobile Alerte pour actionner les volets en DIO 433 RFplayer.
Mes sondes gèrent ma vmc et mon chauffage en fonction de la présence de la pleine occupation ou non des extensions de la maison. J’ai aussi du ZWave pour la présence et les Thermostats pilotés.
Mais tout passer en Zwave représente un cout pour les sondes, pour la station météo je ne sait pas se qui se fait !
Le Zigbee je n’ai pas mais ça m’intéresse pour des raison de cout, par compte je ne sais pas si ça pourrait passer partout (wifi 2,4ghz), je crois qu’il faudrait que je passe par des répéteurs maillé (mesh), après se pause la question de la santé !
Je vais tester la fiabilité du wifi avec 2-3 modules shelly
Bref un vaste sujet cout / fiabilité / santé…

Je suis en train de migrer sur du Zigbee mais effectivement il faut beaucoup plus de modules répéteurs pour que le réseau fonctionne parfaitement. Rien à voir avec le zwave. En ce qui concerne anémomètre et pluviomètre je suis sur Oregon en RF433/rfplayer, je n’ai qu’une station météo et des thermomètres en Mobile Alerts.

Moi aussi j’ai jeté l’éponge avec cette solution.
Je pense partir sur la girouette anemometre zwave.

POPP Z-Weather ? Je pense aussi migrer dessus le jour ou mes équipements Oregon RF433 seront hors service. Elle est pas si chère qu’en apparence finalement pour toutes les mesures effectuées (vitesse du vent, température, pression atmosphérique, humidité), manque juste la direction du vente (mais parfaitement inutile me concernant).

Slt…
Pour ma part, je suis partis sur une version MQTT pour récupérer les infos Mobile-Alertes, voir Github
Ta 1ere version tourne encore sous Jeedom , j’ai du limiter le timeout à 20s dans la config du scénario et j’ai fais un peu comme @mick37 un test sur la requête …
# @+D(Ô¿Ô)M

{"temperature":[0.5,19.7,14.9,22.7],"humidity":[87,49,56,43],"id":"********","t":"2020-12-31T15:43:43.000Z","offline":true}

Le souci comme on la évoqué plus haut c’est la disponibilité du measurement.eu qui ne répond pas toujours avec le navigateur.
L’idéal serait du pouvoir lire les trames envoyées par le concentrateur Mobile Alerts, avec peut être un Raspi dédié à ça, pour avoir une solution 100% off line.

Pour cela il faut modifier dans la Gateway son proxy !

Use Proxy	Yes
Proxy Server Name	192.168.0.**
Proxy Port	8080
Proxy Server IP	192.168.0.**
Last contact	164183263100
RF channel	2

Normalement c’est comme ça …

Use Proxy	No
Proxy Server Name	192.168.1.1
Proxy Port	80
Data Server IP	23.97.212.128
Last contact	164183263600
RF channel	2

J’en avais déjà parlé au début du prog fait par @laurent.da-col

Mais si la version MQTT utilise les API Mobile Alerts alors cela n’est pas compatible avec toutes les sondes.