[Store]Script : Météo du jour

Discussion et échanges de scripts pour la box eedomus

Re: [Store]Script : Météo du jour

Messagepar opa95 » 27 Mars 2025 19:51

Bonjour Fabrice
Fab_Rice a écrit:Bonsoir à vous et surtout à nos spécialistes de ce plugin ;)

J'ai voulu mettre à jour vers la dernière version du plugin et depuis j'ai systématique cette notification concernant la ville :
Ville station météo Extérieur en erreur: [Impossible de parser le XML]. avec un aperçu à "1" et un test qui renvoi "ERREUR: Valeur lue vide"
Mon URL est la suivante :
http://localhost/script/?exec=openweath ... a&commune=[VAR1]&key=[VAR2]&country=[VAR3]
Et mon XPATH est celui-ci :
//@city_GPS
Sauriez vous me dire où est la coquille ?
Merci à vous

Il y a longtemps, que je ne l'ai pas utilisé, je ne sais pas si nous avons la même version.
Mes réponses ne sont pas correctes, mais je ne n'ai pas de réponse qui correspond à une erreur sur le traitement php (affichage :) de 1).
Chez moi l'erreur est une erreur 401 qui correspond à un accès non autorisé Il faudrait que je vérifie mes codes qui ne doivent plus être à jour.
Tu peux essayer en mode test en ajoutant
&debug=1&mem=no ou seulement &debug=1
et voir quand ça plante :)
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 : 984
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store]Script : Météo du jour

Messagepar Hervé1810 » 15 Sep 2025 19:15

Bonjour Fab_Rice,

J'ai l'impression que j'ai le même problème et je n'arrive pas à faire fonctionner le plugin.
Avez vous réussis à résoudre votre problème ?

Merci.




Fab_Rice a écrit:Bonsoir à vous et surtout à nos spécialistes de ce plugin ;)

J'ai voulu mettre à jour vers la dernière version du plugin et depuis j'ai systématique cette notification concernant la ville :
Ville station météo Extérieur en erreur: [Impossible de parser le XML]. avec un aperçu à "1" et un test qui renvoi "ERREUR: Valeur lue vide"
Mon URL est la suivante :
http://localhost/script/?exec=openweath ... a&commune=[VAR1]&key=[VAR2]&country=[VAR3]
Et mon XPATH est celui-ci :
//@city_GPS
Sauriez vous me dire où est la coquille ?
Merci à vous
Hervé1810
 
Messages : 3
Inscription : 24 Jan 2023

Re: [Store]Script : Météo du jour

Messagepar squalou » 06 Juin 2026 07:39

Bonjour,
J'ai eu le même problème.
Voici le script corrigé (merci Claude IA) qui permet de retrouver le bon fonctionnement.
Je laisse aux auteurs ou à l'équipe eedomus le soin de le mettre a jour sur le store.
Merci.

Code : Tout sélectionner
<?php

/*************************************************************************************************************************************
 * Script Meteo du Jour basé sur le site OpenWeather.com pour box eedomus
 * Développement par dommarion et opa95 - V2.3
 *
 * V2.3 : corrections de bugs (voir le courrier d'accompagnement pour le détail
 *        et la justification de chaque modification). Synthèse :
 *  - daily   : is_invalid_matrice -> $is_invalid_matrice ($ manquant)
 *  - hourly  : initialisation de $jour_loc_sem et $heure_ avant la boucle
 *  - DJU     : $old_dju (inexistant) -> $old_data['dju']
 *  - mémoire : $buffername (faute de frappe) -> $buffer_name
 *  - hourly  : suppression de la variable fantôme $xml_
 *  - load/save : pas d'accès aux variables eedomus quand mem=no (3 endroits)
 *  - sdk_formatTableauXML : variable $xml locale (et non plus le tableau global)
 *  - sdk_formatTableauXML : rain/snow et feels_like gérés qu'ils soient
 *                           scalaires (daily) ou tableaux (hourly/current)
 *  - sdk_formatTableauXML : temp_min/temp_max optionnels (absents en hourly)
 *  - sdk_alertsXML : global $$xml -> variable locale
 *  - sdk_formatXML : valeur 0 en format long n'initialisait pas $xml
 *  - qualité air : URL en 2.5 (l'API Air Pollution n'existe pas en 3.0)
 *  - precipitation : comptage dynamique des entrées minutely (60 ou 61)
 *  - encodage : caractère degré de city_GPS ecrit en entite XML &#176;
 *               (sinon octet Latin-1 0xB0 invalide dans un flux UTF-8)
 *  - encodage : weather_main / weather_desc passes par sdk_utf8() car l'API
 *               arrive en Latin-1 sur la box (accents : legere, moderee, degage...)
 *  - robustesse : is_array() avant count() (geocoding et meteo)
 *
 * Appel Master : http://localhost/script/?exec=openweather.php&commune=[VAR1]&key=[VAR2]&country=[VAR3]&device=Master
 * Appel autres : http://localhost/script/?exec=openweather.php&key=[VAR2][&device=Sensor]
 *************************************************************************************************************************************/

define ('DEFCOUNTRY' , 'FR');
define ('DEFLANG' , 'FR');
define ('DEFDEBUG',0);
define ('DEFDEVICE','Sensor');
define ('DEFAFFICHE',39);

define ('SEPCOORD',',');
define ('SEPMODE','_');
define ('SEPHEURE','*');
define ('SUFFH','h');
define ('SUFFJ','j');
define ('VOID' , '');
define ('NBDIGIT' , 4);
define ('DJUREF' , 18);

define ('ERRCODE',-9999);
define ('ERRTXT','#Erreur');
define ('ERRCOORD',199);
define ('VALIDHTTP',200);
define ('BUFFERNAME','xml');
define ('NOMEM','no');
define ('FORMATXML','short');
define ('ELEMXML','_elem');

define ('ALERTS',0);


//***************** conversion UTF-8 sure (les chaines de l'API arrivent en Latin-1 sur la box)
function sdk_utf8($s) {
  if ($s === null) return $s;
  // si la chaine est deja de l'UTF-8 valide, on n'y touche pas (evite le double encodage)
  if (preg_match('//u',$s)) return $s;
  return utf8_encode($s);
}// function sdk_utf8

//***************** heure locale
function sdk_hloc($elem,$deltaT = 0,$mode = 'hour') {
  if ($elem == ERRCODE) return ERRCODE;
  else {
    $elem += $deltaT;
    if ($mode == 'hour') return date('G',$elem).':'.date('i',$elem);
    else return date('Y',$elem).'-'.date('m',$elem).'-'.date('d',$elem).' '.date('G',$elem).':'.date('i',$elem);
  }
}// function sdk_hloc

//***************** testNum
function sdk_testNum(&$elem,$is_invalid = false,$err = ERRCODE) {
  if ( ($is_invalid) || (!is_numeric($elem)) ) {$elem = $err;}
}// function sdk_testNum

//***************** testWeather codes
function sdk_testWeather(&$tableau,$is_invalid = false,$err = ERRCODE) {
  if ( (!is_numeric($tableau['id'])) || ($is_invalid) ) {
      $tableau['id']          = ERRCODE;
      $tableau['main']        = ERRTXT;
      $tableau['description'] = ERRTXT;
      $tableau['icon']        = ERRTXT;
    }
}// function sdk_testWeather

//***************** alerts XML
function sdk_alertsXML($tableau) {
  global $delta_h;
    $xml  = sdk_formatXML('values','_beg');
    $xml .= sdk_formatXML('sender',$tableau['sender_name']);
    $xml .= sdk_formatXML('evenement',$tableau['event']);
    $xml .= sdk_formatXML('alert_debut',$tableau['start']);
    $xml .= sdk_formatXML('alert_fin',$tableau['end']);
    $xml .= sdk_formatXML('alert_debut_hloc',sdk_hloc($tableau['start'],$delta_h,'date'));
    $xml .= sdk_formatXML('alert_fin_hloc',sdk_hloc($tableau['end'],$delta_h,'date'));
    $xml .= sdk_formatXML('description',$tableau['description']);
    $xml .= sdk_formatXML('values','_end').PHP_EOL;
    $xml .= sdk_formatXML('tags','_beg','long').PHP_EOL;
    if (is_array($tableau['tags']) && array_key_exists('0',$tableau['tags'])){
      foreach($tableau['tags'] as $cle => $elem){
        $xml .= sdk_formatXML('values','_beg');
        $xml .= sdk_formatXML('tag'.$cle,$elem);
        $xml .= sdk_formatXML('values','_end').PHP_EOL;
      }
    }
    else {
      $xml .= sdk_formatXML('values','_beg');
      $xml .= sdk_formatXML('tag0','notags');
      $xml .= sdk_formatXML('values','_end').PHP_EOL;
    }
    $xml .= sdk_formatXML('tags','_end','long').PHP_EOL;
    return $xml;
}// function sdk_alertsXML

//***************** formatXML donnee
function sdk_formatXML($tag,$value,$formatXML = 'default') {
  global $format;
  if ($formatXML == 'default') $formatXML = $format;

  if ($value === 0) $value = '_0';
  if ($value === null) $value = '_?_?';

  switch ($formatXML) {
      case 'long'  : switch ($value) {
                       case '_?_?'  : $xml = '<'.$tag.'></'.$tag.'>';break;
                       case '_0'    : $xml = '<'.$tag.'>0</'.$tag.'>';break;
                       case '_beg'  : $xml = '<'.$tag.'>';break;
                       case '_end'  : $xml = '</'.$tag.'>';break;
                       default      : $xml = '<'.$tag.'>'.$value.'</'.$tag.'>';
                     }
                     break;
      default      : switch ($value) {
                       case '_?_?'  : $xml = $tag.'="_" ';break;
                       case '_0'    : $xml = $tag.'="0" ';break;
                       case '_beg'  : $xml = '<'.$tag.' ';break;
                       case '_end'  : $xml = '/>';break;
                       default      : $xml = $tag.'="'.$value.'" ';
                     }
  }
  return $xml;
}// function sdk_formatXML

//***************** formattableauXML donnees
function sdk_formatTableauXML(&$tableau,$formatXML = 'default') {
  global $format;
  global $delta_h;
  global $jours_fr;
  $xml = '';

  if ($formatXML == 'default') $formatXML = $format;
  if ($tableau['dt'] == ERRCODE) {
    $local_time = ERRCODE;
    $jour_fr = ERRTXT;
  }
  else {
    $local_time = $tableau['dt'] + $delta_h;
    $jour_fr = $jours_fr[date('w',$local_time)];
  }
  $xml .= sdk_formatXML('num',$tableau['num']);
  $xml .= sdk_formatXML('nom',$tableau['nom']);
  $xml .= sdk_formatXML('dt',$tableau['dt']);
  if ($local_time == ERRCODE) {
    $xml .= sdk_formatXML('date_loc_str',ERRTXT);
    $xml .= sdk_formatXML('heure_loc_str',ERRTXT);
    $xml .= sdk_formatXML('jour_loc_semaine',ERRCODE);
    $xml .= sdk_formatXML('jour_loc_fr',ERRTXT);
  }
  else {
    $xml .= sdk_formatXML('date_loc_str',date('Y',$local_time) . '-' . date('m',$local_time).'-'.date('d',$local_time));
    $xml .= sdk_formatXML('heure_loc_str',date('G',$local_time) . ':' . date('i',$local_time));
    $xml .= sdk_formatXML('jour_loc_semaine',date('w',$local_time));
    $xml .= sdk_formatXML('jour_loc_fr',$jours_fr[date('w',$local_time)]);
  }
  $xml .= sdk_formatXML('sunrise',$tableau['sunrise']);
  $xml .= sdk_formatXML('sunset',$tableau['sunset']);
  $xml .= sdk_formatXML('sunrise_hloc',sdk_hloc($tableau['sunrise'],$delta_h,'date'));
  $xml .= sdk_formatXML('sunset_hloc',sdk_hloc($tableau['sunset'],$delta_h,'date'));
  $xml .= sdk_formatXML('moonrise',$tableau['moonrise']);
  $xml .= sdk_formatXML('moonset',$tableau['moonset']);
  $xml .= sdk_formatXML('moonrise_hloc',sdk_hloc($tableau['moonrise'],$delta_h,'date'));
  $xml .= sdk_formatXML('moonset_hloc',sdk_hloc($tableau['moonset'],$delta_h,'date'));
  $xml .= sdk_formatXML('moon_phase',$tableau['moon_phase']);
  $xml .= sdk_formatXML('night',$tableau['night']);

  if (array_key_exists('temperature',$tableau)) {$xml .= sdk_formatXML('temperature',$tableau['temperature']);}
  else {$xml .= sdk_formatXML('temperature',$tableau['temp']);}
  $xml .= sdk_formatXML('temp_morn',$tableau['temp_morn']);
  $xml .= sdk_formatXML('temp_day',$tableau['temp_day']);
  $xml .= sdk_formatXML('temp_eve',$tableau['temp_eve']);
  $xml .= sdk_formatXML('temp_night',$tableau['temp_night']);
  $xml .= sdk_formatXML('temp_min',isset($tableau['temp_min']) ? $tableau['temp_min'] : ERRCODE);
  $xml .= sdk_formatXML('temp_max',isset($tableau['temp_max']) ? $tableau['temp_max'] : ERRCODE);
  // feels_like est un tableau {day,night,eve,morn} pour daily, un scalaire pour current/hourly
  $feels = isset($tableau['feels_like']) ? $tableau['feels_like'] : ERRCODE;
  if (is_array($feels)) $feels = isset($feels['day']) ? $feels['day'] : ERRCODE;
  $xml .= sdk_formatXML('feels_like',$feels);
  $xml .= sdk_formatXML('temp_like_morn',$tableau['like_morn']);
  $xml .= sdk_formatXML('temp_like_day',$tableau['like_day']);
  $xml .= sdk_formatXML('temp_like_eve',$tableau['like_eve']);
  $xml .= sdk_formatXML('temp_like_night',$tableau['like_night']);
  $xml .= sdk_formatXML('pressure',$tableau['pressure']);
  $xml .= sdk_formatXML('humidity',$tableau['humidity']);
  $xml .= sdk_formatXML('dew_point',$tableau['dew_point']);
  $xml .= sdk_formatXML('wind_speed',$tableau['wind_speed']);
  $xml .= sdk_formatXML('wind_gust',$tableau['wind_gust']);
  $xml .= sdk_formatXML('wind_deg',$tableau['wind_deg']);
  $xml .= sdk_formatXML('clouds',$tableau['clouds']);
  $xml .= sdk_formatXML('uvi',$tableau['uvi']);
  $xml .= sdk_formatXML('visibility',$tableau['visibility']);
  $xml .= sdk_formatXML('pop',$tableau['pop']);
  // rain/snow : scalaire en daily, tableau sous la cle '1h' en hourly/current
  if (is_array($tableau['rain']) && array_key_exists('1h',$tableau['rain']))
      $xml .= sdk_formatXML('rain',$tableau['rain']['1h']);
  else
      $xml .= sdk_formatXML('rain', is_array($tableau['rain']) ? 0 : $tableau['rain']);
  if (is_array($tableau['snow']) && array_key_exists('1h',$tableau['snow']))
      $xml .= sdk_formatXML('snow',$tableau['snow']['1h']);
  else
      $xml .= sdk_formatXML('snow', is_array($tableau['snow']) ? 0 : $tableau['snow']);
  if ($tableau['night'] && ($tableau['weather'][0]['id'] == 800)) $tableau['weather'][0]['id'] = 900;
  $xml .= sdk_formatXML('weather_id',$tableau['weather'][0]['id']);
  $xml .= sdk_formatXML('weather_main',sdk_utf8($tableau['weather'][0]['main']));
  $xml .= sdk_formatXML('weather_desc',sdk_utf8($tableau['weather'][0]['description']));
  return $xml;
}// function sdk_formatTableauXML

//***************** fonction lecture commune
function sdk_getCity(&$city) {
  global $debug;
  global $key;

  $url_GPS    = 'http://api.openweathermap.org/geo/1.0/';
  $url_GPS_fr = 'http://api-adresse.data.gouv.fr/';

  $commune  = getArg('commune');
  $state_   = getArg('state',false,VOID);
  $country_ = getArg('country',false,VOID);
  if ( ($country_ == VOID) && ($state_ != VOID) ) {$country_ = $state_; $state_ = VOID;}
  if (strpos($country_,SEPMODE) !== false) $country_ = DEFCOUNTRY;
  $tab_country = explode(SEPCOORD,$country_);
  if (count($tab_country) >1) {
    $state_   = $tab_country[0];
    $country_ = $tab_country[1];
  }
  $country_ = strtoupper($country_);
  if (($country_=="") or (strpos($country_,'.') != 0)) {$country_=DEFCOUNTRY;}
  $state   = utf8_encode($state_);

  $localization = explode(SEPCOORD,$commune);
  $nbr_element  = count($localization);

  if ($nbr_element == 1) {
    $test = preg_replace("/[0-9]/","",$localization[0]);
    if ($test == $localization[0]) {
      $type_commune = "name";
      $city['name'] = utf8_encode($localization[0]);}
    else {
      $type_commune = "zip";
      $city['zip']  = strtoupper($localization[0]);
    }
  }
  else {
    if ( strpos($localization[1],'.') !== false) {
      $type_commune = "coord";
      switch ($nbr_element) {
        case 4 : $city['state']   = utf8_encode($localization[2]);
        case 3 : $city['country'] = strtoupper($localization[$nbr_element-1]);
        case 2 : $city['lat'] = sprintf("%.4f",$localization[0]);
                 if (abs($city['lat']) > 90) $city['lat'] = ERRCOORD;
                 $city['lon'] = sprintf("%.4f",$localization[1]);
                 if (abs($city['lon']) > 180) $city['lon'] = ERRCOORD;
                 $city['valid'] = ( ($city['lon'] != ERRCOORD) && ($city['lat'] != ERRCOORD));
      }
    }
  else {
    switch ($nbr_element) {
      case 3 : $type_commune = "name";
               $city['name']     = utf8_encode($localization[0]);
               $city['country']  = strtoupper($localization[2]);
               $test = preg_replace("/[0-9]/","",$localization[1]);
               if ( $test != $localization[1]) {$city['zip']  = strtoupper($localization[1]);}
               else $city['state'] = utf8_encode($localization[1]);
               break;
      case 2 :
               $test = preg_replace("/[0-9]/","",$localization[0]);
               if ( $test != $localization[0]) {
                  $type_commune = "zip";
                  $city['zip']     = strtoupper($localization[0]);
                  $city['country'] = strtoupper($localization[1]);
                }
                else {
                  $type_commune    = "name";
                  $city['name']    = utf8_encode($localization[0]);
                  $test = preg_replace("/[0-9]/","",$localization[1]);
                  if ( $test != $localization[1]) {$city['zip']  = strtoupper($localization[1]);}
                  else $city['country'] = strtoupper($localization[1]);
                }
    }
  }
}

  if ($city['country'] == VOID) {
    $city['country'] = $country_;
    if ($city['country'] == VOID) {$city['country'] = DEFCOUNTRY;}
    if ($city['state'] == VOID) {$city['state'] = $state_;}
  }
  if ( (strlen($state_) > 0) && ($city['state'] != VOID) && ($city['country'] != $country_) ) {$city['state'] = VOID;}
  if ( ($city['state'] == VOID) && ($city['country'] == $country_) ) {$city['state'] = $state_;}

  if ($debug) {
    var_dump($localization);
    echo "nbr_elements = ".$nbr_element." Type commune : ".$type_commune.PHP_EOL;
    echo $country_.' '.$state_.PHP_EOL;
    var_dump($city);
  }

  switch ($city['country']) {
    case 'FR' : if ($type_commune == 'coord') {
                  $requete = 'reverse/?lat='.$city['lat'].'&lon='.$city['lon'];
                }
                else {
                  $requete = 'search/?q=';
                  if ($type_commune == 'name') {
                    $requete .= $city['name'];
                    if ($city['zip'] != VOID) $requete .= '&postcode='.$city['zip'];
                  }
                  else {$requete .= $city['zip'];}
                }
                $url_GPS  = $url_GPS_fr.$requete.'&limit=1';
                $jsonResponse_GPS = httpQuery($url_GPS);
                $jsonResponse_GPS = preg_replace('/\\\\u([\da-fA-F]{4})/', '&#x\1;', $jsonResponse_GPS);
                $GPS_ = sdk_json_decode($jsonResponse_GPS, true);
                $GPS  = &$GPS_['features'][0];
                if (is_array($GPS) && count($GPS) > 0) {
                  $city['name'] = $GPS['properties']['city'];
                  $city['zip']  = $GPS['properties']['postcode'];
                  $city['lat']  = sprintf("%.4f",$GPS['geometry']['coordinates'][1]);
                  $city['lon']  = sprintf("%.4f",$GPS['geometry']['coordinates'][0]);
                  $contexte     = $GPS['properties']['context'];
                  $bof = explode(',',$contexte);
                  $city['state'] = trim($bof[count($bof)-1]);
                }
                if ($debug) {
                  echo "url_GPS : ".$url_GPS.PHP_EOL;
                  echo "reponse : ".$jsonResponse_GPS.PHP_EOL;
                }
                if (is_array($GPS) && count($GPS) > 0) {
                  $city['valid'] = ($city['lat'] != ERRCOORD) && ($city['lon'] != ERRCOORD);
                  if ($debug) {var_dump($city);}
                  break;
                }
                else {$city['country'] = VOID;}
    default   : switch ($type_commune) {
                  case 'name'  : $requete  = 'direct?q='   . $city['name'];
                                 break;
                  case 'zip'   : $requete  = 'zip?zip='    . $city['zip'];
                                 break;
                }
                if (strlen($city['state']) > 0) $requete .= SEPCOORD.$city['state'];
                $requete .= SEPCOORD.$city['country'];
                if ($type_commune == 'coord') {}
                else {
                  $url_GPS  .= $requete.'&limit=1&appid='.$key;
                  $jsonResponse_GPS = httpQuery($url_GPS);
                  $GPS_ = sdk_json_decode($jsonResponse_GPS, true);
                  if ($type_commune == 'name') {$GPS = &$GPS_[0];}
                  else {$GPS = &$GPS_;}
                  if ( ($GPS !== null) && array_key_exists('lat',$GPS) ){
                        $GPS['lat'] = sprintf("%.4f",$GPS['lat']);
                        $GPS['lon'] = sprintf("%.4f",$GPS['lon']);
                        foreach ($GPS as $cle => $value){
                           if (array_key_exists($cle,$city)) $city[$cle] = $value;
                        }
                  }
                }
                $city['valid'] = ($city['lat'] != ERRCOORD) && ($city['lon'] != ERRCOORD);
                if ($debug) {
                  echo "url_GPS : ".$url_GPS.PHP_EOL;
                  echo "reponse : ".$jsonResponse_GPS.PHP_EOL;
                  var_dump($city);
                }
  }//switch
  return $city['valid'];

};//function sdk_getCity

//***************** programme principal
$jours_fr = array('Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi');
$alerts_on = ALERTS;

$debug   = getArg('debug',false,DEFDEBUG);
$reloc   = getArg('reloc',false,'0');
$format  = getArg('format',false,FORMATXML);

$device = getArg('device',false,DEFDEVICE);
$device = substr(strtolower($device),0,6);
if ($debug) {echo "device: ".$device.PHP_EOL;}

$null_city   = array('zip' => 0, 'name' => VOID, 'lat' => ERRCOORD, 'lon' => ERRCOORD, 'state' => VOID, 'country' => VOID, 'valid' => false);

// init memoire (faute de frappe corrigee : $buffername -> $buffer_name)
$buffer_name  = getArg('mem',false,BUFFERNAME);
$buffer_data  = $buffer_name.'_data';
$buffer_xml   = $buffer_name.'_xml';

// mem=no : ne pas lire la variable eedomus (nom a underscore initial interdit)
if ($buffer_name != NOMEM) {
  $old_data = loadVariable($buffer_data);
} else {
  $old_data = "";
}
if ($old_data == "") {
  $old_data = array ('city' => $null_city, 'input' => "", 'dju' => ERRCODE, 'days' => array(), 'hours' => array());
}

$xml = array('commune' => ' ','erreur' => ' ', 'current' => ' ','hours' => array(), 'dju' => '','precipitation' => '', 'days' => array(), 'alertes' => '', 'qualite' =>'');

switch ($device) {
  case 'master':
    $now = time();
    $commune = getArg('commune');
    $key     = getArg('key');
    $url = 'http://api.openweathermap.org/data/3.0/';
    $url_meteo      = $url.'onecall?';
    $url_qualiteair = 'http://api.openweathermap.org/data/2.5/air_pollution?';
    $old_xml  = "";
    $data     = array ('city' => $null_city, 'xml' => "", 'input' => $commune.';'.$country.';'.$state, 'dju' => ERRCODE, 'days' => array(), 'hours' => array());

    if ( ($data['input'] === $old_data['input']) && !$reloc ) {
      $data['city'] = $old_data['city'];
      $is_valid_city = true;
      if ($debug) echo 'Reprise ancienne localisation'.PHP_EOL;
    }
    else {
      $is_valid_city = sdk_getCity($data['city']);
      $old_data['dju'] = ERRCODE;
      if ($debug) echo 'Calcul nouvelle localisation'.PHP_EOL;
    }

    $lat = $data['city']['lat'];
    $lon = $data['city']['lon'];

    $error  = sdk_formatXML('erreur','_beg');
    $url_meteo  .= 'lat=' . $lat . '&lon=' . $lon. '&units=metric&lang='. DEFLANG .'&mode=Json&appid=' . $key;
    $jsonResponse_meteo = httpQuery($url_meteo, 'GET', NULL, NULL, NULL,false,false,$info,NULL);
    $matrice = sdk_json_decode($jsonResponse_meteo, true);

    $errMess = 'message_API_meteo';
    $error .= sdk_formatXML('retour_API_meteo',$info['http_code']);
    switch ($info['http_code']){
        case 200 : $error .= sdk_formatXML($errMess,'OK');break;
        default  : $error .= sdk_formatXML($errMess,$matrice['message']);
    }
    // robustesse : si l API echoue, $matrice peut ne pas etre un tableau
    $is_invalid_matrice = !is_array($matrice) || count($matrice) < 3;
    $gmt_offset = date('Z');
    $delta_h = $matrice['timezone_offset'] - date('Z');

    if ($debug) {
      echo "url_meteo= ".$url_meteo.PHP_EOL;
      echo "reponse : ".$jsonResponse_meteo.PHP_EOL;
    }

//****** Bloc commune
    $nom_ville = $data['city']['name'];
    if ($data['city']['state'] != "") $nom_ville .= ' : '.$data['city']['state'];
    elseif (($data['city']['state'] != DEFCOUNTRY)) {$nom_ville .= ' : '.$data['city']['country'];}
    $nom_ville = substr($nom_ville,0,DEFAFFICHE);
    $ville_GPS = $nom_ville . " (" . round($data['city']['lat'],3) . "&#176;, " . round($data['city']['lon'],3) . "&#176;)";
    sdk_testNum($matrice['timezone_offset'],$is_invalid_matrice);
    if ($matrice['timezone_offset'] == ERRCODE) {$matrice['timezone'] = ERRTXT;}
    $result  = sdk_formatXML('commune','_beg');
    $result .= sdk_formatXML('city_GPS',$ville_GPS);
    $result .= sdk_formatXML('country',$data['city']['country']);
    $result .= sdk_formatXML('state',$data['city']['state']);
    $result .= sdk_formatXML('zip',$data['city']['zip']);
    $result .= sdk_formatXML('lat',$matrice['lat']);
    $result .= sdk_formatXML('lon',$matrice['lon']);
    $result .= sdk_formatXML('timezone',$matrice['timezone']);
    $result .= sdk_formatXML('timezone_offset',$matrice['timezone_offset']);
    $xml['commune'] = $result. sdk_formatXML('commune','_end').PHP_EOL;
    if ($debug) {echo 'Commune : '.$xml['commune'].PHP_EOL;}
//****** Fin Bloc commune

//****** Bloc alertes
    if ($alerts_on){
      $result  = sdk_formatXML('alerts','_beg','long').PHP_EOL;
      if (!array_key_exists('alerts',$matrice)){
        $matrice['alerts'][0]= array('sender_name' => 'Aucun','event' => 'Aucun','start' => ERRCODE, 'end' => ERRCODE, 'description' => VOID, 'tags' => VOID);
        $count = count($matrice['alerts']);
        for ($num = 0; $num < $count; $num++) {
          $result .= sdk_formatXML('alerts_'.$num,'_beg','long').PHP_EOL;
          $result .= sdk_alertsXML($matrice['alerts'][$num]);
          $result .= sdk_formatXML('alerts_'.$num,'_end','long').PHP_EOL;
        }
      }
      else $result .= sdk_alertsXML('noAlert');
      $xml['alertes'] = $result.sdk_formatXML('alerts','_end','long').PHP_EOL;
      if ($debug) {echo 'Alertes : '. $xml['alertes'].PHP_EOL;}
   }
   else $xml['alertes'] = '';
//****** Fin Bloc alertes

//****** Bloc daily
    for ($num=0;$num<8;$num++){
      foreach ( array('dt','sunrise','sunset','moonrise','moonset','moon_phase','pressure','visibility','humidity','dew_point','wind_speed','wind_deg','wind_gust','clouds','pop','uvi') as $cle) {
        sdk_testNum($matrice['daily'][$num][$cle],$is_invalid_matrice);
      }
      foreach ( array('day','min','max','night','eve','morn' ) as $cle) {
        sdk_testNum($matrice['daily'][$num]['temp'][$cle],$is_invalid_matrice);
        $matrice['daily'][$num]['temp_'.$cle] = $matrice['daily'][$num]['temp'][$cle];
      }
      $matrice['daily'][$num]['temperature'] = $matrice['daily'][$num]['temp_day'];

      foreach ( array('day','night','eve','morn' ) as $cle) {
        sdk_testNum($matrice['daily'][$num]['feels_like'][$cle],$is_invalid_matrice);
        $matrice['daily'][$num]['like_'.$cle] = $matrice['daily'][$num]['feels_like'][$cle];
      }
      sdk_testWeather($matrice['daily'][$num]['weather'][0],$is_invalid_matrice);
      if ( (!array_key_exists('rain',$matrice['daily'][$num])) && ($matrice['daily'][$num]['dt'] != ERRCODE) ) $matrice['daily'][$num]['rain'] = 0;
      if ( (!array_key_exists('snow',$matrice['daily'][$num])) && ($matrice['daily'][$num]['dt'] != ERRCODE) ) $matrice['daily'][$num]['snow'] = 0;
      // $ manquant corrige (etait : is_invalid_matrice)
      if ($is_invalid_matrice) {$local_time = $now + $delta_h + $num*86400;}
      else $local_time = $matrice['daily'][$num]['dt'] + $delta_h;
      $jour_fr = $jours_fr[date('w',$local_time)];
      if ($num == 0) {$jour='auj';}
      else {$jour = $jour_fr;}
      $matrice['daily'][$num]['num']= $num;
      $matrice['daily'][$num]['nom']= strtolower(substr($jour,0,3));
      $matrice['daily'][$num]['night']= 0;
      $data['days'][strtolower(substr($jour,0,3))] = $num;
      $result  = sdk_formatXML('day','_beg');
      $result .= sdk_formatTableauXML($matrice['daily'][$num]);
      $xml['days'][$num] = $result.sdk_formatXML('day','_end').PHP_EOL;
    }

    if ($debug) {
      echo 'daily : '.PHP_EOL;
      var_dump($matrice['daily']);
      var_dump($xml['days']);
    }
//****** Fin Bloc daily

//****** Bloc precipitation et minutely
    $nb_min = is_array($matrice['minutely']) ? count($matrice['minutely']) : 0;
    for ($num=0;$num<$nb_min;$num++){
      sdk_testNum($matrice['minutely'][$num]['dt'],$is_invalid_matrice);
      sdk_testNum($matrice['minutely'][$num]['precipitation'],$is_invalid_matrice);
    }
    $stop_rain  = $now - 60;
    $start_rain = $now + 7200;
    $rain  = false;
    $is_raining = false;
    for ($ind = 0,$total_rain=0; $ind < $nb_min; $ind++) {
      if ($matrice['minutely'][$ind]['precipitation'] == ERRCODE) {
        $total_rain = ERRCODE; break;
      }
      elseif ($matrice['minutely'][$ind]['precipitation'] != 0){
        if (!$is_raining) {$rain = true; $is_raining = true; $start_rain = $matrice['minutely'][$ind]['dt'];}
        else {
          $total_rain += $matrice['minutely'][$ind]['precipitation'];
          if ($matrice['minutely'][$ind]['dt'] < $start_rain) {$start_rain = $matrice['minutely'][$ind]['dt'];}
        }
      }
      else {
        if ($is_raining) {$is_raining = false; $stop_rain = $matrice['minutely'][$ind]['dt'];break;}
        else {}
      }
    }
    if ($is_raining && $nb_min > 0) {$stop_rain = $matrice['minutely'][$nb_min-1]['dt'];}
    if (!$rain){$start_rain = $now; $stop_rain = $now + 3600;}

    $result  = sdk_formatXML('precipitation','_beg');
    $result .= sdk_formatXML('averse_hauteur',$total_rain);
    $result .= sdk_formatXML('averse_duree',round(($stop_rain-$start_rain)/60));
    $result .= sdk_formatXML('averse_debut_hloc',sdk_hloc($start_rain,$delta_h));
    $result .= sdk_formatXML('averse_fin_hloc',sdk_hloc($stop_rain,$delta_h));
    $xml['precipitation'] = $result.sdk_formatXML('precipitation','_end').PHP_EOL;
    if ($debug) {echo 'precipitation : '.$xml['precipitation'].PHP_EOL;}
//****** Fin Bloc precipitation

//****** Bloc prevision hourly 0 à 47 + DJU
    // initialisation des variables utilisees dans la boucle hourly
    $local_time_now = $now + $delta_h;
    $jour_loc_sem   = date('w',$local_time_now);
    $heure_         = date('G',$local_time_now);

    $dju_Tmin = 100;
    $min_start = -1;
    $dju_Tmax = -100;
    $max_start = -1;
    $day_parts = array(0 =>'night',1 =>'morn', 2 =>'day',3 =>'eve');
    $temp_ = array ('morn'=>ERRCODE,'day'=>ERRCODE,'eve'=>ERRCODE,'night'=>ERRCODE);
    $like_ = array ('morn'=>ERRCODE,'day'=>ERRCODE,'eve'=>ERRCODE,'night'=>ERRCODE);

    for ($num=0;$num<48;$num++){
      $local_time = $matrice['hourly'][$num]['dt'] + $delta_h;
      $jour_loc_semaine = date('w',$local_time);
      $delta_day        = $jour_loc_semaine - $jour_loc_sem;
      if ($delta_day < 0) $delta_day += 7;
      $heure = date('G',$local_time);
      if ($num == 0) {$numh = 'now';}
      elseif ($num <= 24) {$numh = $heure;}
      else {$numh = SEPHEURE.$heure;}
      $night_ = ( (($matrice['hourly'][$num]['dt'] > $matrice['daily'][0]['sunrise']) && ($matrice['hourly'][$num]['dt'] < $matrice['daily'][0]['sunset'])) || (($matrice['hourly'][$num]['dt'] > $matrice['daily'][1]['sunrise']) && ($matrice['hourly'][$num]['dt'] < $matrice['daily'][1]['sunset'])) || (($matrice['hourly'][$num]['dt'] > $matrice['daily'][2]['sunrise']) && ($matrice['hourly'][$num]['dt'] < $matrice['daily'][2]['sunset'])))? 0:1;
      $day_part_num =    (floor( (date('G',$local_time) + 1)/6))%4;
      $day_part = $day_parts[$day_part_num];
      $matrice['hourly'][$num]['num']   = $num;
      $matrice['hourly'][$num]['nom']   = strtolower(substr($numh,0,3));
      $data['hours'][strtolower(substr($numh,0,3))] = $num;

      $matrice['hourly'][$num]['night'] = $night_;
      if ($temp_[$day_part] == ERRCODE) {
        $temp_[$day_part] = $matrice['hourly'][$num]['temp'];
        $like_[$day_part] = $matrice['hourly'][$num]['feels_like'];
      }
      $matrice['hourly'][$num]['sunrise']    = $matrice['daily'][$delta_day]['sunrise'];
      $matrice['hourly'][$num]['sunset']     = $matrice['daily'][$delta_day]['sunset'];
      $matrice['hourly'][$num]['moonrise']   = $matrice['daily'][$delta_day]['moonrise'];
      $matrice['hourly'][$num]['moonset']    = $matrice['daily'][$delta_day]['moonset'];
      $matrice['hourly'][$num]['moon_phase'] = $matrice['daily'][$delta_day]['moon_phase'];
      foreach ( array('dt','temp','feels_like','pressure','humidity','dew_point','uvi','clouds','visibility','wind_speed','wind_deg','wind_gust','pop') as $cle) {
        sdk_testNum($matrice['hourly'][$num][$cle],$is_invalid_matrice);
      }
      sdk_testWeather($matrice['hourly'][$num]['weather'][0],$is_invalid_matrice);
      if ( !(array_key_exists('rain',$matrice['hourly'][$num])) && ($matrice['hourly'][$num]['dt'] != ERRCODE) ) $matrice['hourly'][$num]['rain']['1h'] = 0;
      if ( !(array_key_exists('snow',$matrice['hourly'][$num])) && ($matrice['hourly'][$num]['dt'] != ERRCODE) ) $matrice['hourly'][$num]['snow']['1h'] = 0;

      if ( ($min_start < 0)  && ($numh == 18) && ($num < 24) ) {$min_start = $num; $min_stop = $min_start + 18;}
      if ( ($min_start >= 0) && ($num < $min_stop) && ($matrice['hourly'][$num]['temp'] != ERRCODE) ) {$dju_Tmin = min($dju_Tmin,$matrice['hourly'][$num]['temp']);}
      if ( ($min_start >= 0) && ($max_start < 0) && ($numh == 6) && ($num >= 12) ) {$max_start = $num; $max_stop = $max_start + 18;}
      if ( ($max_start >= 0) && ($num < $max_stop) && ($matrice['hourly'][$num]['temp'] != ERRCODE)  ) {$dju_Tmax = max($dju_Tmax,$matrice['hourly'][$num]['temp']);}
    }

    for ($num=0;$num<48;$num++){
      $numh = $matrice['hourly'][$num]['nom'];
      $numh = str_replace(SEPHEURE,'',$numh);
      if ($numh == 'now') $numh = $heure_;
      $day_part_num =    (floor( (date('G',$numh) + 1)/6))%4;
      $day_part     = $day_parts[$day_part_num];
      foreach ($temp_ as $cle => $value) {
        if ($value != ERRCODE) {
          $matrice['hourly'][$num]['temp_'.$cle] = $value;
          $matrice['hourly'][$num]['like_'.$cle] = $like_[$cle];
        }
      }
      $result  = sdk_formatXML('hour','_beg');
      $result .= sdk_formatTableauXML($matrice['hourly'][$num]);
      $xml['hours'][$num] = $result.sdk_formatXML('hour','_end').PHP_EOL;
    }

    // $old_dju (inexistant) remplace par $old_data['dju']
    if ($dju_Tmin > $dju_Tmax){$dju = $old_data['dju'];}
    else {
      $dju_Tmin = min($dju_Tmin,DJUREF);
      $dju_Tmax = min($dju_Tmax,DJUREF);
      $dju = DJUREF - ($dju_Tmin + $dju_Tmax)/2;
    }
    $result  = sdk_formatXML('dju','_beg');
    $result .= sdk_formatXML('dju_prev',$dju);
    $result .= sdk_formatXML('dju_tmin',$dju_Tmin);
    $result .= sdk_formatXML('dju_tmax',$dju_Tmax);
    $xml['dju'] = $result.sdk_formatXML('dju','_end').PHP_EOL;
    // (ancienne ligne fantome $xml_ supprimee ici)

    if ($debug) {
      echo 'hourly : '.PHP_EOL;
      var_dump($matrice['hourly']);
      echo 'dju '.$xml['dju'].PHP_EOL;
    }
//****** Fin Bloc hourly et dju

//****** Bloc current
    foreach ( array('dt','sunrise','sunset','temp','feels_like','pressure','humidity','dew_point','uvi','clouds','visibility','wind_speed','wind_deg') as $cle) {
      sdk_testNum($matrice['current'][$cle],$is_invalid_matrice);
    }
    if ( (!array_key_exists('rain',$matrice['current'])) && ($matrice['current']['dt'] != ERRCODE) ) $matrice['current']['rain']['1h'] = 0;
    if ( (!array_key_exists('snow',$matrice['current'])) && ($matrice['current']['dt'] != ERRCODE) ) $matrice['current']['snow']['1h'] = 0;
    sdk_testWeather($matrice['current']['weather'][0],$is_invalid_matrice);
    $matrice['current']['num'] = 0;
    $matrice['current']['nom'] = 'now';
    $matrice['current']['moonrise']   = $matrice['daily'][0]['moonrise'];
    $matrice['current']['moonset']    = $matrice['daily'][0]['moonset'];
    $matrice['current']['moon_phase'] = $matrice['daily'][0]['moon_phase'];
    $night_ = (($matrice['current']['dt'] > $matrice['current']['sunrise']) && ($matrice['current']['dt'] < $matrice['current']['sunset']))? 0:1;
    $matrice['current']['night'] = $night_;
    foreach (array('morn','day','eve','night','min','max') as $cle){
      $matrice['current']['temp_'.$cle] = $matrice['daily'][0]['temp'][$cle];
    }
    foreach (array('morn','day','eve','night') as $cle){
      $matrice['current']['like_'.$cle] = $matrice['daily'][0]['feels_like'][$cle];
    }
    foreach (array('wind_gust','pop','rain','snow') as $cle){
      $matrice['current'][$cle] = $matrice['hourly'][0][$cle];
    }

    $result  = sdk_formatXML('current','_beg');
    $result .= sdk_formatTableauXML($matrice['current']);
    $xml['current'] = $result.sdk_formatXML('current','_end').PHP_EOL;
    if ($debug) {echo 'current OK'.PHP_EOL;}
//****** Fin Bloc current

//******************************************** Traitement qualité air
    $url_qualiteair .= 'lat=' . $data['city']['lat'] . '&lon=' . $data['city']['lon'] . '&appid=' . $key;
    $jsonResponse_qualite = httpQuery($url_qualiteair, 'GET', NULL, NULL, NULL,false,false,$info,NULL);
    $content = sdk_json_decode($jsonResponse_qualite, true);
    $is_invalid_content = ( (isset($content['cod'])) && (!is_numeric(isset($content['list'][0]['main']['aqi']) ? $content['list'][0]['main']['aqi'] : null)) );
    $error .= sdk_formatXML('retour_API_qualite',$info['http_code']);
    $errMess = 'message_API_qualite';
    switch ($info['http_code']){
        case 200 : $error .= sdk_formatXML($errMess,"OK");break;
        default  : $error .= sdk_formatXML($errMess,$content['message']);
    }

    $error  .= sdk_formatXML('erreur','_end').PHP_EOL;
    $xml['erreur'] = $error;
    if ($debug) {
      echo "url_qualiteair: ".$url_qualiteair.PHP_EOL;
      echo "reponse : ".$jsonResponse_qualite.PHP_EOL;
      var_dump($content);
    }

    $content['coord']['lat'] = $data['city']['lat'];
    $content['coord']['lon'] = $data['city']['lon'];
    sdk_testNum($content['list'][0]['dt'],$is_invalid_content);
    sdk_testNum($content['list'][0]['main']['aqi'],$is_invalid_content);
    foreach ( array('no','no2','o3','so2','co','pm2_5','pm10','nh3') as $cle) {
      sdk_testNum($content['list'][0]['components'][$cle],$is_invalid_content);
    }
    sdk_testNum($content['list'][0]['dt'],$is_invalid_content);

    $result  = sdk_formatXML('donnees_qualite','_beg');
    $result .= sdk_formatXML('dt',$content['list'][0]['dt']);
    $result .= sdk_formatXML('air_aqi',$content['list'][0]['main']['aqi']);
    $result .= sdk_formatXML('air_no',$content['list'][0]['components']['no']);
    $result .= sdk_formatXML('air_no2',$content['list'][0]['components']['no2']);
    $result .= sdk_formatXML('air_o3',$content['list'][0]['components']['o3']);
    $result .= sdk_formatXML('air_so2',$content['list'][0]['components']['so2']);
    $result .= sdk_formatXML('air_co',$content['list'][0]['components']['co']);
    $result .= sdk_formatXML('air_pm2_5',$content['list'][0]['components']['pm2_5']);
    $result .= sdk_formatXML('air_pm10',$content['list'][0]['components']['pm10']);
    $result .= sdk_formatXML('air_nh3',$content['list'][0]['components']['nh3']);
    $xml['qualite'] = $result.sdk_formatXML('donnees_qualite','_end').PHP_EOL;

// Generation du XML
    sdk_header('text/xml');
    echo '<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL;
    echo sdk_formatXML('donnees_meteo','_beg','long').PHP_EOL;
    echo $xml['commune'];
    echo $xml['erreur'];
    echo $xml['current'];
    echo $xml['precipitation'];
    echo $xml['dju'];
    echo sdk_formatXML('daily','_beg','long').PHP_EOL;
    foreach ($xml['days'] as $elem) {echo $elem;}
    echo sdk_formatXML('daily','_end','long').PHP_EOL;
    echo sdk_formatXML('hourly','_beg','long').PHP_EOL;
    foreach ($xml['hours'] as $elem) {echo $elem;}
    echo sdk_formatXML('hourly','_end','long').PHP_EOL;
    echo $xml['qualite'];
    echo sdk_formatXML('donnees_meteo','_end','long').PHP_EOL;

    // ne sauvegarder dans eedomus que si mem != no
    if ($buffer_name != NOMEM) {
        saveVariable($buffer_data,$data);
        saveVariable($buffer_xml,$xml);
    }
    break;//fin MasterData

  default:
    $mode  = array ('com' => 1,'err' => 1,'cur' => 1,'pre' => 1,'alr' => 1,'dju' => 1,'qua' => 1,'day' => 1,'hor' => 1);
    $days  = array ();
    for ($num =0;$num<8;$num++) {$days[$num] = 1;}
    $hours = array();
    for ($num =0;$num<48;$num++) {$hours[$num] = 1;}
    $state_ = getArg('state',false,VOID);
    $mode_  = getArg('country',false,VOID);
    if ( ($mode_ == VOID) && ($state_ != VOID) ) {$mode_ = $state_;}
    $_mode_ = getArg('mode',false,VOID);
    if ($_mode_ !== VOID) $mode_ = $_mode_;
    $periph_id = getArg('periph_id',false);
    $values = getValue($periph_id);
    $choix_ = $values['value'];
    $choix = array (0=>'auj','1J','2J','3J','4J','5J','6J','7J',
                    100=> 'dim','lun','mar','mer','jeu','ven','sam',
                    200=> '0H','1H','2H','3H','4H','5H','6H','7H','8H','9H','10H','11H',
                         '12H','13H','14H','15H','16H','17H','18H','19H','20H','21H','22H','23H','24H',
                    300=> '0','1','2','3','4','4','6','7','8','9','10','11','12',
                          '13','14','15','16','17','18','19','20','21','22','23');
    if (isset($choix[$choix_]) && $choix[$choix_]) $mode_ = SEPMODE.$choix[$choix_];
    $mode_ = strtolower($mode_);
    $modeXML = $mode_;
    if (strpos($mode_,SEPMODE) !== false) {
      foreach ($mode as $cle => $elem){
        if (strpos($mode_,SEPMODE.$cle) === false) {$mode[$cle] = 0;}
        else $mode_ = str_replace(SEPMODE.$cle,'',$mode_);
      }
      if (!$mode['day']){
        foreach ($days as $cle => $elem){
          if (strpos($mode_,SEPMODE.$cle.SUFFJ) === false) {$days[$cle] = 0;}
          else {
            $mode_ = str_replace(SEPMODE.$cle.SUFFJ,'',$mode_);
            $mode['day'] = 1;
          }
        }
      }
      if (!$mode['hor']){
        foreach ($hours as $cle => $elem){
          if (strpos($mode_,SEPMODE.$cle.SUFFH) === false) {$hours[$cle] = 0;}
          else {
            $mode_ = str_replace(SEPMODE.$cle.SUFFH,'',$mode_);
            $mode['hor'] = 1;
          }
        }
      }
      if (strpos($mode_,SEPMODE) !== false) {
        $mode_ = substr($mode_,1);
        $mode__ = explode(SEPMODE,$mode_);
        foreach ($mode__ as $cle) {
          if (is_array($old_data['days']) && array_key_exists($cle,$old_data['days'])) {
            $elem = $old_data['days'][$cle];
            $days[$elem] = 1;
            $mode['day'] = 1;
          }
          if (is_array($old_data['hours']) && array_key_exists($cle,$old_data['hours'])) {
            $elem = $old_data['hours'][$cle];
            $hours[$elem] = 1;
            $mode['hor'] = 1;
          }
        }
      }
    }
    // mem=no : ne pas lire la variable eedomus
    if ($buffer_name != NOMEM) {
      $xml = loadVariable($buffer_xml);
    } else {
      $xml = array();
    }
    if ($debug) {
      echo 'mode - ';var_dump($mode);
      echo 'days - ';var_dump($days);
      echo 'hours - ';var_dump($hours);
    }
    sdk_header('text/xml');
    echo '<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL;
    echo sdk_formatXML('donnees_meteo','_beg','long').PHP_EOL;
    echo '<modes mode="'.$modeXML.'" />'.PHP_EOL;
    if ($mode['com']) echo $xml['commune'];
    if ($mode['err']) echo $xml['erreur'];
    if ($mode['cur']) echo $xml['current'];
    if ($mode['pre']) echo $xml['precipitation'];
    if ($mode['alr']) echo $xml['alertes'];
    if ($mode['dju']) echo $xml['dju'];
    if ($mode['day']) {
      echo sdk_formatXML('daily','_beg','long').PHP_EOL;
      foreach ($days as $cle => $elem) {
        if ($days[$cle]) {echo $xml['days'][$cle];}
      }
      echo sdk_formatXML('daily','_end','long').PHP_EOL;
    }
    if ($mode['hor']) {
      echo sdk_formatXML('hourly','_beg','long').PHP_EOL;
      foreach ($hours as $cle => $elem) {
        if ($hours[$cle]) {echo $xml['hours'][$cle];}
      }
      echo sdk_formatXML('hourly','_end','long').PHP_EOL;
    }
    if ($mode['qua']) echo $xml['qualite'];
    echo sdk_formatXML('donnees_meteo','_end','long').PHP_EOL;
    break;
}
?>
squalou
 
Messages : 1
Inscription : 06 Juin 2026

Re: [Store]Script : Météo du jour

Messagepar opa95 » 06 Juin 2026 09:07

squalou a écrit:Bonjour,
J'ai eu le même problème.
Voici le script corrigé (merci Claude IA) qui permet de retrouver le bon fonctionnement.
Je laisse aux auteurs ou à l'équipe eedomus le soin de le mettre a jour sur le store.
Merci.

Bonjour squalou
Merci de ton partage du script adapté.
Je ne m'y intéresse plus depuis environ 4 ans car je ne l'utilise pas.
Je vais y jeter un coup d'oeil pour m'instruire, peut-être la semaine prochaine (?) :)
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 : 984
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Précédent

Retour vers Scripts & Périphériques du store

Qui est en ligne ?

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