[Store] Tempo EDF

Lecture des compteurs EDF avec téléinformation

Re: [Store] Tempo EDF

Messagepar Vicnau32 » 01 Sep 2024 12:57

quand tu vas dans l'aide faut cliquer sur statut des services
Pièces jointes
Opera Instantané_2024-09-01_135540_secure.eedomus.com.png
Opera Instantané_2024-09-01_135540_secure.eedomus.com.png (18.37 Kio) Consulté 3173 fois
EEDOMUS +, RFXCOM, TELEINFO, FGR222, PRISES AN180-6, FGS223, FGBS001 SONDES, TELECOMMANDE DUEWI ZME_RC2, SYNOLOGY DS220+, CAMERAS IP, THERMOSTAT NETATMO, PRISES 433 MHZ, GOOGLE HOME, ECO-DEVICE, PANNEAUX PHOTOVOLTAIQUES + MICRO ONDULEURS ENPHASE
Vicnau32
 
Messages : 101
Inscription : 17 Juil 2016
Localisation : 32

Re: [Store] Tempo EDF

Messagepar paope » 02 Sep 2024 09:55

Bonjour à tous,

depuis plusieurs jours, l'appli EDF Temp ne fonctionne plus et ne parviens pas à avoir les finos pour la mise à jour.
Cela concerne t il tout le monde ?
Les jours blancs vont arriver et les compteurs ont été remis à 0 par EDF au 1er septembre.

Merci de votre aide car cet app est vraiment utile avec du Tempo EDF.
Bonne journée
Paope
paope
 
Messages : 34
Inscription : 08 Juin 2019

Re: [Store] Tempo EDF

Messagepar vva » 05 Sep 2024 14:07

Bonjour,

Oui je confirme c'est planté.
Erreur : could not find resource for full path ...
vva
 
Messages : 386
Inscription : 12 Juin 2013

Re: [Store] Tempo EDF

Messagepar Vicnau32 » 05 Sep 2024 18:08

Par contre cela fonctionne parfaitement sur Home assistant.... :o
EEDOMUS +, RFXCOM, TELEINFO, FGR222, PRISES AN180-6, FGS223, FGBS001 SONDES, TELECOMMANDE DUEWI ZME_RC2, SYNOLOGY DS220+, CAMERAS IP, THERMOSTAT NETATMO, PRISES 433 MHZ, GOOGLE HOME, ECO-DEVICE, PANNEAUX PHOTOVOLTAIQUES + MICRO ONDULEURS ENPHASE
Vicnau32
 
Messages : 101
Inscription : 17 Juil 2016
Localisation : 32

Re: [Store] Tempo EDF

Messagepar Vincent » 06 Sep 2024 06:54

Bonjour,

Le script ne fonctionne plus depuis 8 jours. Quelqu'un sait comment corriger cela ?
Merci par avance :)
Vincent
 
Messages : 65
Inscription : 21 Fév 2013

Re: [Store] Tempo EDF

Messagepar MaDomotic » 06 Sep 2024 09:15

Plugin obsolète, ne fonctionne plus.
Pour combler ce manque vous pouvez charger sur votre mobile l'Apps "RTE Notifications" en attendant un correctif.
https://www.madomotic.fr
Concepteur - Intégrateur - Installateur
MaDomotic est partenaire de Connected Object.
Membre de la Fédération Francaise de Domotique.
MaDomotic
 
Messages : 181
Inscription : 21 Oct 2015

Re: [Store] Tempo EDF

Messagepar paope » 06 Sep 2024 13:28

Bonjour,
Ce n'est pas la première fois qu'il ne fonctionne plus.
On espère une bonne âme pour venir nous corriger le bug sur l'app pour que tout rentre dans l'ordre.

Malheureusement moi je ne sais pas faire... :roll:

Merci d'avance à la communauté, cet app est tellement pratique pour gérer ses économies.

Bonne journée
Paope
paope
 
Messages : 34
Inscription : 08 Juin 2019

Re: [Store] Tempo EDF

Messagepar opa95 » 06 Sep 2024 13:53

Bonjour tous
paope a écrit:Bonjour,
Ce n'est pas la première fois qu'il ne fonctionne plus.
On espère une bonne âme pour venir nous corriger le bug sur l'app pour que tout rentre dans l'ordre.
Malheureusement moi je ne sais pas faire... :roll:
Merci d'avance à la communauté, cet app est tellement pratique pour gérer ses économies.
Bonne journée

En fait le site direct d'edf ne répond plus, je ne sais pas s'il y a un autre endroit où l'on trouverait les mêmes informations aussi compactes (quelques dizaines d'octets) : donc la version 3.6 ne fonctionne plus.
Il faudrait remettre la version 3.5, qui traitait directement le fichier html de l'un des nombreux sites relais (quelques dizaines de kilo-octets). Il faut que je la teste de nouveau pour la remettre à disposition.
Patience, je vais regarder ;)
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 : 870
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar MaDomotic » 06 Sep 2024 16:52

Domotifred me dit avoir une alternative, il rentre de congés demain, wait and see
https://www.madomotic.fr
Concepteur - Intégrateur - Installateur
MaDomotic est partenaire de Connected Object.
Membre de la Fédération Francaise de Domotique.
MaDomotic
 
Messages : 181
Inscription : 21 Oct 2015

Re: [Store] Tempo EDF

Messagepar gusdelamort » 06 Sep 2024 17:29

Hello à tous,

J'ai une solution qui semble marcher.

Création d'un capteur http
Adresse : https://www.api-couleur-tempo.fr/api/jourTempo/today
On coche, transformer en xml
Xpath codeJour
On crée 4 valeurs, 0 : Non Communiqué / 1: Bleu / 2: Blanc / 3: Rouge
Mise à jour toutes les 60 min, et ça roule :=

Ensuite on copie l'indicateur, pour Tempo Lendemain
Adresse : https://www.api-couleur-tempo.fr/api/jourTempo/tomorrow
gusdelamort
 
Messages : 259
Inscription : 16 Mai 2013

Re: [Store] Tempo EDF

Messagepar opa95 » 06 Sep 2024 20:42

Bonsoir
gusdelamort a écrit:Hello à tous,

J'ai une solution qui semble marcher.

Création d'un capteur http
Adresse : https://www.api-couleur-tempo.fr/api/jourTempo/today
On coche, transformer en xml
Xpath codeJour
On crée 4 valeurs, 0 : Non Communiqué / 1: Bleu / 2: Blanc / 3: Rouge
Mise à jour toutes les 60 min, et ça roule :=

Ensuite on copie l'indicateur, pour Tempo Lendemain
Adresse : https://www.api-couleur-tempo.fr/api/jourTempo/tomorrow

Il n'y a plus qu'à adapter le plugin actuel.
Sais-tu si on peut récupérer les jours restants? :)
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 : 870
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar MaDomotic » 07 Sep 2024 09:56

gusdelamort a écrit:Hello à tous,

J'ai une solution qui semble marcher.

Création d'un capteur http
Adresse : https://www.api-couleur-tempo.fr/api/jourTempo/today
On coche, transformer en xml
Xpath codeJour
On crée 4 valeurs, 0 : Non Communiqué / 1: Bleu / 2: Blanc / 3: Rouge
Mise à jour toutes les 60 min, et ça roule :=

Ensuite on copie l'indicateur, pour Tempo Lendemain
Adresse : https://www.api-couleur-tempo.fr/api/jourTempo/tomorrow


Merci j'ai testé ce matin, parfait ;)
Domotifred avait le même lien.
Reste à trouver l'EcoWatt qui lui aussi ne fonctionne plus
https://www.madomotic.fr
Concepteur - Intégrateur - Installateur
MaDomotic est partenaire de Connected Object.
Membre de la Fédération Francaise de Domotique.
MaDomotic
 
Messages : 181
Inscription : 21 Oct 2015

Re: [Store] Tempo EDF

Messagepar paope » 09 Sep 2024 10:21

Bonjour à tous,
Testé ce matin et ça récupère bien les infos. :D
merci !
A suivre si quelqu'un met le plugin a jour ou si je me plonge pour revoir toutes mes règles. :shock:
Bonne journée à tous
Paope
paope
 
Messages : 34
Inscription : 08 Juin 2019

Re: [Store] Tempo EDF

Messagepar opa95 » 09 Sep 2024 19:59

Bonjour paope
paope a écrit:Bonjour à tous,
Testé ce matin et ça récupère bien les infos. :D
merci !
A suivre si quelqu'un met le plugin a jour ou si je me plonge pour revoir toutes mes règles. :shock:
Bonne journée à tous

Normalement il devrait y avoir un script correct demain sur le forum. Il donne les anciennes info en utilisant l'api edf qui fonctionne et des informations complémentaires en utilisant d'autres sites : on peut continuer à avoir des valeurs si l'api edf tombe en rade. :)
tarifs du jour et du lendemain,
couleur actuelle qui tient compte de l'heure (avant 6h on est encore hier)
Tarif actuel qui tient compte de l'heure (jour et heure).
Ce ne sera pas une version définitive, mais les modifications ultérieures seront invisibles.
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 : 870
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar opa95 » 10 Sep 2024 17:44

Bonjour paope et ceux qui sont intéressés
paope a écrit:Bonjour à tous,
Testé ce matin et ça récupère bien les infos. :D
merci !
A suivre si quelqu'un met le plugin a jour ou si je me plonge pour revoir toutes mes règles. :shock:
Bonne journée à tous

Pour une fois je vais tenir mes délais.
Voici une version de edf_tempo.php (V3.7) compatible avec la V3.6.
La version est provisoire car le nettoyage n'est pas fini, mais rien ne va changer dans la version finale; sauf si vous me signalez des bugs ou des souhaits.
Elle utilise l"API edf au lieu du site edf qui ne fonctionne plus.
Toutefois, certaines informations ne sont pas accessibles avec l'api; j'ai donc du repartir de la version 1.5 pour récupérer les infos manquantes sur d'autres sites ("electra",...).
Le script va tester plusieurs sites pour trouver un site qui fonctionne, il peut même se débrouiller si le site de l"api edf est à plat.
Normalement, il suffit de remplacer l'ancien script edf_tempo.php par le nouveau script (si vous voulez changer le nom du nouveau, il faut qu'il contienne le mot "tempo") et les 5 anciens devices fonctionneront. On peut en créer d'autres avec des informations complémentaires (voir l'entête du fichier). On peut avoir les tarifs et l'état actuel (qui tient compte de l'heure pour déterminer le tarif en cours, pour ceux qui n'ont pas de linky connecté).
Les données récupérées sont stockées dans la box, on peut donc réduire fortement les pollings réels vers les sites externes.
Il y a un timer qui limite les appels trop rapprochés et évite que les 5 (ou plus) devices fassent chacun appel aux sites externes (valeur par défaut timer=3600secondes) -> 24 appels par jour indépendamment du nombre de devices.
Les heures importantes sont minuit : changement de jour, 6h début du jour tempo (avant on est encore hier), midi date limite de mise à jour, 22h début des heures creuses jusqu'au lendemain 6h.
Si on souhaite que les informations soient mises à jour à ces instants, on peut remplacer la fréquence de lecture des devices (60 minutes) par 1 (ou 2 ou 5) (il suffit de le faire sur un seul device car ils sont tous couplés) et laisser le timer faire le job : tant que le temps n'est pas écoulé, les données renvoyées seront directement reprises de la mémoire sans appel externe sauf aux "heures critiques" (0h, 6h, 12h, 22h). Dans ce cas on laisser le timer à 3600 secondes et profiter éventuellement d'une mise à jour dès 11h au lieu de 12h, sinon on peut mettre le timer à 21600=6h (5 lectures par jour : toutes les 6h plus celle 22h) ou bien carrément à plus de 10h (40000 secondes) pour sauter la demande de 18h.
Pour modifier facilement le timer, on peut remplacer la ligne de commande par
Code : Tout sélectionner
http://localhost/script/?exec=edf_tempo.php&contrat=[VAR1]&site=[VAR2]&timer=[VAR3]
avec
VAR1 : vide (-> tempo) ou tempo ou ejp (ou contenu dans le nom du script)
VAR2 : vide ou numéro du site secondaire, 0 par défaut -> test de tous les sites
VAR3 : vide ou période de polling (secondes) 3600 par défaut

Voici le code à charger :)
Code : Tout sélectionner
<?php
/*****************************************************************************
**
** Script Tempo/EJP pour eedomus
**
** Script qui permet de récupérer au format XML les données Tempo ou EJP :
**   - Couleur Tempo du jour/EJP (//aujourdhui),
**  - Couleur Tempo du lendemain/EJP (//demain),
**  - Nombre de jours Bleus Tempo restants (//decompte_bleu),
**  - Nombre de jours Blancs Tempo restants (//decompte_blanc),
**  - Nombre de jours Rouge Tempo restants (//decompte_rouge),
**  - Nombre de jours Rouge EJP restants (//decompte),
**  - Tarif du jour
** Les données sont stockées en mémoire et le polling sur les sites est réglé
** par la valeur de 'timer' (3600 secondes par défaut).
** Un polling automatique est fait au passage à minuit, 6h, 12h et 22h,
** pour que ce polling automatique se fasse bien, on peut régler la fréquence des plugins à une valeur faible (1 ou 2 minutes) : dans ce cas, les pollings
réels seront synchronisés à peu près sur les passages à l'heure (0:01h,1:01h... pour timer=3600) ou par exemple à (0:01h, 6h:01, 12h:01,18:01h,22:01h pour timer=21600 [6*3600] ); si timer>=36000, les lectures seront (0:01h, 6h:01, 12h:01,22:01h)
** Le nombre d'appels sera donc compris entre 4 et 25 par jour, quel que soit le nombre de devices créés. Le reste du temps les appels se conteteront de renvoyer le contenu de la mémoire.
** en mode test, on peut forcer la lecture avec la commande &reset=1 ou &simul=x, avec x<0 ou >timer
****************************************************************************
**  - URL de la Requête 
**: http://localhost/script/?exec=edf_tempo.php
**  - ou http://localhost/script/?exec=edf_tempo.php&contrat=[VAR1]&site=[VAR2]&timer=[VAR3]
** avec
**   VAR1 : vide (-> tempo) ou tempo ou ejp (ou contenu dans le nom du script)
**   VAR2 : vide ou numéro du site secondaire, 0 par défaut -> test de tous les sites
**   VAR3 : vide ou période de polling (secondes) 3600 par défaut
** - Fréquence de la Requête : 60 minutes ou 1 si on veut mettre à jour l'affichage plus souvent pour le passage à 0h, 6h, 12h, 22h, de toute façon le polling vers les sites est réglé par 'timer' (3600 par défaut)
** L'URL est de la forme (Tempo) : edf_tempo.php ou edf_ejp.php&contrat=tempo ou utiliser VAR1
** L'URL est de la forme (EJP)   : edf_ejp.php   ou edf_tempo.php&contrat=ejp ou utiliser VAR1
** si l'URL porte un autre nom, le champ &contrat est obligatoire (ou VAR1)
** commandes ajouter à la fin de la ligne de commande:
** type contrat : &contrat=1 (tempo par défaut ou récupéré dans le nom)
** mode debug : &debug=1 (0 par défaut)
** site  : &site=n (0 par défaut -> tous les sites, sinon n° du site)
** timer (Validité du fichier en secondes) :&timer=xxxxx (3600 par défaut)
** reset : effacement mémoire : &reset=n (0 par défaut, 1 sinon)
** simul décalage temporel (secondes) : &simul=yyyyy (0 par défaut)
****************************************************************************
Resultats : /tempo/champ ou //champ
?xml version="1.0" encoding="UTF-8"?>
<root>
<tempo>
   <aujourdhui>BLEU</aujourdhui> // de 6h à 6h (demain)
   <date_aujourdhui>JOUR</date_aujourdhui> // de 6h à 6h (demain)
   <demain>BLEU</demain> // de 6h (demain) à 6h (aprèsdemain)
   <date_demain>11/09</date_demain> // de 6h (demain) à 6h (aprèsdemain)
   <now>BLEU</now> // couleur actuelle (dépend de l'heure, avant 6h -> hier)
   <date_now>JOUR</date_now> // date actuelle (dépend de l'heure, avant 6h -> hier)
   <decompte_bleu>10</decompte_bleu> //nombre de jours écoulés
   <decompte_blanc>0</decompte_blanc> //nombre de jours écoulés
   <decompte_rouge>0</decompte_rouge> //nombre de jours écoulés
   <reste_bleu>290</reste_bleu> //nombre de jours restants
   <reste_blanc>43</reste_blanc> //nombre de jours restants
   <reste_rouge>22</reste_rouge> //nombre de jours restants
   <type>tempo</type>
   <hphc>HP</hphc> // période actuelle (dépend de l'heure, avant 6h -> hier)
   <tarifs_aujourdhui>0.1609/0.1296</tarifs_aujourdhui> // de 6h à 6h (demain)
   <tarifs_demain>0.1609/0.1296</tarifs_demain> // de 6h (demain) à 6h (aprèsdemain)
   <tarif_now>0.1609</tarif_now>// tarif actuel (dépend de l'heure, avant 6h -> hier)
   <bleu_hc>0.1296</bleu_hc> // tarif
   <bleu_hp>0.1609</bleu_hp> // tarif
   <blanc_hc>0.1486</blanc_hc> // tarif
   <blanc_hp>0.1894</blanc_hp> // tarif
   <rouge_hc>0.1568</rouge_hc> // tarif
   <rouge_hp>0.7562</rouge_hp> // tarif
</tempo>
<debug>
   <date_fichier>2024-09-10 11:34:28</date_fichier>
   <timestamp>1725960868</timestamp> //fichier
   <date_lecture>Mardi 10/09 11:34:28</date_lecture>
   <url>https://www.api-couleur-tempo.fr/api/joursTempo?dateJour[]=2024-09-09&amp;dateJour[]=2024-09-10&amp;dateJour[]=2024-09-11</url> //api edf
   <url_>https://selectra.info/energie/fournisseurs/edf/tempo</url_> // url secondaire
  <result>1</result> //1->OK
</debug>
</root>
********************************************************************************
urls compatibles :
tempo
https://www.api-couleur-tempo.fr/api/joursTempo?',
https://selectra.info/energie/fournisseurs/edf/tempo#selectran',
https://www.fournisseurs-electricite.com/edf/tarifs/tempo#selectran',
https://prix-elec.com/tarifs/fournisseurs/edf/tempo#selectran'
ejp (pas testé le 2024/09/10)
https://electricite.net/edf/tarifs/ejp // **dates fausses le 2/04
https://prix-elec.com/tarifs/fournisseurs/edf/ejp-demain
https://selectra.info/energie/fournisseurs/edf/ejp
https://selectra.info/energie/fournisseurs/edf/ejp/demain
https://observatoires.net/calendrier
https://selectra.info/energie/fournisseurs/edf/ejp/jours
https://www.fournisseurs-electricite.com/edf/tarifs/ejp/jour-demain
https://www.fournisseurs-electricite.com/edf/tarifs/ejp
https://www.kelwatt.fr/fournisseurs/edf/ejp/demain
https://www.kelwatt.fr/guide/ejp

******************************************************************************
**
** Evolution des versions :
**
** 2017-07-26 (DjMomo)    :V1.0 - Version initiale
** 2019-10-24 (Merguez07) :V2.0 - utilisation du proxy Eedomus
** 2019-10-26 (Merguez07) :V2.1 - Passage du cache de 24h à 1h
** 2020-11-11 (Merguez07) :V3.0 - utilisation des données du site de selectra
** 2021-10-04 (Merguez07) :V3.1 - correction du script suite à evolution du site Electra
** 2022-01-07 (Merguez07) :V3.2 - correction du script suite à evolution du site Electra
** 2022-03-24 (Merguez07) :V3.3 - correction du script suite à evolution du site Electra
** 2022-03-27 (Merguez07) :V3.4 - bug dans le store
** 2022-04-01 (opa95)     :V3.5 - corrections mineures, compatible autres sites et EJP
** 2022-04-01 (opa95)     :V3.6 - utilisation du site edf tempo et EJP
** 2024-09-10 (opa95)     :V3.7 - Utilisation api edf et sites selectra...
*******************************************************************************/
function sdk_jour($time_now,$nbJours = 0,$jourStr = 2) {
  //creation date à partir du temps unix décale de $nbJours
  //sortie jourFrançais jj/mm
  global $days;
  $time_now += 86400*$nbJours;
  $jour_semaine = date('w',$time_now);
  $start = 0;
  foreach ($days as $key => $day) {
    if ($start == $jour_semaine) {
      $jour_semaine = $key;
      break;
    }
    $start ++;
  }
  switch ($jourStr) {
    case 2 : $ret= date('Y-m-d',$time_now);
    return $ret;
    case 1 : return $jour_semaine.' '.date('d/m',$time_now);
    default :
      $ret= date('d/m',$time_now);
      return $ret;
}
//  if ($jourStr ==1 ) return $jour_semaine.' '.date('d/m',$time_now);
//  else return date('d/m',$time_now);
//  return;
}

function sdk_multiextract1($string,$startStr,$stopStr='',&$start,$outer = 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 sot pas incluses
  // start est remis a jour
  // eviter les caractères non standards
  $beg = $start;
  if (!is_array($startStr)) {
    $startLen = strlen($startStr);
    if ($startLen > 0)
      if ( ($pos = strpos(substr($string,$beg),$startStr)) !== false)
        $beg = $beg + $pos + $startLen;
      else $beg += $startLen;
  }
  else {
    foreach ($startStr as $str){
      $startLen = strlen($str);
      if ($startLen > 0) {
        if ( ($pos = strpos(substr($string,$beg),$str)) !== false)
          $beg = $beg + $pos + $startLen;
        else {
          $beg += $startLen;
          break;
        }
      }
    }
  }
  if ($outer) $beg -= $startLen;
  if (!is_array($stopStr)) {
    $stopLen = strlen($stopStr);
    if ($stopStr)
      if ( ($pos = strpos(substr($string,$beg+1),$stopStr)) !== false)
        $end = $beg + $pos + 1;
        else $end = strlen($string);
  }
  else {
    $end = $beg;
    foreach ($stopStr as $str){
      $stopLen = strlen($str);
      if ($stopStr) {
        if ( ($pos = strpos(substr($string,$beg+1),$str)) !== false)
          $end = $beg + $pos + 1;
        else {
          $end = strlen($string);
          break;
        }
      }
    }
  }
  if ($outer) $end += $stopLen;
  $launch  = substr($string,$beg,$end-$beg);
  $start  = $end;
  return  $launch;
}

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_multiexplode ($delimiters,$string) {   // Separer une chaine de caracteres suivant plusieurs separateurs
// remplacement delimiters[1] par delimiters[0]
// renvoi du tableau rédultat de explode
  $ready  = str_replace($delimiters, $delimiters[0], $string);
  $launch = explode($delimiters[0], $ready);
  return  $launch;
}

function sdk_format ($string,$field = 'color') {  // met en forme selon la semantique du plugin du store
  // formatage de date -> format[dayWeek] dayWeek et format[dateJM] jj/mm ou renvoi ND ND
  // formatage de couleur tempo -> BLEU, BLANC, ROUGE ND
  // formatage de couleur ejp -> NON_EJP, EST_EJP, ND
  global $contrat;// tempo ou ejp
  global $upc_contrat;// TEMPO ou EJP
  global $days;// jour de la semaine
  $string   =   str_replace($upc_contrat,'',trim(strtoupper($string))); 
  if ($field == 'date') {
    if (strlen($string) < 6) $string = 'ND '.$string;
    list($format['dayWeek'],$format['dateJM']) = explode(' ',trim($string));
    if ($format['dayWeek'] != 'ND') $format['dayWeek'] = $format['dayWeek'][0].strtolower(substr($format['dayWeek'],1));
    if (!array_key_exists($format['dayWeek'],$days) ) $format['dayWeek'] = 'ND';
  }
  else {
    $format   = "ND";
    $string   =   strtoupper(str_replace(' ','',$string));
    if ($contrat == 'ejp') {
      if ( ($string == "PASD'") || (strpos($string,'JAMAIS') !== false) ) $format="NON_EJP";
      if ($string == "JOUR")  $format="EST_EJP";
    }
    else {
      $string = strtoupper($string);
      $color  =   array("1"=>"BLEU","2"=>"BLANC","3"=>"ROUGE","0"=>"ND");
      if (is_numeric($string)) {
          $string = $string%4;
          if ($string>0) return $color[$string];
      }
      foreach ($color as $col) {
        if (strpos($string,$col) !== false) {
          $format = $col;
          break;
        }
      }
    }
  }
  return  $format;
}


define('MEM','OLD');
define('DEFTYPE','selectran');// format url annexe
define('DEFTIME','3600');//3600 secondes
define('NBB','300');
define('NBW','43');
define('NBR','22');
define('TSTART',6);//début start
define('TSTOP',22);//fin HP
$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');
$days   = array('Dimanche' => 'Sunday','Lundi' => 'Monday','Mardi' => 'Tuesday','Mercredi' => 'Wednesday','Jeudi' => 'Tuesday',
                'Vendredi' => 'Friday','Samedi' => 'Saturday');
                //initialisation des variables
//$start = strlen('exec=edf_');
$source = (array_key_exists('exec',$_GET))? strtolower($_GET['exec']):"";
if (strpos('Z'.$source,'tempo')) $contrat = 'tempo';
elseif (strpos('Z'.$source,'ejp'))$contrat = 'ejp';
else $contrat = "";
$contrats = array('tempo','ejp');
$urls     = array('tempo' => array (
  'https://www.api-couleur-tempo.fr/api/joursTempo?',
  'https://selectra.info/energie/fournisseurs/edf/tempo#selectran',
  'https://www.fournisseurs-electricite.com/edf/tarifs/tempo#selectran',
  'https://prix-elec.com/tarifs/fournisseurs/edf/tempo#selectran',
  'https://www.kelwatt.fr/guide/tempo#selectra',
  'https://observatoires.net#selectra',
  'https://observatoires.net/tempo#selectra',
  ),
        'ejp'   => array (
    1 => 'https://selectra.info/energie/fournisseurs/edf/ejp#selectra',
    'https://observatoires.net#selectra',
    'https://observatoires.net/ejp#selectra',
    'https://prix-elec.com/tarifs/fournisseurs/edf/ejp-demain#selectra',
    'https://www.fournisseurs-electricite.com/edf/tarifs/ejp/jour-demain#selectra',
    'https://www.kelwatt.fr/fournisseurs/edf/ejp#selectra',
    'https://electricite.net/edf/tarifs/ejp#selectra',
    'https://agence-energie.com/edf/tarifs/ejp#selectra'
  )
      );
$types = array('selectra','selectran','keskeces');               

$contrat_  = strtolower(getArg('contrat',false,""));
$contrat = (($contrat_!="") && (in_array($contrat_,$contrats)))?  $contrat_:$contrat;
$debug  = getArg('debug',false);
if ( (!$debug) || (!in_array($debug,array(0,1))) ) $debug = 0;
$num_site   = abs(getArg('site',false));
if ( (!$num_site) || (($num_site > count($urls[$contrat]) )) ) $num_site = 1;
if ($num_site == 0 ) $scan = 1; else $scan = 0;
$timer = getArg('timer',false,DEFTIME);//Validité du fichier
$upc_contrat = strtoupper($contrat);
$poll = 0;
$reset = getArg('reset',false,0);
if ($reset) {
  deleteVariable(MEM.$contrat);
  $poll = 1;
}
$simul = getArg('simul',false,0);//Décalage temps secondes

$time_now    = time()+$simul;
$annee_now   = date('Y',$time_now);//aaaa
$heure_now   = date('H',$time_now);//hh
$date_now    = sdk_jour($time_now,0,1);// jj/mm
$date_demain = sdk_jour($time_now,1,1);//jour jj/mm
$date_hier   = sdk_jour($time_now,-1,0);//jour jj/mm
$nowDate     = sdk_jour($time_now,0,0);//jour semaine
$dateDemain  = sdk_jour($time_now,1,0);//jour semaine
list($nowDayWeek,$bof)    = explode(' ',$date_now);
list($tomorrowDayWeek,$bof) = explode(' ',$date_demain);
$infos_ = array (
  'todayDate' => 'ND', 'todayDayWeek' => 'ND',
  'todayYear' => 'ND', 'todayColor' => 'ND', 'hphc' =>'HP',
  'tomorrowDate' => 'ND', 'tomorrowDayWeek' => 'ND', 'tomorrowYear' => 'ND', 'tomorrowColor' => 'ND',
  'yesterdayColor' =>'ND', 'yesterdayRate' => 'ND', 'yesterdayDate' => 'ND',
  'nowDate' => 'ND','nowColor'=>'ND', 'tarifnow' => 'ND',
  'decRed' => NBR, 'totRed' => NBR, 'remRed' => 'ND',
  'decWhite' => NBW, 'totWhite' => NBW, 'remWhite' => 'ND',
  'decBlue' => NBB, 'totBlue' => NBB, 'remBlue' => 'ND',
  'fileDate' => 'ND', 'fileTimestamp' => 'ND',
  'BLEU' => array('HC'=>'0.1296','HP'=>'0.1609'),
  'BLANC' => array('HC'=>'0.1486','HP'=>'0.1894'),
  'ROUGE' => array('HC'=>'0.1568','HP'=>'0.7562'),
) ;

if (loadVariable(MEM.$contrat)) $infos_ = loadVariable(MEM.$contrat);
  else $poll = 1;
$infos_['hphc'] = (($heure_now<TSTART) || ($heure_now>=TSTOP))?'HC':'HP';
if (!$poll && array_key_exists('fileTimestamp',$infos_)){// forçage lecture
  $file_hour = date("H",$infos_['fileTimestamp']);
  if ($time_now<$infos_['fileTimestamp']) {$poll=1;}// simulation (recul)
  elseif (($time_now-$infos_['fileTimestamp'])>$timer) {$poll=1;}// temps expiré
  elseif (($file_hour<TSTART) && ($heure_now>=TSTART)) {$poll=1;}// passage à 6h
  elseif (($file_hour<TSTOP) && ($heure_now>=TSTOP)) {$poll=1;} // passage à 22h
  elseif (($file_hour>$heure_now)) {$poll=1;}// passage à minuit
  elseif (($file_hour<12) && ($heure_now>=12)) {$poll=1;} // passage à 12h
}
$heure_lecture = date('H:i:s',$time_now);
if ($poll)
{  $urls['tempo'][0] .= 'dateJour[]='.sdk_jour($time_now,-1).'&dateJour[]='.sdk_jour($time_now).'&dateJour[]='.sdk_jour($time_now,1);
  $infos_['todayDate']       = $nowDate; // dd/mm
  $infos_['todayDayWeek']    = $nowDayWeek; // Jour ou ND
  $infos_['tomorrowDate']    = $dateDemain; // dd/mm
  $infos_['tomorrowDayWeek'] = $tomorrowDayWeek; // Jour ou ND
  $infos_['yesterdayDate']   = $date_hier;
  if ('todayDayWeek' == 'Samedi') $infos_['tomorrowColor'] = 'BLEU';
  elseif ('todayDayWeek' == 'Dimanche') $infos_['todayColor'] = 'BLEU';
  $response0 = httpQuery($urls['tempo'][0],'GET');
  $response0 = sdk_json_decode($response0);
  $api_edf = count($response0)>1;
  $infos_['yesterdayColor'] = sdk_format($response0[0]['codeJour']);
  $bof = sdk_format($response0[1]['codeJour']);
  if ($bof!='ND') $infos_['todayColor']  = $bof;
  $bof = sdk_format($response0[2]['codeJour']);
  if ($bof!='ND') $infos_['tomorrowColor']  = $bof;
  for ($i=$num_site;$i<=count($urls[$contrat]);$i++){
    if (!$i) $i++;
    list($url,$type) = explode('#',$urls[$contrat][$num_site]);
    if ( (!$type) || (!in_array($type,$types)) ) $type = DEFTYPE;
    $response = trim(httpQuery($url,'GET'));
    if (strpos($response,'html') === false) $result = 0;
      else {$result = 1;break;}
    if ($num_site) break;
  }

  if ($result) {
    $erreur = 0;
    switch ($type) {
      case 'selectra' :
          //lecture block
          $sep2  = array(array('<!-- END'),array('<div id="block-'));
          $sep   = array('<div id="block-'.$contrat,'<div');
          $start = 0;
          $block = trim(strtolower(sdk_extract($response,$sep,$sep2,$start,false,false)));//pas de MaJ $start
          $err_num = 1;
          if (strlen($block) == 0) {$erreur = $err_num;break;}
          //extraction infos Aujourd'hui
          $sep2  ='</';
          // date
          $sep   = array('aujourd',$contrat);// jour dd/mm
          $bof   = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $bof   = sdk_format($bof,'date');
          $infos_['todayDate']    = $bof['dateJM']; // dd/mm
          $infos_['todayDayWeek'] = $bof['dayWeek']; // Jour ou ND
          //couleur
          $sep    = array('_icon','<span>');// couleur
          $infos_['todayColor'] = trim(sdk_multiextract($block,$sep,$sep2,$start));
          $infos_['todayColor'] = sdk_format($infos_['todayColor']);//COUL ou ND
          //extraction infos demain
          $start = 0;// debut block
          // date
          $sep = array('demain',$contrat);// jour dd:mm
          $bof = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $bof = sdk_format($bof,'date');
          $infos_['tomorrowDate']    = $bof['dateJM']; // dd/mm
          $infos_['tomorrowDayWeek'] = $bof['dayWeek']; // Jour ou ND
          // couleur
          $sep = array('_icon','<span>');// couleur
          $infos_['tomorrowColor'] = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $infos_['tomorrowColor'] = sdk_format($infos_['tomorrowColor']);
          // bilan
          $sep = array('title','>'); //{ejp}nbjoursecoules/nbtotjours {tempo} nbjoursrestants
          $bof = trim(sdk_multiextract($block,$sep,$sep2,$start));
          if ($contrat == 'ejp') {
            list($bof,$bof1) = explode('/',$bof);
            $bof1 = trim($bof1);
            if (is_numeric($bof1))  $infos_['totRed'] = $bof1;
            $bof  = trim($bof);
            if (is_numeric($bof)) {
              $infos_['decRed'] = $infos_['totRed'] - $bof;}
          }
          //complements
          $bof = str_replace('/','-',$infos_['todayDate'].'-'.$annee_now);//date europeenne
          $bof = strtotime($bof);
          if ($bof > $time_now) $infos_['todayYear'] = $annee_now -1;
          else $infos_['todayYear'] = $annee_now;
          $infos_['tomorrowYear'] = $infos_['todayYear'];
          if ($infos_['tomorrowDate'] == '01/01') $infos_['tomorrowYear']++;
        break;
      case 'selectran' :
        $sep2  = array(array('<!-- END'),array('<div class='));
        $sep   = array('"intro">','hui, ');
        $start = 0;
        $block = trim(strtolower(sdk_extract($response,$sep,$sep2,$start,false,false)));//pas de MaJ $start
        $err_num = 1;
        if (strlen($block) == 0) {$erreur = $err_num;break;}
        if ($api_edf*0){
          $sep   = array('il reste');// jour dd/mm
          $sep2  =array('</p>');
          $block = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $start=0;
          $sep2   =array('</');
        }else{
          //lecture block
          //extraction infos Aujourd'hui
          // date
          $sep  = array('hui, ');// jour dd/mm
          $sep2 = array(',');// jour dd/mm
          $bof  = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $jour = explode(" ",$bof);
          $jour[1] = $months[$jour[1]];
          $date = strtotime($jour[0]." ".$jour[1]." ".$jour[2]);
          //couleur
          $sep  = array('est');// couleur
          $sep2 ='</';
          $bof  = trim(sdk_multiextract($block,$sep,$sep2,$start));
          $infos_['todayColor'] = sdk_format($bof);//COUL ou ND
          //extraction infos demain
          // date
          // couleur
          $sep    = array('sera');// couleur
          $bof = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $infos_['tomorrowColor'] = sdk_format($bof);
        }
        // bilan
        $sep    = array('<strong>'); //{ejp}nbjoursecoules/nbtotjours {tempo} nbjoursrestants
        for ($i =0;$i<3;$i++) {
          $bof = trim(sdk_multiextract($block,$sep,$sep2,$start));
            $nb = (int)$bof;
            if (strpos($bof,'bleu')>1) $infos_['remBlue'] = $nb;
            elseif (strpos($bof,'rouge')>1) $infos_['remRed'] = $nb;
            elseif (strpos($bof,'blanc')>1) $infos_['remWhite'] = $nb;
          }
        $infos_['decRed'] = $infos_['totRed'] - $infos_['remRed'];
        $infos_['decWhite'] = $infos_['totWhite'] - $infos_['remWhite'];
        $infos_['decBlue'] = $infos_['totBlue'] - $infos_['remBlue'];
        $sep2  = array(array('<!-- END'),array('</tr'));
        $sep   = array('<th>Abonnement','<strong>','<strong>','</td>');
        $start = 0;
        $block = trim(strtolower(sdk_extract($response,$sep,$sep2,$start,false,false)));//pas de MaJ $start
        $sep2  = array('&nbsp;');
        $sep   = array('<td>');
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['BLEU']['HC'] = $bof;
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['BLEU']['HP'] = $bof;
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['BLANC']['HC'] = $bof;
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['BLANC']['HP'] = $bof;
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['ROUGE']['HC'] = $bof;
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['ROUGE']['HP'] = $bof;
        break;
      case 'keskeces' :
      //lecture block1
        $sep   = array("<div class='cont' onclick=","Aujourd'hui");
        $sep2  = "<div class='cont' onclick=";
        $startBlock = 0;
        $block = trim(str_replace(',','',sdk_multiextract($response,$sep,$sep2,$startBlock)));
        if (strlen($block == 0) ) {$erreur = 1;break;}
        //extraction dates et couleur
        $sep2  = '</';
        $sep   = '';
        $start = 0;
        $infos_['todayDate']     = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
        $sep   = array('Jour','<div','>');//Bleu Blanc Rouge Indeterminé
        $infos_['todayColor']    = sdk_multiextract($block,$sep,$sep2,$start);//MaJ $start
        $infos_['todayColor']    = sdk_format($infos_['todayColor']);
        $sep   = array('Lendemain','<div','>');//Bleu Blanc Rouge Indeterminé
        $infos_['tomorrowColor'] = sdk_multiextract($block,$sep,$sep2,$start);//MaJ $start
        $infos_['tomorrowColor'] = sdk_format($infos_['tomorrowColor']);
        $date_array = explode(' ',$infos_['todayDate']);//Jour J mois aaaa (français)
        $bof = strtotime($date_array[1].' '.$months[$date_array[2]].' '.$date_array[3]);
        $infos_['todayDayWeek']  = $date_array[0];
        $infos_['todayDate']     = sdk_jour($bof,0,false);//jour JJ/MM
        $infos_['todayYear']    = $date_array[3];
        $infos_['tomorrowDate']  = sdk_jour($bof,1,false);
        $infos_['tomorrowYear'] = $infos_['todayYear'];
        if ($infos_['tomorrowDate'] == '01/01') $infos_['tomorrowYear']++;
      //lecture block2
        $sep   = array("<div class='cont' onclick=",'Tempo','Jours');
        $sep2  = "<div class='cont pub'";
        $block = trim(str_replace(',','',sdk_multiextract($response,$sep,$sep2,$startBlock)));
        //bilan
        $sep2                    = '</';
        $start = 0;
        $sep                     = array('bj','<b>');//Bleu Blanc Rouge Indeterminé
        $infos_['decBlue']     = sdk_multiextract($block,$sep,$sep2,$start);//nn
        $infos_['totBlue']  = sdk_multiextract($block,$sep,$sep2,$start) + $infos_['decBlue'];//nn
        $start = 0;
        $sep                     = array('wj','<b>');//Bleu Blanc Rouge Indeterminé
        $infos_['decWhite']     = sdk_multiextract($block,$sep,$sep2,$start);//nn
        $infos_['totWhite']  = sdk_multiextract($block,$sep,$sep2,$start) + $infos_['decWhite'];//nn
        $start = 0;
        $sep                     = array('rj','<b>');//Bleu Blanc Rouge Indeterminé
        $infos_['decRed']     = sdk_multiextract($block,$sep,$sep2,$start);//nn
        $infos_['totRed']  = sdk_multiextract($block,$sep,$sep2,$start) + $infos_['decRed'];//nn
        $sep                     = array('/table',':');//J mois aaaa à hhhmm(français)
        $infos_['fileDate']      = trim(sdk_multiextract($block,$sep,'<',$start));//MaJ $start
        $date_array = explode(' ',$infos_['fileDate']);//array JJ mois aaaa à hhhmm
        $bof = strtotime($date_array[0].' '.$months[$date_array[1]].' '.$date_array[2]);
        $infos_['heureFile']     = str_replace('h',':',$date_array[4]);//hh:mm
        $infos_['fileDate']      = sdk_jour($bof,0);
        break;
      }
  }
  if ($heure_now<TSTART) {
    if ($infos_['nowDate'] != $infos_['yesterdayDate']){
      $infos_['nowDate'] = $infos_['yesterdayDate'];
      $infos_['nowColor'] = $infos_['yesterdayColor'];
  //    $infos_['tarifNow'] = $infos_['yesterdayRate'];
    }
  }elseif ($infos_['nowDate'] != $infos_['todayDate']){
    $infos_['nowDate'] = $infos_['todayDate'];
    $infos_['nowColor'] = $infos_['todayColor'];
  //  $infos_['tarifNow'] = $infos_['tarifToday'];
  }

  if ( ($infos_['todayColor'] == 'ND') || ($infos_['tomorrowColor'] == 'ND') ) {
    $result = 0;
  }

  $infos_['fileTimestamp'] = $time_now;;
  $infos_['fileDate'] = date('Y-m-d H:i:s',$infos_['fileTimestamp']);
  //var_dump($infos_);
  saveVariable(MEM.$contrat,$infos_);
}
// Génération du XML
  sdk_header('text/xml');
$xml  = '<?xml version="1.0" encoding="UTF-8"?>'."\n";
$xml .= "<root>\n";
$xml .= '<'.$contrat.'>'."\n";
$xml .= '   <aujourdhui>'.$infos_['todayColor']."</aujourdhui>\n";
$xml .= '   <date_aujourdhui>'.$infos_['todayDate']."</date_aujourdhui>\n";
$xml .= '   <demain>'.$infos_['tomorrowColor']."</demain>\n";
$xml .= '   <date_demain>'.$infos_['tomorrowDate']."</date_demain>\n";
$xml .= '   <now>'.$infos_['nowColor']."</now>\n";
$xml .= '   <date_now>'.$infos_['nowDate']."</date_now>\n";
if ($contrat == 'ejp') {
  $xml .= '   <decompte>'.$infos_['decRed']."</decompte>\n";
}
else {
  $xml .= "   <decompte_bleu>".$infos_['decBlue']."</decompte_bleu>\n";
  $xml .= "   <decompte_blanc>" .$infos_['decWhite']."</decompte_blanc>\n";
  $xml .= '   <decompte_rouge>' .$infos_['decRed']."</decompte_rouge>\n";
  $xml .= "   <reste_bleu>"  .$infos_['remBlue']."</reste_bleu>\n";
  $xml .= "   <reste_blanc>" .$infos_['remWhite']."</reste_blanc>\n";
  $xml .= '   <reste_rouge>' .$infos_['remRed']."</reste_rouge>\n";
  $xml .= '   <type>'.$contrat."</type>\n";
  $xml .= '   <hphc>'.$infos_['hphc']."</hphc>\n";
  $xml .= '   <tarifs_aujourdhui>'.$infos_[$infos_['todayColor']]['HP'].'/'.$infos_[$infos_['todayColor']]['HC']."</tarifs_aujourdhui>\n";
  $xml .= '   <tarifs_demain>'.$infos_[$infos_['tomorrowColor']]['HP'].'/'.$infos_[$infos_['todayColor']]['HC']."</tarifs_demain>\n";
  $xml .= '   <tarif_now>'.$infos_[$infos_['nowColor']][$infos_['hphc']]."</tarif_now>\n";
  $xml .= '   <bleu_hc>'.$infos_['BLEU']['HC']."</bleu_hc>\n";
  $xml .= '   <bleu_hp>'.$infos_['BLEU']['HP']."</bleu_hp>\n";
  $xml .= '   <blanc_hc>'.$infos_['BLANC']['HC']."</blanc_hc>\n";
  $xml .= '   <blanc_hp>'.$infos_['BLANC']['HP']."</blanc_hp>\n";
  $xml .= '   <rouge_hc>'.$infos_['ROUGE']['HC']."</rouge_hc>\n";
  $xml .= '   <rouge_hp>'.$infos_['ROUGE']['HP']."</rouge_hp>\n";
}
$xml .='</'.$contrat.'>'."\n";
$xml .= "<debug>\n";
$xml .= '   <date_fichier>'.$infos_['fileDate']."</date_fichier>\n";
$xml .= '   <timestamp>'.$infos_['fileTimestamp']."</timestamp>\n";
$xml .= '   <date_lecture>'.$date_now." ".$heure_lecture."</date_lecture>\n";
$xml .= '   <url>'.htmlentities($urls['tempo'][0])."</url>\n";
$xml .= '   <url_>'.htmlentities($url)."</url_>\n";
$xml .= '   <result>'.$result."</result>\n";
if ($debug) {
    $xml .= '   <source>'       .$source                    ."</source>\n";
    $xml .= "   <response>   "  .substr($response,0,100)    .".....\n   </response>\n";
  foreach ($infos_ as $key => $info){
    $xml .= '   <test_'.$key.'>'       .$info               ."</test_".$key.">\n";
  }
  $xml .= "   <debugLen>"     .strlen($block)               ."</debugLen>\n";
  $xml .= "   <debugStr>\n"   .$block                       ."\n   </debugStr>\n";
  foreach ($urls[$contrat] as $key => $url)  {
    $xml .= '   <url_'.$key.'>'.$url                        ."</url_".$key.">\n";
  }     
}
$xml .= "<debug>\n";
$xml .= "<root>\n";
echo $xml;
?>

eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 870
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar opa95 » 10 Sep 2024 18:02

Bonjour paope et ceux qui sont intéressés
Désolé, j'ai laissé un bug dans le code :(
Pour modifier facilement le timer, on peut remplacer la ligne de commande par

Code : Tout sélectionner
    http://localhost/script/?exec=edf_tempo.php&contrat=[VAR1]&site=[VAR2]&timer=[VAR3]
    avec
    VAR1 : vide (-> tempo) ou tempo ou ejp (ou contenu dans le nom du script)
    VAR2 : vide ou numéro du site secondaire, 0 par défaut -> test de tous les sites
    VAR3 : vide ou période de polling (secondes) 3600 par défaut


Voici le code à charger :)
Code : Tout sélectionner
<?php
/*****************************************************************************
**
** Script Tempo/EJP pour eedomus
**
** Script qui permet de récupérer au format XML les données Tempo ou EJP :
**   - Couleur Tempo du jour/EJP (//aujourdhui),
**  - Couleur Tempo du lendemain/EJP (//demain),
**  - Nombre de jours Bleus Tempo restants (//decompte_bleu),
**  - Nombre de jours Blancs Tempo restants (//decompte_blanc),
**  - Nombre de jours Rouge Tempo restants (//decompte_rouge),
**  - Nombre de jours Rouge EJP restants (//decompte),
**  - Tarif du jour
** Les données sont stockées en mémoire et le polling sur les sites est réglé
** par la valeur de 'timer' (3600 secondes par défaut).
** Un polling automatique est fait au passage à minuit, 6h, 12h et 22h,
** pour que ce polling automatique se fasse bien, on peut régler la fréquence des plugins à une valeur faible (1 ou 2 minutes) : dans ce cas, les pollings
réels seront synchronisés à peu près sur les passages à l'heure (0:01h,1:01h... pour timer=3600) ou par exemple à (0:01h, 6h:01, 12h:01,18:01h,22:01h pour timer=21600 [6*3600] ); si timer>=36000, les lectures seront (0:01h, 6h:01, 12h:01,22:01h)
** Le nombre d'appels sera donc compris entre 4 et 25 par jour, quel que soit le nombre de devices créés. Le reste du temps les appels se conteteront de renvoyer le contenu de la mémoire.
** en mode test, on peut forcer la lecture avec la commande &reset=1 ou &simul=x, avec x<0 ou >timer
****************************************************************************
**  - URL de la Requête 
**: http://localhost/script/?exec=edf_tempo.php
**  - ou http://localhost/script/?exec=edf_tempo.php&contrat=[VAR1]&site=[VAR2]&timer=[VAR3]
** avec
**   VAR1 : vide (-> tempo) ou tempo ou ejp (ou contenu dans le nom du script)
**   VAR2 : vide ou numéro du site secondaire, 0 par défaut -> test de tous les sites
**   VAR3 : vide ou période de polling (secondes) 3600 par défaut
** - Fréquence de la Requête : 60 minutes ou 1 si on veut mettre à jour l'affichage plus souvent pour le passage à 0h, 6h, 12h, 22h, de toute façon le polling vers les sites est réglé par 'timer' (3600 par défaut)
** L'URL est de la forme (Tempo) : edf_tempo.php ou edf_ejp.php&contrat=tempo ou utiliser VAR1
** L'URL est de la forme (EJP)   : edf_ejp.php   ou edf_tempo.php&contrat=ejp ou utiliser VAR1
** si l'URL porte un autre nom, le champ &contrat est obligatoire (ou VAR1)
** commandes ajouter à la fin de la ligne de commande:
** type contrat : &contrat=1 (tempo par défaut ou récupéré dans le nom)
** mode debug : &debug=1 (0 par défaut)
** site  : &site=n (0 par défaut -> tous les sites, sinon n° du site)
** timer (Validité du fichier en secondes) :&timer=xxxxx (3600 par défaut)
** reset : effacement mémoire : &reset=n (0 par défaut, 1 sinon)
** simul décalage temporel (secondes) : &simul=yyyyy (0 par défaut)
****************************************************************************
Resultats : /tempo/champ ou //champ
?xml version="1.0" encoding="UTF-8"?>
<root>
<tempo>
   <aujourdhui>BLEU</aujourdhui> // de 6h à 6h (demain)
   <date_aujourdhui>JOUR</date_aujourdhui> // de 6h à 6h (demain)
   <demain>BLEU</demain> // de 6h (demain) à 6h (aprèsdemain)
   <date_demain>11/09</date_demain> // de 6h (demain) à 6h (aprèsdemain)
   <now>BLEU</now> // couleur actuelle (dépend de l'heure, avant 6h -> hier)
   <date_now>JOUR</date_now> // date actuelle (dépend de l'heure, avant 6h -> hier)
   <decompte_bleu>10</decompte_bleu> //nombre de jours écoulés
   <decompte_blanc>0</decompte_blanc> //nombre de jours écoulés
   <decompte_rouge>0</decompte_rouge> //nombre de jours écoulés
   <reste_bleu>290</reste_bleu> //nombre de jours restants
   <reste_blanc>43</reste_blanc> //nombre de jours restants
   <reste_rouge>22</reste_rouge> //nombre de jours restants
   <type>tempo</type>
   <hphc>HP</hphc> // période actuelle (dépend de l'heure, avant 6h -> hier)
   <tarifs_aujourdhui>0.1609/0.1296</tarifs_aujourdhui> // de 6h à 6h (demain)
   <tarifs_demain>0.1609/0.1296</tarifs_demain> // de 6h (demain) à 6h (aprèsdemain)
   <tarif_now>0.1609</tarif_now>// tarif actuel (dépend de l'heure, avant 6h -> hier)
   <bleu_hc>0.1296</bleu_hc> // tarif
   <bleu_hp>0.1609</bleu_hp> // tarif
   <blanc_hc>0.1486</blanc_hc> // tarif
   <blanc_hp>0.1894</blanc_hp> // tarif
   <rouge_hc>0.1568</rouge_hc> // tarif
   <rouge_hp>0.7562</rouge_hp> // tarif
</tempo>
<debug>
   <date_fichier>2024-09-10 11:34:28</date_fichier>
   <timestamp>1725960868</timestamp> //fichier
   <date_lecture>Mardi 10/09 11:34:28</date_lecture>
   <url>https://www.api-couleur-tempo.fr/api/joursTempo?dateJour[]=2024-09-09&amp;dateJour[]=2024-09-10&amp;dateJour[]=2024-09-11</url> //api edf
   <url_>https://selectra.info/energie/fournisseurs/edf/tempo</url_> // url secondaire
  <result>1</result> //1->OK
</debug>
</root>
********************************************************************************
urls compatibles :
tempo
https://www.api-couleur-tempo.fr/api/joursTempo?',
https://selectra.info/energie/fournisseurs/edf/tempo#selectran',
https://www.fournisseurs-electricite.com/edf/tarifs/tempo#selectran',
https://prix-elec.com/tarifs/fournisseurs/edf/tempo#selectran'
ejp (pas testé le 2024/09/10)
https://electricite.net/edf/tarifs/ejp // **dates fausses le 2/04
https://prix-elec.com/tarifs/fournisseurs/edf/ejp-demain
https://selectra.info/energie/fournisseurs/edf/ejp
https://selectra.info/energie/fournisseurs/edf/ejp/demain
https://observatoires.net/calendrier
https://selectra.info/energie/fournisseurs/edf/ejp/jours
https://www.fournisseurs-electricite.com/edf/tarifs/ejp/jour-demain
https://www.fournisseurs-electricite.com/edf/tarifs/ejp
https://www.kelwatt.fr/fournisseurs/edf/ejp/demain
https://www.kelwatt.fr/guide/ejp

******************************************************************************
**
** Evolution des versions :
**
** 2017-07-26 (DjMomo)    :V1.0 - Version initiale
** 2019-10-24 (Merguez07) :V2.0 - utilisation du proxy Eedomus
** 2019-10-26 (Merguez07) :V2.1 - Passage du cache de 24h à 1h
** 2020-11-11 (Merguez07) :V3.0 - utilisation des données du site de selectra
** 2021-10-04 (Merguez07) :V3.1 - correction du script suite à evolution du site Electra
** 2022-01-07 (Merguez07) :V3.2 - correction du script suite à evolution du site Electra
** 2022-03-24 (Merguez07) :V3.3 - correction du script suite à evolution du site Electra
** 2022-03-27 (Merguez07) :V3.4 - bug dans le store
** 2022-04-01 (opa95)     :V3.5 - corrections mineures, compatible autres sites et EJP
** 2022-04-01 (opa95)     :V3.6 - utilisation du site edf tempo et EJP
** 2024-09-10 (opa95)     :V3.7 - Utilisation api edf et sites selectra...
*******************************************************************************/
function sdk_jour($time_now,$nbJours = 0,$jourStr = 2) {
  //creation date à partir du temps unix décale de $nbJours
  //sortie jourFrançais jj/mm
  global $days;
  $time_now += 86400*$nbJours;
  $jour_semaine = date('w',$time_now);
  $start = 0;
  foreach ($days as $key => $day) {
    if ($start == $jour_semaine) {
      $jour_semaine = $key;
      break;
    }
    $start ++;
  }
  switch ($jourStr) {
    case 2 : $ret= date('Y-m-d',$time_now);
    return $ret;
    case 1 : return $jour_semaine.' '.date('d/m',$time_now);
    default :
      $ret= date('d/m',$time_now);
      return $ret;
}
//  if ($jourStr ==1 ) return $jour_semaine.' '.date('d/m',$time_now);
//  else return date('d/m',$time_now);
//  return;
}

function sdk_multiextract1($string,$startStr,$stopStr='',&$start,$outer = 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 sot pas incluses
  // start est remis a jour
  // eviter les caractères non standards
  $beg = $start;
  if (!is_array($startStr)) {
    $startLen = strlen($startStr);
    if ($startLen > 0)
      if ( ($pos = strpos(substr($string,$beg),$startStr)) !== false)
        $beg = $beg + $pos + $startLen;
      else $beg += $startLen;
  }
  else {
    foreach ($startStr as $str){
      $startLen = strlen($str);
      if ($startLen > 0) {
        if ( ($pos = strpos(substr($string,$beg),$str)) !== false)
          $beg = $beg + $pos + $startLen;
        else {
          $beg += $startLen;
          break;
        }
      }
    }
  }
  if ($outer) $beg -= $startLen;
  if (!is_array($stopStr)) {
    $stopLen = strlen($stopStr);
    if ($stopStr)
      if ( ($pos = strpos(substr($string,$beg+1),$stopStr)) !== false)
        $end = $beg + $pos + 1;
        else $end = strlen($string);
  }
  else {
    $end = $beg;
    foreach ($stopStr as $str){
      $stopLen = strlen($str);
      if ($stopStr) {
        if ( ($pos = strpos(substr($string,$beg+1),$str)) !== false)
          $end = $beg + $pos + 1;
        else {
          $end = strlen($string);
          break;
        }
      }
    }
  }
  if ($outer) $end += $stopLen;
  $launch  = substr($string,$beg,$end-$beg);
  $start  = $end;
  return  $launch;
}

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_multiexplode ($delimiters,$string) {   // Separer une chaine de caracteres suivant plusieurs separateurs
// remplacement delimiters[1] par delimiters[0]
// renvoi du tableau rédultat de explode
  $ready  = str_replace($delimiters, $delimiters[0], $string);
  $launch = explode($delimiters[0], $ready);
  return  $launch;
}

function sdk_format ($string,$field = 'color') {  // met en forme selon la semantique du plugin du store
  // formatage de date -> format[dayWeek] dayWeek et format[dateJM] jj/mm ou renvoi ND ND
  // formatage de couleur tempo -> BLEU, BLANC, ROUGE ND
  // formatage de couleur ejp -> NON_EJP, EST_EJP, ND
  global $contrat;// tempo ou ejp
  global $upc_contrat;// TEMPO ou EJP
  global $days;// jour de la semaine
  $string   =   str_replace($upc_contrat,'',trim(strtoupper($string))); 
  if ($field == 'date') {
    if (strlen($string) < 6) $string = 'ND '.$string;
    list($format['dayWeek'],$format['dateJM']) = explode(' ',trim($string));
    if ($format['dayWeek'] != 'ND') $format['dayWeek'] = $format['dayWeek'][0].strtolower(substr($format['dayWeek'],1));
    if (!array_key_exists($format['dayWeek'],$days) ) $format['dayWeek'] = 'ND';
  }
  else {
    $format   = "ND";
    $string   =   strtoupper(str_replace(' ','',$string));
    if ($contrat == 'ejp') {
      if ( ($string == "PASD'") || (strpos($string,'JAMAIS') !== false) ) $format="NON_EJP";
      if ($string == "JOUR")  $format="EST_EJP";
    }
    else {
      $string = strtoupper($string);
      $color  =   array("1"=>"BLEU","2"=>"BLANC","3"=>"ROUGE","0"=>"ND");
      if (is_numeric($string)) {
          $string = $string%4;
          if ($string>0) return $color[$string];
      }
      foreach ($color as $col) {
        if (strpos($string,$col) !== false) {
          $format = $col;
          break;
        }
      }
    }
  }
  return  $format;
}


define('MEM','OLD');
define('DEFTYPE','selectran');// format url annexe
define('DEFTIME','3600');//3600 secondes
define('NBB','300');
define('NBW','43');
define('NBR','22');
define('TSTART',6);//début start
define('TSTOP',22);//fin HP
$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');
$days   = array('Dimanche' => 'Sunday','Lundi' => 'Monday','Mardi' => 'Tuesday','Mercredi' => 'Wednesday','Jeudi' => 'Tuesday',
                'Vendredi' => 'Friday','Samedi' => 'Saturday');
                //initialisation des variables
//$start = strlen('exec=edf_');
$source = (array_key_exists('exec',$_GET))? strtolower($_GET['exec']):"";
if (strpos('Z'.$source,'tempo')) $contrat = 'tempo';
elseif (strpos('Z'.$source,'ejp'))$contrat = 'ejp';
else $contrat = "";
$contrats = array('tempo','ejp');
$urls     = array('tempo' => array (
  'https://www.api-couleur-tempo.fr/api/joursTempo?',
  'https://selectra.info/energie/fournisseurs/edf/tempo#selectran',
  'https://www.fournisseurs-electricite.com/edf/tarifs/tempo#selectran',
  'https://prix-elec.com/tarifs/fournisseurs/edf/tempo#selectran',
  'https://www.kelwatt.fr/guide/tempo#selectra',
  'https://observatoires.net#selectra',
  'https://observatoires.net/tempo#selectra',
  ),
        'ejp'   => array (
    1 => 'https://selectra.info/energie/fournisseurs/edf/ejp#selectra',
    'https://observatoires.net#selectra',
    'https://observatoires.net/ejp#selectra',
    'https://prix-elec.com/tarifs/fournisseurs/edf/ejp-demain#selectra',
    'https://www.fournisseurs-electricite.com/edf/tarifs/ejp/jour-demain#selectra',
    'https://www.kelwatt.fr/fournisseurs/edf/ejp#selectra',
    'https://electricite.net/edf/tarifs/ejp#selectra',
    'https://agence-energie.com/edf/tarifs/ejp#selectra'
  )
      );
$types = array('selectra','selectran','keskeces');               

$contrat_  = strtolower(getArg('contrat',false,""));
$contrat = (($contrat_!="") && (in_array($contrat_,$contrats)))?  $contrat_:$contrat;
$debug  = getArg('debug',false);
if ( (!$debug) || (!in_array($debug,array(0,1))) ) $debug = 0;
$num_site   = abs(getArg('site',false));
if ( (!$num_site) || (($num_site > count($urls[$contrat]) )) ) $num_site = 1;
if ($num_site == 0 ) $scan = 1; else $scan = 0;
$timer = getArg('timer',false,DEFTIME);//Validité du fichier
$upc_contrat = strtoupper($contrat);
$poll = 0;
$reset = getArg('reset',false,0);
if ($reset) {
  deleteVariable(MEM.$contrat);
  $poll = 1;
}
$simul = getArg('simul',false,0);//Décalage temps secondes

$time_now    = time()+$simul;
$annee_now   = date('Y',$time_now);//aaaa
$heure_now   = date('H',$time_now);//hh
$date_now    = sdk_jour($time_now,0,1);// jj/mm
$date_demain = sdk_jour($time_now,1,1);//jour jj/mm
$date_hier   = sdk_jour($time_now,-1,0);//jour jj/mm
$nowDate     = sdk_jour($time_now,0,0);//jour semaine
$dateDemain  = sdk_jour($time_now,1,0);//jour semaine
list($nowDayWeek,$bof)    = explode(' ',$date_now);
list($tomorrowDayWeek,$bof) = explode(' ',$date_demain);
$infos_ = array (
  'todayDate' => 'ND', 'todayDayWeek' => 'ND',
  'todayYear' => 'ND', 'todayColor' => 'ND', 'hphc' =>'HP',
  'tomorrowDate' => 'ND', 'tomorrowDayWeek' => 'ND', 'tomorrowYear' => 'ND', 'tomorrowColor' => 'ND',
  'yesterdayColor' =>'ND', 'yesterdayRate' => 'ND', 'yesterdayDate' => 'ND',
  'nowDate' => 'ND','nowColor'=>'ND', 'tarifnow' => 'ND',
  'decRed' => NBR, 'totRed' => NBR, 'remRed' => 'ND',
  'decWhite' => NBW, 'totWhite' => NBW, 'remWhite' => 'ND',
  'decBlue' => NBB, 'totBlue' => NBB, 'remBlue' => 'ND',
  'fileDate' => 'ND', 'fileTimestamp' => 'ND',
  'BLEU' => array('HC'=>'0.1296','HP'=>'0.1609'),
  'BLANC' => array('HC'=>'0.1486','HP'=>'0.1894'),
  'ROUGE' => array('HC'=>'0.1568','HP'=>'0.7562'),
) ;

if (loadVariable(MEM.$contrat)) $infos_ = loadVariable(MEM.$contrat);
  else $poll = 1;
$infos_['hphc'] = (($heure_now<TSTART) || ($heure_now>=TSTOP))?'HC':'HP';
if (!$poll && array_key_exists('fileTimestamp',$infos_)){// forçage lecture
  $file_hour = date("H",$infos_['fileTimestamp']);
  if ($time_now<$infos_['fileTimestamp']) {$poll=1;}// simulation (recul)
  elseif (($time_now-$infos_['fileTimestamp'])>$timer) {$poll=1;}// temps expiré
  elseif (($file_hour<TSTART) && ($heure_now>=TSTART)) {$poll=1;}// passage à 6h
  elseif (($file_hour<TSTOP) && ($heure_now>=TSTOP)) {$poll=1;} // passage à 22h
  elseif (($file_hour>$heure_now)) {$poll=1;}// passage à minuit
  elseif (($file_hour<12) && ($heure_now>=12)) {$poll=1;} // passage à 12h
}
$heure_lecture = date('H:i:s',$time_now);
if ($poll)
{  $urls['tempo'][0] .= 'dateJour[]='.sdk_jour($time_now,-1).'&dateJour[]='.sdk_jour($time_now).'&dateJour[]='.sdk_jour($time_now,1);
  $infos_['todayDate']       = $nowDate; // dd/mm
  $infos_['todayDayWeek']    = $nowDayWeek; // Jour ou ND
  $infos_['tomorrowDate']    = $dateDemain; // dd/mm
  $infos_['tomorrowDayWeek'] = $tomorrowDayWeek; // Jour ou ND
  $infos_['yesterdayDate']   = $date_hier;
  if ('todayDayWeek' == 'Samedi') $infos_['tomorrowColor'] = 'BLEU';
  elseif ('todayDayWeek' == 'Dimanche') $infos_['todayColor'] = 'BLEU';
  $response0 = httpQuery($urls['tempo'][0],'GET');
  $response0 = sdk_json_decode($response0);
  $api_edf = count($response0)>1;
  $infos_['yesterdayColor'] = sdk_format($response0[0]['codeJour']);
  $bof = sdk_format($response0[1]['codeJour']);
  if ($bof!='ND') $infos_['todayColor']  = $bof;
  $bof = sdk_format($response0[2]['codeJour']);
  if ($bof!='ND') $infos_['tomorrowColor']  = $bof;
  for ($i=$num_site;$i<=count($urls[$contrat]);$i++){
    if (!$i) $i++;
    list($url,$type) = explode('#',$urls[$contrat][$num_site]);
    if ( (!$type) || (!in_array($type,$types)) ) $type = DEFTYPE;
    $response = trim(httpQuery($url,'GET'));
    if (strpos($response,'html') === false) $result = 0;
      else {$result = 1;break;}
    if ($num_site) break;
  }

  if ($result) {
    $erreur = 0;
    switch ($type) {
      case 'selectra' :
          //lecture block
          $sep2  = array(array('<!-- END'),array('<div id="block-'));
          $sep   = array('<div id="block-'.$contrat,'<div');
          $start = 0;
          $block = trim(strtolower(sdk_extract($response,$sep,$sep2,$start,false,false)));//pas de MaJ $start
          $err_num = 1;
          if (strlen($block) == 0) {$erreur = $err_num;break;}
          //extraction infos Aujourd'hui
          $sep2  ='</';
          // date
          $sep   = array('aujourd',$contrat);// jour dd/mm
          $bof   = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $bof   = sdk_format($bof,'date');
          $infos_['todayDate']    = $bof['dateJM']; // dd/mm
          $infos_['todayDayWeek'] = $bof['dayWeek']; // Jour ou ND
          //couleur
          $sep    = array('_icon','<span>');// couleur
          $infos_['todayColor'] = trim(sdk_multiextract($block,$sep,$sep2,$start));
          $infos_['todayColor'] = sdk_format($infos_['todayColor']);//COUL ou ND
          //extraction infos demain
          $start = 0;// debut block
          // date
          $sep = array('demain',$contrat);// jour dd:mm
          $bof = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $bof = sdk_format($bof,'date');
          $infos_['tomorrowDate']    = $bof['dateJM']; // dd/mm
          $infos_['tomorrowDayWeek'] = $bof['dayWeek']; // Jour ou ND
          // couleur
          $sep = array('_icon','<span>');// couleur
          $infos_['tomorrowColor'] = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $infos_['tomorrowColor'] = sdk_format($infos_['tomorrowColor']);
          // bilan
          $sep = array('title','>'); //{ejp}nbjoursecoules/nbtotjours {tempo} nbjoursrestants
          $bof = trim(sdk_multiextract($block,$sep,$sep2,$start));
          if ($contrat == 'ejp') {
            list($bof,$bof1) = explode('/',$bof);
            $bof1 = trim($bof1);
            if (is_numeric($bof1))  $infos_['totRed'] = $bof1;
            $bof  = trim($bof);
            if (is_numeric($bof)) {
              $infos_['decRed'] = $infos_['totRed'] - $bof;}
          }
          //complements
          $bof = str_replace('/','-',$infos_['todayDate'].'-'.$annee_now);//date europeenne
          $bof = strtotime($bof);
          if ($bof > $time_now) $infos_['todayYear'] = $annee_now -1;
          else $infos_['todayYear'] = $annee_now;
          $infos_['tomorrowYear'] = $infos_['todayYear'];
          if ($infos_['tomorrowDate'] == '01/01') $infos_['tomorrowYear']++;
        break;
      case 'selectran' :
        $sep2  = array(array('<!-- END'),array('<div class='));
        $sep   = array('"intro">','hui, ');
        $start = 0;
        $block = trim(strtolower(sdk_extract($response,$sep,$sep2,$start,false,false)));//pas de MaJ $start
        $err_num = 1;
        if (strlen($block) == 0) {$erreur = $err_num;break;}
        if ($api_edf*0){
          $sep   = array('il reste');// jour dd/mm
          $sep2  =array('</p>');
          $block = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $start=0;
          $sep2   =array('</');
        }else{
          //lecture block
          //extraction infos Aujourd'hui
          // date
          $sep  = array('hui, ');// jour dd/mm
          $sep2 = array(',');// jour dd/mm
          $bof  = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $jour = explode(" ",$bof);
          $jour[1] = $months[$jour[1]];
          $date = strtotime($jour[0]." ".$jour[1]." ".$jour[2]);
          //couleur
          $sep  = array('est');// couleur
          $sep2 ='</';
          $bof  = trim(sdk_multiextract($block,$sep,$sep2,$start));
          $infos_['todayColor'] = sdk_format($bof);//COUL ou ND
          //extraction infos demain
          // date
          // couleur
          $sep    = array('sera');// couleur
          $bof = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $infos_['tomorrowColor'] = sdk_format($bof);
        }
        // bilan
        $sep    = array('<strong>'); //{ejp}nbjoursecoules/nbtotjours {tempo} nbjoursrestants
        for ($i =0;$i<3;$i++) {
          $bof = trim(sdk_multiextract($block,$sep,$sep2,$start));
            $nb = (int)$bof;
            if (strpos($bof,'bleu')>1) $infos_['remBlue'] = $nb;
            elseif (strpos($bof,'rouge')>1) $infos_['remRed'] = $nb;
            elseif (strpos($bof,'blanc')>1) $infos_['remWhite'] = $nb;
          }
        $infos_['decRed'] = $infos_['totRed'] - $infos_['remRed'];
        $infos_['decWhite'] = $infos_['totWhite'] - $infos_['remWhite'];
        $infos_['decBlue'] = $infos_['totBlue'] - $infos_['remBlue'];
        $sep2  = array(array('<!-- END'),array('</tr'));
        $sep   = array('<th>Abonnement','<strong>','<strong>','</td>');
        $start = 0;
        $block = trim(strtolower(sdk_extract($response,$sep,$sep2,$start,false,false)));//pas de MaJ $start
        $sep2  = array('&nbsp;');
        $sep   = array('<td>');
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['BLEU']['HC'] = $bof;
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['BLEU']['HP'] = $bof;
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['BLANC']['HC'] = $bof;
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['BLANC']['HP'] = $bof;
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['ROUGE']['HC'] = $bof;
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['ROUGE']['HP'] = $bof;
        break;
      case 'keskeces' :
      //lecture block1
        $sep   = array("<div class='cont' onclick=","Aujourd'hui");
        $sep2  = "<div class='cont' onclick=";
        $startBlock = 0;
        $block = trim(str_replace(',','',sdk_multiextract($response,$sep,$sep2,$startBlock)));
        if (strlen($block == 0) ) {$erreur = 1;break;}
        //extraction dates et couleur
        $sep2  = '</';
        $sep   = '';
        $start = 0;
        $infos_['todayDate']     = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
        $sep   = array('Jour','<div','>');//Bleu Blanc Rouge Indeterminé
        $infos_['todayColor']    = sdk_multiextract($block,$sep,$sep2,$start);//MaJ $start
        $infos_['todayColor']    = sdk_format($infos_['todayColor']);
        $sep   = array('Lendemain','<div','>');//Bleu Blanc Rouge Indeterminé
        $infos_['tomorrowColor'] = sdk_multiextract($block,$sep,$sep2,$start);//MaJ $start
        $infos_['tomorrowColor'] = sdk_format($infos_['tomorrowColor']);
        $date_array = explode(' ',$infos_['todayDate']);//Jour J mois aaaa (français)
        $bof = strtotime($date_array[1].' '.$months[$date_array[2]].' '.$date_array[3]);
        $infos_['todayDayWeek']  = $date_array[0];
        $infos_['todayDate']     = sdk_jour($bof,0,false);//jour JJ/MM
        $infos_['todayYear']    = $date_array[3];
        $infos_['tomorrowDate']  = sdk_jour($bof,1,false);
        $infos_['tomorrowYear'] = $infos_['todayYear'];
        if ($infos_['tomorrowDate'] == '01/01') $infos_['tomorrowYear']++;
      //lecture block2
        $sep   = array("<div class='cont' onclick=",'Tempo','Jours');
        $sep2  = "<div class='cont pub'";
        $block = trim(str_replace(',','',sdk_multiextract($response,$sep,$sep2,$startBlock)));
        //bilan
        $sep2                    = '</';
        $start = 0;
        $sep                     = array('bj','<b>');//Bleu Blanc Rouge Indeterminé
        $infos_['decBlue']     = sdk_multiextract($block,$sep,$sep2,$start);//nn
        $infos_['totBlue']  = sdk_multiextract($block,$sep,$sep2,$start) + $infos_['decBlue'];//nn
        $start = 0;
        $sep                     = array('wj','<b>');//Bleu Blanc Rouge Indeterminé
        $infos_['decWhite']     = sdk_multiextract($block,$sep,$sep2,$start);//nn
        $infos_['totWhite']  = sdk_multiextract($block,$sep,$sep2,$start) + $infos_['decWhite'];//nn
        $start = 0;
        $sep                     = array('rj','<b>');//Bleu Blanc Rouge Indeterminé
        $infos_['decRed']     = sdk_multiextract($block,$sep,$sep2,$start);//nn
        $infos_['totRed']  = sdk_multiextract($block,$sep,$sep2,$start) + $infos_['decRed'];//nn
        $sep                     = array('/table',':');//J mois aaaa à hhhmm(français)
        $infos_['fileDate']      = trim(sdk_multiextract($block,$sep,'<',$start));//MaJ $start
        $date_array = explode(' ',$infos_['fileDate']);//array JJ mois aaaa à hhhmm
        $bof = strtotime($date_array[0].' '.$months[$date_array[1]].' '.$date_array[2]);
        $infos_['heureFile']     = str_replace('h',':',$date_array[4]);//hh:mm
        $infos_['fileDate']      = sdk_jour($bof,0);
        break;
      }
  }
  if ($heure_now<TSTART) {
    if ($infos_['nowDate'] != $infos_['yesterdayDate']){
      $infos_['nowDate'] = $infos_['yesterdayDate'];
      $infos_['nowColor'] = $infos_['yesterdayColor'];
  //    $infos_['tarifNow'] = $infos_['yesterdayRate'];
    }
  }elseif ($infos_['nowDate'] != $infos_['todayDate']){
    $infos_['nowDate'] = $infos_['todayDate'];
    $infos_['nowColor'] = $infos_['todayColor'];
  //  $infos_['tarifNow'] = $infos_['tarifToday'];
  }

  if ( ($infos_['todayColor'] == 'ND') || ($infos_['tomorrowColor'] == 'ND') ) {
    $result = 0;
  }

  $infos_['fileTimestamp'] = $time_now;;
  $infos_['fileDate'] = date('Y-m-d H:i:s',$infos_['fileTimestamp']);
  //var_dump($infos_);
  saveVariable(MEM.$contrat,$infos_);
}
// Génération du XML
  sdk_header('text/xml');
$xml  = '<?xml version="1.0" encoding="UTF-8"?>'."\n";
$xml .= "<root>\n";
$xml .= '<'.$contrat.'>'."\n";
$xml .= '   <aujourdhui>'.$infos_['todayColor']."</aujourdhui>\n";
$xml .= '   <date_aujourdhui>'.$infos_['todayDate']."</date_aujourdhui>\n";
$xml .= '   <demain>'.$infos_['tomorrowColor']."</demain>\n";
$xml .= '   <date_demain>'.$infos_['tomorrowDate']."</date_demain>\n";
$xml .= '   <now>'.$infos_['nowColor']."</now>\n";
$xml .= '   <date_now>'.$infos_['nowDate']."</date_now>\n";
if ($contrat == 'ejp') {
  $xml .= '   <decompte>'.$infos_['decRed']."</decompte>\n";
}
else {
  $xml .= "   <decompte_bleu>".$infos_['decBlue']."</decompte_bleu>\n";
  $xml .= "   <decompte_blanc>" .$infos_['decWhite']."</decompte_blanc>\n";
  $xml .= '   <decompte_rouge>' .$infos_['decRed']."</decompte_rouge>\n";
  $xml .= "   <reste_bleu>"  .$infos_['remBlue']."</reste_bleu>\n";
  $xml .= "   <reste_blanc>" .$infos_['remWhite']."</reste_blanc>\n";
  $xml .= '   <reste_rouge>' .$infos_['remRed']."</reste_rouge>\n";
  $xml .= '   <type>'.$contrat."</type>\n";
  $xml .= '   <hphc>'.$infos_['hphc']."</hphc>\n";
  $xml .= '   <tarifs_aujourdhui>'.$infos_[$infos_['todayColor']]['HP'].'/'.$infos_[$infos_['todayColor']]['HC']."</tarifs_aujourdhui>\n";
  $xml .= '   <tarifs_demain>'.$infos_[$infos_['tomorrowColor']]['HP'].'/'.$infos_[$infos_['todayColor']]['HC']."</tarifs_demain>\n";
  $xml .= '   <tarif_now>'.$infos_[$infos_['nowColor']][$infos_['hphc']]."</tarif_now>\n";
  $xml .= '   <bleu_hc>'.$infos_['BLEU']['HC']."</bleu_hc>\n";
  $xml .= '   <bleu_hp>'.$infos_['BLEU']['HP']."</bleu_hp>\n";
  $xml .= '   <blanc_hc>'.$infos_['BLANC']['HC']."</blanc_hc>\n";
  $xml .= '   <blanc_hp>'.$infos_['BLANC']['HP']."</blanc_hp>\n";
  $xml .= '   <rouge_hc>'.$infos_['ROUGE']['HC']."</rouge_hc>\n";
  $xml .= '   <rouge_hp>'.$infos_['ROUGE']['HP']."</rouge_hp>\n";
}
$xml .='</'.$contrat.'>'."\n";
$xml .= "<debug>\n";
$xml .= '   <date_fichier>'.$infos_['fileDate']."</date_fichier>\n";
$xml .= '   <timestamp>'.$infos_['fileTimestamp']."</timestamp>\n";
$xml .= '   <date_lecture>'.$date_now." ".$heure_lecture."</date_lecture>\n";
//$xml .= '   <url>'.htmlentities($urls['tempo'][0])."</url>\n";
$xml .= '   <url_>'.htmlentities($url)."</url_>\n";
$xml .= '   <result>'.$result."</result>\n";
if ($debug) {
    $xml .= '   <source>'       .$source                    ."</source>\n";
    $xml .= "   <response>   "  .substr($response,0,100)    .".....\n   </response>\n";
  foreach ($infos_ as $key => $info){
    $xml .= '   <test_'.$key.'>'       .$info               ."</test_".$key.">\n";
  }
  $xml .= "   <debugLen>"     .strlen($block)               ."</debugLen>\n";
  $xml .= "   <debugStr>\n"   .$block                       ."\n   </debugStr>\n";
  foreach ($urls[$contrat] as $key => $url)  {
    $xml .= '   <url_'.$key.'>'.$url                        ."</url_".$key.">\n";
  }     
}
$xml .= "</debug>\n";
$xml .= "</root>\n";
echo $xml;
?>

eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 870
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar opa95 » 10 Sep 2024 19:37

Bonsoir
Désolé :( encore une erreur, le script était encore en mode test et n'utilisait pas l'api (ça prouve que ça marche aussi sans, mais c'est plus sur avec!!)
Code : Tout sélectionner
<?php
/*****************************************************************************
**
** Script Tempo/EJP pour eedomus
**
** Script qui permet de récupérer au format XML les données Tempo ou EJP :
**   - Couleur Tempo du jour/EJP (//aujourdhui),
**  - Couleur Tempo du lendemain/EJP (//demain),
**  - Nombre de jours Bleus Tempo restants (//decompte_bleu),
**  - Nombre de jours Blancs Tempo restants (//decompte_blanc),
**  - Nombre de jours Rouge Tempo restants (//decompte_rouge),
**  - Nombre de jours Rouge EJP restants (//decompte),
**  - Tarif du jour
** Les données sont stockées en mémoire et le polling sur les sites est réglé
** par la valeur de 'timer' (3600 secondes par défaut).
** Un polling automatique est fait au passage à minuit, 6h, 12h et 22h,
** pour que ce polling automatique se fasse bien, on peut régler la fréquence des plugins à une valeur faible (1 ou 2 minutes) : dans ce cas, les pollings
réels seront synchronisés à peu près sur les passages à l'heure (0:01h,1:01h... pour timer=3600) ou par exemple à (0:01h, 6h:01, 12h:01,18:01h,22:01h pour timer=21600 [6*3600] ); si timer>=36000, les lectures seront (0:01h, 6h:01, 12h:01,22:01h)
** Le nombre d'appels sera donc compris entre 4 et 25 par jour, quel que soit le nombre de devices créés. Le reste du temps les appels se conteteront de renvoyer le contenu de la mémoire.
** en mode test, on peut forcer la lecture avec la commande &reset=1 ou &simul=x, avec x<0 ou >timer
****************************************************************************
**  - URL de la Requête 
**: http://localhost/script/?exec=edf_tempo.php
**  - ou http://localhost/script/?exec=edf_tempo.php&contrat=[VAR1]&site=[VAR2]&timer=[VAR3]
** avec
**   VAR1 : vide (-> tempo) ou tempo ou ejp (ou contenu dans le nom du script)
**   VAR2 : vide ou numéro du site secondaire, 0 par défaut -> test de tous les sites
**   VAR3 : vide ou période de polling (secondes) 3600 par défaut
** - Fréquence de la Requête : 60 minutes ou 1 si on veut mettre à jour l'affichage plus souvent pour le passage à 0h, 6h, 12h, 22h, de toute façon le polling vers les sites est réglé par 'timer' (3600 par défaut)
** L'URL est de la forme (Tempo) : edf_tempo.php ou edf_ejp.php&contrat=tempo ou utiliser VAR1
** L'URL est de la forme (EJP)   : edf_ejp.php   ou edf_tempo.php&contrat=ejp ou utiliser VAR1
** si l'URL porte un autre nom, le champ &contrat est obligatoire (ou VAR1)
** commandes ajouter à la fin de la ligne de commande:
** type contrat : &contrat=1 (tempo par défaut ou récupéré dans le nom)
** mode debug : &debug=1 (0 par défaut)
** site  : &site=n (0 par défaut -> tous les sites, sinon n° du site)
** timer (Validité du fichier en secondes) :&timer=xxxxx (3600 par défaut)
** reset : effacement mémoire : &reset=n (0 par défaut, 1 sinon)
** simul décalage temporel (secondes) : &simul=yyyyy (0 par défaut)
****************************************************************************
Resultats : /tempo/champ ou //champ
?xml version="1.0" encoding="UTF-8"?>
<root>
<tempo>
   <aujourdhui>BLEU</aujourdhui> // de 6h à 6h (demain)
   <date_aujourdhui>JOUR</date_aujourdhui> // de 6h à 6h (demain)
   <demain>BLEU</demain> // de 6h (demain) à 6h (aprèsdemain)
   <date_demain>11/09</date_demain> // de 6h (demain) à 6h (aprèsdemain)
   <now>BLEU</now> // couleur actuelle (dépend de l'heure, avant 6h -> hier)
   <date_now>JOUR</date_now> // date actuelle (dépend de l'heure, avant 6h -> hier)
   <decompte_bleu>10</decompte_bleu> //nombre de jours écoulés
   <decompte_blanc>0</decompte_blanc> //nombre de jours écoulés
   <decompte_rouge>0</decompte_rouge> //nombre de jours écoulés
   <reste_bleu>290</reste_bleu> //nombre de jours restants
   <reste_blanc>43</reste_blanc> //nombre de jours restants
   <reste_rouge>22</reste_rouge> //nombre de jours restants
   <type>tempo</type>
   <hphc>HP</hphc> // période actuelle (dépend de l'heure, avant 6h -> hier)
   <tarifs_aujourdhui>0.1609/0.1296</tarifs_aujourdhui> // de 6h à 6h (demain)
   <tarifs_demain>0.1609/0.1296</tarifs_demain> // de 6h (demain) à 6h (aprèsdemain)
   <tarif_now>0.1609</tarif_now>// tarif actuel (dépend de l'heure, avant 6h -> hier)
   <bleu_hc>0.1296</bleu_hc> // tarif
   <bleu_hp>0.1609</bleu_hp> // tarif
   <blanc_hc>0.1486</blanc_hc> // tarif
   <blanc_hp>0.1894</blanc_hp> // tarif
   <rouge_hc>0.1568</rouge_hc> // tarif
   <rouge_hp>0.7562</rouge_hp> // tarif
</tempo>
<debug>
   <date_fichier>2024-09-10 11:34:28</date_fichier>
   <timestamp>1725960868</timestamp> //fichier
   <date_lecture>Mardi 10/09 11:34:28</date_lecture>
   <url>https://www.api-couleur-tempo.fr/api/joursTempo?dateJour[]=2024-09-09&amp;dateJour[]=2024-09-10&amp;dateJour[]=2024-09-11</url> //api edf
   <url_>https://selectra.info/energie/fournisseurs/edf/tempo</url_> // url secondaire
  <result>1</result> //1->OK
</debug>
</root>
********************************************************************************
urls compatibles :
tempo
https://www.api-couleur-tempo.fr/api/joursTempo?',
https://selectra.info/energie/fournisseurs/edf/tempo#selectran',
https://www.fournisseurs-electricite.com/edf/tarifs/tempo#selectran',
https://prix-elec.com/tarifs/fournisseurs/edf/tempo#selectran'
ejp (pas testé le 2024/09/10)
https://electricite.net/edf/tarifs/ejp // **dates fausses le 2/04
https://prix-elec.com/tarifs/fournisseurs/edf/ejp-demain
https://selectra.info/energie/fournisseurs/edf/ejp
https://selectra.info/energie/fournisseurs/edf/ejp/demain
https://observatoires.net/calendrier
https://selectra.info/energie/fournisseurs/edf/ejp/jours
https://www.fournisseurs-electricite.com/edf/tarifs/ejp/jour-demain
https://www.fournisseurs-electricite.com/edf/tarifs/ejp
https://www.kelwatt.fr/fournisseurs/edf/ejp/demain
https://www.kelwatt.fr/guide/ejp

******************************************************************************
**
** Evolution des versions :
**
** 2017-07-26 (DjMomo)    :V1.0 - Version initiale
** 2019-10-24 (Merguez07) :V2.0 - utilisation du proxy Eedomus
** 2019-10-26 (Merguez07) :V2.1 - Passage du cache de 24h à 1h
** 2020-11-11 (Merguez07) :V3.0 - utilisation des données du site de selectra
** 2021-10-04 (Merguez07) :V3.1 - correction du script suite à evolution du site Electra
** 2022-01-07 (Merguez07) :V3.2 - correction du script suite à evolution du site Electra
** 2022-03-24 (Merguez07) :V3.3 - correction du script suite à evolution du site Electra
** 2022-03-27 (Merguez07) :V3.4 - bug dans le store
** 2022-04-01 (opa95)     :V3.5 - corrections mineures, compatible autres sites et EJP
** 2022-04-01 (opa95)     :V3.6 - utilisation du site edf tempo et EJP
** 2024-09-10 (opa95)     :V3.7 - Utilisation api edf et sites selectra...
*******************************************************************************/
function sdk_jour($time_now,$nbJours = 0,$jourStr = 2) {
  //creation date à partir du temps unix décale de $nbJours
  //sortie jourFrançais jj/mm
  global $days;
  $time_now += 86400*$nbJours;
  $jour_semaine = date('w',$time_now);
  $start = 0;
  foreach ($days as $key => $day) {
    if ($start == $jour_semaine) {
      $jour_semaine = $key;
      break;
    }
    $start ++;
  }
  switch ($jourStr) {
    case 2 : $ret= date('Y-m-d',$time_now);
    return $ret;
    case 1 : return $jour_semaine.' '.date('d/m',$time_now);
    default :
      $ret= date('d/m',$time_now);
      return $ret;
}
//  if ($jourStr ==1 ) return $jour_semaine.' '.date('d/m',$time_now);
//  else return date('d/m',$time_now);
//  return;
}

function sdk_multiextract1($string,$startStr,$stopStr='',&$start,$outer = 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 sot pas incluses
  // start est remis a jour
  // eviter les caractères non standards
  $beg = $start;
  if (!is_array($startStr)) {
    $startLen = strlen($startStr);
    if ($startLen > 0)
      if ( ($pos = strpos(substr($string,$beg),$startStr)) !== false)
        $beg = $beg + $pos + $startLen;
      else $beg += $startLen;
  }
  else {
    foreach ($startStr as $str){
      $startLen = strlen($str);
      if ($startLen > 0) {
        if ( ($pos = strpos(substr($string,$beg),$str)) !== false)
          $beg = $beg + $pos + $startLen;
        else {
          $beg += $startLen;
          break;
        }
      }
    }
  }
  if ($outer) $beg -= $startLen;
  if (!is_array($stopStr)) {
    $stopLen = strlen($stopStr);
    if ($stopStr)
      if ( ($pos = strpos(substr($string,$beg+1),$stopStr)) !== false)
        $end = $beg + $pos + 1;
        else $end = strlen($string);
  }
  else {
    $end = $beg;
    foreach ($stopStr as $str){
      $stopLen = strlen($str);
      if ($stopStr) {
        if ( ($pos = strpos(substr($string,$beg+1),$str)) !== false)
          $end = $beg + $pos + 1;
        else {
          $end = strlen($string);
          break;
        }
      }
    }
  }
  if ($outer) $end += $stopLen;
  $launch  = substr($string,$beg,$end-$beg);
  $start  = $end;
  return  $launch;
}

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_multiexplode ($delimiters,$string) {   // Separer une chaine de caracteres suivant plusieurs separateurs
// remplacement delimiters[1] par delimiters[0]
// renvoi du tableau rédultat de explode
  $ready  = str_replace($delimiters, $delimiters[0], $string);
  $launch = explode($delimiters[0], $ready);
  return  $launch;
}

function sdk_format ($string,$field = 'color') {  // met en forme selon la semantique du plugin du store
  // formatage de date -> format[dayWeek] dayWeek et format[dateJM] jj/mm ou renvoi ND ND
  // formatage de couleur tempo -> BLEU, BLANC, ROUGE ND
  // formatage de couleur ejp -> NON_EJP, EST_EJP, ND
  global $contrat;// tempo ou ejp
  global $upc_contrat;// TEMPO ou EJP
  global $days;// jour de la semaine
  $string   =   str_replace($upc_contrat,'',trim(strtoupper($string))); 
  if ($field == 'date') {
    if (strlen($string) < 6) $string = 'ND '.$string;
    list($format['dayWeek'],$format['dateJM']) = explode(' ',trim($string));
    if ($format['dayWeek'] != 'ND') $format['dayWeek'] = $format['dayWeek'][0].strtolower(substr($format['dayWeek'],1));
    if (!array_key_exists($format['dayWeek'],$days) ) $format['dayWeek'] = 'ND';
  }
  else {
    $format   = "ND";
    $string   =   strtoupper(str_replace(' ','',$string));
    if ($contrat == 'ejp') {
      if ( ($string == "PASD'") || (strpos($string,'JAMAIS') !== false) ) $format="NON_EJP";
      if ($string == "JOUR")  $format="EST_EJP";
    }
    else {
      $string = strtoupper($string);
      $color  =   array("1"=>"BLEU","2"=>"BLANC","3"=>"ROUGE","0"=>"ND");
      if (is_numeric($string)) {
          $string = $string%4;
          if ($string>0) return $color[$string];
      }
      foreach ($color as $col) {
        if (strpos($string,$col) !== false) {
          $format = $col;
          break;
        }
      }
    }
  }
  return  $format;
}


define('MEM','OLD');
define('DEFTYPE','selectran');// format url annexe
define('DEFTIME','3600');//3600 secondes
define('NBB','300');
define('NBW','43');
define('NBR','22');
define('TSTART',6);//début start
define('TSTOP',22);//fin HP
$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');
$days   = array('Dimanche' => 'Sunday','Lundi' => 'Monday','Mardi' => 'Tuesday','Mercredi' => 'Wednesday','Jeudi' => 'Tuesday',
                'Vendredi' => 'Friday','Samedi' => 'Saturday');
                //initialisation des variables
//$start = strlen('exec=edf_');
$source = (array_key_exists('exec',$_GET))? strtolower($_GET['exec']):"";
if (strpos('Z'.$source,'tempo')) $contrat = 'tempo';
elseif (strpos('Z'.$source,'ejp'))$contrat = 'ejp';
else $contrat = "";
$contrats = array('tempo','ejp');
$urls     = array('tempo' => array (
  'https://www.api-couleur-tempo.fr/api/joursTempo?',
  'https://selectra.info/energie/fournisseurs/edf/tempo#selectran',
  'https://www.fournisseurs-electricite.com/edf/tarifs/tempo#selectran',
  'https://prix-elec.com/tarifs/fournisseurs/edf/tempo#selectran',
  'https://www.kelwatt.fr/guide/tempo#selectra',
  'https://observatoires.net#selectra',
  'https://observatoires.net/tempo#selectra',
  ),
        'ejp'   => array (
    1 => 'https://selectra.info/energie/fournisseurs/edf/ejp#selectra',
    'https://observatoires.net#selectra',
    'https://observatoires.net/ejp#selectra',
    'https://prix-elec.com/tarifs/fournisseurs/edf/ejp-demain#selectra',
    'https://www.fournisseurs-electricite.com/edf/tarifs/ejp/jour-demain#selectra',
    'https://www.kelwatt.fr/fournisseurs/edf/ejp#selectra',
    'https://electricite.net/edf/tarifs/ejp#selectra',
    'https://agence-energie.com/edf/tarifs/ejp#selectra'
  )
      );
$types = array('selectra','selectran','keskeces');               

$contrat_  = strtolower(getArg('contrat',false,""));
$contrat = (($contrat_!="") && (in_array($contrat_,$contrats)))?  $contrat_:$contrat;
$debug  = getArg('debug',false);
if ( (!$debug) || (!in_array($debug,array(0,1))) ) $debug = 0;
$num_site   = abs(getArg('site',false));
if ( (!$num_site) || (($num_site > count($urls[$contrat]) )) ) $num_site = 1;
if ($num_site == 0 ) $scan = 1; else $scan = 0;
$timer = getArg('timer',false,DEFTIME);//Validité du fichier
$upc_contrat = strtoupper($contrat);
$poll = 0;
$reset = getArg('reset',false,0);
if ($reset) {
  deleteVariable(MEM.$contrat);
  $poll = 1;
}
$simul = getArg('simul',false,0);//Décalage temps secondes

$time_now    = time()+$simul;
$annee_now   = date('Y',$time_now);//aaaa
$heure_now   = date('H',$time_now);//hh
$date_now    = sdk_jour($time_now,0,1);// jj/mm
$date_demain = sdk_jour($time_now,1,1);//jour jj/mm
$date_hier   = sdk_jour($time_now,-1,0);//jour jj/mm
$nowDate     = sdk_jour($time_now,0,0);//jour semaine
$dateDemain  = sdk_jour($time_now,1,0);//jour semaine
list($nowDayWeek,$bof)    = explode(' ',$date_now);
list($tomorrowDayWeek,$bof) = explode(' ',$date_demain);
$infos_ = array (
  'todayDate' => 'ND', 'todayDayWeek' => 'ND',
  'todayYear' => 'ND', 'todayColor' => 'ND', 'hphc' =>'HP',
  'tomorrowDate' => 'ND', 'tomorrowDayWeek' => 'ND', 'tomorrowYear' => 'ND', 'tomorrowColor' => 'ND',
  'yesterdayColor' =>'ND', 'yesterdayRate' => 'ND', 'yesterdayDate' => 'ND',
  'nowDate' => 'ND','nowColor'=>'ND', 'tarifnow' => 'ND',
  'decRed' => NBR, 'totRed' => NBR, 'remRed' => 'ND',
  'decWhite' => NBW, 'totWhite' => NBW, 'remWhite' => 'ND',
  'decBlue' => NBB, 'totBlue' => NBB, 'remBlue' => 'ND',
  'fileDate' => 'ND', 'fileTimestamp' => 'ND',
  'BLEU' => array('HC'=>'0.1296','HP'=>'0.1609'),
  'BLANC' => array('HC'=>'0.1486','HP'=>'0.1894'),
  'ROUGE' => array('HC'=>'0.1568','HP'=>'0.7562'),
) ;

if (loadVariable(MEM.$contrat)) $infos_ = loadVariable(MEM.$contrat);
  else $poll = 1;
$infos_['hphc'] = (($heure_now<TSTART) || ($heure_now>=TSTOP))?'HC':'HP';
if (!$poll && array_key_exists('fileTimestamp',$infos_)){// forçage lecture
  $file_hour = date("H",$infos_['fileTimestamp']);
  if ($time_now<$infos_['fileTimestamp']) {$poll=1;}// simulation (recul)
  elseif (($time_now-$infos_['fileTimestamp'])>$timer) {$poll=1;}// temps expiré
  elseif (($file_hour<TSTART) && ($heure_now>=TSTART)) {$poll=1;}// passage à 6h
  elseif (($file_hour<TSTOP) && ($heure_now>=TSTOP)) {$poll=1;} // passage à 22h
  elseif (($file_hour>$heure_now)) {$poll=1;}// passage à minuit
  elseif (($file_hour<12) && ($heure_now>=12)) {$poll=1;} // passage à 12h
}
$heure_lecture = date('H:i:s',$time_now);
if ($poll)
{  $urls['tempo'][0] .= 'dateJour[]='.sdk_jour($time_now,-1).'&dateJour[]='.sdk_jour($time_now).'&dateJour[]='.sdk_jour($time_now,1);
  $infos_['todayDate']       = $nowDate; // dd/mm
  $infos_['todayDayWeek']    = $nowDayWeek; // Jour ou ND
  $infos_['tomorrowDate']    = $dateDemain; // dd/mm
  $infos_['tomorrowDayWeek'] = $tomorrowDayWeek; // Jour ou ND
  $infos_['yesterdayDate']   = $date_hier;
  if ('todayDayWeek' == 'Samedi') $infos_['tomorrowColor'] = 'BLEU';
  elseif ('todayDayWeek' == 'Dimanche') $infos_['todayColor'] = 'BLEU';
  $response0 = httpQuery($urls['tempo'][0],'GET');
  $response0 = sdk_json_decode($response0);
  $api_edf = count($response0)>1;
  $infos_['yesterdayColor'] = sdk_format($response0[0]['codeJour']);
  $bof = sdk_format($response0[1]['codeJour']);
  if ($bof!='ND') $infos_['todayColor']  = $bof;
  $bof = sdk_format($response0[2]['codeJour']);
  if ($bof!='ND') $infos_['tomorrowColor']  = $bof;
  for ($i=$num_site;$i<=count($urls[$contrat]);$i++){
    if (!$i) $i++;
    list($url,$type) = explode('#',$urls[$contrat][$num_site]);
    if ( (!$type) || (!in_array($type,$types)) ) $type = DEFTYPE;
    $response = trim(httpQuery($url,'GET'));
    if (strpos($response,'html') === false) $result = 0;
      else {$result = 1;break;}
    if ($num_site) break;
  }

  if ($result) {
    $erreur = 0;
    switch ($type) {
      case 'selectra' :
          //lecture block
          $sep2  = array(array('<!-- END'),array('<div id="block-'));
          $sep   = array('<div id="block-'.$contrat,'<div');
          $start = 0;
          $block = trim(strtolower(sdk_extract($response,$sep,$sep2,$start,false,false)));//pas de MaJ $start
          $err_num = 1;
          if (strlen($block) == 0) {$erreur = $err_num;break;}
          //extraction infos Aujourd'hui
          $sep2  ='</';
          // date
          $sep   = array('aujourd',$contrat);// jour dd/mm
          $bof   = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $bof   = sdk_format($bof,'date');
          $infos_['todayDate']    = $bof['dateJM']; // dd/mm
          $infos_['todayDayWeek'] = $bof['dayWeek']; // Jour ou ND
          //couleur
          $sep    = array('_icon','<span>');// couleur
          $infos_['todayColor'] = trim(sdk_multiextract($block,$sep,$sep2,$start));
          $infos_['todayColor'] = sdk_format($infos_['todayColor']);//COUL ou ND
          //extraction infos demain
          $start = 0;// debut block
          // date
          $sep = array('demain',$contrat);// jour dd:mm
          $bof = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $bof = sdk_format($bof,'date');
          $infos_['tomorrowDate']    = $bof['dateJM']; // dd/mm
          $infos_['tomorrowDayWeek'] = $bof['dayWeek']; // Jour ou ND
          // couleur
          $sep = array('_icon','<span>');// couleur
          $infos_['tomorrowColor'] = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $infos_['tomorrowColor'] = sdk_format($infos_['tomorrowColor']);
          // bilan
          $sep = array('title','>'); //{ejp}nbjoursecoules/nbtotjours {tempo} nbjoursrestants
          $bof = trim(sdk_multiextract($block,$sep,$sep2,$start));
          if ($contrat == 'ejp') {
            list($bof,$bof1) = explode('/',$bof);
            $bof1 = trim($bof1);
            if (is_numeric($bof1))  $infos_['totRed'] = $bof1;
            $bof  = trim($bof);
            if (is_numeric($bof)) {
              $infos_['decRed'] = $infos_['totRed'] - $bof;}
          }
          //complements
          $bof = str_replace('/','-',$infos_['todayDate'].'-'.$annee_now);//date europeenne
          $bof = strtotime($bof);
          if ($bof > $time_now) $infos_['todayYear'] = $annee_now -1;
          else $infos_['todayYear'] = $annee_now;
          $infos_['tomorrowYear'] = $infos_['todayYear'];
          if ($infos_['tomorrowDate'] == '01/01') $infos_['tomorrowYear']++;
        break;
      case 'selectran' :
        $sep2  = array(array('<!-- END'),array('<div class='));
        $sep   = array('"intro">','hui, ');
        $start = 0;
        $block = trim(strtolower(sdk_extract($response,$sep,$sep2,$start,false,false)));//pas de MaJ $start
        $err_num = 1;
        if (strlen($block) == 0) {$erreur = $err_num;break;}
        if ($api_edf){
          $sep   = array('il reste');// jour dd/mm
          $sep2  =array('</p>');
          $block = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $start=0;
          $sep2   =array('</');
        }else{
          //lecture block
          //extraction infos Aujourd'hui
          // date
          $sep  = array('hui, ');// jour dd/mm
          $sep2 = array(',');// jour dd/mm
          $bof  = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $jour = explode(" ",$bof);
          $jour[1] = $months[$jour[1]];
          $date = strtotime($jour[0]." ".$jour[1]." ".$jour[2]);
          //couleur
          $sep  = array('est');// couleur
          $sep2 ='</';
          $bof  = trim(sdk_multiextract($block,$sep,$sep2,$start));
          $infos_['todayColor'] = sdk_format($bof);//COUL ou ND
          //extraction infos demain
          // date
          // couleur
          $sep    = array('sera');// couleur
          $bof = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $infos_['tomorrowColor'] = sdk_format($bof);
        }
        // bilan
        $sep    = array('<strong>'); //{ejp}nbjoursecoules/nbtotjours {tempo} nbjoursrestants
        for ($i =0;$i<3;$i++) {
          $bof = trim(sdk_multiextract($block,$sep,$sep2,$start));
            $nb = (int)$bof;
            if (strpos($bof,'bleu')>1) $infos_['remBlue'] = $nb;
            elseif (strpos($bof,'rouge')>1) $infos_['remRed'] = $nb;
            elseif (strpos($bof,'blanc')>1) $infos_['remWhite'] = $nb;
          }
        $infos_['decRed'] = $infos_['totRed'] - $infos_['remRed'];
        $infos_['decWhite'] = $infos_['totWhite'] - $infos_['remWhite'];
        $infos_['decBlue'] = $infos_['totBlue'] - $infos_['remBlue'];
        $sep2  = array(array('<!-- END'),array('</tr'));
        $sep   = array('<th>Abonnement','<strong>','<strong>','</td>');
        $start = 0;
        $block = trim(strtolower(sdk_extract($response,$sep,$sep2,$start,false,false)));//pas de MaJ $start
        $sep2  = array('&nbsp;');
        $sep   = array('<td>');
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['BLEU']['HC'] = $bof;
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['BLEU']['HP'] = $bof;
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['BLANC']['HC'] = $bof;
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['BLANC']['HP'] = $bof;
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['ROUGE']['HC'] = $bof;
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['ROUGE']['HP'] = $bof;
        break;
      case 'keskeces' :
      //lecture block1
        $sep   = array("<div class='cont' onclick=","Aujourd'hui");
        $sep2  = "<div class='cont' onclick=";
        $startBlock = 0;
        $block = trim(str_replace(',','',sdk_multiextract($response,$sep,$sep2,$startBlock)));
        if (strlen($block == 0) ) {$erreur = 1;break;}
        //extraction dates et couleur
        $sep2  = '</';
        $sep   = '';
        $start = 0;
        $infos_['todayDate']     = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
        $sep   = array('Jour','<div','>');//Bleu Blanc Rouge Indeterminé
        $infos_['todayColor']    = sdk_multiextract($block,$sep,$sep2,$start);//MaJ $start
        $infos_['todayColor']    = sdk_format($infos_['todayColor']);
        $sep   = array('Lendemain','<div','>');//Bleu Blanc Rouge Indeterminé
        $infos_['tomorrowColor'] = sdk_multiextract($block,$sep,$sep2,$start);//MaJ $start
        $infos_['tomorrowColor'] = sdk_format($infos_['tomorrowColor']);
        $date_array = explode(' ',$infos_['todayDate']);//Jour J mois aaaa (français)
        $bof = strtotime($date_array[1].' '.$months[$date_array[2]].' '.$date_array[3]);
        $infos_['todayDayWeek']  = $date_array[0];
        $infos_['todayDate']     = sdk_jour($bof,0,false);//jour JJ/MM
        $infos_['todayYear']    = $date_array[3];
        $infos_['tomorrowDate']  = sdk_jour($bof,1,false);
        $infos_['tomorrowYear'] = $infos_['todayYear'];
        if ($infos_['tomorrowDate'] == '01/01') $infos_['tomorrowYear']++;
      //lecture block2
        $sep   = array("<div class='cont' onclick=",'Tempo','Jours');
        $sep2  = "<div class='cont pub'";
        $block = trim(str_replace(',','',sdk_multiextract($response,$sep,$sep2,$startBlock)));
        //bilan
        $sep2                    = '</';
        $start = 0;
        $sep                     = array('bj','<b>');//Bleu Blanc Rouge Indeterminé
        $infos_['decBlue']     = sdk_multiextract($block,$sep,$sep2,$start);//nn
        $infos_['totBlue']  = sdk_multiextract($block,$sep,$sep2,$start) + $infos_['decBlue'];//nn
        $start = 0;
        $sep                     = array('wj','<b>');//Bleu Blanc Rouge Indeterminé
        $infos_['decWhite']     = sdk_multiextract($block,$sep,$sep2,$start);//nn
        $infos_['totWhite']  = sdk_multiextract($block,$sep,$sep2,$start) + $infos_['decWhite'];//nn
        $start = 0;
        $sep                     = array('rj','<b>');//Bleu Blanc Rouge Indeterminé
        $infos_['decRed']     = sdk_multiextract($block,$sep,$sep2,$start);//nn
        $infos_['totRed']  = sdk_multiextract($block,$sep,$sep2,$start) + $infos_['decRed'];//nn
        $sep                     = array('/table',':');//J mois aaaa à hhhmm(français)
        $infos_['fileDate']      = trim(sdk_multiextract($block,$sep,'<',$start));//MaJ $start
        $date_array = explode(' ',$infos_['fileDate']);//array JJ mois aaaa à hhhmm
        $bof = strtotime($date_array[0].' '.$months[$date_array[1]].' '.$date_array[2]);
        $infos_['heureFile']     = str_replace('h',':',$date_array[4]);//hh:mm
        $infos_['fileDate']      = sdk_jour($bof,0);
        break;
      }
  }
  if ($heure_now<TSTART) {
    if ($infos_['nowDate'] != $infos_['yesterdayDate']){
      $infos_['nowDate'] = $infos_['yesterdayDate'];
      $infos_['nowColor'] = $infos_['yesterdayColor'];
  //    $infos_['tarifNow'] = $infos_['yesterdayRate'];
    }
  }elseif ($infos_['nowDate'] != $infos_['todayDate']){
    $infos_['nowDate'] = $infos_['todayDate'];
    $infos_['nowColor'] = $infos_['todayColor'];
  //  $infos_['tarifNow'] = $infos_['tarifToday'];
  }

  if ( ($infos_['todayColor'] == 'ND') || ($infos_['tomorrowColor'] == 'ND') ) {
    $result = 0;
  }

  $infos_['fileTimestamp'] = $time_now;;
  $infos_['fileDate'] = date('Y-m-d H:i:s',$infos_['fileTimestamp']);
  //var_dump($infos_);
  saveVariable(MEM.$contrat,$infos_);
}
// Génération du XML
  sdk_header('text/xml');
$xml  = '<?xml version="1.0" encoding="UTF-8"?>'."\n";
$xml .= "<root>\n";
$xml .= '<'.$contrat.'>'."\n";
$xml .= '   <aujourdhui>'.$infos_['todayColor']."</aujourdhui>\n";
$xml .= '   <date_aujourdhui>'.$infos_['todayDate']."</date_aujourdhui>\n";
$xml .= '   <demain>'.$infos_['tomorrowColor']."</demain>\n";
$xml .= '   <date_demain>'.$infos_['tomorrowDate']."</date_demain>\n";
$xml .= '   <now>'.$infos_['nowColor']."</now>\n";
$xml .= '   <date_now>'.$infos_['nowDate']."</date_now>\n";
if ($contrat == 'ejp') {
  $xml .= '   <decompte>'.$infos_['decRed']."</decompte>\n";
}
else {
  $xml .= "   <decompte_bleu>".$infos_['decBlue']."</decompte_bleu>\n";
  $xml .= "   <decompte_blanc>" .$infos_['decWhite']."</decompte_blanc>\n";
  $xml .= '   <decompte_rouge>' .$infos_['decRed']."</decompte_rouge>\n";
  $xml .= "   <reste_bleu>"  .$infos_['remBlue']."</reste_bleu>\n";
  $xml .= "   <reste_blanc>" .$infos_['remWhite']."</reste_blanc>\n";
  $xml .= '   <reste_rouge>' .$infos_['remRed']."</reste_rouge>\n";
  $xml .= '   <type>'.$contrat."</type>\n";
  $xml .= '   <hphc>'.$infos_['hphc']."</hphc>\n";
  $xml .= '   <tarifs_aujourdhui>'.$infos_[$infos_['todayColor']]['HP'].'/'.$infos_[$infos_['todayColor']]['HC']."</tarifs_aujourdhui>\n";
  $xml .= '   <tarifs_demain>'.$infos_[$infos_['tomorrowColor']]['HP'].'/'.$infos_[$infos_['todayColor']]['HC']."</tarifs_demain>\n";
  $xml .= '   <tarif_now>'.$infos_[$infos_['nowColor']][$infos_['hphc']]."</tarif_now>\n";
  $xml .= '   <bleu_hc>'.$infos_['BLEU']['HC']."</bleu_hc>\n";
  $xml .= '   <bleu_hp>'.$infos_['BLEU']['HP']."</bleu_hp>\n";
  $xml .= '   <blanc_hc>'.$infos_['BLANC']['HC']."</blanc_hc>\n";
  $xml .= '   <blanc_hp>'.$infos_['BLANC']['HP']."</blanc_hp>\n";
  $xml .= '   <rouge_hc>'.$infos_['ROUGE']['HC']."</rouge_hc>\n";
  $xml .= '   <rouge_hp>'.$infos_['ROUGE']['HP']."</rouge_hp>\n";
}
$xml .='</'.$contrat.'>'."\n";
$xml .= "<debug>\n";
$xml .= '   <date_fichier>'.$infos_['fileDate']."</date_fichier>\n";
$xml .= '   <timestamp>'.$infos_['fileTimestamp']."</timestamp>\n";
$xml .= '   <date_lecture>'.$date_now." ".$heure_lecture."</date_lecture>\n";
//$xml .= '   <url>'.htmlentities($urls['tempo'][0])."</url>\n";
$xml .= '   <url_>'.htmlentities($url)."</url_>\n";
$xml .= '   <result>'.$result."</result>\n";
if ($debug) {
    $xml .= '   <source>'       .$source                    ."</source>\n";
    $xml .= "   <response>   "  .substr($response,0,100)    .".....\n   </response>\n";
  foreach ($infos_ as $key => $info){
    $xml .= '   <test_'.$key.'>'       .$info               ."</test_".$key.">\n";
  }
  $xml .= "   <debugLen>"     .strlen($block)               ."</debugLen>\n";
  $xml .= "   <debugStr>\n"   .$block                       ."\n   </debugStr>\n";
  foreach ($urls[$contrat] as $key => $url)  {
    $xml .= '   <url_'.$key.'>'.$url                        ."</url_".$key.">\n";
  }     
}
$xml .= "</debug>\n";
$xml .= "</root>\n";
echo $xml;
?>

eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 870
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar patrichkof » 11 Sep 2024 16:47

Bonjour OPA,
merci pour ton aide,
j'ai remplacé le script par celui que tu as fait mais j'ai tjs le problème, ci-dessous le résultat du test:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<tempo>
<aujourdhui>ND</aujourdhui>
<date_aujourdhui>ND</date_aujourdhui>
<demain>ND</demain>
<date_demain>ND</date_demain>
<now></now>
<date_now></date_now>
<decompte_bleu></decompte_bleu>
<decompte_blanc></decompte_blanc>
<decompte_rouge></decompte_rouge>
<reste_bleu></reste_bleu>
<reste_blanc></reste_blanc>
<reste_rouge></reste_rouge>
<type>tempo</type>
<hphc>HP</hphc>
<tarifs_aujourdhui>/</tarifs_aujourdhui>
<tarifs_demain>/</tarifs_demain>
<tarif_now></tarif_now>
<bleu_hc></bleu_hc>
<bleu_hp></bleu_hp>
<blanc_hc></blanc_hc>
<blanc_hp></blanc_hp>
<rouge_hc></rouge_hc>
<rouge_hp></rouge_hp>
</tempo>
<debug>
<date_fichier></date_fichier>
<timestamp></timestamp>
<date_lecture>Mercredi 11/09 17:44:34</date_lecture>
<url_></url_>
<result></result>
</debug>
</root>

peux-tu m'aider?
Merci
patrichkof
 
Messages : 28
Inscription : 18 Fév 2019

Re: [Store] Tempo EDF

Messagepar opa95 » 11 Sep 2024 17:25

Bonjour
patrichkof a écrit:Bonjour OPA,
merci pour ton aide,
j'ai remplacé le script par celui que tu as fait mais j'ai tjs le problème, ci-dessous le résultat du test:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<tempo>
....
<date_lecture>Mercredi 11/09 17:44:34</date_lecture>
<url_></url_>
<result></result>
</debug>
</root>

peux-tu m'aider?
Merci

Merci pour le test, je suis en train de faire le nettoyage.
Pour l'instant, peux tu corriger la ligne 520 (environ) (elle était restée en mode test)
ou plutôt charger celle qui tournait chez moi cette nuit (légèrement modifiée), mais pas encore nettoyée
Code : Tout sélectionner
 if ($api_edf*0){
qui devrait être
 if ($api_edf){

Peux tu aussi supprimer la mise en commentaire de la ligne 708 (environ) (//)
Code : Tout sélectionner
//$xml .= '   <url>'.htmlentities($urls['tempo'][0])."</url>\n";
qui devrait être
$xml .= '   <url>'.htmlentities($urls['tempo'][0])."</url>\n";

Malgré cela, ça aurait du marcher.
Peux-tu me mettre une copie de la fenêtre du plugin pour que je vérifie les valeurs d'appel.
Voici ma page d'appel
Tempo.png
Plugin Tempo
Tempo.png (29.86 Kio) Consulté 2506 fois

Sinon voici le script qui tourne chez moi, avant le dernier nettoyage
Code : Tout sélectionner
<?php
/*****************************************************************************
**
** Script Tempo/EJP pour eedomus
**
** Script qui permet de récupérer au format XML les données Tempo ou EJP :
**   - Couleur Tempo du jour/EJP (//aujourdhui),
**  - Couleur Tempo du lendemain/EJP (//demain),
**  - Nombre de jours Bleus Tempo restants (//decompte_bleu),
**  - Nombre de jours Blancs Tempo restants (//decompte_blanc),
**  - Nombre de jours Rouge Tempo restants (//decompte_rouge),
**  - Nombre de jours Rouge EJP restants (//decompte),
**  - Tarif du jour
** Les données sont stockées en mémoire et le polling sur les sites est réglé
** par la valeur de 'timer' (3600 secondes par défaut).
** Un polling automatique est fait au passage à minuit, 6h, 12h et 22h,
** pour que ce polling automatique se fasse bien, on peut régler la fréquence des plugins à une valeur faible (1 ou 2 minutes) : dans ce cas, les pollings
réels seront synchronisés à peu près sur les passages à l'heure (0:01h,1:01h... pour timer=3600) ou par exemple à (0:01h, 6h:01, 12h:01,18:01h,22:01h pour timer=21600 [6*3600] ); si timer>=36000, les lectures seront (0:01h, 6h:01, 12h:01,22:01h)
** Le nombre d'appels sera donc compris entre 4 et 25 par jour, quel que soit le nombre de devices créés. Le reste du temps les appels se conteteront de renvoyer le contenu de la mémoire.
** en mode test, on peut forcer la lecture avec la commande &reset=1 ou &simul=x, avec x<0 ou >timer
****************************************************************************
**  - URL de la Requête 
**: http://localhost/script/?exec=edf_tempo.php
**  - ou http://localhost/script/?exec=edf_tempo.php&contrat=[VAR1]&site=[VAR2]&timer=[VAR3]
** avec
**   VAR1 : vide (-> tempo) ou tempo ou ejp (ou contenu dans le nom du script)
**   VAR2 : vide ou numéro du site secondaire, 0 par défaut -> test de tous les sites
**   VAR3 : vide ou période de polling (secondes) 3600 par défaut
** - Fréquence de la Requête : 60 minutes ou 1 si on veut mettre à jour l'affichage plus souvent pour le passage à 0h, 6h, 12h, 22h, de toute façon le polling vers les sites est réglé par 'timer' (3600 par défaut)
** L'URL est de la forme (Tempo) : edf_tempo.php ou edf_ejp.php&contrat=tempo ou utiliser VAR1
** L'URL est de la forme (EJP)   : edf_ejp.php   ou edf_tempo.php&contrat=ejp ou utiliser VAR1
** si l'URL porte un autre nom, le champ &contrat est obligatoire (ou VAR1)
** commandes ajouter à la fin de la ligne de commande:
** type contrat : &contrat=1 (tempo par défaut ou récupéré dans le nom)
** mode debug : &debug=1 (0 par défaut)
** site  : &site=n (0 par défaut -> tous les sites, sinon n° du site)
** timer (Validité du fichier en secondes) :&timer=xxxxx (3600 par défaut)
** reset : effacement mémoire : &reset=n (0 par défaut, 1 sinon)
** simul décalage temporel (secondes) : &simul=yyyyy (0 par défaut)
****************************************************************************
Resultats : /tempo/champ ou //champ
?xml version="1.0" encoding="UTF-8"?>
<root>
<tempo>
   <aujourdhui>BLEU</aujourdhui> // de 6h à 6h (demain)
   <date_aujourdhui>JOUR</date_aujourdhui> // de 6h à 6h (demain)
   <demain>BLEU</demain> // de 6h (demain) à 6h (aprèsdemain)
   <date_demain>11/09</date_demain> // de 6h (demain) à 6h (aprèsdemain)
   <now>BLEU</now> // couleur actuelle (dépend de l'heure, avant 6h -> hier)
   <date_now>JOUR</date_now> // date actuelle (dépend de l'heure, avant 6h -> hier)
   <decompte_bleu>10</decompte_bleu> //nombre de jours écoulés
   <decompte_blanc>0</decompte_blanc> //nombre de jours écoulés
   <decompte_rouge>0</decompte_rouge> //nombre de jours écoulés
   <reste_bleu>290</reste_bleu> //nombre de jours restants
   <reste_blanc>43</reste_blanc> //nombre de jours restants
   <reste_rouge>22</reste_rouge> //nombre de jours restants
   <type>tempo</type>
   <hphc>HP</hphc> // période actuelle (dépend de l'heure, avant 6h -> hier)
   <tarifs_aujourdhui>0.1609/0.1296</tarifs_aujourdhui> // de 6h à 6h (demain)
   <tarifs_demain>0.1609/0.1296</tarifs_demain> // de 6h (demain) à 6h (aprèsdemain)
   <tarif_now>0.1609</tarif_now>// tarif actuel (dépend de l'heure, avant 6h -> hier)
   <bleu_hc>0.1296</bleu_hc> // tarif
   <bleu_hp>0.1609</bleu_hp> // tarif
   <blanc_hc>0.1486</blanc_hc> // tarif
   <blanc_hp>0.1894</blanc_hp> // tarif
   <rouge_hc>0.1568</rouge_hc> // tarif
   <rouge_hp>0.7562</rouge_hp> // tarif
</tempo>
<debug>
   <date_fichier>2024-09-10 11:34:28</date_fichier>
   <timestamp>1725960868</timestamp> //fichier
   <date_lecture>Mardi 10/09 11:34:28</date_lecture>
   <url>https://www.api-couleur-tempo.fr/api/joursTempo?dateJour[]=2024-09-09&amp;dateJour[]=2024-09-10&amp;dateJour[]=2024-09-11</url> //api edf
   <url_>https://selectra.info/energie/fournisseurs/edf/tempo</url_> // url secondaire
  <result>1</result> //1->OK
</debug>
</root>
********************************************************************************
urls compatibles :
tempo
https://www.api-couleur-tempo.fr/api/joursTempo?',
https://selectra.info/energie/fournisseurs/edf/tempo#selectran',
https://www.fournisseurs-electricite.com/edf/tarifs/tempo#selectran',
https://prix-elec.com/tarifs/fournisseurs/edf/tempo#selectran'
ejp (pas testé le 2024/09/10)
https://electricite.net/edf/tarifs/ejp // **dates fausses le 2/04
https://prix-elec.com/tarifs/fournisseurs/edf/ejp-demain
https://selectra.info/energie/fournisseurs/edf/ejp
https://selectra.info/energie/fournisseurs/edf/ejp/demain
https://observatoires.net/calendrier
https://selectra.info/energie/fournisseurs/edf/ejp/jours
https://www.fournisseurs-electricite.com/edf/tarifs/ejp/jour-demain
https://www.fournisseurs-electricite.com/edf/tarifs/ejp
https://www.kelwatt.fr/fournisseurs/edf/ejp/demain
https://www.kelwatt.fr/guide/ejp

******************************************************************************
**
** Evolution des versions :
**
** 2017-07-26 (DjMomo)    :V1.0 - Version initiale
** 2019-10-24 (Merguez07) :V2.0 - utilisation du proxy Eedomus
** 2019-10-26 (Merguez07) :V2.1 - Passage du cache de 24h à 1h
** 2020-11-11 (Merguez07) :V3.0 - utilisation des données du site de selectra
** 2021-10-04 (Merguez07) :V3.1 - correction du script suite à evolution du site Electra
** 2022-01-07 (Merguez07) :V3.2 - correction du script suite à evolution du site Electra
** 2022-03-24 (Merguez07) :V3.3 - correction du script suite à evolution du site Electra
** 2022-03-27 (Merguez07) :V3.4 - bug dans le store
** 2022-04-01 (opa95)     :V3.5 - corrections mineures, compatible autres sites et EJP
** 2022-04-01 (opa95)     :V3.6 - utilisation du site edf tempo et EJP
** 2024-09-10 (opa95)     :V3.7 - Utilisation api edf et sites selectra...
*******************************************************************************/
function sdk_jour($time_now,$nbJours = 0,$jourStr = 2) {
  //creation date à partir du temps unix décale de $nbJours
  //sortie jourFrançais jj/mm
  global $days;
  $time_now += 86400*$nbJours;
  $jour_semaine = date('w',$time_now);
  $start = 0;
  foreach ($days as $key => $day) {
    if ($start == $jour_semaine) {
      $jour_semaine = $key;
      break;
    }
    $start ++;
  }
  switch ($jourStr) {
    case 2 : $ret= date('Y-m-d',$time_now);
    return $ret;
    case 1 : return $jour_semaine.' '.date('d/m',$time_now);
    default :
      $ret= date('d/m',$time_now);
      return $ret;
}
//  if ($jourStr ==1 ) return $jour_semaine.' '.date('d/m',$time_now);
//  else return date('d/m',$time_now);
//  return;
}

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_multiexplode ($delimiters,$string) {   // Separer une chaine de caracteres suivant plusieurs separateurs
// remplacement delimiters[1] par delimiters[0]
// renvoi du tableau rédultat de explode
  $ready  = str_replace($delimiters, $delimiters[0], $string);
  $launch = explode($delimiters[0], $ready);
  return  $launch;
}

function sdk_format ($string,$field = 'color') {  // met en forme selon la semantique du plugin du store
  // formatage de date -> format[dayWeek] dayWeek et format[dateJM] jj/mm ou renvoi ND ND
  // formatage de couleur tempo -> BLEU, BLANC, ROUGE ND
  // formatage de couleur ejp -> NON_EJP, EST_EJP, ND
  global $contrat;// tempo ou ejp
  global $upc_contrat;// TEMPO ou EJP
  global $days;// jour de la semaine
  $string   =   str_replace($upc_contrat,'',trim(strtoupper($string))); 
  if ($field == 'date') {
    if (strlen($string) < 6) $string = 'ND '.$string;
    list($format['dayWeek'],$format['dateJM']) = explode(' ',trim($string));
    if ($format['dayWeek'] != 'ND') $format['dayWeek'] = $format['dayWeek'][0].strtolower(substr($format['dayWeek'],1));
    if (!array_key_exists($format['dayWeek'],$days) ) $format['dayWeek'] = 'ND';
  }
  else {
    $format   = "ND";
    $string   =   strtoupper(str_replace(' ','',$string));
    if ($contrat == 'ejp') {
      if ( ($string == "PASD'") || (strpos($string,'JAMAIS') !== false) ) $format="NON_EJP";
      if ($string == "JOUR")  $format="EST_EJP";
    }
    else {
      $string = strtoupper($string);
      $color  =   array("1"=>"BLEU","2"=>"BLANC","3"=>"ROUGE","0"=>"ND");
      if (is_numeric($string)) {
          $string = $string%4;
          if ($string>0) return $color[$string];
      }
      foreach ($color as $col) {
        if (strpos($string,$col) !== false) {
          $format = $col;
          break;
        }
      }
    }
  }
  return  $format;
}


define('MEM','OLD');
define('DEFTYPE','selectran');// format url annexe
define('DEFTIME','3600');//3600 secondes
define('NBB','300');
define('NBW','43');
define('NBR','22');
define('TSTART',6);//début start
define('TSTOP',22);//fin HP
$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');
$days   = array('Dimanche' => 'Sunday','Lundi' => 'Monday','Mardi' => 'Tuesday','Mercredi' => 'Wednesday','Jeudi' => 'Tuesday',
                'Vendredi' => 'Friday','Samedi' => 'Saturday');
                //initialisation des variables
//$start = strlen('exec=edf_');
$source = (array_key_exists('exec',$_GET))? strtolower($_GET['exec']):"";
if (strpos('Z'.$source,'tempo')) $contrat = 'tempo';
elseif (strpos('Z'.$source,'ejp'))$contrat = 'ejp';
else $contrat = "";
$contrats = array('tempo','ejp');
$urls     = array('tempo' => array (
  'https://www.api-couleur-tempo.fr/api/joursTempo?',
  'https://selectra.info/energie/fournisseurs/edf/tempo#selectran',
  'https://www.fournisseurs-electricite.com/edf/tarifs/tempo#selectran',
  'https://prix-elec.com/tarifs/fournisseurs/edf/tempo#selectran',
  'https://www.kelwatt.fr/guide/tempo#selectra',
  'https://observatoires.net#selectra',
  'https://observatoires.net/tempo#selectra',
  ),
        'ejp'   => array (
    1 => 'https://selectra.info/energie/fournisseurs/edf/ejp#selectra',
    'https://observatoires.net#selectra',
    'https://observatoires.net/ejp#selectra',
    'https://prix-elec.com/tarifs/fournisseurs/edf/ejp-demain#selectra',
    'https://www.fournisseurs-electricite.com/edf/tarifs/ejp/jour-demain#selectra',
    'https://www.kelwatt.fr/fournisseurs/edf/ejp#selectra',
    'https://electricite.net/edf/tarifs/ejp#selectra',
    'https://agence-energie.com/edf/tarifs/ejp#selectra'
  )
      );
$types = array('selectra','selectran','keskeces');               

$contrat_  = strtolower(getArg('contrat',false,""));
$contrat = (($contrat_!="") && (in_array($contrat_,$contrats)))?  $contrat_:$contrat;
$debug  = getArg('debug',false);
if ( (!$debug) || (!in_array($debug,array(0,1))) ) $debug = 0;
$num_site   = abs(getArg('site',false));
if ( (!$num_site) || (($num_site > count($urls[$contrat]) )) ) $num_site = 1;
if ($num_site == 0 ) $scan = 1; else $scan = 0;
$timer = getArg('timer',false,DEFTIME);//Validité du fichier
$upc_contrat = strtoupper($contrat);
$poll = 0;
$reset = getArg('reset',false,0);
if ($reset) {
  deleteVariable(MEM.$contrat);
  $poll = 1;
}
$simul = getArg('simul',false,0);//Décalage temps secondes

$time_now    = time()+$simul;
$annee_now   = date('Y',$time_now);//aaaa
$heure_now   = date('H',$time_now);//hh
$date_now    = sdk_jour($time_now,0,1);// jj/mm
$date_demain = sdk_jour($time_now,1,1);//jour jj/mm
$date_hier   = sdk_jour($time_now,-1,0);//jour jj/mm
$nowDate     = sdk_jour($time_now,0,0);//jour semaine
$dateDemain  = sdk_jour($time_now,1,0);//jour semaine
list($nowDayWeek,$bof)    = explode(' ',$date_now);
list($tomorrowDayWeek,$bof) = explode(' ',$date_demain);
$infos_ = array (
  'todayDate' => 'ND', 'todayDayWeek' => 'ND',
  'todayYear' => 'ND', 'todayColor' => 'ND', 'hphc' =>'HP',
  'tomorrowDate' => 'ND', 'tomorrowDayWeek' => 'ND', 'tomorrowYear' => 'ND', 'tomorrowColor' => 'ND',
  'yesterdayColor' =>'ND', 'yesterdayRate' => 'ND', 'yesterdayDate' => 'ND',
  'nowDate' => 'ND','nowColor'=>'ND', 'tarifnow' => 'ND',
  'decRed' => NBR, 'totRed' => NBR, 'remRed' => 'ND',
  'decWhite' => NBW, 'totWhite' => NBW, 'remWhite' => 'ND',
  'decBlue' => NBB, 'totBlue' => NBB, 'remBlue' => 'ND',
  'fileDate' => 'ND', 'fileTimestamp' => 'ND',
  'BLEU' => array('HC'=>'0.1296','HP'=>'0.1609'),
  'BLANC' => array('HC'=>'0.1486','HP'=>'0.1894'),
  'ROUGE' => array('HC'=>'0.1568','HP'=>'0.7562'),
) ;

if (loadVariable(MEM.$contrat)) $infos_ = loadVariable(MEM.$contrat);
  else $poll = 1;
$infos_['hphc'] = (($heure_now<TSTART) || ($heure_now>=TSTOP))?'HC':'HP';
if (!$poll && array_key_exists('fileTimestamp',$infos_)){// forçage lecture
  $file_hour = date("H",$infos_['fileTimestamp']);
  if ($time_now<$infos_['fileTimestamp']) {$poll=1;}// simulation (recul)
  elseif (($time_now-$infos_['fileTimestamp'])>$timer) {$poll=1;}// temps expiré
  elseif (($file_hour<TSTART) && ($heure_now>=TSTART)) {$poll=1;}// passage à 6h
  elseif (($file_hour<TSTOP) && ($heure_now>=TSTOP)) {$poll=1;} // passage à 22h
  elseif (($file_hour>$heure_now)) {$poll=1;}// passage à minuit
  elseif (($file_hour<12) && ($heure_now>=12)) {$poll=1;} // passage à 12h
}
$heure_lecture = date('H:i:s',$time_now);
if ($poll)
{  $urls['tempo'][0] .= 'dateJour[]='.sdk_jour($time_now,-1).'&dateJour[]='.sdk_jour($time_now).'&dateJour[]='.sdk_jour($time_now,1);
  $infos_['todayDate']       = $nowDate; // dd/mm
  $infos_['todayDayWeek']    = $nowDayWeek; // Jour ou ND
  $infos_['tomorrowDate']    = $dateDemain; // dd/mm
  $infos_['tomorrowDayWeek'] = $tomorrowDayWeek; // Jour ou ND
  $infos_['yesterdayDate']   = $date_hier;
  if ('todayDayWeek' == 'Samedi') $infos_['tomorrowColor'] = 'BLEU';
  elseif ('todayDayWeek' == 'Dimanche') $infos_['todayColor'] = 'BLEU';
  $response0 = httpQuery($urls['tempo'][0],'GET');
  $response0 = sdk_json_decode($response0);
  $api_edf = count($response0)>1;
  $infos_['yesterdayColor'] = sdk_format($response0[0]['codeJour']);
  $bof = sdk_format($response0[1]['codeJour']);
  if ($bof!='ND') $infos_['todayColor']  = $bof;
  $bof = sdk_format($response0[2]['codeJour']);
  if ($bof!='ND') $infos_['tomorrowColor']  = $bof;
  for ($i=$num_site;$i<=count($urls[$contrat]);$i++){
    if (!$i) $i++;
    list($url,$type) = explode('#',$urls[$contrat][$num_site]);
    if ( (!$type) || (!in_array($type,$types)) ) $type = DEFTYPE;
    $response = trim(httpQuery($url,'GET'));
    if (strpos($response,'html') === false) $result = 0;
      else {$result = 1;break;}
    if ($num_site) break;
  }

  if ($result) {
    $erreur = 0;
    switch ($type) {
      case 'selectra' :
          //lecture block
          $sep2  = array(array('<!-- END'),array('<div id="block-'));
          $sep   = array('<div id="block-'.$contrat,'<div');
          $start = 0;
          $block = trim(strtolower(sdk_extract($response,$sep,$sep2,$start,false,false)));//pas de MaJ $start
          $err_num = 1;
          if (strlen($block) == 0) {$erreur = $err_num;break;}
          //extraction infos Aujourd'hui
          $sep2  ='</';
          // date
          $sep   = array('aujourd',$contrat);// jour dd/mm
          $bof   = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $bof   = sdk_format($bof,'date');
          $infos_['todayDate']    = $bof['dateJM']; // dd/mm
          $infos_['todayDayWeek'] = $bof['dayWeek']; // Jour ou ND
          //couleur
          $sep    = array('_icon','<span>');// couleur
          $infos_['todayColor'] = trim(sdk_multiextract($block,$sep,$sep2,$start));
          $infos_['todayColor'] = sdk_format($infos_['todayColor']);//COUL ou ND
          //extraction infos demain
          $start = 0;// debut block
          // date
          $sep = array('demain',$contrat);// jour dd:mm
          $bof = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $bof = sdk_format($bof,'date');
          $infos_['tomorrowDate']    = $bof['dateJM']; // dd/mm
          $infos_['tomorrowDayWeek'] = $bof['dayWeek']; // Jour ou ND
          // couleur
          $sep = array('_icon','<span>');// couleur
          $infos_['tomorrowColor'] = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $infos_['tomorrowColor'] = sdk_format($infos_['tomorrowColor']);
          // bilan
          $sep = array('title','>'); //{ejp}nbjoursecoules/nbtotjours {tempo} nbjoursrestants
          $bof = trim(sdk_multiextract($block,$sep,$sep2,$start));
          if ($contrat == 'ejp') {
            list($bof,$bof1) = explode('/',$bof);
            $bof1 = trim($bof1);
            if (is_numeric($bof1))  $infos_['totRed'] = $bof1;
            $bof  = trim($bof);
            if (is_numeric($bof)) {
              $infos_['decRed'] = $infos_['totRed'] - $bof;}
          }
          //complements
          $bof = str_replace('/','-',$infos_['todayDate'].'-'.$annee_now);//date europeenne
          $bof = strtotime($bof);
          if ($bof > $time_now) $infos_['todayYear'] = $annee_now -1;
          else $infos_['todayYear'] = $annee_now;
          $infos_['tomorrowYear'] = $infos_['todayYear'];
          if ($infos_['tomorrowDate'] == '01/01') $infos_['tomorrowYear']++;
        break;
      case 'selectran' :
        $sep2  = array(array('<!-- END'),array('<div class='));
        $sep   = array('"intro">','hui, ');
        $start = 0;
        $block = trim(strtolower(sdk_extract($response,$sep,$sep2,$start,false,false)));//pas de MaJ $start
        $err_num = 1;
        if (strlen($block) == 0) {$erreur = $err_num;break;}
        if ($api_edf){
          $sep   = array('il reste');// jour dd/mm
          $sep2  =array('</p>');
          $block = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $start=0;
          $sep2   =array('</');
        }else{
          //lecture block
          //extraction infos Aujourd'hui
          // date
          $sep  = array('hui, ');// jour dd/mm
          $sep2 = array(',');// jour dd/mm
          $bof  = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $jour = explode(" ",$bof);
          $jour[1] = $months[$jour[1]];
          $date = strtotime($jour[0]." ".$jour[1]." ".$jour[2]);
          //couleur
          $sep  = array('est');// couleur
          $sep2 ='</';
          $bof  = trim(sdk_multiextract($block,$sep,$sep2,$start));
          $infos_['todayColor'] = sdk_format($bof);//COUL ou ND
          //extraction infos demain
          // date
          // couleur
          $sep    = array('sera');// couleur
          $bof = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
          $infos_['tomorrowColor'] = sdk_format($bof);
        }
        // bilan
        $sep    = array('<strong>'); //{ejp}nbjoursecoules/nbtotjours {tempo} nbjoursrestants
        for ($i =0;$i<3;$i++) {
          $bof = trim(sdk_multiextract($block,$sep,$sep2,$start));
            $nb = (int)$bof;
            if (strpos($bof,'bleu')>1) $infos_['remBlue'] = $nb;
            elseif (strpos($bof,'rouge')>1) $infos_['remRed'] = $nb;
            elseif (strpos($bof,'blanc')>1) $infos_['remWhite'] = $nb;
          }
        $infos_['decRed'] = $infos_['totRed'] - $infos_['remRed'];
        $infos_['decWhite'] = $infos_['totWhite'] - $infos_['remWhite'];
        $infos_['decBlue'] = $infos_['totBlue'] - $infos_['remBlue'];
        $sep2  = array(array('<!-- END'),array('</tr'));
        $sep   = array('<th>Abonnement','<strong>','<strong>','</td>');
        $start = 0;
        $block = trim(strtolower(sdk_extract($response,$sep,$sep2,$start,false,false)));//pas de MaJ $start
        $sep2  = array('&nbsp;');
        $sep   = array('<td>');
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['BLEU']['HC'] = $bof;
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['BLEU']['HP'] = $bof;
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['BLANC']['HC'] = $bof;
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['BLANC']['HP'] = $bof;
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['ROUGE']['HC'] = $bof;
        $bof   = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
        if ($bof>0) $infos_['ROUGE']['HP'] = $bof;
        break;
      case 'keskeces' :
      //lecture block1
        $sep   = array("<div class='cont' onclick=","Aujourd'hui");
        $sep2  = "<div class='cont' onclick=";
        $startBlock = 0;
        $block = trim(str_replace(',','',sdk_multiextract($response,$sep,$sep2,$startBlock)));
        if (strlen($block == 0) ) {$erreur = 1;break;}
        //extraction dates et couleur
        $sep2  = '</';
        $sep   = '';
        $start = 0;
        $infos_['todayDate']     = trim(sdk_multiextract($block,$sep,$sep2,$start));//MaJ $start
        $sep   = array('Jour','<div','>');//Bleu Blanc Rouge Indeterminé
        $infos_['todayColor']    = sdk_multiextract($block,$sep,$sep2,$start);//MaJ $start
        $infos_['todayColor']    = sdk_format($infos_['todayColor']);
        $sep   = array('Lendemain','<div','>');//Bleu Blanc Rouge Indeterminé
        $infos_['tomorrowColor'] = sdk_multiextract($block,$sep,$sep2,$start);//MaJ $start
        $infos_['tomorrowColor'] = sdk_format($infos_['tomorrowColor']);
        $date_array = explode(' ',$infos_['todayDate']);//Jour J mois aaaa (français)
        $bof = strtotime($date_array[1].' '.$months[$date_array[2]].' '.$date_array[3]);
        $infos_['todayDayWeek']  = $date_array[0];
        $infos_['todayDate']     = sdk_jour($bof,0,false);//jour JJ/MM
        $infos_['todayYear']    = $date_array[3];
        $infos_['tomorrowDate']  = sdk_jour($bof,1,false);
        $infos_['tomorrowYear'] = $infos_['todayYear'];
        if ($infos_['tomorrowDate'] == '01/01') $infos_['tomorrowYear']++;
      //lecture block2
        $sep   = array("<div class='cont' onclick=",'Tempo','Jours');
        $sep2  = "<div class='cont pub'";
        $block = trim(str_replace(',','',sdk_multiextract($response,$sep,$sep2,$startBlock)));
        //bilan
        $sep2                    = '</';
        $start = 0;
        $sep                     = array('bj','<b>');//Bleu Blanc Rouge Indeterminé
        $infos_['decBlue']     = sdk_multiextract($block,$sep,$sep2,$start);//nn
        $infos_['totBlue']  = sdk_multiextract($block,$sep,$sep2,$start) + $infos_['decBlue'];//nn
        $start = 0;
        $sep                     = array('wj','<b>');//Bleu Blanc Rouge Indeterminé
        $infos_['decWhite']     = sdk_multiextract($block,$sep,$sep2,$start);//nn
        $infos_['totWhite']  = sdk_multiextract($block,$sep,$sep2,$start) + $infos_['decWhite'];//nn
        $start = 0;
        $sep                     = array('rj','<b>');//Bleu Blanc Rouge Indeterminé
        $infos_['decRed']     = sdk_multiextract($block,$sep,$sep2,$start);//nn
        $infos_['totRed']  = sdk_multiextract($block,$sep,$sep2,$start) + $infos_['decRed'];//nn
        $sep                     = array('/table',':');//J mois aaaa à hhhmm(français)
        $infos_['fileDate']      = trim(sdk_multiextract($block,$sep,'<',$start));//MaJ $start
        $date_array = explode(' ',$infos_['fileDate']);//array JJ mois aaaa à hhhmm
        $bof = strtotime($date_array[0].' '.$months[$date_array[1]].' '.$date_array[2]);
        $infos_['heureFile']     = str_replace('h',':',$date_array[4]);//hh:mm
        $infos_['fileDate']      = sdk_jour($bof,0);
        break;
      }
  }
  if ($heure_now<TSTART) {
    if ($infos_['nowDate'] != $infos_['yesterdayDate']){
      $infos_['nowDate'] = $infos_['yesterdayDate'];
      $infos_['nowColor'] = $infos_['yesterdayColor'];
  //    $infos_['tarifNow'] = $infos_['yesterdayRate'];
    }
  }elseif ($infos_['nowDate'] != $infos_['todayDate']){
    $infos_['nowDate'] = $infos_['todayDate'];
    $infos_['nowColor'] = $infos_['todayColor'];
  //  $infos_['tarifNow'] = $infos_['tarifToday'];
  }

  if ( ($infos_['todayColor'] == 'ND') || ($infos_['tomorrowColor'] == 'ND') ) {
    $result = 0;
  }

  $infos_['fileTimestamp'] = $time_now;;
  $infos_['fileDate'] = date('Y-m-d H:i:s',$infos_['fileTimestamp']);
  //var_dump($infos_);
  saveVariable(MEM.$contrat,$infos_);
}
// Génération du XML
  sdk_header('text/xml');
$xml  = '<?xml version="1.0" encoding="UTF-8"?>'."\n";
$xml .= "<root>\n";
$xml .= '<'.$contrat.'>'."\n";
$xml .= '   <aujourdhui>'.$infos_['todayColor']."</aujourdhui>\n";
$xml .= '   <date_aujourdhui>'.$infos_['todayDate']."</date_aujourdhui>\n";
$xml .= '   <demain>'.$infos_['tomorrowColor']."</demain>\n";
$xml .= '   <date_demain>'.$infos_['tomorrowDate']."</date_demain>\n";
$xml .= '   <now>'.$infos_['nowColor']."</now>\n";
$xml .= '   <date_now>'.$infos_['nowDate']."</date_now>\n";
if ($contrat == 'ejp') {
  $xml .= '   <decompte>'.$infos_['decRed']."</decompte>\n";
}
else {
  $xml .= "   <decompte_bleu>".$infos_['decBlue']."</decompte_bleu>\n";
  $xml .= "   <decompte_blanc>" .$infos_['decWhite']."</decompte_blanc>\n";
  $xml .= '   <decompte_rouge>' .$infos_['decRed']."</decompte_rouge>\n";
  $xml .= "   <reste_bleu>"  .$infos_['remBlue']."</reste_bleu>\n";
  $xml .= "   <reste_blanc>" .$infos_['remWhite']."</reste_blanc>\n";
  $xml .= '   <reste_rouge>' .$infos_['remRed']."</reste_rouge>\n";
  $xml .= '   <type>'.$contrat."</type>\n";
  $xml .= '   <hphc>'.$infos_['hphc']."</hphc>\n";
  $xml .= '   <tarifs_aujourdhui>'.$infos_[$infos_['todayColor']]['HP'].'/'.$infos_[$infos_['todayColor']]['HC']."</tarifs_aujourdhui>\n";
  $xml .= '   <tarifs_demain>'.$infos_[$infos_['tomorrowColor']]['HP'].'/'.$infos_[$infos_['todayColor']]['HC']."</tarifs_demain>\n";
  $xml .= '   <tarif_now>'.$infos_[$infos_['nowColor']][$infos_['hphc']]."</tarif_now>\n";
  $xml .= '   <bleu_hc>'.$infos_['BLEU']['HC']."</bleu_hc>\n";
  $xml .= '   <bleu_hp>'.$infos_['BLEU']['HP']."</bleu_hp>\n";
  $xml .= '   <blanc_hc>'.$infos_['BLANC']['HC']."</blanc_hc>\n";
  $xml .= '   <blanc_hp>'.$infos_['BLANC']['HP']."</blanc_hp>\n";
  $xml .= '   <rouge_hc>'.$infos_['ROUGE']['HC']."</rouge_hc>\n";
  $xml .= '   <rouge_hp>'.$infos_['ROUGE']['HP']."</rouge_hp>\n";
}
$xml .='</'.$contrat.'>'."\n";
$xml .= "<debug>\n";
$xml .= '   <date_fichier>'.$infos_['fileDate']."</date_fichier>\n";
$xml .= '   <timestamp>'.$infos_['fileTimestamp']."</timestamp>\n";
$xml .= '   <date_lecture>'.$date_now." ".$heure_lecture."</date_lecture>\n";
$xml .= '   <url>'.htmlentities($urls['tempo'][0])."</url>\n";
$xml .= '   <url_>'.htmlentities($url)."</url_>\n";
$xml .= '   <result>'.$result."</result>\n";
if ($debug) {
    $xml .= '   <source>'       .$source                    ."</source>\n";
    $xml .= "   <response>   "  .substr($response,0,100)    .".....\n   </response>\n";
  foreach ($infos_ as $key => $info){
    $xml .= '   <test_'.$key.'>'       .$info               ."</test_".$key.">\n";
  }
  $xml .= "   <debugLen>"     .strlen($block)               ."</debugLen>\n";
  $xml .= "   <debugStr>\n"   .$block                       ."\n   </debugStr>\n";
  foreach ($urls[$contrat] as $key => $url)  {
    $xml .= '   <url_'.$key.'>'.$url                        ."</url_".$key.">\n";
  }     
}
$xml .= "</debug>\n";
$xml .= "</root>\n";
echo $xml;
?>

eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 870
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar opa95 » 11 Sep 2024 17:27

Salut Patrickhof
Avec le dernier script (eedomus +), j'obtiens : :)
Code : Tout sélectionner
<?xml version="1.0" encoding="UTF-8"?>
<root>
<tempo>
   <aujourdhui>BLEU</aujourdhui>
   <date_aujourdhui>11/09</date_aujourdhui>
   <demain>BLEU</demain>
   <date_demain>12/09</date_demain>
   <now>BLEU</now>
   <date_now>11/09</date_now>
   <decompte_bleu>11</decompte_bleu>
   <decompte_blanc>0</decompte_blanc>
   <decompte_rouge>0</decompte_rouge>
   <reste_bleu>289</reste_bleu>
   <reste_blanc>43</reste_blanc>
   <reste_rouge>22</reste_rouge>
   <type>tempo</type>
   <hphc>HP</hphc>
   <tarifs_aujourdhui>0.1609/0.1296</tarifs_aujourdhui>
   <tarifs_demain>0.1609/0.1296</tarifs_demain>
   <tarif_now>0.1609</tarif_now>
   <bleu_hc>0.1296</bleu_hc>
   <bleu_hp>0.1609</bleu_hp>
   <blanc_hc>0.1486</blanc_hc>
   <blanc_hp>0.1894</blanc_hp>
   <rouge_hc>0.1568</rouge_hc>
   <rouge_hp>0.7562</rouge_hp>
</tempo>
<debug>
   <date_fichier>2024-09-11 18:26:02</date_fichier>
   <timestamp>1726071962</timestamp>
   <date_lecture>Mercredi 11/09 18:26:02</date_lecture>
   <url>https://www.api-couleur-tempo.fr/api/joursTempo?dateJour[]=2024-09-10&dateJour[]=2024-09-11&dateJour[]=2024-09-12</url>
   <url_>https://selectra.info/energie/fournisseurs/edf/tempo</url_>
   <result>1</result>
</debug>
</root>

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

PrécédentSuivant

Retour vers Téléinformation

Qui est en ligne ?

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