Forum eedomus
http://forum.eedomus.fr/

Récupérer le nombre d'heures de soleil API weatherstack
http://forum.eedomus.fr/viewtopic.php?f=15&t=12308
Page 1 sur 1
Auteur:  bigjohn007 [ 06 Juil 2024 06:25 ]
Sujet du message:  Récupérer le nombre d'heures de soleil API weatherstack

Bonjour,

J'utilise l'API de Merguez pour récupérer la météo sur Weatherstack. Hélas je suis incapable de modifier le script php pour aller chercher le nombre d'heures de soleil du lendemain.

J'ai tenté de créer un capteur HTTP qui lit bien les données mais impossible d'extraire celle qui m'interesse dans la réponse reçue de l'API.

Pouvez-vous m'aider ?

Voici l'url utilisée dans le capteur: http://api.weatherstack.com/forecast?ac ... query=Lyon

J'obtiens cette réponse du serveur:
{"request":{"type":"City","query":"Lyon, France","language":"en","unit":"m"},"location":{"name":"Lyon","country":"France","region":"Rhone-Alpes","lat":"45.750","lon":"4.850","timezone_id":"Europe\/Paris","localtime":"2024-07-06 07:17","localtime_epoch":1720250220,"utc_offset":"2.0"},"current":{"observation_time":"05:17 AM","temperature":22,"weather_code":302,"weather_icons":["https:\/\/cdn.worldweatheronline.com\/images\/wsymbols01_png_64\/wsymbol_0018_cloudy_with_heavy_rain.png"],"weather_descriptions":["Rain Shower"],"wind_speed":22,"wind_degree":170,"wind_dir":"S","pressure":1009,"precip":0,"humidity":65,"cloudcover":62,"feelslike":25,"uv_index":5,"visibility":10,"is_day":"yes"},"forecast":{"2024-07-05":{"date":"2024-07-05","date_epoch":1720137600,"astro":{"sunrise":"05:58 AM","sunset":"09:33 PM","moonrise":"04:47 AM","moonset":"09:51 PM","moon_phase":"New Moon","moon_illumination":1},"mintemp":14,"maxtemp":28,"avgtemp":21,"totalsnow":0,"sunhour":15.3,"uv_index":7}}}

Dans le capteur, je demande le xpath suivant: //sunhour
Et le résultat pour l'eedomus est en erreur:
Résultat XPath :
ERREUR: Valeur lue vide
Auteur:  opa95 [ 06 Juil 2024 09:14 ]
Sujet du message:  Re: Récupérer le nombre d'heures de soleil API weatherstack

Bonjour bigjohn007
bigjohn007 a écrit:Bonjour,

J'utilise l'API de Merguez pour récupérer la météo sur Weatherstack. Hélas je suis incapable de modifier le script php pour aller chercher le nombre d'heures de soleil du lendemain.

J'ai tenté de créer un capteur HTTP qui lit bien les données mais impossible d'extraire celle qui m'interesse dans la réponse reçue de l'API.

Pouvez-vous m'aider ?

Voici l'url utilisée dans le capteur: http://api.weatherstack.com/forecast?ac ... query=Lyon

J'obtiens cette réponse du serveur:
Code : Tout sélectionner
{"request":{"type":"City","query":"Lyon, France","language":"en","unit":"m"},"location":{"name":"Lyon","country":"France","region":"Rhone-Alpes","lat":"45.750","lon":"4.850","timezone_id":"Europe\/Paris","localtime":"2024-07-06 07:17","localtime_epoch":1720250220,"utc_offset":"2.0"},"current":{"observation_time":"05:17 AM","temperature":22,"weather_code":302,"weather_icons":["https:\/\/cdn.worldweatheronline.com\/images\/wsymbols01_png_64\/wsymbol_0018_cloudy_with_heavy_rain.png"],"weather_descriptions":["Rain Shower"],"wind_speed":22,"wind_degree":170,"wind_dir":"S","pressure":1009,"precip":0,"humidity":65,"cloudcover":62,"feelslike":25,"uv_index":5,"visibility":10,"is_day":"yes"},"forecast":{"2024-07-05":{"date":"2024-07-05","date_epoch":1720137600,"astro":{"sunrise":"05:58 AM","sunset":"09:33 PM","moonrise":"04:47 AM","moonset":"09:51 PM","moon_phase":"New Moon","moon_illumination":1},"mintemp":14,"maxtemp":28,"avgtemp":21,"totalsnow":0,"sunhour":15.3,"uv_index":7}}}

Dans le capteur, je demande le xpath suivant: //sunhour
Et le résultat pour l'eedomus est en erreur:
Résultat XPath :
ERREUR: Valeur lue vide

L'erreur vient du champ "forecast":{"2024-07-05" qui crée un en-tête de champ XML <2024-07-05>et </2024-07-05> qui n'est pas acceptable par l'eedomus : il faudrait ajouter un caractère alphabétique pour avoir "forecast":{"_2024-07-05". donc remplacer dans la chaine "forecast":{" par "forecast":{"_ ou plus simplement {"2 par {"_2 (valable jusqu'en 2999).
Le plugin de Merguez utilise l'appel à
http://api.openweathermap.org/data/2.5/ ... =xxxxxxxxx
qui ne renvoie pas d'information sur sur le nombre d'heures d'ensoleillement. :)
Auteur:  opa95 [ 06 Juil 2024 10:58 ]
Sujet du message:  Re: Récupérer le nombre d'heures de soleil API weatherstack

Bonjour bigjohn007 (suite et fin?)
Voici une version du script qui fonctionne et est un peu mieux protégée : les données sont mises en cache et le polling réel vers le site limité par défaut à 250 par mois (limite de l'abonnement gratuit) (un appel toutes les 3 heures). Elle te permet d'accéder à tous les champs.
Sauve le script sous le nom "weatherstack.php"
Crée un capteurr HTTP avec
une requête :
Code : Tout sélectionner
http://localhost/script/?exec=weatherstack.php&commune=[VAR1]&key=[VAR2]&quota=[VAR3]

VAR1 -> commune (Lyon pour toi)
VAR2 -> cle weatherstack
VAR3 -> quota mensuel (250 si vide, pas de limite si valeur 0)
XPATH -> //sunhour ou ce que tu veux et tu obtiens 15.3 pour aujourd'hui
Active la transformation JSON -> XML dans les paramètres expert
Tu peux déboguer dans la fenêtre "test" en ajoutant &debug=1 à la chaine de commande et éventuellement remplacer &quota= par &quota=0 (mais tu vas "bouffer" une connexion à chaque essai)
:)
Code
Code : Tout sélectionner
<?php
// appel weatherstack depuis eedomus (opa95 2024/07/06)
//http://localhost/script/?exec=weatherstack.php&commune=[VAR1]&key=[VAR2]&quota=[VAR3]
//VAR1 = commune
//VAR2 = cle
//VAR3 = quota mensuel (250 par défaut) si 0, force la lecture
//activer la transformation json -> XML
//Ne pas dépasser le nombre d'appels autorisés
//En mode test ajouter &debug=1 et éventuellement &quota=0
  define('MEM','mem');
  define('DEBUG',0);
  define('QUOTA',250);//quota par mois abonnement gratuit
   $now = time();
  $debug   = getArg('debug',false,DEBUG);
  $quota   = getArg('quota',false,QUOTA);
  $mem     = getArg('memoire',false,MEM);
  $commune = getArg('commune');
  $key     = getArg('key');
   $delta_time = ($quota>0)? ceil(86400/floor($quota/31)):0;
   $data = loadVariable($mem);
   $poll = 0;
   if ($data != "") {
      $poll = (($now - $data['time'])>$delta_time)?$poll=1:0;
      if (!$poll) {
         if ($debug) echo "Memoire : $mem ; Delta : $delta_time ; Polling : $poll\n";
         echo $data['json'];die;}
   }
  $url     = 'http://api.weatherstack.com/forecast?';// url du site
  $url    .= 'access_key='.$key.'&query='.$commune;// url du site
   $data['time'] = $now;
  $data['json'] = httpQuery($url, 'GET', NULL, NULL, NULL,false,false,$info,NULL);
  $data['json'] = str_replace('{"2','{"_2',$data['json']);
   if ($info['http_code']==200) saveVariable($mem,$data);
   else {echo "Erreur : ".$info['http_code']." (429 = trop de requetes mensuelles)\n" ;$debug=1;}
   if ($debug) {
      echo "Polling : $poll\n";
      var_dump($info);
      die;
   }
  echo $data['json'];
?>

et tu obtiens cela:
Code : Tout sélectionner
<?xml version="1.0" encoding="ISO-8859-1"?>
<root><request><type>City</type>
<query>Lyon, France</query>
<language>en</language>
<unit>m</unit>
</request>
<location><name>Lyon</name>
<country>France</country>
<region>Rhone-Alpes</region>
<lat>45.750</lat>
<lon>4.850</lon>
<timezone_id>Europe\/Paris</timezone_id>
<localtime>2024-07-06 11:46</localtime>
<localtime_epoch>1720266360</localtime_epoch>
<utc_offset>2.0</utc_offset>
</location>
<current><observation_time>09:46 AM</observation_time>
<temperature>20</temperature>
<weather_code>302</weather_code>
<weather_icons><weather_icons>https:\/\/cdn.worldweatheronline.com\/images\/wsymbols01_png_64\/wsymbol_0018_cloudy_with_heavy_rain.png</weather_icons>
</weather_icons>
<weather_descriptions><weather_icons>Rain Shower</weather_icons>
</weather_descriptions>
<wind_speed>9</wind_speed>
<wind_degree>200</wind_degree>
<wind_dir>SSW</wind_dir>
<pressure>1010</pressure>
<precip>0.1</precip>
<humidity>88</humidity>
<cloudcover>75</cloudcover>
<feelslike>20</feelslike>
<uv_index>5</uv_index>
<visibility>10</visibility>
<is_day>yes</is_day>
</current>
<forecast><_2024-07-05><date>2024-07-05</date>
<date_epoch>1720137600</date_epoch>
<astro><sunrise>05:58 AM</sunrise>
<sunset>09:33 PM</sunset>
<moonrise>04:47 AM</moonrise>
<moonset>09:51 PM</moonset>
<moon_phase>New Moon</moon_phase>
<moon_illumination>1</moon_illumination>
</astro>
<mintemp>14</mintemp>
<maxtemp>28</maxtemp>
<avgtemp>21</avgtemp>
<totalsnow>0</totalsnow>
<sunhour>15.3</sunhour>
<uv_index>7</uv_index>
</_2024-07-05>
</forecast>
</root>
Auteur:  bigjohn007 [ 21 Juil 2024 05:09 ]
Sujet du message:  Re: Récupérer le nombre d'heures de soleil API weatherstack

Bonjour Opa,

Un immense merci, cela fonctionne à merveille !!

Mes connaissances en XML/PHP sont bien trop limitées, je n'y serais pas arrivé sans toi.
Bien amicalement,

Jean
Page 1 sur 1 Le fuseau horaire est UTC+1 heure