Bonjour vva
vva a écrit:Bonjour, je relance le sujet car j'ai reçu un mail de RTE-Ecowatt indiquant que la v4 de leur API ne fonctionnera plus à compter du 30.06.2024.
Une âme charitable peut il migrer le script de notre box vers la version 5 de leur api ?
Moi, j'ai fait une version qui va chercher l'information soit chez eedomus, soit chez rte soit chez edf. Ca fonctionne : Pour l'instant, ça relit le buffer de "eedomus" (mode auto), mais tu peux forcer la lecture depuis edf ou rte Requete : http://localhost/script/?exec=ecowatt_e ... w&mode=rte ou http://localhost/script/?exec=ecowatt_e ... w&mode=edf
- Code : Tout sélectionner
<?php // Peripherique EcoWatt pour eedomus // Basé sur les travaux de Ianx74 // Version 1.2 // Les donnees sont desormais "cachees" sur le cloud eedomus ce qui evite la creation d'identifiants Oauth pour chaque utilisateur // Version 1.3 adaptation opa95 (janvier 2024) // // action : [request (par défaut),restart] // alerte : [-1,0,1,2,3] prochain niveau d'alerte recherché (-1 => non spécifié) // heure : [now,0..23] ou h,d (heure h, durée en heures(1 par défaut)) now // par défaut // jour : [1(par défaut)..max] JMIN=1 //Lancement // état aujourd'hui http://localhost/script/?exec=ecowatt_eedomus.php // (a=-1,h=(0,24),j=1) // état demain http://localhost/script/?exec=ecowatt_eedomus.php&jour=2 // (a=-1,h=(0,24),j=2) // état maintenant http://localhost/script/?exec=ecowatt_eedomus.php&heure=now // (a=-1,h=(now,1),j=1) // état dans (x-1) heures http://localhost/script/?exec=ecowatt_eedomus.php&heure=now, // (a=-1,h=(now,x),j=1) (x=1 -> maintenant) comme JMIN // état entre 7h et 21h http://localhost/script/?exec=ecowatt_eedomus.php&heure=7,14 (depuis 7h pour une durée de 14h) // (a=-1,h=(7,14),j=1), si heure actuelle<7 aujourd'hui sinon demain // durée limitée par la taille du fichier retourné (96h le 2023-01-08) // Première alerte http://localhost/script/?exec=ecowatt_eedomus.php&alerte=x // (a=x,h=0,j=1) (depuis aujourd'hui à 0h) // Première alerte à venir http://localhost/script/?exec=ecowatt_eedomus.php&alerte=x&heure=now // (a=x,h=now,j=1) (depuis maintenant) // Resultat //status pour rester compatible avec V1.2 /* <root> <status>1</status>resultat, dépend de la demande <etat>1</etat> état 0->Vert décarboné, 1->Vert, 2->Orange, 3->Rouge, -2->erreur (valeur max dan la période recherchée) <message>Pas d'alerte.</message> Message <alerte>-1</alerte> alerte recherchée (comme status) <jour>2024-01-09</jour> jour début <heure>0</heure> heure début <duree>24</duree> durée (heures) <url>https://secure.eedomus.com/json/ecowatt_cache.php</url> url utilisée <buffer>non</buffer> relecture du buffer ([oui, non]) <date>1704725407</date> Timestamp <datestr>2024-01-08 15:50:07</datestr> date requete <expdate>2024-01-08 15:59:12</expdate> date expiration buffer </root> */
define('JSON','{ "eedomus_downloaded_time":"2023-12-27 15:48:29", "signals":[{"GenerationFichier":"2023-12-26T23:00:00+01:00","jour":"2023-12-27T00:00:00+01:00","dvalue":1,"message":"Pas d\u2019alerte.","values":[{"pas":0,"hvalue":1},{"pas":1,"hvalue":1},{"pas":2,"hvalue":2},{"pas":3,"hvalue":1},{"pas":4,"hvalue":1},{"pas":5,"hvalue":1},{"pas":6,"hvalue":1},{"pas":7,"hvalue":1},{"pas":8,"hvalue":1},{"pas":9,"hvalue":1},{"pas":10,"hvalue":1},{"pas":11,"hvalue":2},{"pas":12,"hvalue":1},{"pas":13,"hvalue":1},{"pas":14,"hvalue":1},{"pas":15,"hvalue":1},{"pas":16,"hvalue":1},{"pas":17,"hvalue":1},{"pas":18,"hvalue":1},{"pas":19,"hvalue":1},{"pas":20,"hvalue":1},{"pas":21,"hvalue":1},{"pas":22,"hvalue":1},{"pas":23,"hvalue":1}]},{"GenerationFichier":"2023-12-26T23:00:00+01:00","jour":"2023-12-28T00:00:00+01:00","dvalue":1,"message":"Pas d\u2019alerte.","values":[{"pas":0,"hvalue":1},{"pas":1,"hvalue":0},{"pas":2,"hvalue":2},{"pas":3,"hvalue":0},{"pas":4,"hvalue":1},{"pas":5,"hvalue":1},{"pas":6,"hvalue":1},{"pas":7,"hvalue":1},{"pas":8,"hvalue":1},{"pas":9,"hvalue":1},{"pas":10,"hvalue":1},{"pas":11,"hvalue":1},{"pas":12,"hvalue":2},{"pas":13,"hvalue":1},{"pas":14,"hvalue":1},{"pas":15,"hvalue":1},{"pas":16,"hvalue":1},{"pas":17,"hvalue":1},{"pas":18,"hvalue":1},{"pas":19,"hvalue":1},{"pas":20,"hvalue":1},{"pas":21,"hvalue":1},{"pas":22,"hvalue":1},{"pas":23,"hvalue":1}]},{"GenerationFichier":"2023-12-26T23:00:00+01:00","jour":"2023-12-29T00:00:00+01:00","dvalue":1,"message":"Pas d\u2019alerte.","values":[{"pas":0,"hvalue":1},{"pas":1,"hvalue":1},{"pas":2,"hvalue":1},{"pas":3,"hvalue":2},{"pas":4,"hvalue":1},{"pas":5,"hvalue":1},{"pas":6,"hvalue":1},{"pas":7,"hvalue":2},{"pas":8,"hvalue":2},{"pas":9,"hvalue":2},{"pas":10,"hvalue":1},{"pas":11,"hvalue":1},{"pas":12,"hvalue":1},{"pas":13,"hvalue":1},{"pas":14,"hvalue":1},{"pas":15,"hvalue":1},{"pas":16,"hvalue":1},{"pas":17,"hvalue":1},{"pas":18,"hvalue":1},{"pas":19,"hvalue":1},{"pas":20,"hvalue":1},{"pas":21,"hvalue":1},{"pas":22,"hvalue":1},{"pas":23,"hvalue":1}]},{"GenerationFichier":"2023-12-26T23:00:00+01:00","jour":"2023-12-30T00:00:00+01:00","dvalue":1,"message":"Pas d\u2019alerte.","values":[{"pas":0,"hvalue":1},{"pas":1,"hvalue":1},{"pas":2,"hvalue":1},{"pas":3,"hvalue":1},{"pas":4,"hvalue":1},{"pas":5,"hvalue":1},{"pas":6,"hvalue":1},{"pas":7,"hvalue":1},{"pas":8,"hvalue":1},{"pas":9,"hvalue":1},{"pas":10,"hvalue":1},{"pas":11,"hvalue":1},{"pas":12,"hvalue":1},{"pas":13,"hvalue":1},{"pas":14,"hvalue":1},{"pas":15,"hvalue":1},{"pas":16,"hvalue":1},{"pas":17,"hvalue":1},{"pas":18,"hvalue":1},{"pas":19,"hvalue":1},{"pas":20,"hvalue":1},{"pas":21,"hvalue":1},{"pas":22,"hvalue":1},{"pas":23,"hvalue":1}]}]}');
define('VER','1.4');// version juin 2024 define('DELTAT','900');// Ecart lecture serveur (sec) define('JMIN','1');// indice d'aujourd'hui et heure actuelle (compatibilté V1.2) define('ALUKN','-2');// alerte non définie define('ALOK','-1');// pas d'alerte define('ALMIN','0');// niveau d'alerte min define('ALMAX','3');// niveau d'alerte max define('DECARB','0');// niveau d'alerte décarboné define('VERT','1');// niveau d'alerte vert define('ORANGE','2');// niveau d'alerte orange define('ROUGE','3');// niveau d'alerte rouge define('DEFMODE','auto');//['auto','eedomus','edf','rte','simul']
$GLOBALS['TS_JOUR'] = 86400; /*60*60*24*/ $GLOBALS['valstatus'] = array(ALUKN => 'Etat non défini',ALOK => "Pas d'alarme",DECARB => 'Vert décarboné',VERT => 'Vert',ORANGE => 'Orange', ROUGE => 'Rouge' ); $GLOBALS['time'] = time(); $GLOBALS['urls'] = array('eedomus','edf','rte'); $GLOBALS['jour'] = strtotime(date('Y-m-d',$GLOBALS['time']));
// $url nom du site // return mise à jour $GLOBALS // return nom du site function sdk_select_url($url) { switch ($url){ case 'auto' : case 'eedomus' : $GLOBALS['LOCAL_CACHE_DURATION_SEC'] = 60;//60 sec $GLOBALS['url'] = "https://secure.eedomus.com/json/ecowatt_cache.php"; break; case 'edf' : $GLOBALS['LOCAL_CACHE_DURATION_SEC'] = DELTAT;//15*60; sec $GLOBALS['url'] = "https://particulier.edf.fr/content/dam/2-Actifs/Scripts/ecowattSignal.json"; break; case 'rte' : $GLOBALS['LOCAL_CACHE_DURATION_SEC'] = DELTAT;//15*60; sec $GLOBALS['url'] = "https://digital.iservices.rte-france.com/open_api/ecowatt/v5/signals"; break; case 'simul' : $GLOBALS['LOCAL_CACHE_DURATION_SEC'] = 0; $GLOBALS['url'] = ""; $GLOBALS['time'] = strtotime(substr(JSON,strpos(JSON,'jour":"')+strlen('jour":"'),25))+43200;//12h break; default : $GLOBALS['url']=''; } $GLOBALS['message'] = ""; $GLOBALS['value'] = ""; return $url; } // json donnees // return tableau donnees function sdk_get_data_array($json) { // $json = str_replace('{"pas":2,"hvalue":1}','{"pas":2,"hvalue":3}',$json); $json = str_replace(array('"pas":',',"hvalue"'),array('',''),$json); $response = sdk_json_decode($json,true); $num = 0; foreach($response['signals'] as $signals){ $response['signals'][$num]['message']=htmlentities(preg_replace('/\\\\u([0-9a-fA-F]{4})/', "&#x$1;", $signals['message']), ENT_NOQUOTES, 'UTF-8'); $num++; } return $response; }
// jour : JMIN (jour_actuel)..jour relatif souhaité // data = [jour => yyyy-mm-dd,heure => h] function sdk_get_abs_date($jRel) { $jAbs = date('Y-m-d', $GLOBALS['time']+(($jRel-JMIN)*$GLOBALS['TS_JOUR'])); return $jAbs; }
// $date : 2023-12-26... // return format Y-m-d function sdk_extract_jour($date) { $jAbs = substr($date,0,10); return $jAbs; }
// $jRel : jour relatif (>=JMIN) // return nom du jour function sdk_get_jour_str($jRel) { switch ($jRel) { case 1 : return "Aujourd'hui"; // case 2 : return "Demain"; default : $jours_traduction = array(1 => 'Lundi', 2 => 'Mardi', 3 => 'Mercredi', 4 => 'Jeudi', 5 => 'Vendredi', 6 => 'Samedi', 7 => 'Dimanche'); $result = $jours_traduction[date('N',$GLOBALS['time']+$GLOBALS['TS_JOUR']*($jRel-JMIN))]; return $result; } }
// jour : false = JMIN..JMAX; // heure : null, 0..23 // return mise à jour $GLOBALS function sdk_get_values($datas, $jRel, $heure='',$duree=1) { $GLOBALS['value'] = ALUKN; $GLOBALS['status'] = ALUKN; $GLOBALS['message'] = 'Données invalides'; $jAbs = null; $GLOBALS['jour'] = null; $GLOBALS['heure'] = null; $GLOBALS['duree'] = 0; if (array_key_exists('signals', $datas)) { $jAbs = sdk_get_abs_date($jRel); $numJour = JMIN-1;
foreach ($datas['signals'] as $elem_jour)//Valeurs journalières { if ($jAbs == sdk_extract_jour($elem_jour['jour'])) { if ($GLOBALS['jour'] == null) $GLOBALS['jour'] = $jAbs;//premier tour if ($heure === '')//aujourd'hui { $GLOBALS['value'] = $elem_jour['dvalue']; $GLOBALS['message'] = $elem_jour['message']; $GLOBALS['duree'] = 24; $GLOBALS['heure'] = 0; $GLOBALS['status'] = $GLOBALS['value']; break; } else { foreach ($elem_jour['values'] as $elem) { if (array_key_exists($heure,$elem)){ $GLOBALS['value'] = max($GLOBALS['value'],$elem[$heure]); $GLOBALS['duree']++; $duree--; if ($GLOBALS['heure'] == null) $GLOBALS['heure'] = $heure;//premier tour if ($duree <= 0) { $GLOBALS['message'] = $GLOBALS['valstatus'][$GLOBALS['value']]; $GLOBALS['status'] = $GLOBALS['value']; break 2; } $heure++; if ($heure==24) { $jRel++; $jAbs = sdk_get_abs_date($jRel); $heure=0; } } } } } $numJour++; $GLOBALS['message'] = 'Erreur jour >'.$numJour; } } return; }
// jour : false = JMIN..JMAX; // heure : null, 0..23 // return mise à jour $GLOBALS function sdk_get_alert($datas, $alert, $jRel=1, $heure='') { $GLOBALS['value'] = ALUKN; $GLOBALS['status'] = ALUKN; $GLOBALS['message'] = 'Données invalides'; $jAbs = null; $GLOBALS['jour'] = null; $GLOBALS['heure'] = null; $GLOBALS['duree'] = 0; if ($heure == '') $heure =date('G',$GLOBALS['time']); if (array_key_exists('signals', $datas)) { $jAbs = sdk_get_abs_date($jRel); $numJour = JMIN-1; $first = true; foreach ($datas['signals'] as $elem_jour)//Valeurs journalières { if ($jAbs == sdk_extract_jour($elem_jour['jour'])) { foreach ($elem_jour['values'] as $elem) { if (array_key_exists($heure,$elem)){ if ($first) { if ($elem[$heure] == $alert) { $GLOBALS['jour'] = $jAbs; $GLOBALS['heure'] = $heure; $GLOBALS['value'] = $alert; $GLOBALS['duree']++; $first = false; } } else// recherche fin de séquence { if ($elem[$heure] == $alert) { $GLOBALS['duree']++; } else { break 2; }
} $heure++; if ($heure==24) { $jRel++; $jAbs = sdk_get_abs_date($jRel); $heure=0; } } } } $numJour++; } } if ($first) $GLOBALS['message'] = "Pas d'alerte ".$GLOBALS['valstatus'][$alert]; else $GLOBALS['message'] = sdk_get_jour_str($jRel).' à '.$GLOBALS['heure'].'h (durée '.$GLOBALS['duree'].'h)'; $GLOBALS['status'] = $GLOBALS['message']; return; }
/* Programme principal */
$action = getArg('action',false,'request'); switch ($action) { case 'restart': saveVariable('json_time', null);// force la relecture case 'request': $alert = strtolower(getArg('alerte', false, ALOK));//si ALOK, champ global du jour if (is_numeric($alert)) $alert = max(min(intval($alert),ALMAX),ALOK); else{ switch ($alert){ case 'rouge' : $alert =ROUGE; break; case 'orange' : $alert =ORANGE; break; case 'vert' : $alert =VERT; break; case 'decarb' : $alert =DECARB; break; default : $alert = ALUKN; } }
$mode = strtolower(getArg('mode', false, DEFMODE)); $GLOBALS['mode']=sdk_select_url($mode);
$jRel_ = getArg('jour', false, null); $jRel = max(intval($jRel_),JMIN);
$heures = getArg('heure', false, null);//heures=heure,duree list($heure_,$duree) = explode(',',$heures); $heure = $heure_; if ($heure == 'now') { $heure = date('G',$GLOBALS['time'])+max(0,(int)$duree-JMIN); $duree = 1; while ($heure > 23) { $heure -= 24; $jRel++; } }
if ($heure !== '') $heure = max(min(intval($heure),23),0); if ($duree != '') { $duree = max(intval($duree),1); } if ( ($alert <= ALOK) && ($heure_ !== '') && (date('G',$GLOBALS['time'])>$heure) ) $jRel++;//si heure dépassée, passer au lendemain
$prev_json_val_time = loadVariable('json_time'); $left_time = $prev_json_val_time-$GLOBALS['time']; $json = ''; $buffer = 'non'; if ($left_time<=0) { if ($GLOBALS['url'] == "") { $json = JSON; $infos = array('url'=>'simulation','http_code' => 200,'header'=>'HTTP/1.1 200 OK Date:'); } else { foreach ($GLOBALS['urls'] as $url) { if ($GLOBALS['mode'] != 'auto' && $GLOBALS['mode'] != $url) continue; sdk_select_url($url); $json = httpQuery($GLOBALS['url'], 'GET', null, null, $header,false,false,$infos); if (($GLOBALS['mode'] != 'auto') || ($infos['http_code'] == 200) )break; } } if ($info['http_code'] != 200){ $message = 'info :'.substr($info['header'],0,strpos($info['header'],'Date')-1).PHP_EOL; } if ($json != '') { $json = str_replace(array('{ ',', '),array('{',','),$json);//suppression espaces saveVariable('json_cache', $json); $new_time = $time + $GLOBALS['LOCAL_CACHE_DURATION_SEC']; saveVariable('json_time', $new_time); } } // cache ou erreur de telechargement if ($json == '') { $json = loadVariable('json_cache'); if ($json) { $buffer = 'oui'; } } $response = sdk_get_data_array($json); if (array_key_exists('eedomus_downloaded_time',$response)) saveVariable('json_time', DELTAT + rand (0,60)+ strtotime($response['eedomus_downloaded_time'])); if ($alert != ALOK){ sdk_get_alert($response, $alert, $jRel, $heure);} else sdk_get_values($response, $jRel, $heure, $duree); break;
default: $GLOBALS['value'] = ALUKN; $GLOBALS['message'] = "Invalid action : [$action]"; } @sdk_header('text/xml'); //"utf8" "iso-8859-1" //var_dump($response); $xml = '<?xml version="1.0" encoding="utf8" ?>'.PHP_EOL; $xml .= '<root>'.PHP_EOL; $xml .= ' <status>'.$GLOBALS['status'].'</status>'.PHP_EOL; $xml .= ' <valeur>'.$GLOBALS['value'].'</valeur>'.PHP_EOL; $xml .= ' <message>'.$GLOBALS['message'].'</message>'.PHP_EOL; $xml .= ' <alerte>'.$alert.'</alerte>'; $xml .= '<jour>'.$GLOBALS['jour'].'</jour>'; $xml .= '<heure>'.$GLOBALS['heure'].'</heure>'; $xml .= '<duree>'.$GLOBALS['duree'].'</duree>'.PHP_EOL; $xml .= ' <url>'.$GLOBALS['url'].'</url>'; $xml .= '<buffer>'.$buffer.'</buffer>'.PHP_EOL; $xml .= ' <date>'.$GLOBALS['time'].'</date>'; $xml .= '<datestr>'.date('Y-m-d H:i:s',$GLOBALS['time']).'</datestr>'; $xml .= '<expdate>'.date('Y-m-d H:i:s',loadVariable('json_time')).'</expdate>'; $xml .= '<creation>'.$response['signals'][0]['GenerationFichier'].'</creation>'.PHP_EOL; $xml .= ' <json>'.$json.'</json>'.PHP_EOL; $xml .= '</root>'; echo $xml; ?>
|