Récupérer le nombre d'heures de soleil API weatherstack

Capteurs et actionneurs HTTP

Récupérer le nombre d'heures de soleil API weatherstack

Messagepar bigjohn007 » 06 Juil 2024 06:25

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
bigjohn007
 
Messages : 13
Inscription : 20 Août 2023

Re: Récupérer le nombre d'heures de soleil API weatherstack

Messagepar opa95 » 06 Juil 2024 09:14

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. :)
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 870
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: Récupérer le nombre d'heures de soleil API weatherstack

Messagepar opa95 » 06 Juil 2024 10:58

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>
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 870
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: Récupérer le nombre d'heures de soleil API weatherstack

Messagepar bigjohn007 » 21 Juil 2024 05:09

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
bigjohn007
 
Messages : 13
Inscription : 20 Août 2023


Retour vers Requêtes HTTP

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 19 invité(s)