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

Signal EcoWatt
http://forum.eedomus.fr/viewtopic.php?f=11&t=11690
Page 1 sur 1
Auteur:  Bart (eedomus team) [ 16 Déc 2022 15:19 ]
Sujet du message:  Signal EcoWatt

Bonjour,

Voici le contenu de la mise à jour prévue ce lundi :

Pièces jointes:
ecowatt.jpg
ecowatt.jpg (220.94 Kio) Consulté 6166 fois
Auteur:  xeos [ 16 Déc 2022 17:49 ]
Sujet du message:  Re: Signal EcoWatt

:thumbup: merci la team
Auteur:  jluc2808 [ 17 Déc 2022 08:10 ]
Sujet du message:  Re: Signal EcoWatt

:clap: merci la team

- dommage qu'il n'y a pas dans cette version l'ajout du gestionnaire de clim "aidoo" en zwave de chez airzone que j'avais demandé il y a quelques temps
Auteur:  merguez07 [ 17 Déc 2022 09:41 ]
Sujet du message:  Re: Signal EcoWatt

super
Auteur:  ARTNOW [ 18 Déc 2022 13:34 ]
Sujet du message:  Re: Signal EcoWatt

Merci la Team ;)
Auteur:  catalan [ 18 Déc 2022 15:10 ]
Sujet du message:  Re: Signal EcoWatt

Merci la team :P
Auteur:  didou45 [ 19 Déc 2022 09:40 ]
Sujet du message:  Re: Signal EcoWatt

bonjour a tous et toutes

Pour ma part je suis a la recherche d’une commande pour les tarifs Tempo , il y en a bien dans le store eedomus mais sûrement trot ancien et ne fonctionne pas ou plus , j’aimerai trouver une solution pour que mes modifications de fonctionnement de mise en place de chauffage puise ce réaliser automatiquement lors du passage au tarif rouge et en fin de tarif rouge bien sûr.

Et comme je ne suis pas suffisamment compétant pour le faire moi-même si, une bonne âme pouvais réaliser ce petit script je vous serais très reconnaissant lol .

Merci et bonne fête de fin d’année à tous.

Didier
Auteur:  merguez07 [ 19 Déc 2022 12:42 ]
Sujet du message:  Re: Signal EcoWatt

didou45 a écrit:Pour ma part je suis a la recherche d’une commande pour les tarifs Tempo , il y en a bien dans le store eedomus mais sûrement trot ancien et ne fonctionne pas ou plus ,


Ah bon ???!!!!!
Auteur:  JuanMarco [ 19 Déc 2022 18:11 ]
Sujet du message:  Re: Signal EcoWatt

Bonjour,

A l'attention de la Team, si l'objet "EcoWatt" est maintenant disponible dans la rubrique "Ajouter un périphérique / Ajouter un autre type de périphérique / Objet connecté", celui d'Enedis pour avoir les consommations de la veille a disparu ???

Peut-être un effet de bord de la dernière mise à jour... sans doute à corriger.
Auteur:  marcal [ 02 Jan 2023 11:46 ]
Sujet du message:  Re: Signal EcoWatt

Hello, bonne année!

Je confirme, après mise à jour de la box et installation du périphérique EcoWatt (le 29 décembre), la consommation horaire de la veille n'est plus dispo dans le plugin Enedis... Bizarre, et dommage!
La conso globale de la journée remonte bien pourtant...
Auteur:  opa95 [ 22 Déc 2023 18:38 ]
Sujet du message:  Re: Signal EcoWatt

Bonjour Bart
Bart (eedomus team) a écrit:Bonjour,

Voici le contenu de la mise à jour prévue ce lundi :

EcoWatt a été mis à jour par RTE (passage de V4 à V5), il existe maintenant 4 états (ajout de l'état 0 qui correspond à "vert décarbonné", il faudrait donc mettre à jour le :) script ou au moins lui dire que l'état 0 correspond à l'état 1 (en mieux).
La version V4 sera désactivée dans quelque temps.
J'ai du :) redéclarer une autre utilisation pour que ça marche.
Auteur:  vva [ 22 Mai 2024 16:47 ]
Sujet du message:  Re: Signal EcoWatt

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 ?

https://doc.eedomus.com/view/Eedomus_et_Ecowatt

MAIL_RTE.PNG
MAIL_RTE
MAIL_RTE.PNG (58.43 Kio) Consulté 359 fois
Auteur:  opa95 [ 22 Mai 2024 18:51 ]
Sujet du message:  Re: Signal EcoWatt

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;
?>
Auteur:  vva [ 23 Mai 2024 17:16 ]
Sujet du message:  Re: Signal EcoWatt

opa95 a écrit: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;
?>


Merci @opa95 pour ton travail
Page 1 sur 1 Le fuseau horaire est UTC+1 heure