[Store] Tempo EDF

Lecture des compteurs EDF avec téléinformation

Re: [Store] Tempo EDF

Messagepar danardf » 30 Sep 2024 16:54

paope a écrit:Bonjour OPA,

petit retour de ma part sur la V3.7,j 'ai eu une coupure internet aujourd'hui et quand la box se reconnecte je m'aperçois qu'elle a perdu la couleur du jour.
je pense qu'elle va revenir, mais il serait interessant qu'en cas de coupure, elle ne soit pas perdu non ?
Merci pour ton retour.


J'ai testé cette version, elle ne fonctionne pas dans mon cas.
J'ai toujours ND
Pas de couleur...
Peut-être je m'y prend mal.
danardf
 
Messages : 79
Inscription : 27 Juil 2018

Re: [Store] Tempo EDF

Messagepar opa95 » 30 Sep 2024 16:58

Bonsoir paope
Réponse à ta question :
Redémarrage de la box à 17h50 lecture OK à 17h51 :)
Tempo.png
Tempo V4.0
Tempo.png (20.9 Kio) Consulté 2094 fois
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 : 836
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar opa95 » 30 Sep 2024 17:00

danardf a écrit:J'ai testé cette version, elle ne fonctionne pas dans mon cas.
J'ai toujours ND
Pas de couleur...
Peut-être je m'y prend mal.

Patiente jusqu'à demain pour tester la 4.0 et on en rediscutera :)
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 : 836
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar danardf » 30 Sep 2024 17:07

opa95 a écrit:
danardf a écrit:J'ai testé cette version, elle ne fonctionne pas dans mon cas.
J'ai toujours ND
Pas de couleur...
Peut-être je m'y prend mal.

Patiente jusqu'à demain pour tester la 4.0 et on en rediscutera :)


Ok
danardf
 
Messages : 79
Inscription : 27 Juil 2018

Re: [Store] Tempo EDF

Messagepar paope » 01 Oct 2024 10:02

Salut OPA,

je ne désespere pas du tout. :D
juste un petit retour pour participer si tu n'avais pas noté ce souci.
tout est revenu dans l'ordre qq heures apres. :shock:
Merci d'avance pour ton aide !
Paope
paope
 
Messages : 18
Inscription : 08 Juin 2019

Re: [Store] Tempo EDF

Messagepar damien673 » 02 Oct 2024 14:22

Salut opa95, tu as mis la version 4.0 dans le store ?
Je vois encore la 3.6 dans le store ...
damien673
 
Messages : 24
Inscription : 31 Mai 2022

Re: [Store] Tempo EDF

Messagepar opa95 » 02 Oct 2024 16:53

Bonsoir tous
damien673 a écrit:Salut opa95, tu as mis la version 4.0 dans le store ?
Je vois encore la 3.6 dans le store ...

Désolé les tests sont toujours en cours : ça traîne car les simulations ne sont pas suffisantes, il faut aussi un test réel : Il n'y en a qu'un de possible (de23h59 à midi) d'où 1 simulation réelle par jour.
Il y a eu des corrections aujourd'hui : il faut attendre les résultats.
Dès que c'est bon, je publie le script et Merguez07 (merci) assurera la mise en ligne sur le store :)
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 : 836
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar damien673 » 03 Oct 2024 08:17

Pas de soucis. Vous êtes au top opa95 et merguez07 !
Merci beaucoup à vous.
En effet ça met un peu le bazard chez moi car j'ai plusieurs règles qui sont basées sur ces infos de jours tempo ...
Et j'avoue que je ne maîtrise pas suffisamment pour trifouiller dans les scripts ...

Bonne journée
damien673
 
Messages : 24
Inscription : 31 Mai 2022

Re: [Store] Tempo EDF

Messagepar opa95 » 03 Oct 2024 09:34

Bonjour tous
damien673 a écrit:Pas de soucis. Vous êtes au top opa95 et merguez07 !
Merci beaucoup à vous.
En effet ça met un peu le bazard chez moi car j'ai plusieurs règles qui sont basées sur ces infos de jours tempo ...
Et j'avoue que je ne maîtrise pas suffisamment pour trifouiller dans les scripts ...

Bonne journée

J'ai une version qui a bien tourné cette nuit : il faut juste un toilettage du code pour terminer l'adaptation et que je vérifie qu'il fonctionne bien avec les devices créés par l'ancienne version.
Ca devrait permettre de charger le script dès ce soir et permettre ensuite à Merguez07 de mettre la nouvelle version sur le store. :)
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 : 836
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar enr37 » 03 Oct 2024 12:16

bonjour à tous,
ca ne fonctionne plus chez moi aussi depuis un mois.
si ca peut aider le programmeur, voici ce que j'ai recu d'enedis. Certes, edf n'est pas enedis, mais cela aura peut etre une conséquence sur tous les energetyiciens, dont EDF :
Code : Tout sélectionner
                 Service API : DataConnect
              Environnement : Homologation et Production

 
 
Bonjour,
 
Dans le cadre d’une migration technique, les DNS et les certificat liés aux API vont évoluer vers une nouvelle zone réseau.
 
Depuis le 16 Septembre la nouvelle infrastructure est disponible pour vos appels en Production.
 
 Merci en conséquence de bien prévoir les actions de votre côté pour effectuer dès à présent les bascules.
 
Voici le tableau d’évolutions des DNS :
 
Environnement   Canal   Ancien DNS   Nouveau DNS
PRODUCTION   Alex   ext.prod.api.enedis.fr   gw.ext.prod.api.enedis.fr
HOMOLOGATION   Alex (Sandbox)   ext.prod-sandbox.api.enedis.fr   gw.ext.prod-sandbox.api.enedis.fr
 
 
Concernant les certificats, veuillez-vous référez aux PJ de ce mail
 
Voici le planning de mise à disposition:
-   Ouverture de l’environnement de Production (et sa Sandbox) dès le 16 Septembre
[L’ancien environnement ne sera plus disponible au-delà du 4 octobre]
-   Pour la Production, les anciens DNS seront routés vers les nouveaux pour un délai de 6 mois à compter du 1er Octobre.
 
 
Si vous souhaitez de plus amples renseignements, vous pouvez poser vos questions via le formulaire de contact https://datahub-enedis.fr/services-api/contacter-le-service-api/ ou écrire directement à SERVICECLIENTS-API <serviceclients-api@enedis.fr>:

En vous souhaitant une bonne journée,
 
 
L’équipe support client API
 
actionnaire de photoshop. partageur des 450 icones sur abavala et dans votre box.
Le savoir ne vaut que s'il est partagé par tous !
enr37
 
Messages : 1351
Inscription : 06 Juin 2013
Localisation : 37

Re: [Store] Tempo EDF

Messagepar Tonio83 » 06 Oct 2024 15:28

Bonjour à tous, merci de tous les efforts que vous faites pour nous donner de super périphéries comme le script du Tempo. je l'utilise pour qu'en fonction des panneaux solaire et des jours il se déclenche à différentes heures. Et là depuis une semaine j'avoue que plus rien ne fonctionne. Je ne suis pas du tout un initié des scripts, pourriez vous me donner la marche à suivre afin de réguler ce problème. J'ai cru comprendre qu'il fallait le modifier pour que cela refonctionne. Merci de votre aide
Tonio83
 
Messages : 1
Inscription : 06 Oct 2024

Re: [Store] Tempo EDF

Messagepar danardf » 06 Oct 2024 15:32

Tonio83 a écrit:Bonjour à tous, merci de tous les efforts que vous faites pour nous donner de super périphéries comme le script du Tempo. je l'utilise pour qu'en fonction des panneaux solaire et des jours il se déclenche à différentes heures. Et là depuis une semaine j'avoue que plus rien ne fonctionne. Je ne suis pas du tout un initié des scripts, pourriez vous me donner la marche à suivre afin de réguler ce problème. J'ai cru comprendre qu'il fallait le modifier pour que cela refonctionne. Merci de votre aide


Une mise à jour du script est en préparation.
Je suis dans le même cas. Ne fonctionne plus depuis quelques semaines.
danardf
 
Messages : 79
Inscription : 27 Juil 2018

Re: [Store] Tempo EDF

Messagepar akua » 10 Oct 2024 09:51

Bonjour,

Idem, j'ai un souci sur le script depuis environ 3 semaines.

Ne l'ayant jamais fait, comment se passe la mise à jour d'un script ? Faut-il le réinstaller depuis le Store, ou peut-on le faire sur le périphérique existant ?

Merci beaucoup !! :)
akua
 
Messages : 90
Inscription : 11 Déc 2017

Re: [Store] Tempo EDF

Messagepar opa95 » 10 Oct 2024 10:11

Bonjour akua
akua a écrit:Bonjour,

Idem, j'ai un souci sur le script depuis environ 3 semaines.

Ne l'ayant jamais fait, comment se passe la mise à jour d'un script ? Faut-il le réinstaller depuis le Store, ou peut-on le faire sur le périphérique existant ?

Merci beaucoup !! :)

Quand tu testes la mise à jour depuis le panneau d'un device, on te propose la mise à jour et tu acceptes. Encore faut-il que quelqu'un ait fait une mise à jour sur le store.
S'il y a un script (réalisé par quelqu'un ou par toi), qui n'est pas encore sur le Store, tu peux le remplacer selon une méthode déjà décrite sur cette discussion :
Depuis la fenêtre du device, tu peux cliquer sur Editer puis effectuer un Copier/Coller du script modifié pour remplacer l'ancien, puis tu cliques sur Sauvegarder.
Sinon tu peux passer par la gestion directe des scripts : http://192.168.x.yyy/script/ (adresse de secours 192.168.x.yyy) et balancer le script avec son nom correct (nom.php) pour qu'il remplace l'ancien.
Sinon, courage tempo arrive (ça traîne, mais les tests réels ne sont pas identiques au simulations et on ne peut faire qu'un test réel par 24h). Les remontées de valeurs ne posent pas de problèmes, c'est la gestion des appels qui n'est pas optimale. :)
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 : 836
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar akua » 10 Oct 2024 17:41

Merci beaucoup pour la réponse ! :)

Je ne connaissais pas cette fonctionnalité "Vérifier les mises à jour de edf_tempo.php", pratique ;)

Du coup je ne vais pas me lancer dans des tests de mon côté car je ne saurais pas bien comment m'en sortir, je vais attendre la mise à jour officielle :P

Bon courage et merci !!
akua
 
Messages : 90
Inscription : 11 Déc 2017

Re: [Store] Tempo EDF

Messagepar herve27h » 14 Oct 2024 19:15

Bonjour à tous,
Merci à tout ceux qui œuvre pour la mise à jour néanmoins, pourriez vous m'informer si vous avez publié la mise à jour de la précédente version ou si c'est une nouvelle version qu'il faut aller chercher sur le store ?
plus simplement, votre version est-elle accessible par le mode de mise à jour par le lien de vérification?
Merci pour vos retours et le temps que vous consacrez aux évolutions.
herve27h
 
Messages : 15
Inscription : 04 Fév 2019

Re: [Store] Tempo EDF

Messagepar opa95 » 15 Oct 2024 09:59

Bonjour Herve et à tous
herve27h a écrit:Bonjour à tous,
Merci à tout ceux qui œuvre pour la mise à jour néanmoins, pourriez vous m'informer si vous avez publié la mise à jour de la précédente version ou si c'est une nouvelle version qu'il faut aller chercher sur le store ?
plus simplement, votre version est-elle accessible par le mode de mise à jour par le lien de vérification?
Merci pour vos retours et le temps que vous consacrez aux évolutions.

J'ai fini la mise à jour du nouveau script que je viens d'envoyer à Merguez07. J'attends son retour, donc la mise dans le Store ne devrait pas tarder.
Pour ceux qui veulent mettre à jour l'ancienne version dès maintenant, voici le script à télécharger (j'ai déjà décrit la procédure sur cette discussion) : elle devrait fonctionner sans aucune modification des devices. Pour avoir les améliorations déjà décrites, vous pouvez reprendre les procédures décrites : il y a quelques capteurs à ajouter et à remplacer le capteur "demain" par un actionneur http "demain".
La documentation incluse dans le script est minimale, mais je tiens à disposition la doc complète qui sera sur le store (me contacter en mp).
La mise à jour des infos du lendemain se fait vers 6h15 quand tout va bien.
:)
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 W par défaut (ex 0.1296,0.1609,0.1486,0.1894,0.1568,0.7562, ou W)
** 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)
** 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)
*******************************************************************************/

//Initialisations
define('VER','V4.0');
define('NBW','43');
define('NBR','22');
define('DEFTIMER','20');//20 minutes
define('MEM','OLDtempo');
define('MANUAL','1');//autorise la commande manuelle
define('DEFTARIF','W');//Weekly
define('TSTART',60000);//début start 06h00:00
define('TRTE',61500);//lecture rte 06h15:00
define('TSEL',63000);//lecture selectra 06h30:00
define('TEDF',80500);//lecture edf 8h05:00
define('TSTOP',220000);//fin HP 22h00:00
define('TMAT',110000);//11h00:00
define('NOON',121500);//12h15:00
$colors['rte']  =   array(1=>'BLUE','WHITE','RED',0=>'ND');

// XML header
@sdk_header('text/xml');
$xml  = '<?xml version="1.0" encoding="UTF-8"?>'."\n";
$xml .= "<!--\n";
echo $xml;//print header for debugging

//necessary
$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;
$debug    = getArg('debug',false,0);
$manual_  = getArg('manuel',false,MANUAL);
$action = '';
$set_state_  = strtoupper(getArg('setstate',false,''));
if ($set_state_ == ''){$set_state[0] = '';$set_state[1] = 0;
}else{
    saveVariable('test',$set_state_);
  $set_state = explode(':',$set_state_);
  if (!in_array($set_state[0],array('A','D','C','T'))) $set_state[0] = '';
  if (count($set_state)<2) $set_state[1] = '';
  //if ($set_state[1] == 'ND') $set_state[1] = '';
  $action = 'setstate';
}
$test = loadVariable('test');
if ($debug >0) var_dump($_GET);

$src_    = getArg('src',false,7)%7;
if (!$src_) $src_ = 7;
$src['rte'] = 1&$src_;
$src['edf'] = (2&$src_)/2;
$src['alt'] = (4&$src_)/4;

//reset?
if ('' == $mem = loadVariable($mem_name)) $reset = 1;
else {
  if ($reset_>0) {$reset = 1;
  }elseif ($reset_<0) {//reset_ < 0
    $reset = ($reset_  && ($reset_ != $mem['st']['reset']))?1:0;//reset change de valeur
  }
  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 ($reset) {
  sdk_init($mem_name,$time_now);
}//poll print die
else $mem['st']['reset'] = $reset_;

//action?
$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['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';
  }
}

if ($time_now < $mem['fileTimestamp']) { // simulation (recul)
  $action = 'simul';
  $timer  = -0.01;//minutes partial reset
}else{//search for modifications
  $today_week = date('D',$time_now);
  $hour_now   = date('His',$time_now)+0;
  $hour_file  = date('His',$mem['fileTimestamp'])+0;
  $mem['todayDate']  = sdk_day($time_now);
  $mem['tomoroDate'] = sdk_day($time_now,1);
  if ($today_week != $mem['todayWeek']) {//midnight
    $action = 'midnite';
  }elseif (($hour_file<TSTART) && ($hour_now>=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',TMAT=>'poll',NOON=>'poll');
    foreach (array(TRTE,TSEL,TEDF,TMAT,NOON) as $timeOut){
      if (($hour_file<$timeOut) && ($hour_now>=$timeOut)){
        $action = $actions[$timeOut];break;}
    }
  }
  if ($action == ''){
    if (($time_now - $mem['fileTimestamp'])>$timer) {$action = 'timer';
    }elseif ($timer_<0) {$action = 'timer_';}
    else {$action = 'read';}
  }
}
switch ($action){
  case 'read' : break;
  case 'midnite' :
    $month_now = date('m',$time_now);
    $year_now = date('Y',$time_now);
    $hour_file_ = 0;
    $action = 'read';
    $mem['todayWeek'] = $today_week;
    if ($month_now>=9) $season = $year_now.'-'.($year_now+1);
    else $season = ($year_now-1).'-'.$year_now;
    $mem['count']['rte'] = $mem['count']['edf'] = $mem['count']['alt1'] = $mem['count']['alt2'] = $mem['count']['alt3'] = 0;//reset counters
    $mem['st']['tomoro'] = $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']++;
    }
    switch ($mem['todayWeek']) {
      case 'Sat' :
        $mem['tomoroColor'] = $colors['rte'][1];//Sunday
        $mem['st']['tomoro'] = $mem['tomoroDate'];
        break;
      case 'Sun' : $mem['todayColor'] = $colors['rte'][1];break;
      default : $mem['tomoroColor'] = $colors['rte'][0];
    }
    $mem[$mem['todayColor']]['rem'] = $mem[$mem['todayColor']]['tot'] - $mem[$mem['todayColor']]['dec'];
    $adjustFile = 1;
    break;
  default :
    $req_fields = array('tomoro' => 0,'count' => 0,'rates' => 0);//requested fields //opa95
    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'] = 1;
      case 'simul' :
        $mem['st']['tomoro'] = $mem['st']['count'] = 0;
        $req_fields['tomoro'] = $req_fields['count'] = 1;
        break;
      case 'startalt' : $req_fields['rates'] = 1;
      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;
        }
        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_now()
{
  global $time_now;
  global $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 $time_now;
  global $colors;
  global $mem;
  $tarifs = getArg('tarifs',false,'');//BHC, BHP, WHC, WHP, RHC, RHP
  $rates = array('D','W','M');//Dayly,Weekly,Monthly,No
  if ($tarifs==''){$tarifs=DEFTARIF;}
  elseif (!strpos('@'.$tarifs,',')){
    $tarifs = trim(strtoupper($tarifs));
    $tarifs = 'M';
    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 = DEFTARIF;
  }
  $mem['tarifsRef'] = $tarifs;
  return $tarifs;
}

function sdk_init($mem_name,$time,$reset_='')
{
  global $mem;
  global $colors;
  global $reset_;
  global $time_now;
  global $debug;
  global $adjustFile;

  $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', 'tarifsRef' => 'ND',
    'BLUE' => array('rem'=>$nb_blue,'dec'=>0,'tot'=>$nb_blue,'HC'=>'0.1296','HP'=>'0.1609'),
    'WHITE' => array('rem'=>NBW,'dec'=>0,'tot'=>NBW,'HC'=>'0.1486','HP'=>'0.1894'),
    'RED' => array('rem'=>NBR,'dec'=>0,'tot'=>NBR,'HC'=>'0.1568','HP'=>'0.7562'),
    'ND' => array('HC'=>'0','HP'=>'0'),
    'ratePeriod'=>'W','count' => array('rte' => 0,'edf' => 0,'alt1' => 0,'alt2' => 0,'alt3' => 0),
    'st'=>array('tomoro'=>'0','count'=>0,'rates'=>-1,'reset'=>0,'fileTime'=>-1, 'manual'=>MANUAL),
   'fileTimestamp' => '0',
  ) ;
  $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];
  switch ($mem['todayWeek']) {
    case 'Sat' : $mem['tomoroColor'] = $colors['rte'][1];break;//dimanche
    case 'Sun' : $mem['todayColor'] = $colors['rte'][1];break;
    default : $mem['tomoroColor'] = $colors['rte'][0];
  }
  if ($reset_<0) $mem['st']['reset'] = $reset_;
  sdk_init_tarifs();
  if ($debug >0) echo "Action : init\n";
  $req_fields['tomoro'] = $req_fields['count'] = $req_fields['rates'] = 1;
  $result = sdk_poll('reset',$req_fields);
  $adjustFile = ($result==1)?1: $adjustFile;
  sdk_print();//die
}

function sdk_print($adjustFile = 1)
{//suppose impression entete
  global $mem;
  global $test;
  if (!$test) $test = 'test';
  global $mem_name;
  global $debug;
  global $colors;
  global $timer_;
  global $action;
  global $src_;
  global $time_now;
  $colors['eed'] = array($colors['rte'][1]=>'BLEU',$colors['rte'][2]=>'BLANC',$colors['rte'][3]=>'ROUGE',$colors['rte'][0]=>'ND');
  $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);
  }
  saveVariable($mem_name,$mem);
  if($debug >0) {echo "Save :\n";var_dump($mem);}
// Génération du XML
  $xml = "-->\n";
  $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>'.$colors['eed'][$mem['tomoroColor']]."</demain>\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 .= '    <test>'.$test."</test>\n";
  $xml .= "  </tempo>\n";
  if ($debug){
    $xml .= "  <debug>\n";
    $xml .= '    <reset>'.$mem['st']['reset']."</reset>\n";
    $xml .= '    <action>'.$action."</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 .= '    <tarifs>'.$mem['BLUE']['HC'].','.$mem['BLUE']['HP'].','.$mem['WHITE']['HC'].','.$mem['WHITE']['HP'].','.$mem['RED']['HC'].','.$mem['RED']['HP']."</tarifs>\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 ( ($key == 'rates') && $mem['st']['rates']) {$state_ .= strtoupper($key).',';continue;}
      elseif( ($key == 'reset') && $mem['st']['reset']){$state_ .= strtoupper($key).',';continue;}
      else $state_ .= strtolower($key).',';
    }
    $xml .= '    <state>'.$state_."</state>\n";
    $xml .= "  </debug>\n";
  }
  $xml .= "</root>\n";
  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($action = 'read',&$req_fields)
{
  global $src;
  global $mem;
  global $reset_;
  global $time_now;
  global $colors;
  global $debug;
  global $adjustFile;
  if ($action=='reset'){
    $mem['st']['tomoro'] = $mem['st']['count'] = $mem['st']['rates']= 0;
    $req_fields['tomoro'] = $req_fields['count'] = $req_fields['rates'] = 1;
    $mem['st']['reset'] = $reset_;
  }
  if ($debug) echo "Polling : $action\n";
  if ($src['rte']) {
    $result = sdk_poll_rte_edf('rte',$req_fields,sdk_day($time_now,1));
    $adjustFile = ($result)?1: $adjustFile;
  }
  if ($src['edf']) {
    $result = sdk_poll_rte_edf('edf',$req_fields,sdk_day($time_now,1));
    $adjustFile = ($result==1)?1: $adjustFile;
  }

  if ($src['alt']){
    switch($mem['ratePeriod']){
      case 'W' : $alt = date('W',$time_now);break;
      case 'M' : $alt = date('m',$time_now);break;
      case 'D' : $alt = date('z',$time_now);break;
      default  : $alt = -1;
    }
    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)?1: $adjustFile;
    }
  }
  foreach ($colors['rte'] as $key => $col){
    if (!$key) continue;
      $mem[$col]['rem'] = $mem[$col]['tot'] - $mem[$col]['dec'];
  }
  return $adjustFile;
}

function sdk_poll_rte_edf($src_,&$req_fields,$tomoro_date,$season='')
{
  global $debug;
  global $time_now;
  global $mem;
  global $colors;
  global $url_history;
  if (!($req_fields['tomoro'] || $req_fields['count'])) return 0;
  if (($mem['st']['tomoro'] == $tomoro_date) && ($mem['st']['count'] == $tomoro_date)) return 0;
  $url_history = ($src_=='rte')? $url_history = '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,NULL,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";
    }
    return 0;
  }

  $res_arr = sdk_json_decode($response);
  if (is_array($res_arr) && (count($res_arr)<1)) 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);
  return $ret;
}

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;//$codes = array($codes);
    }
    $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_extract($string,$startStr,$stopStr='',$start = 0,$startIn = false,$stopIn = false) { // Ectraire 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_poll_alt($alt,&$req_fields){
{
  global $debug;
  global $time_now;
  global $mem;
  global $colors;
  global $url_alt;
  if (!($req_fields['tomoro'] || $req_fields['count'] || $req_fields['rates'])) return 0;
  if ($alt != $mem['todayWeek']) $mem['st']['rates'] = -1;
  $urls_alt = array(1 =>
    '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'
  );
  $months = 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,NULL,false,false,$info));
      if (strpos($respAlt,'html') === false) $result = 0;
        else {$result = 1;break;}
    }
    if ($debug >0) {echo"Polling Info : $url_alt\n";var_dump($info);}
    if ($result) {//traitement des données annexes
      $erreur = 0;
      $mem['count']['alt'.$iurl]++;
      if ($debug >0) {echo"Polling : alt$iurl\n";var_dump($mem['count']);}
      switch ($type) {
        case 'selectra' :
          $sep2  = array(array('<!-- END'),array('<div class='),array('rouges'));
          $sep   = array('"intro">','hui, ');
          $start = 0;
          $block = trim(strtolower(sdk_extract($respAlt,$sep,$sep2,$start,false,false))).' rouges##';//pas de MaJ $start
          $block = str_replace(array('bleus','blancs','rouges'),array('bleu','blanc','rouge'),$block);
        //"11 septembre 2024, est bleu</strong>.la couleur<strong>tempo de demain sera bleu</strong>. il reste donc <strong>289 jours tempo bleus</strong>, <strong>43 jours tempo blancs</strong> et <strong>22 jours tempo rouges##"
          $err_num = 1;
          if (strlen($block) == 0) {$erreur = $err_num;break;}
          //lecture block
          //extraction infos Aujourd'hui
          // date
          $sep  = array('');
          $sep2 = array(',');
          $temp  = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start //"11 septembre 2024"
          $day = explode(" ",$temp);
          $day[1] = $months[$day[1]];
          $date = strtotime($day[0]." ".$day[1]." ".$day[2]);//"11 September 2024"
          $date = sdk_day($date);//"2024-09-11"
          $day0='today';$day1='tomoro';
          if ($date == $mem['yesterDate']) {$day0='yester';$day1='today';}
          //couleur0
          $sep2 = array('<');
          $sep  = array('est');// couleur
          $color0 = $colors['alt'][strtolower(trim(sdk_multiextract($block,$sep,$sep2,$start)))];
          //extraction infos demain
          // couleur1
          $sep    = array('sera');// couleur
          $color1 = $colors['alt'][trim(sdk_multiextract($block,$sep,$sep2,$start))];//MaJ $start

          if ($req_fields['tomoro'] && ($mem['st']['tomoro'] != $mem['tomoroDate'])){
            $mem[$day0.'Color'] = $color0;
            $mem[$day1.'Color'] = $color1;
            if ($day1 == 'tomoro') $mem['st']['tomoro'] = $mem['tomoroDate'];
          }
          // bilan
          $sep2    = array(array('</'),array('##'));
          $sep    = array('<strong>');
          $nbTot = $mem['BLUE']['tot']+$mem['WHITE']['tot']+$mem['RED']['tot'];
          for ($i =0;$i<3;$i++) {
            $temp = strtolower(trim(sdk_multiextract($block,$sep,$sep2,$start)));
            //"289 jours tempo bleus"
            $nb = (int)$temp;
            $nbTot -= $nb;
            if ($req_fields['tomoro'] && ($mem['st']['count'] != $mem['tomoroDate'])){
              foreach ($colors['alt'] as $key => $col){
                if (strpos($temp,$key)>1) {
                  $mem[$colors['alt'][$key]]['rem'] = $nb;
                  $mem[$colors['alt'][$key]]['dec'] = $mem[$colors['alt'][$key]]['tot'] - $nb;
                  break;
                }
              }
          }
          $nbJours = (strtotime($mem['todayDate'])-strtotime(substr($mem['season'],0,4).'-08-31'))/86400;
          if ($nbTot == $nbJours) $mem['st']['count'] = $mem['tomoroDate'];
        }
        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,$start,false,false)));//pas de MaJ $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;
            $mem['todayWeek'] != $alt;
          }
        }
        break;
      case 'selectra2' :
        $sep2  = array(array('<th>12 kVA'));
        $sep   = array('list-card--stretch">');
        $start = 0;
        $block = trim(sdk_extract($respAlt,$sep,$sep2,$start,false,false));//pas de MaJ $start
        $block = str_replace(array('bleus','blancs','rouges'),array('bleu','blanc','rouge'),$block);
        $err_num = 1;
        if (strlen($block) == 0) {$erreur = $err_num;break;}
        //lecture block
        //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') $mem['st']['tomoro'] = $mem['tomoroDate'];
        }
        // 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_multiextract($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;}
        }
        break;
      }
      if ($debug >0) {echo"Polling : alt$iurl\n";var_dump($mem['st']);}
    }
  }
  return $ret;
}
?>

Désolé pour le délai : signalez moi les problèmes rencontrés
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 : 836
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar akua » 15 Oct 2024 11:52

Bonjour,

Merci beaucoup pour la mise à jour !

Juste pour bien comprendre la subtilité avec le "demain", quelle est l'amélioration dont tu parles ?

Sur mon périphérique Tempo, j'ai les canaux suivants :

- Jours Tempo - Aujourd'hui
- Jours Tempo - Demain RDC
- Jours Tempo - Décompte rouge RDC
- Jours Tempo - Décompte blanc RDC
- Jours Tempo - Décompte bleu RDC

Je me sers de "Aujourd'hui" et "Demain" pour toutes mes planifications.

Si je mets à jour le script, est-ce que j'aurai besoin de créer un nouvel actionneur en plus de ces canaux ?

Merci !
Stéphane
akua
 
Messages : 90
Inscription : 11 Déc 2017

Re: [Store] Tempo EDF

Messagepar opa95 » 15 Oct 2024 13:35

Bonjour akua
akua a écrit:Bonjour,

Merci beaucoup pour la mise à jour !

Juste pour bien comprendre la subtilité avec le "demain", quelle est l'amélioration dont tu parles ?

Sur mon périphérique Tempo, j'ai les canaux suivants :

- Jours Tempo - Aujourd'hui
- Jours Tempo - Demain RDC
- Jours Tempo - Décompte rouge RDC
- Jours Tempo - Décompte blanc RDC
- Jours Tempo - Décompte bleu RDC

Je me sers de "Aujourd'hui" et "Demain" pour toutes mes planifications.

Si je mets à jour le script, est-ce que j'aurai besoin de créer un nouvel actionneur en plus de ces canaux ?

Merci !
Stéphane

Non, tu peux remplacer l'ancien script par la version 4.0, tout devrait marcher.
Les devices complémentaires peuvent être créés en supplément sans toucher aux anciens.
Si tu décides de remplacer le capteur "Demain", par un actionneur "Demain", ça va modifier l'identificateur correspondant et il va falloir que tu reprogrammes les actions liées à "Demain" (je le crois ou le crains, mais je n'ai pas essayé) : l'intérêt éventuel de l'actionneur est de pouvoir imposer une couleur, de forcer une relecture (commande Indéterminé) ou remettre à zéro la mémoire, si elle a un problème.
Sinon, tu peux créer les capteurs "Couleur maintenant" , "tarif actuel" et "HcHp" (par copie de "Aujourdhui" et de "décompte" en adaptant le type et l'Unité) qui vont évoluer en fonction de l'heure du jour (avant 6h on est encore "hier" pour Tempo). Il faut modifier la fréquence de requête en remplaçant 60 par 2 minutes pour que les passages se fassent à peu près à l'heure.
Tu peux aussi remplacer les 3 décomptes par un seul -> 45-0-0 (300-43-22) (juste une question de XPATH : concat(//decompte_bleu,'-',//decompte_blanc,'-',//decompte_rouge,' (',//total_bleu,'-',//total_blanc,'-',//total_rouge,')') ) et éventuellement suivre le nombre d'appels aux sites avec le capteur "Stats (R/E/S1/S2/S3)" : //counts -> 1/0/0/0/0/ correspondant aux appels journaliers à rte/edf/sel1/sel2/sel3.
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 : 836
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar herve27h » 15 Oct 2024 16:59

Bonjour opa95,

Merci à toi pour ce script.
Je vais l'installer et le tester ;)
herve27h
 
Messages : 15
Inscription : 04 Fév 2019

PrécédentSuivant

Retour vers Téléinformation

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité