Signal EcoWatt

Les messages de l'équipe eedomus

Signal EcoWatt

Messagepar Bart (eedomus team) » 16 Déc 2022 15:19

Bonjour,

Voici le contenu de la mise à jour prévue ce lundi :
Pièces jointes
ecowatt.jpg
ecowatt.jpg (220.94 Kio) Consulté 8367 fois
Bart (eedomus team)
 
Messages : 394
Inscription : 23 Sep 2013

Re: Signal EcoWatt

Messagepar xeos » 16 Déc 2022 17:49

:thumbup: merci la team
Je suis Fou et insatiable
xeos
 
Messages : 836
Inscription : 02 Sep 2017
Localisation : Alsace

Re: Signal EcoWatt

Messagepar jluc2808 » 17 Déc 2022 08:10

: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
jluc2808
 
Messages : 499
Inscription : 30 Jan 2021

Re: Signal EcoWatt

Messagepar merguez07 » 17 Déc 2022 09:41

super
tuto 1 -->Programmation des scripts Eedomus
tuto 2 -->SmartDevice
tuto 3 -->Le déclenchement de règles
scripts -->Météo du jour | GH Thermostat | TotalWatt | Detecfire | smartbattery
Skype Eedomus -->lien vers le skype Eedomus
merguez07
 
Messages : 2346
Inscription : 15 Sep 2017
Localisation : Le Teil en Ardèche

Re: Signal EcoWatt

Messagepar ARTNOW » 18 Déc 2022 13:34

Merci la Team ;)
EEDOMUS + -RFP1000-IPX 800 V4-IPX 800 V5 - FIBARO -GOOGLE(Home-Nest & mini)
ARDUINO-RASPBERRY PRUSA MK3S
Domotisation de :1xPiscine/9xClimatisations réversibles/2xVolets somfy/1xAlarme/1xChauffe-Eau thermodynamique/3xPortes Garage et 1xportail
ARTNOW
 
Messages : 1282
Inscription : 22 Avr 2018
Localisation : LOIRE ATLANTIQUE

Re: Signal EcoWatt

Messagepar catalan » 18 Déc 2022 15:10

Merci la team :P
catalan
 
Messages : 48
Inscription : 13 Nov 2016
Localisation : Perpignan

Re: Signal EcoWatt

Messagepar didou45 » 19 Déc 2022 09:40

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
didou45
 
Messages : 4
Inscription : 27 Mars 2019

Re: Signal EcoWatt

Messagepar merguez07 » 19 Déc 2022 12:42

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 ???!!!!!
tuto 1 -->Programmation des scripts Eedomus
tuto 2 -->SmartDevice
tuto 3 -->Le déclenchement de règles
scripts -->Météo du jour | GH Thermostat | TotalWatt | Detecfire | smartbattery
Skype Eedomus -->lien vers le skype Eedomus
merguez07
 
Messages : 2346
Inscription : 15 Sep 2017
Localisation : Le Teil en Ardèche

Re: Signal EcoWatt

Messagepar JuanMarco » 19 Déc 2022 18:11

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.
JuanMarco
 
Messages : 61
Inscription : 17 Déc 2018

Re: Signal EcoWatt

Messagepar marcal » 02 Jan 2023 11:46

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...
marcal
 
Messages : 203
Inscription : 07 Déc 2016
Localisation : Toulouse

Re: Signal EcoWatt

Messagepar opa95 » 22 Déc 2023 18:38

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.
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 : 744
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: Signal EcoWatt

Messagepar vva » 22 Mai 2024 16:47

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é 2559 fois
vva
 
Messages : 386
Inscription : 12 Juin 2013

Re: Signal EcoWatt

Messagepar opa95 » 22 Mai 2024 18:51

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;
?>
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 : 744
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: Signal EcoWatt

Messagepar vva » 23 Mai 2024 17:16

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
vva
 
Messages : 386
Inscription : 12 Juin 2013


Retour vers Nouveautés & Annonces

Qui est en ligne ?

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