[Store] Tempo EDF

Lecture des compteurs EDF avec téléinformation

Re: [Store] Tempo EDF

Messagepar opa95 » 02 Fév 2025 19:42

Bonjour Vincent
Vincent a écrit:Bonjour Opa95,

Quand tu parles de tarifs qui ont "suivis", tu parles d'un script qui les récupère automatiquement ?

Oui, pour avoir la couleur du lendemain, le script utilise premièrement l'Api "enedis", puis l'Api "edf" si enedis est indisponible (ça arrive rarement), puis les sites "Selectra" (en fait 3 sites différents) si les Api ne répondent pas.
Enfin, les tarifs peuvent être imposés ou recherchés sur un site "Selectra" chaque jour ou chaque semaine (lundi) ou chaque mois (le premier du mois).
En fonctionnement normal, il y a 2 appels par jour : prévision (6h15 sur Enedis) puis confirmation (10h45 sur enedis) plus l'appel éventuel pour les tarifs. Le samedi, il n'y a pas d'appel, car le dimanche est toujours bleu : En moyenne 13 appels internet par semaine. :)
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 : 939
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar opa95 » 02 Fév 2025 19:59

Bonsoir colBur
Essaie avec la version suivante qui n'est pas encore parfaite, mais qui corrige déjà certaines incorrections pour remplacer ta version.
sauve le php sur ta box, le md est le mode d'emploi.
https://filedn.eu/lDueTcUixMVjkxeKkEzWTY0/edf_tempo.zip
:)
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 : 939
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar ColBuR » 02 Fév 2025 20:20

opa95 a écrit:Bonsoir colBur
Essaie avec la version suivante qui n'est pas encore parfaite, mais qui corrige déjà certaines incorrections pour remplacer ta version.
sauve le php sur ta box, le md est le mode d'emploi.
https://filedn.eu/lDueTcUixMVjkxeKkEzWTY0/edf_tempo.zip
:)


Merci

le jour en rouge est revenu.

PS : j'avais essayé une création d'un nouveau "store eedomus" avec l'edf TEMPO mais ça n'avait rien changé. Il doit y avoir quelque chose dans le script.
ColBuR
 
Messages : 11
Inscription : 01 Nov 2021

Re: [Store] Tempo EDF

Messagepar Vincent » 03 Fév 2025 09:01

opa95 a écrit:Bonjour Vincent
Vincent a écrit:Bonjour Opa95,

Quand tu parles de tarifs qui ont "suivis", tu parles d'un script qui les récupère automatiquement ?

Oui, pour avoir la couleur du lendemain, le script utilise premièrement l'Api "enedis", puis l'Api "edf" si enedis est indisponible (ça arrive rarement), puis les sites "Selectra" (en fait 3 sites différents) si les Api ne répondent pas.
Enfin, les tarifs peuvent être imposés ou recherchés sur un site "Selectra" chaque jour ou chaque semaine (lundi) ou chaque mois (le premier du mois).
En fonctionnement normal, il y a 2 appels par jour : prévision (6h15 sur Enedis) puis confirmation (10h45 sur enedis) plus l'appel éventuel pour les tarifs. Le samedi, il n'y a pas d'appel, car le dimanche est toujours bleu : En moyenne 13 appels internet par semaine. :)


Hello, merci pour ton retour. J'utilise ton script depuis que je suis en Tempo pour la remontée des jours. Quand je parlais "tarifs" je voulais dire "prix au kilowattheure". Perso c'est manuel (avec des règles quand changent le tarif actif 2 fois par jour en fonction de la couleur du jour). Pour ta part tu entre également les prix à la main ou un script sait les retrouver quelque part ?
Merci :)
Vincent
 
Messages : 71
Inscription : 21 Fév 2013

Re: [Store] Tempo EDF

Messagepar opa95 » 03 Fév 2025 10:05

Bonjour Vincent
Vincent a écrit:Hello, merci pour ton retour. J'utilise ton script depuis que je suis en Tempo pour la remontée des jours. Quand je parlais "tarifs" je voulais dire "prix au kilowattheure". Perso c'est manuel (avec des règles quand changent le tarif actif 2 fois par jour en fonction de la couleur du jour). Pour ta part tu entre également les prix à la main ou un script sait les retrouver quelque part ?
Merci :)

Dans les versions V3.x, les tarifs sont mis à jour automatiquement depuis la liste des tarifs à 6h00 (passage tarif jour) et 22h00 (passage tarif nuit);
Pour accéder aux tarifs du jour (mis à jour à 6h00) utiliser un device avec
XPATH : //tarifs_aujourdhui
Pour les tarifs du lendemain
XPATH : //tarifs_demain
Pour le tarif instantané (heure actuelle, mis à jour à 6h00 et 22h00)
XPATH : //tarif_now
La liste globale des tarifs :
XPATH : //tarifs
La liste globale des tarifs est dans le code initial au moment de la création du code, mais elle est remise à jour tous les lundis (ou au choix, tous les jours ou tous les mois) à partir de "Selectra" ou de 2 sites miroirs
https://selectra.info/energie/fournisseurs/edf/tempo
https://www.fournisseurs-electricite.com/edf/tarifs/tempo
https://prix-elec.com/tarifs/fournisseurs/edf/tempo
Comme il s'agit de pages Web que le script doit décoder, on reste à la merci de modifications des pages, c'est pourquoi on doit quand même être capable d'imposer les valeurs. N'utilisant pas l'IA pour récupérer les valeurs, le script recherche les valeurs en fonction de la structure du bloc qui les contient : C'est assez fiable, car Selectra conserve cette structure inchangée depuis un certain temps; la structure est identique pour les 2 premiers sites (le second est une copie directe du premier) et un peu différente pour le 3ème.
:)
Code : Tout sélectionner
<root>
  <tempo>
    <version>V4.3</version>
    <maintenant>BLEU</maintenant>
    <hchp>HP</hchp>
    <tarif_now>0.1552</tarif_now>
    <aujourdhui>BLEU</aujourdhui>
    <tarifs_aujourdhui>0.1288/0.1552</tarifs_aujourdhui>
    <demain>ROUGE</demain>
    <estime>ROUGE</estime>
    <confirme>ROUGE</confirme>
    <tarifs_demain>0.1518/0.6586</tarifs_demain>
    <decompte_bleu>109</decompte_bleu>
    <decompte_blanc>25</decompte_blanc>
    <decompte_rouge>21</decompte_rouge>
    <reste_bleu>191</reste_bleu>
    <reste_blanc>18</reste_blanc>
    <reste_rouge>1</reste_rouge>
    <total_bleu>300</total_bleu>
    <total_blanc>43</total_blanc>
    <total_rouge>22</total_rouge>
    <date_now>2025-02-02</date_now>
    <date_aujourdhui>Dimanche 2025-02-02</date_aujourdhui>
    <date_demain>2025-02-03</date_demain>
    <filetime>153434</filetime>
    <counts>1/0/1/0/0/</counts>
    <miss>0/0/0/0/0/</miss>
    <tarifs>0.1288,0.1552,0.1447,0.1792,0.1518,0.6586</tarifs>
    <action>reset</action>
    <test>test</test>
  </tempo>
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 : 939
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar Vincent » 23 Mars 2025 19:23

Hello,

Merci pour ton message, c'est top !
Cependant les tarifs ne semblent pas à jour suite à la réduction des prix du 01/02/2025 :s
Vincent
 
Messages : 71
Inscription : 21 Fév 2013

Re: [Store] Tempo EDF

Messagepar opa95 » 24 Mars 2025 16:02

Bonjour Vincent
Vincent a écrit:Hello,
Merci pour ton message, c'est top !
Cependant les tarifs ne semblent pas à jour suite à la réduction des prix du 01/02/2025 :s

Désolé pour le retard. :(
Normalement, tu peux avoir une version qui marche (chez moi c'est OK pour la mise à jour des tarifs)
https://filedn.eu/lDueTcUixMVjkxeKkEzWTY0/edf_tempo.zip
Ce n'est pas la version définitive, car j'ai eu d'autres occupations ces derniers temps.
La mise au point de la V4.4 reprendra bientôt : c'est trop tard pour cette année, mais si je ne le fais pas maintenant je vais oublier. :)
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 : 939
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar Vincent » 24 Mars 2025 21:15

Merci :)
Vincent
 
Messages : 71
Inscription : 21 Fév 2013

Re: [Store] Tempo EDF

Messagepar cadkey » 11 Juil 2025 07:54

Bonjour,
Pour info, le décideur des jours Tempo est RTE.
J'utilise l'API non documentée de RTE qui permet de connaitre la couleur de 'demain':
https://www.services-rte.com/cms/open_d ... tempoLight
Elle renvoie directement un json.
Je l'utilise depuis deux ans environ.
La couleur de 'demain' est connue avant 7h la veille, bien avant la publication par EDF ou le Linky.
cadkey
 
Messages : 3
Inscription : 03 Mai 2018

Re: [Store] Tempo EDF

Messagepar opa95 » 13 Sep 2025 09:36

Bonjour
La dernière version à jour de tempo est celle du 02/02/2025 19:50, toujours accessible au lien cité plus haut (24 mars 2025)
Chez moi, elle marche bien, même si je n'ai pas d'abonnement tempo.
Le décompte des jours a bien repris automatiquement le premier septembre :
actuellement (samedi 13 septembre 2025, 10h) l'affichage des jours est :
13-0-0 (300-43-22) depuis 10 heures [13 jours bleu,0 blanc et 0 rouge]
Certains utilisateurs, qui ont une version antérieure, n'ont pas vu le décompte des jours repartir correctement, ils doivent recharger cette version.
Bonne journée :)
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 : 939
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar Vincent » 13 Sep 2025 09:57

Hello,

De mon côté je constate que les tarifs n'ont pas été mis à jour le 1er août. Donc ils sont faux depuis :(
Vincent
 
Messages : 71
Inscription : 21 Fév 2013

Re: [Store] Tempo EDF

Messagepar opa95 » 13 Sep 2025 10:26

Bonjour Vincent
Vincent a écrit:Hello,
De mon côté je constate que les tarifs n'ont pas été mis à jour le 1er août. Donc ils sont faux depuis :(

Voici les tarifs que j'observe au voisinage du 1er août
TempoTarifs.png
TempoTarifs.png (44.31 Kio) Consulté 53 fois

et ceux que je viens de voir sur Internet
TempoTarifsEdf.png
TempoTarifsEdf.png (148.39 Kio) Consulté 53 fois

As-tu la dernière version?
La mise à jour du tarif était laissée à la valeur par défaut (W), ce qui explique une mise à jour le lundi 3 août au lieu du 1er :
la valeur VAR1: D aurait été plus pertinente
Sinon, on peut normalement imposer les valeurs dans VAR1 (cf script ligne 15)
"VAR1 : tarifs (Bleu valeurs,Blanc valeurs, rouge valeurs) valeurs (hp,hc ou hc,hp) ou période de mise à jour [D ou W ou M] (Day,Week,Month) ou vide W par défaut (ex 0.1296,0.1609,0.1486,0.1894,0.1568,0.7562, ou W)"
donc essayer VAR1 : D ou bien VAR1 : 0.1232,0.1494,0.1391,0.173,0.146,0.6468
:)
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 : 939
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar Vincent » 13 Sep 2025 10:35

Hello. Merci pour ta réponse. Script bien à jour (indique que je dispose déjà de la dernière version) et VAR1 vide. Il aurait donc du avoir les bons tarifs depuis le 03/08 j'imagine :(
Je ne vais pas les entrer manuellement ici, je ne me sers pas de cas justement parce que je n'étais pas certain que les tarifs seraient bons sans intervention de ma part.
Je les entre déjà manuellement dans un autre device.

Mais du coup je ne comprends pas, pour qu'ils affichent les bons tarifs il faut lui entrer manuellement ?
Vincent
 
Messages : 71
Inscription : 21 Fév 2013

Re: [Store] Tempo EDF

Messagepar opa95 » 13 Sep 2025 11:12

Bonjour Vincent
Vincent a écrit:Hello. Merci pour ta réponse. Script bien à jour (indique que je dispose déjà de la dernière version) et VAR1 vide. Il aurait donc du avoir les bons tarifs depuis le 03/08 j'imagine :(
Je ne vais pas les entrer manuellement ici, je ne me sers pas de cas justement parce que je n'étais pas certain que les tarifs seraient bons sans intervention de ma part.
Je les entre déjà manuellement dans un autre device.
Mais du coup je ne comprends pas, pour qu'ils affichent les bons tarifs il faut lui entrer manuellement ?

Je pense que le problème vient du fait que le store n'est pas à jour (ce n'est pas moi qui ai créé le script initial).
Il faut donc obligatoirement récupérer le nouveau script et le télécharger manuellement pour que le script soit remis à jour.
J'ai remis une mise à jour journalière des tarifs (par défaut) pour corriger le "bug" du 3 août.
Le script à jour est la version 4.33 (du 13/02/2025) toujours à la même adresse donnée plus haut
ou bien en copie plus bas.
Pour remplacer l'ancien, ouvrir l'ancien script (éditer), tout sélectionner et faire un copier-coller avec le nouveau script puis sauvegarder.
Pour pouvoir imposer les tarifs manuellement, il faut que l'appel se fasse par
http://localhost/script/?exec=edf_tempo.php&tarifs=[VAR1]
ou
http://localhost/script/?exec=edf_tempo.php&tarifs=[VAR1]&timer=[VAR2]&reset=[VAR3]
au lieu de
http://localhost/script/?exec=edf_tempo.php
:)
Script version 4.33
Code : Tout sélectionner
<?php
/*****************************************************************************
** Script Tempo pour eedomus (Documentation : voir fichier md)
** Script qui permet de récupérer au format XML les données Tempo avec l'api rte, edf et sites Selectra (3 sites) :
** Les données sont stockées en mémoire et le polling sur les sites est réglé par la valeur de 'timer' : appels sur les sites seulement si données manquantes.
** Polling automatique au passage à 0h00, 6h00, 6h15, 6h30*, 8h00*, 11h30*, 12h15* et 22h (* si necessaire). Pour un fonctionnement efficace, on peut régler la fréquence des devices à une valeur faible (2 ou 5 minutes).
** Un polling complémentaire, est réglé par timer pour limiter les appels successifs des devices (timer = 20 par défaut)
** On peut restreindre l'utilisation des sources : src absent ou 0 ou 7 toutes les sources, 1 rte, 2 edf, 3 rte+edf, 4 selectra, 5 rte + selectra, 6 edf + selectra
** Il n'y a que quelques appels par jour : en général 1 (0 le samedi) plus 1 pour les tarifs (journalier ou hebdomadaire ou mensuel), quel que soit le nombre de devices créés. Le reste du temps les appels renvoient le contenu de la mémoire et gérent l'état actuel (0h, 6h et 22h).
****************************************************************************
**  - URL de la Requête 
**:   - http://localhost/script/?exec=edf_tempo.php
**    - ou http://localhost/script/?exec=edf_tempo.php&tarifs=[VAR1]&timer=[VAR2]&reset=[VAR3]
** avec
** VAR1 : tarifs (Bleu valeurs,Blanc valeurs, rouge valeurs) valeurs (hp,hc ou hc,hp) ou période de mise à jour [D ou W ou M] (Day,Week,Month) ou vide D par défaut (ex 0.1296,0.1609,0.1486,0.1894,0.1568,0.7562, ou D)
** VAR2 : vide ou durée du timer (minutes) 20 par défaut, si <0 lecture immédiate
** VAR3 : reset (0 par défaut, 1 sinon, si négatif 1 seul reset, sauf si changement de valeur négative) effacement mémoire et relecture des données
** - Fréquence de la Requête : 2 ou 5 pour mettre à jour l'affichage plus souvent lors des passage programmés; le polling réel est réglé par 'timer'
** autres commandes ajouter à la fin de la ligne de commande ou à la suite d'une variable :
** source &src=1 [0..7] (7 par défaut)
** confirmation : &conf=0, [0,1] (0 par défaut) si 1 attente de confirmation (10h45 pour rte)
** nom mémoire : &mem=nom (OLDtempo par défaut)
** mode debug : &debug=0 (0 par défaut,-1,1) (-1 infos, 1 tout)
** modification état : &setstate=chp:val avec chp = [A,D,C,T] (Aujourdhui, Demain, Compte, Tarif), ou vide; pour chp=A ou D val = ND,BLUE,WHITE,RED; possible si manuel = 1 (0 sinon)
** manuel : &manuel=1 (par défaut) ou 0 (autorise setstate)
** simul : décalage temporel (heures décimales) : &simul=yyyyy (0 par défaut)
****************************************************************************
Resultats : //champ ou /root/tempo/champ (ou /root/debug/champ)
voir les champs en mode test ou dans sdk_print
********************************************************************************
urls compatibles : (normalement rte dès 6h15, Selectra dès 6h30, edf dès 8h)
api rte : https://www.services-rte.com/cms/open_data/v1/tempo?season=2024-2025
api edf : https://www.api-couleur-tempo.fr/api/joursTempo?periode=2024-2025,
autres (tarifs) la valeur #selectra ou #selectra2 est adaptée au site
  https://selectra.info/energie/fournisseurs/edf/tempo#selectra, 
  https://www.fournisseurs-electricite.com/edf/tarifs/tempo#selectra,
  https://prix-elec.com/tarifs/fournisseurs/edf/tempo#selectra2
******************************************************************************
** Evolution des versions :
** 2017-07-26 (DjMomo)    :V1.0 - Version initiale
** ....
** V4.0 : Restriction à Tempo, utilisation des API Rte, Edf et Selectra (opa95 et Merguez07, 2024-10-01) minimisation des appels (mise en cache local),  état du jour, du lendemain, actuel (couleur et tarif), décompte des jours (bleus, blancs, rouges)
** V4.1 : petites Corrections
** V4.2 : Confirmation rte à 10h45 et petites Corrections
** V4.3 : Ajout timing 15 secondes pour connexion http, corrections diverses (2024-12-01)
** V4.32 : Corrections diverses (2025-02-05)
** V4.33 : correction mineure sur tarifs(2025-09-13)
*******************************************************************************/
//Initialisations
@sdk_header('text/xml');
define('MEM','OLDtempo');
define('DEFTIMER',20);//20 minutes
define('MAXSRC',7);
define('VER','V4.32');
define('NBW','43');
define('NBR','22');
define('MANUAL','1');//autorise la commande manuelle
define('DEFTARIF','D');//Daily
define('DEFCONF','0');//affichage estimation puis confirmation
define('DEFFERIE','1');//pas de lecture dimanche et jours fériés confirmation
define('TSTART',60000);//début start 06h00:00
define('TRTE',61500);//lecture rte 06h15:00
define('TMAXRTE',104500);//lecture rte 10h45:00
define('TSEL',63000);//lecture selectra 06h30:00
define('TMAXSEL',143000);//lecture selectra 14h30:00
define('TEDF',80500);//lecture edf 8h05:00
define('TSTOP',220000);//fin HP 22h00:00
define('TMAT',113000);//11h00:00
define('NOON',121500);//12h15:00
$colors['rte']  = array(1=>'BLUE','WHITE','RED',0=>'ND');
$colors['eed']  = array($colors['rte'][1]=>'BLEU',$colors['rte'][2]=>'BLANC',$colors['rte'][3]=>'ROUGE',$colors['rte'][0]=>'ND');

$mem_name = getArg('mem',false,MEM);
$reset_   = getArg('reset',false);//réinitialisation totale
if ($reset_=='') $reset_=0;
$timer_   = getArg('timer',false);
if ($timer_=='') $timer_=DEFTIMER;
$timer    = abs(60*$timer_);// secondes
$simul    = getArg('simul',false,0);
$time_now = time() + $simul;
$src_    = getArg('src',false,MAXSRC)%MAXSRC;
if (!$src_) $src_ = 7;
$src['rte'] = 1&$src_;
$src['edf'] = (2&$src_)/2;
$src['alt'] = (4&$src_)/4;
$debug = getArg('debug',false,0);
// XML header
$xml = '<?xml version="1.0" encoding="UTF-8"?>'."\n";
if ($debug>0){
  $xml .= "<!--\n";
  echo $xml;//print header for debugging
}

//reset?
$reset = 0;
$mem = loadVariable($mem_name);
$todayDate  = sdk_day($time_now);
if ( $mem == '') $reset = 1;
else {
  $is_new_day = ($todayDate != $mem['todayDate']);
  if ($debug>0) var_dump($mem);
  if ($reset_>0) {
    $reset = $reset_ = $mem['st']['reset'] = 1;
  }elseif ($reset_<0) {//reset_ < 0
    $reset = ($reset_ == $mem['st']['reset'])?0:1;//reset change de valeur
    $mem['st']['reset'] = $reset_;
  }
  if ( !(array_key_exists('src',$mem) && ($src_ == $mem['src'])) ) {
    $reset = $mem['st']['reset'] = 1;
    $mem['src'] = $src_;
  }
  if (!$is_new_day && !$reset && array_key_exists('xml',$mem) && $mem['st']['ok']) {//opa?
    if ($debug>0) echo "read\n-->\n";
    if ($mem['st']['reset']>0){
      $mem['st']['reset'] = ($reset_)? 0:$reset_;
      $mem['st']['lastAction'] = "READ";
      sdk_print(1);//die
    }
    echo $mem['xml'];
    die;
  }
}

if ($reset) {
  $action = 'reset';
  sdk_init($mem_name,$time_now);
}//poll print die

//necessary
$manual_  = getArg('manuel',false,MANUAL);
$conf     = getArg('conf',false);
if ($conf=='') $conf=DEFCONF;
$ferie     = getArg('ferie',false);
if ($ferie=='') $ferie=DEFFERIE;
$action = '';
$set_state_  = strtoupper(getArg('setstate',false,''));
if ($set_state_ == ''){$set_state[0] = '';$set_state[1] = 0;
}else{
  $set_state = explode(':',$set_state_);
//  if (!in_array($set_state[0],array('A','D','C','T'))) $set_state[0] = '';
  if (!in_array($set_state[0],array('D','C','T'))) $set_state[0] = '';
  if (count($set_state)<2) $set_state[1] = '';
  $action = 'setstate';
}
if ($debug >0) var_dump($_GET);

//reset?
if ( $mem == '') $reset = 1;
else {
  $month_now = date('m',$time_now);
  $year_now = date('Y',$time_now);
  if ($month_now>=9) $season = $year_now.'-'.($year_now+1);
  else $season = ($year_now-1).'-'.$year_now;
  if ($season != $mem['season']) $reset = 1;//nouvelle saison
  if (($time_now - $mem['fileTimestamp'])>86400) $reset = 1;//too old file
  if (!in_array($mem['todayColor'],$colors['rte'])) $reset=1;
  if (array_key_exists('manual',$mem['st'])) {
    $manual = ($manual_!='')?$manual_:$mem['st']['manual'];
  }else $manual = MANUAL;
}
if ($time_now < $mem['fileTimestamp']) { // simulation (recul)
  $reset = 1;
}
if ($reset) {
  $action = 'reset';
  $mem['st']['reset'] = ($reset_<0)?$reset_:1;
  sdk_init($mem_name,$time_now);
}//poll print die
//else $mem['st']['reset'] = $reset_;//opa

//action?
$mem['version'] = VER;
$adjustFile = 0;
if ( ($action == 'setstate') && $manual && ($set_state[0] != '')){
  if ($set_state[1] == ''){
    switch ($set_state[0]) {
//      case 'A' : $mem['st']['today'] = 0;$timer=0.01;$timer_=-0.01;break;
      case 'D' : $mem['st']['tomoro'] = 0;$timer=0.01;$timer_=-0.01;$mem['tomoroColor'] = $colors['rte'][0];break;
      case 'C' :
        $mem['st']['count'] = 0;$req_fields['count'] = 1;$timer=0.01;$timer_=-0.01;break;
      case 'T' :
        $mem['st']['rates'] = 0;$req_fields['rates'] = 1;$timer=0.01;$timer_=-0.01;break;
    }
  }else{
    if (in_array($set_state[1],$colors['eed'])) {
      foreach($colors['eed'] as $key => $color)
        if ($color == $set_state[1]) {$set_state[1] = $key;break;}
    }
    if (!in_array($set_state[1],$colors['rte']))
      $set_state[1]='ND';
    switch ($set_state[0]) {
      case 'D' :
        $mem['tomoroDate']  = sdk_day($time_now,1);
        $mem['tomoroColor'] = $set_state[1];
        $mem['st']['tomoro'] = $mem['tomoroDate'];
        break;
//      case 'A' :
//        $mem['todayColor'] = $set_state[1];
//        break;
    }
    $timer=0.01;$timer_=-0.01;
    $req_fields['tomoro'] = 0;//requested fields
    $action = 'read';
  }
}

  //search for modifications
  $today_week = date('D',$time_now);
  $period = sdk_period($time_now);
  $hour_file  = date('His',$mem['fileTimestamp'])+0;
  $hour_now   = date('His',$time_now)+0;
  $mem['tomoroDate'] = sdk_day($time_now,1);
  $action='';
  if ($is_new_day) {//midnight
    $action = 'midnite';
  }elseif($hour_now<TSTART){
      $action = 'read';$adjustFile=0;
  }elseif ($hour_file<TSTART) {
    $action = 'read';$adjustFile=1;
  }elseif (($hour_file<TSTOP) && ($hour_now>=TSTOP)) {
    $action = 'read';$adjustFile=1;
  }else{
    $actions = array(TRTE=>'startrte',TSEL=>'startalt',TEDF=>'startedf',TMAXRTE=>'tmaxrte',TMAT=>'tmat',NOON=>'poll',TMAXSEL=>'poll','150000'=>'end');//sorted
    foreach ($actions as $timeOut => $action){
      if ($hour_file < $timeOut) {
        if ($hour_now  < $timeOut) $action = 'read';
        break;
      }
    }
    if ( !$mem['st']['conftomoro'] && ($action =='') ){
      $T1 = TMAXRTE;
      $T2 = TMAT;
      if ($T2<$T1) {$T1=TMAT;$T2=TMAXRTE;}
      if ($hour_now>=$T2) $action = $actions[$T2];
      elseif ($hour_now>=$T1) $action = $actions[$T1];
    }
  }
  if ($action == ''){
    if (($time_now - $mem['fileTimestamp'])>$timer) {$action = 'timer';
    }elseif ($timer_<0) {$action = 'timer_';}
    else {$action = 'read';}
  }
$mem['todayDate'] = $todayDate;
$req_fields = array('tomoro' => 0,'count' => 0,'rates' => 0);//requested fields

switch ($action){
  case 'read' : break;
  case 'midnite' :
    $hour_file_ = 0;
    $mem['todayWeek'] = $today_week;
    $mem['count']['rte'] = $mem['count']['edf'] = $mem['count']['alt1'] = $mem['count']['alt2'] = $mem['count']['alt3'] = 0;//reset counters
    $mem['st']['tomoro'] = $mem['st']['conftomoro'] = $mem['st']['count'] = 0;
    if ($mem['todayColor'] != $colors['rte'][0]) //!='ND'
      $mem['yesterColor'] = $mem['todayColor'];//oldvalue
    if (!in_array($mem['tomoroColor'],$colors['rte'])) $mem['tomoroColor'] = $colors['rte'][0];//ND
    elseif ($mem['tomoroColor'] != $colors['rte'][0]){ //!='ND'
      $mem['todayColor'] = $mem['tomoroColor'];//oldvalue
      $mem[$mem['todayColor']]['dec']++;
    }
    if ($ferie) sdk_ferie();
    $mem[$mem['todayColor']]['rem'] = $mem[$mem['todayColor']]['tot'] - $mem[$mem['todayColor']]['dec'];
    $req_fields['rates'] = ($period != $mem['st']['rates']);
    $mem['todayDate'] = $todayDate;
    $result = sdk_poll($action,$req_fields);
    $mem['st']['lastAction'] = 'midnite';
    $adjustFile = 1;
    break;
  default :
    if ($action != 'setstate'){
      if ($hour_now < TRTE) $src['rte'] = 0;
      if ($hour_now < TSEL) $src['alt'] = 0;
      if ($hour_now < TEDF) $src['edf'] = 0;
    }
    $adjustFile = 1;
    switch ($action){
      case 'timer' :
        if ($mem['st']['tomoro'] == $mem['tomoroDate']){
          $action = 'read';
          break 2;
        }
        $req_fields['tomoro'] = $req_fields['count'] = 1;
        break;
      case 'timer_' :
        $mem['st']['rates'] = 0;
        $req_fields['rates'] = ($mem['ratePeriod'] != 'N')? 1: 0;
      case 'simul' :
        $mem['st']['tomoro'] = $mem['st']['count'] = 0;
        $req_fields['tomoro'] = $req_fields['count'] = 1;
        break;
      case 'startalt' : $req_fields['rates'] = ($mem['ratePeriod'] != 'N')? 1: 0;
      case 'startedf' :
      case 'startrte' :
        if (($mem['st']['tomoro'] != $mem['tomoroDate']) || ($mem['st']['count'] != $mem['tomoroDate']) || $req_fields['rates']) {
          $req_fields['tomoro'] = $req_fields['count'] = 1;
          $mem['st']['lastAction']=$action;
        }
        break;
      case 'tmaxrte' :
        if (!$src['rte'] || $mem['st']['conftomoro']) {$action='read';$adjustFile=0;break;}
        $mem['st']['tomoro'] = 0;//polling
        $req_fields['tomoro'] = 1;//polling
        $mem['st']['lastAction']=$action;
        break;
      case 'tmat' :
        if ($mem['st']['conftomoro']) {break;}
        $mem['st']['tomoro'] = 0;//polling
        $req_fields['tomoro'] = 1;//polling
        $mem['st']['lastAction']=$action;
        break;
      case 'setstate' : $action ='read';
        if ($set_state[0] == 'D') {
          $req_fields['tomoro'] = $req_fields['count'] = 1;
        }
        break;
      case 'poll' : break;
      default : $adjustFile = 0;
    }
    $result = sdk_poll($action,$req_fields);
    $adjustFile = ($result==1)?1: $adjustFile;
}
sdk_print($adjustFile);//die

function sdk_div($a,$b)
{//proche part_entiere
  $div = ($a - ($a%$b))/$b;
//  $div = floor($a/$b);
  return $div;
}

function sdk_easterSunday($nY)
{
  $nA = (($nY%4 == 0) && !($nY%100 == 0)) && ($nY%400 != 0);
  $nGZ = ($nY%19) + 1;
  $nJHD = sdk_div($nY,100) + 1;
  $nKSJ = sdk_div(3*$nJHD, 4) - 12;
  $nKORR = sdk_div(8*$nJHD + 5, 25) - 5;
  $nSO = sdk_div(5*$nY,4) - $nKSJ - 10;
  $nEpacte = (11*$nGZ + 20 + $nKORR - $nKSJ)%30;
  if (($nEpacte == 25 || $nGZ == 11) && $nEpacte == 24) $nEpacte += 1;
  $nN = 44 - $nEpacte;
  if($nN < 21) $nN += 30;
  $nN += 7 - (($nSO + $nN)%7);
  $nN += $nA +59;
  // Month
  $nNM = $nN;
  if ($nNM > (59 + $nA)) $nNM += 2 - $nA;
  $nNM += 91;
  $nMONTH = sdk_div(20 * $nNM, 611) - 2;
  // Day
  $nNT = $nN;
  if ($nNT > (59 + $nA)) $nNT += 2 - $nA;
  $nNT += 91;
  $nM = sdk_div(20*$nNT,611);
  $nDAY = $nNT - sdk_div(611*$nM,20);
  $dtsdk_easterSunday = mktime(0, 0, 0, $nMONTH, $nDAY, $nY);
  return $dtsdk_easterSunday;
}

function sdk_mobile_feries()
{
  global $mem;
  $mem['j_feries'] = array('01-01','05-01','05-08','07-14','08-15','11-01','11-11','12-25');
  $year = substr($mem['todayDate'],0,4);
  $easter = sdk_easterSunday($year);
  $day = 86400;
  $mem['j_feries']['easter'] = date('m-d',$easter+$day);
  $mem['j_feries'][] = date('m-d',$easter+39*$day);
  $mem['j_feries'][] = date('m-d',$easter+50*$day);
  sdk_ferie();
}

function sdk_ferie()
{
  global $mem,$colors,$req_fields,$reset;
  if (($mem['st']['tomoro'] == $mem['tomoroDate']) && !$reset) return 0;
  if (($mem['todayWeek'] == 'Sat') || in_array(substr($mem['tomoroDate'],5),$mem['j_feries']) ) {
      $mem['tomoroColor'] = $colors['rte'][1];//Sunday
      $mem['st']['tomoro'] = $mem['st']['conftomoro'] = $mem['st']['count'] = $mem['tomoroDate'];
      $req_fields['tomoro'] = $req_fields['count'] = 0;
  }
  elseif (($mem['todayWeek'] == 'sun') || in_array(substr($mem['todayDate'],5),$mem['j_feries']) ) {
    $mem['todayColor'] = $colors['rte'][1];
  }
  else {$mem['tomoroColor'] = $colors['rte'][0];return 0;}
  return 1;
}
function sdk_now()
{
  global $time_now,$mem;
  $hour = date('His',$time_now);
  $mem['hchp'] = (($hour<TSTART) || ($hour>TSTOP))?'HC':'HP';
  if ($hour<TSTART) {
      $mem['nowDate']  = $mem['yesterDate'];
      $mem['nowColor'] = $mem['yesterColor'];
  }else{
      $mem['nowDate']  = $mem['todayDate'];
      $mem['nowColor'] = $mem['todayColor'];
  }
}

function sdk_init_tarifs (){
  global $colors,$mem;
  $tarifs = strtoupper(getArg('tarifs',false,''));//BHC, BHP, WHC, WHP, RHC, RHP
  $rates = array('D','W','M','N');//Dayly,Weekly,Monthly,No
  if ($tarifs==''){$tarifs=DEFTARIF;}
  elseif (!strpos('@'.$tarifs,',')){
    $tarifs = trim(strtoupper($tarifs));
    foreach($rates as $item){
      if (strpos('@'.$tarifs,$item) == 1) {
        $tarifs = $item;
        break;
      }
    }
  }else{
    $i = 0;
    $tarifs_ = explode(',',$tarifs);
    foreach ($colors['rte'] as $col){
      if ($col == $colors['rte'][0]) continue;
      if ( ($tarifs_[$i]) && ($tarifs_[$i]<$tarifs_[$i+1])){
        $mem[$col]['HP'] = $tarifs_[$i+1];
        $mem[$col]['HC'] = $tarifs_[$i];
      }else{
        $mem[$col]['HC'] = $tarifs_[$i+1];
        $mem[$col]['HP'] = $tarifs_[$i];
      }
      $i += 2;
    }
    $tarifs = 'N';
  }
  $mem['ratePeriod'] = $tarifs;
  return $tarifs;
}

function sdk_init($mem_name,$time)
{
  global $mem,$colors,$time_now,$debug,$adjustFile,$src,$reset_,$hour_now;
  $hour_now   = date('His',$time)+0;
  $month = date('m',$time);
  $year = date('Y',$time);
  $nb_blue = 365-NBW-NBR;
  if ($month>=9) {
    $season = $year.'-'.($year+1);
    $nb_blue += date('L',strtotime('next year'));
  }else{
    $season = ($year-1).'-'.$year;
    $nb_blue += date('L',$time);
  }
  deleteVariable($mem_name);
  $mem = array ('version' => VER, 'season'=>$season,
    'todayDate'=>0,'todayColor'=>'ND','tomoroDate'=>0,'todayWeek'=>'x','tomoroColor'=>'ND',
    'yesterDate'=>0,'yesterColor'=>'ND',
    'nowDate'=>0,'nowColor'=>'ND',
    'hchp' => 'HP',
//op95    'BLUE' => array('rem'=>$nb_blue,'dec'=>0,'tot'=>$nb_blue,'HC'=>'0.1296','HP'=>'0.1609'),
    'BLUE' => array('rem'=>$nb_blue,'dec'=>0,'tot'=>$nb_blue,'HC'=>'0.1288','HP'=>'0.1552'),
    'WHITE' => array('rem'=>NBW,'dec'=>0,'tot'=>NBW,'HC'=>'0.1447','HP'=>'0.1792'),
    'RED' => array('rem'=>NBR,'dec'=>0,'tot'=>NBR,'HC'=>'0.1518','HP'=>'0.6586'),
    'ND' => array('HC'=>'0','HP'=>'0'),
    'ratePeriod'=>'W','count' => array('rte' => 0,'edf' => 0,'alt1' => 0,'alt2' => 0,'alt3' => 0),'miss' => array('rte' => 0,'edf' => 0,'alt1' => 0,'alt2' => 0,'alt3' => 0),
    'st'=>array('tomoro'=>'0','conftomoro'=>'0','count'=>0,'rates'=>-1,'reset'=>1,'fileTime'=>-1, 'manual'=>MANUAL, 'lastAction'=>'reset', 'ok' => 0),
   'fileTimestamp' => '0',
   'src' => MAXSRC,
   'xml' => ''
  ) ;
  $mem['st']['reset'] = ($reset_<0)?$reset_:1;  $mem['st']['fileTime'] = date('His',$time_now);
  $adjustFile = 1;
  $mem['todayDate'] = date('Y-m-d',$time);
  $mem['tomoroDate'] = sdk_day($time,1);
  $mem['yesterDate'] = sdk_day($time,-1);
  $mem['todayWeek'] = date('D',$time);
  if (strpos($mem['todayDate'],'09-01'))
    $mem['yesterColor'] = $mem['todayColor'] = $colors['rte'][1];
  $req_fields['tomoro'] = $req_fields['count'] = 1;
  $req_fields['rates'] = 1;
  $mem['src'] = $src['rte'] + 2*$src['edf'] + 4*$src['alt'];
  $src['alt'] = 1;
//  if ($reset_<0) $mem['st']['reset'] = $reset_;//opa
  sdk_init_tarifs();
  if ($debug >0) echo "Action : init\n";
  sdk_mobile_feries();
//opa  if ($ferie) sdk_ferie();//avant poll
  $result = sdk_poll('reset',$req_fields);
  $adjustFile = ($result)?1: $adjustFile;
  if ($debug>0) echo "init\n";//opa
  sdk_print();//die
}

function sdk_test_memory()
{
  global $mem,$mem_name,$colors,$time_now;
  $old_mem = loadVariable($mem_name);
  if (strlen($old_mem)==0) return;
  foreach (array('nowColor','todayColor','tomoroColor') as $key => $item){
    if ($old_mem && ($mem[$item] === "")) $mem['$item'] = $old_mem['$item'];
    if ($mem[$item] === "") $mem['$item'] = $colors['rte'][0];
  }
  foreach ($colors['rte'] as $color){
    if ($color == $colors['rte'][0]) continue;
    if ($old_mem && ($mem[$color]['dec'] === "")) $mem[$color]['dec'] = $old_mem[$color]['dec'];
    if ($mem[$color]['dec'] === "") $mem[$color]['dec'] = $mem[$color]['tot'];
    if ($mem[$color]['rem'] === "")
      $mem[$color]['rem'] = $mem[$color]['tot']- $mem[$color]['dec'];
  }
}

function sdk_print($adjustFile = 1)
{//suppose impression entete
  global $mem,$test,$mem_name,$debug,$colors,$timer_,$action,$src_,$src,$time_now,$conf,$xml,$reset;
  if (!$test) $test = 'test';
  $days   = array( 'Sun'=>'Dimanche', 'Mon'=>'Lundi', 'Tue'=>'Mardi', 'Wed'=>'Mercredi', 'Thu'=>'Jeudi', 'Fri'=>'Vendredi', 'Sat'=>'Samedi');
  sdk_now();
  if ($adjustFile) {
    $mem['fileTimestamp'] = $time_now;
    $mem['st']['fileTime'] = date('His',$time_now);
  }
  if (!$mem['tomoroColor']||!in_array($mem['tomoroColor'],$colors['rte'])) $mem['tomoroColor'] = $colors['rte'][0];
  sdk_test_memory();
  if($debug >0) {echo "Save :\n";var_dump($mem);}
  $conf_color = ($mem['st']['conftomoro'])? $colors['eed'][$mem['tomoroColor']]:$colors['eed'][$colors['rte'][0]];
  $tomoro_color = ($conf)? $conf_color:$colors['eed'][$mem['tomoroColor']];
  if ($debug>0) $xml = "-->\n";
  if ($reset) {$mem['st']['lastAction']='RESET';}
//  $mem['st']['reset'] = 0;//opa
  $mem['st']['ok'] = ($mem['st']['conftomoro'] && $mem['st']['count'] &&($mem['st']['rates'] || !$src['alt']) )?1:0;
// Génération du XML
  $xml .= "<root>\n";
  $xml .= "  <tempo>\n";
  $xml .= '    <version>'.$mem['version']."</version>\n";
  $xml .= '    <maintenant>'.$colors['eed'][$mem['nowColor']]."</maintenant>\n";
  $xml .= '    <hchp>'.$mem['hchp']."</hchp>\n";
  $xml .= '    <tarif_now>'.$mem[$mem['nowColor']][$mem['hchp']]."</tarif_now>\n";
  $xml .= '    <aujourdhui>'.$colors['eed'][$mem['todayColor']]."</aujourdhui>\n";
  $xml .= '    <tarifs_aujourdhui>'.$mem[$mem['todayColor']]['HC'].'/'.$mem[$mem['todayColor']]['HP']."</tarifs_aujourdhui>\n";
  $xml .= '    <demain>'.$tomoro_color."</demain>\n";
  $xml .= '    <estime>'.$colors['eed'][$mem['tomoroColor']]."</estime>\n";
  $xml .= '    <confirme>'.$conf_color."</confirme>\n";
  $xml .= '    <tarifs_demain>'.$mem[$mem['tomoroColor']]['HC'].'/'.$mem[$mem['tomoroColor']]['HP']."</tarifs_demain>\n";
  $xml .= "    <decompte_bleu>" . $mem['BLUE']['dec']."</decompte_bleu>\n";
  $xml .= "    <decompte_blanc>".$mem['WHITE']['dec']."</decompte_blanc>\n";
  $xml .= '    <decompte_rouge>'.$mem['RED']['dec']."</decompte_rouge>\n";
  $xml .= "    <reste_bleu>" . $mem['BLUE']['rem']."</reste_bleu>\n";
  $xml .= "    <reste_blanc>".$mem['WHITE']['rem']."</reste_blanc>\n";
  $xml .= '    <reste_rouge>'.$mem['RED']['rem']."</reste_rouge>\n";
  $xml .= "    <total_bleu>" . $mem['BLUE']['tot']."</total_bleu>\n";
  $xml .= "    <total_blanc>".$mem['WHITE']['tot']."</total_blanc>\n";
  $xml .= '    <total_rouge>'.$mem['RED']['tot']."</total_rouge>\n";
  $xml .= '    <date_now>'.$mem['nowDate']."</date_now>\n";
  $xml .= '    <date_aujourdhui>'.$days[$mem['todayWeek']].' '.$mem['todayDate']."</date_aujourdhui>\n";
  $xml .= '    <date_demain>'.$mem['tomoroDate']."</date_demain>\n";
  $xml .= '    <filetime>'.$mem['st']['fileTime']."</filetime>\n";
  $xml .= '    <counts>'.$mem['count']['rte'].'/'.$mem['count']['edf'].'/'.$mem['count']['alt1'].'/'.$mem['count']['alt2'].'/'.$mem['count']['alt3'].'/'."</counts>\n";
  $xml .= '    <miss>'.$mem['miss']['rte'].'/'.$mem['miss']['edf'].'/'.$mem['miss']['alt1'].'/'.$mem['miss']['alt2'].'/'.$mem['miss']['alt3'].'/'."</miss>\n";
  $xml .= '    <tarifs>'.$mem['BLUE']['HC'].','.$mem['BLUE']['HP'].','.$mem['WHITE']['HC'].','.$mem['WHITE']['HP'].','.$mem['RED']['HC'].','.$mem['RED']['HP']."</tarifs>\n";
  $xml .= '    <action>'.$action."</action>\n";
  $xml .= '    <test>'.$test."</test>\n";
  $xml .= "  </tempo>\n";
  if ($debug){
    $xml .= "  <debug>\n";
    $xml .= '    <reset>'.$mem['st']['reset']."</reset>\n";
    $xml .= '    <mem>'.$mem_name."</mem>\n";
    $xml .= '    <last_action>'.$mem['st']['lastAction']."</last_action>\n";
    $xml .= '    <season>'.$mem['season']."</season>\n";
    $xml .= '    <date_fichier>'.date('Y-m-d H:i:s',$mem['fileTimestamp'])."</date_fichier>\n";
    $xml .= '    <timestamp>'.$mem['fileTimestamp']."</timestamp>\n";
    $xml .= '    <date_lecture>'.date('Y-m-d H:i:s',$time_now)."</date_lecture>\n";
    $xml .= '    <timer>'.abs($timer_)."</timer>\n";
    $xml .= '     <bleu_hc>'.$mem['BLUE']['HC']."</bleu_hc>\n";
    $xml .= '     <bleu_hp>'.$mem['BLUE']['HP']."</bleu_hp>\n";
    $xml .= '    <blanc_hc>'.$mem['WHITE']['HC']."</blanc_hc>\n";
    $xml .= '    <blanc_hp>'.$mem['WHITE']['HP']."</blanc_hp>\n";
    $xml .= '    <rouge_hc>'.$mem['RED']['HC']."</rouge_hc>\n";
    $xml .= '    <rouge_hp>'.$mem['RED']['HP']."</rouge_hp>\n";
    $xml .= '    <index_alt>'.$mem['st']['rates']."</index_alt>\n";
    $xml .= '    <src>'.$src_."</src>\n";
    $state_ = '';
    foreach ($mem['st'] as $key => $state){
      if ($state == $mem['tomoroDate']) {
        $state_ .= strtoupper($key).',';
        continue;
      }elseif ( in_array($key, array('rates','reset','ok','manual')) && $mem['st'][$key]) {
        $state_ .= strtoupper($key).',';continue;
      }elseif ( $key == 'lastAction') {
        $state_ .= strtoupper($state).',';continue;
      }else $state_ .= strtolower($key).',';
    }
    $xml .= '    <state>'.trim($state_,',')."</state>\n";
    $ferie_ = '';
    foreach ($mem['j_feries'] as $jour) $ferie_.= $jour.'/';
    $xml .= '    <feries>'.$ferie_."</feries>\n";
    $xml .= "  </debug>\n";
  }
  $xml .= "</root>\n";
  $mem['xml'] = $xml;
  saveVariable($mem_name,$mem);
  echo $xml;
  die;
}

function sdk_day($time,$nbDays = 0) {//Unix
  //creation date à partir du temps unix décale de $nbDays
  //sortie jourFrançais jj/mm
  $time += 86400*$nbDays;
  $ret= date('Y-m-d',$time);
  return $ret;
}

function sdk_poll_rte_edf($src_,&$req_fields,$tomoro_date,$season='')
{
  global $debug,$mem,$colors,$url_history,$header;
  if (!($req_fields['tomoro'] || $req_fields['count'])) return 0;
  if (($mem['st']['tomoro'] == $tomoro_date) && ($mem['st']['count'] == $tomoro_date) && ($mem['todayColor'] != $colors['rte'][0])) {
    $req_fields['tomoro']=$req_fields['count']=0;return 1;}
  $url_history = ($src_=='rte')? 'https://www.services-rte.com/cms/open_data/v1/tempo?season=': 'https://www.api-couleur-tempo.fr/api/joursTempo?periode=';
  if ($season=='') $season = $mem['season'];
  $url = $url_history.$season;
  if ($debug >0) echo "url : $url\n";
  $info = array();
  $response = httpQuery($url,'GET',NULL,NULL,$header,false,false,$info);
  if ($debug >0) {echo"Polling Info : $src_\n";var_dump($info);}
  if (!$info || ($info["http_code"]!=200)) {
    if ($debug >0){
      echo 'Erreur : $url code : ';
      if ($info) echo $info['http_code'];
      echo "\n";
    }
    $mem['miss'][$src_]++;
    return 0;
  }

  $res_arr = sdk_json_decode($response);
  if (is_array($res_arr) && (count($res_arr)<1)) {
    $mem['miss'][$src_]++;
    return 0;
  }
  if ($debug >0) {echo"Polling Result : $src_\n";var_dump($res_arr);}
  $mem['BLUE']['dec'] = $mem['WHITE']['dec'] = $mem['RED']['dec'] = 0;
  if ($tomoro_date=='') $tomoro_date = $mem['tomoroDate'];
  if ($src_ == 'rte'){
    $mem['count']['rte']++;
    if ($debug >0) echo "poll rte \n";
    foreach($res_arr['values'] as $key => $item){
      if ($item == 'false') continue;
      if ($key != $tomoro_date) $mem[$item]['dec']++;
      else $mem['tomoroColor'] = $item;
      if ($key == $mem['todayDate'])
        $mem['todayColor'] = $item;
    }
  }else{
    $mem['count']['edf']++;
    if ($debug >0) echo "poll edf \n";
    foreach($res_arr as $item){
      if ($item['codeJour']){
        if ($item['dateJour'] != $tomoro_date) $mem[$colors['rte'][$item['codeJour']]]['dec']++;
        else {
          $mem['tomoroColor'] = $colors['rte'][$item['codeJour']];
          break;
        }
        if ($item['dateJour'] == $mem['todayDate'])
          $mem['todayColor'] = $colors['rte'][$item['codeJour']];
      }
    }
  }
  if ($mem['tomoroColor'] != $colors['rte'][0]){//!ND
    $mem['st']['tomoro'] = $tomoro_date;
    $req_fields['tomoro'] = 0;
    $mem['st']['count'] = $tomoro_date;
    $req_fields['count'] = 0;
  }
  $ret = ($mem['st']['tomoro'] == $tomoro_date) && ($mem['st']['count'] == $tomoro_date);
  if (!$ret) $mem['miss'][$src_]++;
  return $ret;
}

function sdk_period($time)
{
  global $mem;
    switch($mem['ratePeriod']){
    case 'W' : $period = date('W',$time);break;
    case 'M' : $period = date('m',$time);break;
    case 'D' : $period = date('z',$time);break;
    case 'N' :
    default  : $period = -1;
  }
  return $period;
}

function sdk_poll($action = 'read',&$req_fields)
{
  global $src,$mem,$reset_,$time_now,$colors,$debug,$adjustFile,$hour_now,$header;//opa reset_
//  if ($action=='reset'){ $mem['st']['reset'] = $reset_; }//opa 
  if ($debug >0) echo "Polling : $action\n";
  $header = array('timeout:15.0');
  if ($src['rte']) {
    $result = sdk_poll_rte_edf('rte',$req_fields,sdk_day($time_now,1));
    if ($result && ($hour_now>=TMAXRTE)) {$mem['st']['conftomoro'] = $mem['st']['tomoro'] = $mem['tomoroDate'];}
    $adjustFile = ($result)?1: $adjustFile;
  }
  if ($src['edf']) {
    $result = sdk_poll_rte_edf('edf',$req_fields,sdk_day($time_now,1));
    if ($result && ($hour_now>=TMAT)) {$mem['st']['conftomoro'] = $mem['st']['tomoro'] = $mem['tomoroDate'];}
    $adjustFile = ($result)?1: $adjustFile;
  }
  if ($src['alt']){
    $alt = sdk_period($time_now);
    if ((($mem['st']['tomoro'] != $mem['tomoroDate']) || ($mem['st']['count'] != $mem['tomoroDate']) || ($mem['st']['rates'] != $alt))) {
      $result = sdk_poll_alt($alt,$req_fields);
      $adjustFile = ($result)?1: $adjustFile;
    }
  }
  foreach ($colors['rte'] as $key => $col){
    if (!$key) continue;
      $mem[$col]['rem'] = $mem[$col]['tot'] - $mem[$col]['dec'];
  }
  return $adjustFile;
}

function sdk_multiextract($string,$startStr,$stopStr='',&$start,$startIn = false,$stopIn = false) { // Extraire une chaine de caracteres suivant plusieurs separateurs
  // startStr : string ou array recherche de startStr ou de startStr[0], puis de startStr[1]à partir de là, puis ...
  // stopStr  : string ou array recherche de stopStr ou de stopStr[0], puis de stopStr[1]à partir de là, puis ...
  // renvoi de la portion de $string entre le dernier startStr et le dernier stopStr
  // Si outer les balises sont incluses, sinon elles ne sont pas incluses
  // start est remis a jour
  // eviter les caractères non standards
  // si startStr (ou stopStr) de la forme
  // array(array('a','b'),array('d','e')) recherche de (a puis b) ou bien (d puis e), si séquence 1 absente
  // array('ab', 'ef') recherche de 'ab' puis 'ef'
  // 'abc' recherche de 'abc'
  $found = true;
  if (!is_array($startStr)) {
    $startStr = array($startStr);
  }
  foreach ($startStr as $codes){
    if (!is_array($codes)) {
      $codes = $startStr;//$codes = array($codes);
    }
    $beg = $start;
    $startPos = '';
    foreach ($codes as $code) {
      $startLen = strlen($code);
      if ( ($startLen != 0) && (($pos = strpos(substr($string,$beg),$code)) !== false) ) {
        if ($startPos == '') $startPos = $beg + $pos;
        $beg = $beg + $pos + $startLen;
      }
      else {
        $beg = $start;
        if ($startPos == '') $startPos = $beg;
        $found = false;
        break;
      }
    }
    if ($found) break;
  }
  $start = $beg;
  $found = true;
  if (!is_array($stopStr)) {
    $stopStr = array($stopStr);
  }
  foreach ($stopStr as $codes){
    if (!is_array($codes)) {
      $codes = $stopStr;
    }
    $end = $start;
    $stopPos = '';
    foreach ($codes as $code) {
      $stopLen = strlen($code);
      if ( ($stopLen != 0) && (($pos = strpos(substr($string,$end+1),$code)) !== false) ) {
        $end = $end + 1 + $pos;
        if ($stopPos == '') $stopPos = $end;
      }
      else {
        $end = $start;
        if ($stopPos == '') $stopPos = $end;
        $found = false;
        break;
      }
    }
    if ($found) break;
  }
  if ($startIn) $beg = $startPos;
  if ($stopIn)  $end += $stopLen;
  else $end = $stopPos;
  $launch  = substr($string,$beg,$end-$beg);
  return $launch;
}

function sdk_convert_month($month)
{
  global $months_fr;
  if (!array_key_exists($month,$months_fr)) {
    switch (substr($month,0,1)){
      case 'f' : $month = 'février';break;
      case 'a' : $month = 'août';break;
      case 'd' : $month = 'décembre';break;
    }
  }
  return $month;
}

function sdk_extract($string,$startStr,$stopStr='',$start = 0,$startIn = false,$stopIn = false) { // Extraire une chaine de caracteres suivant plusieurs separateurs
// appel de sdk_multiextract, start inchangé
  $launch = sdk_multiextract($string,$startStr,$stopStr,$start,$startIn,$stopIn );
  return  $launch;
}

function sdk_extract_html($alt,&$req_fields,$type,$respAlt)
{
  global $debug,$mem,$colors,$months_fr,$colors;
  switch ($type) {
    case 'selectra' :
      //lecture block
      $sep2  = array(array('<!-- END'),array('<div class='),array('rouges'));
      $sep   = array('custom-template-cards">');
      $block = trim(strtolower(sdk_extract($respAlt,$sep,$sep2))).' rouges##';
      $block = str_replace(array('leus','lancs','ouges'),array('leu','lanc','ouge'),$block);//tempo mardi 29/10
      $err_num = 1;
      if (strlen($block) == 0) {$erreur = $err_num;break;}
      if ($req_fields['tomoro'] && ($mem['st']['tomoro'] != $mem['tomoroDate'])) {
        //extraction infos Aujourd'hui
        // dates
        $start = 0;
        $sep  = array('u-text--white">');
        $sep2 = array('</');
        $temp  = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start //"aujourd-hui"
        if ($temp == "aujourd'hui") {
          $temp  = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start //"mar. 29 octobre"
          $day = explode(" ",$temp);
          $day[2] = $months_fr[sdk_convert_month($day[2])];
          $date = strtotime($day[1]." ".$day[2]);//"29 October"
          $date = sdk_day($date);//"2024-10-29"
          $temp  = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $temp = str_replace('<strong>','',$temp); //"couleur"
          if ($mem['todayColor'] == $colors['rte'][0]) $mem['todayColor'] = $colors['alt'][$temp];
          $temp  = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start //"demain"
        }
        if ($temp == "demain") {
          $temp  = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start //"mer. 30 octobre"
          $day = explode(" ",$temp);
          $day[2] = $months_fr[sdk_convert_month($day[2])];
          $date = strtotime($day[1]." ".$day[2]);//"30 October"
          $temp  = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $temp = str_replace('<strong>','',$temp); //"couleur"
          if ( array_key_exists($temp,$colors['alt']) && ($colors['alt'][$temp] != $colors['rte'][0])) {
            $mem['tomoroColor'] = $colors['alt'][$temp];
            $mem['st']['tomoro'] = $mem['tomoroDate'];
            $req_fields['tomoro'] = 0;
          }
        }
      }
        // bilan
      if ($req_fields['count']){
        $sep2    = array('##');
        $start = 0;
        $sep    = array('jours restants');
        $temp = strtolower(trim(sdk_multiextract($block,$sep,$sep2,$start)));
        $nbTot = $mem['BLUE']['tot']+$mem['WHITE']['tot']+$mem['RED']['tot'];
        $sep    = array('u-text--white">');
        $sep2   = array(array('</p'),array('</p'));
        for ($i =0;$i<3;$i++) {
          $temp = strtolower(trim(sdk_multiextract($block,$sep,$sep2,$start)));
          //"241 jours tempo bleus"
          $temp = str_replace('<strong>','',$temp); //"couleur"
          $nb = (int)$temp;
          $nbTot -= $nb;
          $temp = strtolower(trim(sdk_multiextract($block,$sep,$sep2,$start)));
          if ($mem['st']['count'] != $mem['tomoroDate']){
            $mem[$colors['alt'][$temp]]['rem'] = $nb;
            $mem[$colors['alt'][$temp]]['dec'] = $mem[$colors['alt'][$temp]]['tot'] - $nb;
          }
        }
        $nbJours = ceil((strtotime($mem['todayDate'])-strtotime(substr($mem['season'],0,4).'-08-31'))/86400);
        if ($nbTot == $nbJours){
          $mem['st']['count'] = $mem['tomoroDate'];
          $req_fields['count'] = 0;
        }
      }
      if ($req_fields['rates'] && ($mem['st']['rates'] != $alt)){
        $sep2  = array(array('<!-- END'),array('</tr'));
        $sep   = array('<th>Abonnement','<strong>','<strong>','</td>');
        $start = 0;
        $block = trim(strtolower(sdk_extract($respAlt,$sep,$sep2)));
        $sep2  = array('&nbsp;');
        $sep   = array('<td>');
        $tarifs = 1;
        foreach ($colors['alt'] as $key => $col){
          if ($col==$colors['rte'][0]) continue;
          $temp = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
          if ($temp>0) $mem[$col]['HC'] = $temp;
            else $tarifs = 0;
          $temp = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
          if ($temp>0) $mem[$col]['HP'] = $temp;
            else $tarifs = 0;
        }
        if ($tarifs) {
          $mem['st']['rates'] = $alt;
          $req_fields['rates'] = 0;
        }
      }
    break;
  case 'selectra2' :
    //lecture block
    $sep2  = array(array('<th>12 kVA'));
    $sep   = array('list-card--stretch">');
    $start = 0;
    $block = trim(sdk_extract($respAlt,$sep,$sep2));
//    $block = trim(sdk_extract($respAlt,$sep,$sep2,$start,false,false));//pas de MaJ $start
    $block = str_replace(array('leus','lancs','ouges'),array('leu','lanc','ouge'),$block);
    $err_num = 1;
    if (strlen($block) == 0) {$erreur = $err_num;break;}
    if ($req_fields['tomoro'] && ($mem['st']['tomoro'] != $mem['tomoroDate'])){
      //extraction infos Aujourd'hui
      // date
      $sep  = array('card__title">');
      $sep2 = array('</h');
      $temp  = trim(str_replace(array('Tempo','/'),' ',sdk_multiextract($block,$sep,$sep2,$start)));//MaJ $start //"vendredi 27 09"
      $day = explode(" ",$temp);
      $date = substr($mem['todayDate'],0,4).'-'.$day[2].'-'.$day[1];//"2024-09-11"
      $day0='today';$day1='tomoro';
      if ($date == $mem['yesterDate']) {$day0='yester';$day1='today';}
      //couleur0
      $sep2 = array('<');
      $sep  = array('span>');// couleur
      $color0 = $colors['alt'][strtolower(trim(trim(trim(sdk_multiextract($block,$sep,$sep2,$start)),'Tempo')))];
      //extraction infos demain
      $sep  = array('card__title">');
      $sep2 = array('</h');
      $temp  = trim(str_replace(array('Tempo','/'),' ',sdk_multiextract($block,$sep,$sep2,$start)));//MaJ $start //"vendredi 27 09"
      $day = explode(" ",$temp);
      $date = substr($mem['tomoroDate'],0,4).'-'.$day[2].'-'.$day[1];//"2024-09-11"
      //couleur0
      $sep2 = array('<');
      $sep  = array('span>');// couleur
      $color1 = $colors['alt'][strtolower(trim(trim(trim(sdk_multiextract($block,$sep,$sep2,$start)),'Tempo')))];// couleur1
      if ($req_fields['tomoro'] && ($mem['st']['tomoro'] != $mem['tomoroDate'])){
        $mem[$day0.'Color'] = $color0;
        $mem[$day1.'Color'] = $color1;
        if (($day1 == 'tomoro')&&(!in_array($color1,$colors['eed']))&&($color1 != $colors['rte'][0])) {
          $mem['st']['tomoro'] = $mem['tomoroDate'];
          $req_fields['tomoro'] = 0;
        }
      }
    }
    // bilan
    $sep2    = array(array('</p'),array('##'));
    $sep    = array('col-md-6">');
    if ($req_fields['count'] && ($mem['st']['count'] != $mem['tomoroDate'])){
      $mem['RED']['rem'] = trim(sdk_extract($block,$sep,$sep2,$start));
      $mem['RED']['dec'] = $mem['RED']['tot'] - $mem['RED']['rem'];
    }
    if ($req_fields['rates'] && ($mem['st']['rates'] !=  $alt)){
      $sep  = array(array('kVA</th>','</td>'));
      $sep2 = array('kVA');
      $temp = trim(sdk_multiextract($block,$sep,$sep2,$start));
      $sep2  = array('&nbsp;');
      $sep   = array('<td>');
      $tarifs = 1;
      foreach ($colors['alt'] as $key => $col){
        if ($col==$colors['rte'][0]) continue;
        $temp = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($temp>0) $mem[$col]['HC'] = $temp;
          else $tarifs = 0;
        $temp = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($temp>0) $mem[$col]['HP'] = $temp;
          else $tarifs = 0;
      }
      if ($tarifs) {
        $mem['st']['rates'] = $alt;
        $req_fields['rates'] = 0;
      }
    }
    break;
  }
}

function sdk_poll_alt($alt,&$req_fields)
{
  global $debug,$mem,$colors,$url_alt,$header,$months_fr,$colors,$time_now;
  if (!($req_fields['tomoro'] || $req_fields['count'] || $req_fields['rates'])) return 0;
  if ($alt != $mem['st']['rates']) $req_fields['rates'] = 1;
  $urls_alt = array(1 =>
    'https://selectra.info/energie/fournisseurs/edf/tempo#selectra',
    'https://www.fournisseurs-electricite.com/fournisseurs/edf/tarifs/tempo#selectra',
    'https://prix-elec.com/tarifs/fournisseurs/edf/tempo#selectra2'
  );
  $months_fr = array('janvier' => 'January', 'février' => 'February','mars' => 'March','avril' => 'April','mai' => 'May','juin' => 'June','juillet' => 'July','août' => 'August','septembre' => 'September','octobre' => 'October','novembre' => 'November','décembre' => 'December');

  $colors['alt']  =   array('bleu'=>'BLUE','blanc'=>'WHITE','rouge'=>'RED','ND'=>'ND');

  $info = array();
  $ret = 1;
  for ($iurl=1;$iurl<=count($urls_alt);$iurl++){
    list($url_alt,$type) = explode('#',$urls_alt[$iurl]);
    $respAlt = trim(httpQuery($url_alt,'GET',NULL,NULL,$header,false,false,$info));
    $mem['count']['alt'.$iurl]++;
    if ($debug >0) {echo"Polling : alt$iurl\n";var_dump($mem['count']);}
    sdk_extract_html($alt,$req_fields,$type,$respAlt);
    if ($debug >0) {echo"Polling : alt$iurl\n";var_dump($mem['st']);}
    if (!($req_fields['tomoro'] || $req_fields['count'] || $req_fields['rates'])) break;

    }
  if (($mem['st']['tomoro'] == $mem['tomoroDate']) && (TMAXSEL<date('His',$time_now)) ) $mem['st']['conftomoro'] = $mem['tomoroDate'];
  if (!$ret) $mem['miss']['alt'.$iurl]++;
  return $ret;
}
?>
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 : 939
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Précédent

Retour vers Téléinformation

Qui est en ligne ?

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

cron