[Store] Tempo EDF

Lecture des compteurs EDF avec téléinformation

Re: [Store] Tempo EDF

Messagepar opa95 » 15 Oct 2024 17:10

OK hervé
herve27h a écrit:Bonjour opa95,

Merci à toi pour ce script.
Je vais l'installer et le tester ;)

Tiens moi au courant :)
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 : 899
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar bleauge » 16 Oct 2024 15:25

Bonjour

D'abord merci à tous pour vos contributions.
Mais j'ai dû louper quelque chose.
J'ai bien remplacer l'ancienne version par la, nouvelle.
J'ai fait un test : tester chement XPATH :
- utiliser l'URL => OK retourne bien 'BLEU'
- utiliser XML => ERREUR valeur lue vide
et du coup n'est pas pris en compte par le widget EEDOMUS (ni les regles bien sur)
bleauge
 
Messages : 24
Inscription : 11 Juin 2019

Re: [Store] Tempo EDF

Messagepar opa95 » 16 Oct 2024 16:22

Bonjour bleauge
bleauge a écrit:Bonjour

D'abord merci à tous pour vos contributions.
Mais j'ai dû louper quelque chose.
J'ai bien remplacer l'ancienne version par la, nouvelle.
J'ai fait un test : tester chement XPATH :
- utiliser l'URL => OK retourne bien 'BLEU'
- utiliser XML => ERREUR valeur lue vide
et du coup n'est pas pris en compte par le widget EEDOMUS (ni les regles bien sur)

Qu'obtiens-tu en mode test : "utiliser l'URL"
Avec XPATH : //demain
J'obtiens cela, as-tu quelque chose d'équivalent?
Quelles valeurs as-tu dans ta fenêtre d'appel : http de la requête? fréquence de la requête?
Si tu as laissé 60 minutes, tu vas probablement devoir attendre 1 heure pour voir les effets : mets 2 minutes.
J'obtiens la même chose si je passe ensuite en mode "utiliser le résultat XML", mais tu ne devrais pas utiliser ce mode, il ne sert qu'à tester diverses valeurs de XPATH, sans rappeler le script.
Code : Tout sélectionner
<?xml version="1.0" encoding="UTF-8"?>
<!--
-->
<root>
  <tempo>
    <version>V4.0</version>
    <maintenant>BLEU</maintenant>
    <hchp>HP</hchp>
    <tarif_now>0.1609</tarif_now>
    <aujourdhui>BLEU</aujourdhui>
    <tarifs_aujourdhui>0.1296/0.1609</tarifs_aujourdhui>
    <demain>BLEU</demain>
    <tarifs_demain>0.1296/0.1609</tarifs_demain>
    <decompte_bleu>46</decompte_bleu>
    <decompte_blanc>0</decompte_blanc>
    <decompte_rouge>0</decompte_rouge>
    <reste_bleu>254</reste_bleu>
    <reste_blanc>43</reste_blanc>
    <reste_rouge>22</reste_rouge>
    <total_bleu>300</total_bleu>
    <total_blanc>43</total_blanc>
    <total_rouge>22</total_rouge>
    <date_now>2024-10-16</date_now>
    <date_aujourdhui>Mercredi 2024-10-16</date_aujourdhui>
    <date_demain>2024-10-17</date_demain>
    <filetime>170705</filetime>
    <counts>1/0/1/0/0/</counts>
    <test>test</test>
  </tempo>
</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 : 899
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar bleauge » 16 Oct 2024 16:32

J'obtiens ceci.
Cela parait conforme, je vais attendre 60mn
Code : Tout sélectionner
<?xml version="1.0" encoding="UTF-8"?>
<!--
-->
<root>
  <tempo>
    <version>V4.0</version>
    <maintenant>BLEU</maintenant>
    <hchp>HP</hchp>
    <tarif_now>0.1609</tarif_now>
    <aujourdhui>BLEU</aujourdhui>
    <tarifs_aujourdhui>0.1296/0.1609</tarifs_aujourdhui>
    <demain>BLEU</demain>
    <tarifs_demain>0.1296/0.1609</tarifs_demain>
    <decompte_bleu>46</decompte_bleu>
    <decompte_blanc>0</decompte_blanc>
    <decompte_rouge>0</decompte_rouge>
    <reste_bleu>254</reste_bleu>
    <reste_blanc>43</reste_blanc>
    <reste_rouge>22</reste_rouge>
    <total_bleu>300</total_bleu>
    <total_blanc>43</total_blanc>
    <total_rouge>22</total_rouge>
    <date_now>2024-10-16</date_now>
    <date_aujourdhui>Mercredi 2024-10-16</date_aujourdhui>
    <date_demain>2024-10-17</date_demain>
    <filetime>171939</filetime>
    <counts>1/0/1/0/0/</counts>
    <test>test</test>
  </tempo>
</root>
bleauge
 
Messages : 24
Inscription : 11 Juin 2019

Re: [Store] Tempo EDF

Messagepar bleauge » 16 Oct 2024 16:44

l'URL de la requete est http://localhost/script/?exec=edf_tempo.php
j'ai mis 2mn mais rien, pas de retour dans EEDOMUS, mais efectivement quand je teste
l'URL j'obtiens bien 'BLEU'.
Je vais remettre cela à plus tard, merci
bleauge
 
Messages : 24
Inscription : 11 Juin 2019

Re: [Store] Tempo EDF

Messagepar opa95 » 16 Oct 2024 17:00

Salut
bleauge a écrit:l'URL de la requete est http://localhost/script/?exec=edf_tempo.php
j'ai mis 2mn mais rien, pas de retour dans EEDOMUS, mais efectivement quand je teste
l'URL j'obtiens bien 'BLEU'.
Je vais remettre cela à plus tard, merci

Quand tu modifies la fréquence, n'oublie pas de cliquer sur "Sauver et continuer" avant de retester ou "Sauver".
Pour les règles, tu ne verras pas d'effet si elles contiennent des "est maintenant" ou "devient" ou "devient maintenant" car "demain" est déja BLEU.
Après minuit, "demain" deviendra "indéterminé" puis redeviendra "BLEU" après 6h du mat.
En ce moment, "Aujourdhui" est toujours "BLEU" donc on ne peut pas se fier à son changement de valeur.
Le dimanche matin, "demain" est "BLEU" dès minuit, donc ne varie pas si le samedi était "BLEU" :)
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 : 899
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar jch » 17 Oct 2024 06:50

Si cela peut aider les programmeurs... voici le script utilisé sur la box domotique Homey Pro et qui fonctionne parfaitement.
Il faut peut-être l'adapter pour qu'il tourne sur Eedomus ??

var color = ["PAS ENCORE DEFINI", "TEMPO_BLEU", "TEMPO_BLANC", "TEMPO_ROUGE"];

var tagName_today = "JourJ";
var tagName_tomorrow = "JourJ+1";
var tagName_jourRougeRestant = "JourRougeRestant";

var jourRougeRestant = 22;

var today = "Non défini";
var tomorrow = "Non défini";

const currentYear = new Date().getFullYear();
var periode = `${currentYear}-${currentYear+1}`;



//====== Aujourd'hui
async function getToday() {
try {
const response = await fetch('https://www.api-couleur-tempo.fr/api/jourTempo/today', {
method: 'GET',
headers: {
'Accept': 'application/json'
}
});

if (!response.ok) {
throw new Error(`Erreur réseau : ${response.status}`);
}

const data = await response.json();
//console.log(data);
today = data.codeJour; // codeJour: 0 = pas encore défini, 1 = bleu, 2 = blanc, 3 = rouge
return today;
} catch (error) {
console.error('Il y a eu un problème avec la requête fetch:', error);
}
}

//====== Demain
async function getTomorrow() {
try {
const response = await fetch('https://www.api-couleur-tempo.fr/api/jourTempo/tomorrow', {
method: 'GET',
headers: {
'Accept': 'application/json'
}
});

if (!response.ok) {
throw new Error(`Erreur réseau : ${response.status}`);
}

const data = await response.json();
//console.log(data);
return data.codeJour; // codeJour: 0 = pas encore défini, 1 = bleu, 2 = blanc, 3 = rouge
} catch (error) {
console.error('Il y a eu un problème avec la requête fetch:', error);
}
}

//===== Jours Rouge
async function getJoursRouge() {
try {
const response = await fetch('https://www.api-couleur-tempo.fr/api/joursTempo?periode=' + periode, {
method: 'GET',
headers: {
'Accept': 'application/json'
}
});

if (!response.ok) {
throw new Error(`Erreur réseau : ${response.status}`);
}

const data = await response.json();
//console.log(data);

data.forEach((jour) => {
if (jour.codeJour === 3) {
jourRougeRestant--;
}
});

//console.log(`Jour Rouge Restant: ${jourRougeRestant}`);
return jourRougeRestant;
} catch (error) {
console.error('Il y a eu un problème avec la requête fetch:', error);
}
}





//===== Obtenir tempo + créer tag
async function getTempo() {
today = await getToday();
tomorrow = await getTomorrow();
jourRouge = await getJoursRouge();

console.log("Jour rouge restant: ", jourRouge);
console.log('Aujourd\'hui:', color[today]);
console.log('Demain:', color[tomorrow]);
await tag(tagName_today, color[today]);
await tag(tagName_tomorrow, color[tomorrow]);
await tag(tagName_jourRougeRestant, jourRouge);
}

getTempo(); // Appelle la fonction principale
return true;
jch
 
Messages : 7
Inscription : 14 Mai 2017

Re: [Store] Tempo EDF

Messagepar opa95 » 17 Oct 2024 08:01

Bonjour jch
jch a écrit:Si cela peut aider les programmeurs... voici le script utilisé sur la box domotique Homey Pro et qui fonctionne parfaitement.
Il faut peut-être l'adapter pour qu'il tourne sur Eedomus ??

Merci pour le partage d'information.
Nous avions déjà cette solution simple pour l'eedomus.
La version 4.0 actuelle fonctionne aussi parfaitement.
Elle présente toutefois certains avantages :
-Elle gère le bilan des jours blanc, bleu, rouge : ce que ne fait pas le script proposé par Homey Pro.
-Elle permet d'avoir les informations 2 heures plus tôt que l'Homey Pro (un peu après 6h au lieu de 8h).
-Elle est plus fiable car elle repose directement sur le service d'Enedis qu'Edf ne fait que reproduire (certes après un petit nettoyage) : l'utilisation de l'API edf suppose que les sites d'edf et d'enedis sont accessibles (l'autre jour je suis tombé sur un site "en maintenance") : actuellement, en pratique, la V4.0 ne fait aucun appel à l"api edf; en fait en ce moment, j'ai 4 versions qui tournent en test : la version publiée et 3 versions (une qui n'utilise que rte, une qui n'utilise que edf et une qui n'utilise que les sites Selectra).
-Elle récupère éventuellement l'information de 2 API et 3 sites internet en passant automatiquement d'une méthode à l'autre s'il y a échec des premiers essais.
-Dans les conditions normales, elle ne fait qu'un seul appel Internet par jour (aucun le samedi, car le dimanche est toujours BLEU).
-Elle récupère les tarifs et donne en temps réel le coût du kWh (en tenant compte de l'heure).
-Evidemment, elle est plus "lourde" en mémoire, mais il serait facile de nettoyer la version 4.0 pour obtenir une version "light" équivalente à l'Homey Pro (je pourrais le faire un jour, si ça intéresse quelqu'un et si j'ai 1 heure de libre).
Bonne journée :)
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 899
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar akua » 17 Oct 2024 10:36

Bonjour,

J'ai mis à jour le script, ça me remonte bien les couleurs du jour et de demain.
Par contre sur le décompte des jours, j'ai laissé les 3 canaux sans concaténation, et je vois que les compteurs rouge et blanc restent à 0.
Si je fais un test en séletionnant "Utiliser l'URL :" et avec "//decompte_rouge" dans le chemin XPath, ça affiche bien 0.
Pourtant sur les différentes URL des sites web, on voit bien le compteur de jours rouge à 22.

Est-ce qu'il y a quelque chose que j'aurais raté ? :oops:

Merci ! ;)
akua
 
Messages : 95
Inscription : 11 Déc 2017

Re: [Store] Tempo EDF

Messagepar opa95 » 17 Oct 2024 10:48

Bonjour akua
akua a écrit:Bonjour,

J'ai mis à jour le script, ça me remonte bien les couleurs du jour et de demain.
Par contre sur le décompte des jours, j'ai laissé les 3 canaux sans concaténation, et je vois que les compteurs rouge et blanc restent à 0.
Si je fais un test en séletionnant "Utiliser l'URL :" et avec "//decompte_rouge" dans le chemin XPath, ça affiche bien 0.
Pourtant sur les différentes URL des sites web, on voit bien le compteur de jours rouge à 22.

Est-ce qu'il y a quelque chose que j'aurais raté ? :oops:

Merci ! ;)

Ca dépend de ce que tu veux mettre dans compteur.
Soit le nombre de jours écoulés, soit le nombre de jours restants
Jours écoulés : //decompte_bleu
Jours restants : //reste_bleu
Total des jours de type bleu : //total_bleu (300 habituellement, mais 301 en 2028; si rien ne change)
:)
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 : 899
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar bleauge » 17 Oct 2024 12:24

Pour faire suite à mes messages d'hier;
Ce matin cela parait fonctionner.
Pour info, je ne sait pas si cela peux etre utile, voila ce qu'affichait EEDOMUS hier
Pièces jointes
tempo4_eedomus.jpg
tempo4_eedomus.jpg (30.35 Kio) Consulté 7349 fois
bleauge
 
Messages : 24
Inscription : 11 Juin 2019

Re: [Store] Tempo EDF

Messagepar akua » 17 Oct 2024 12:55

opa95 a écrit:Bonjour akua
Ca dépend de ce que tu veux mettre dans compteur.
Soit le nombre de jours écoulés, soit le nombre de jours restants
Jours écoulés : //decompte_bleu
Jours restants : //reste_bleu
Total des jours de type bleu : //total_bleu (300 habituellement, mais 301 en 2028; si rien ne change)
:)

Bonjour opa,
Ah bah oui quel boulet, merci pour la réponse, c'était pourtant clair :oops: :oops: :oops: !
akua
 
Messages : 95
Inscription : 11 Déc 2017

Re: [Store] Tempo EDF

Messagepar herve27h » 17 Oct 2024 23:35

opa95 a écrit:OK hervé
herve27h a écrit:Bonjour opa95,

Merci à toi pour ce script.
Je vais l'installer et le tester ;)

Tiens moi au courant :)


Bonjour Opa95,

Merci pour ton script.
Comme évoqué je l'ai déployé sur ma box et tout fonctionne correctement.
J'ai profité de tes remontées pour ajouter la situation HC/HP ainsi que les tarifs.
Vraiment au top, Merci ;)
herve27h
 
Messages : 15
Inscription : 04 Fév 2019

Re: [Store] Tempo EDF

Messagepar opa95 » 18 Oct 2024 14:26

Bonjour bleauge
bleauge a écrit:Pour faire suite à mes messages d'hier;
Ce matin cela parait fonctionner.
Pour info, je ne sait pas si cela peux etre utile, voila ce qu'affichait EEDOMUS hier

Je n'ai jamais eu ce message et je ne peux rien en déduire car le message est tronqué (%3...). Pour que je puisse faire un diagnostic, il aurait fallu passer en mode test et compléter la ligne de commande avec
Code : Tout sélectionner
&timer=0.01&debug=1
(impose une lecture immédiate [0.01minute] et un affichage du déroulement) : La copie de la fenêtre permettrait peut-être de connaître la raison du problème.
En cas de comportement de ce genre, tu peux effectuer un "reset" des mémoires; 3 solutions
-Si tu as créé un actionneur pour "Demain" ; Cliquer sur "reset"
-Sinon, ouvrir le panneau d"aujourdhui" et passer en mode "test" : ajouter à la ligne de commande
Code : Tout sélectionner
&reset=1
ou remplacer
Code : Tout sélectionner
&reset=
par
Code : Tout sélectionner
&reset=1
.
-Sinon, ouvrir le panneau d"aujourdhui" et mettre en VAR3 une valeur négative différente de celle qui existe -> -1 ou -2 : cela produira un reset une seule fois (on peut donc le laisser comme cela). Ca fonctionne seulement si la ligne de commande a été modifiée en
Code : Tout sélectionner
http://localhost/script/?exec=edf_tempo.php&tarifs=[VAR1]&timer=[VAR2]&reset=[VAR3]

Signale si ça se reproduit.
:)
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 : 899
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar opa95 » 19 Oct 2024 09:34

Bonjour tous
Reçu ce matin un mp de Jordi me signalant un problème lorsqu'il a utilisé le lien de mise à jour du script.
Le script actuellement en ligne pour la "mise à jour" n'est pas le mien, il utilise (mal) l'api edf avec l'instruction
https://particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant=2024-10-19&_=1729321120879
qui renvoie :
RESTEASY003210: Could not find resource for full path: https://particulier.edf.fr/services/res ... 9321120879
Je vais enquêter...
Le début de mon script renvoie
Code : Tout sélectionner
<?xml version="1.0" encoding="UTF-8"?>
<!--
-->
<root>
  <tempo>
    <version>V4.0</version>
    <maintenant>BLEU</maintenant>
    <hchp>HP</hchp>

Et pas
Code : Tout sélectionner
    <?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>
    <decompte_bleu>-1</decompte_bleu>
    <decompte_blanc>-1</decompte_blanc>
    <decompte_rouge>-1</decompte_rouge>
    <type>tempo</type>
    </tempo>
    <debug>
    <colors>RESTEASY003210: Could not find resource for full path: https://particulier.edf.fr/services/res ... 9321120879</colors>
    <jours>ND</jours>
    <ms>1729321120879</ms>
    <etat>ND</etat>
    <source>mémoire</source>
    <message></message>
    </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 : 899
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar opa95 » 19 Oct 2024 10:31

Bonjour tous
Le "problème" est résolu, jordi a rechargé l'ancienne version qui fonctionne avec l'ancien lien vers edf qui n'est plus fonctionnel chez edf.
La nouvelle version n'est pas en ligne sur le Store (je vais voir avec Merguez07).
Bonne journée :)
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 899
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar bleauge » 21 Oct 2024 06:29

Bonjour,

Merci opa95
bleauge
 
Messages : 24
Inscription : 11 Juin 2019

Re: [Store] Tempo EDF

Messagepar enr37 » 23 Oct 2024 19:18

hello,
quand je lis tous vs postes, n'étant pas venu depuis un bout de temps, je me demande alors comment cela fonctionne désormais lorsqu'un script est validé par son auteur (ce qui semble le cas mais 2 jours après, rien dans le store).
Du coup, c'est quoi le process ? Ca doit être validé par la communauté ?La team eedomus ? je ne comprends pas le "trou" entre le dev qui dit, c'est ok et le moment où il est mis en ligne. Ce délai est dû a quoi ?
merci
actionnaire de photoshop. partageur des 450 icones sur abavala et dans votre box.
Le savoir ne vaut que s'il est partagé par tous !
enr37
 
Messages : 1359
Inscription : 06 Juin 2013
Localisation : 37

Re: [Store] Tempo EDF

Messagepar opa95 » 23 Oct 2024 19:47

Bonsoir enr37
enr37 a écrit:hello,
quand je lis tous vs postes, n'étant pas venu depuis un bout de temps, je me demande alors comment cela fonctionne désormais lorsqu'un script est validé par son auteur (ce qui semble le cas mais 2 jours après, rien dans le store).
Du coup, c'est quoi le process ? Ca doit être validé par la communauté ?La team eedomus ? je ne comprends pas le "trou" entre le dev qui dit, c'est ok et le moment où il est mis en ligne. Ce délai est dû a quoi ?
merci

Normalement les développeurs d'applications se chargent (bénévolement) de rédiger le script, et de créer les fichiers permettant de créer les délices.
Ensuite je crois qu'il y a un certain delai pour le mise effective a disposition sur le store.
Il se trouve que j'ai eu l'opportunité de modifier ou développer un certains nombre d'applications pour mes besoins personnels ou parce que ça m'intéressait, mais je n'ai pas effectué la mise en place sur le store car je n'ai jamais eu le temps de me pencher sur la procédure qui a donc été réalisée par divers auteurs (merci Merguez07, dommarion, ...)
Je considère d'ailleurs que c'est au créateur initial d'accepter les modifications des scripts et de faire ou autoriser les mises à jour : il n'est pas très raisonnable que n'importe qui puisse modifier un produit sans l'accord des auteurs (c'est en quelque sorte respecter le droit d'auteur).
J'ai donc mis à disposition de la communauté le script et tiens à disposition la documentation.
J'ai envoyé à Merguez07 les fichiers et la trame du fichier de création qui nécessite une vérification avant mise en ligne, mais n'ai pas de ses nouvelles depuis plus d'un mois : j'espère qu'il va bien et est juste indisponible en ce moment.
Je n'ai pas le temps de tester la création du device en ce moment, car j'ai d'autres occupation et un autre script que j'ai du suspendre trop longtemps.
Si quelqu'un est prêt à assurer la modification du device, il sera le bienvenu.
:)
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 : 899
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Store] Tempo EDF

Messagepar opa95 » 24 Oct 2024 15:06

Bonjour
Après les tests plus approfondis en situation réelle, il reste 1 double erreur (en attendant les tests avec de vrais jours "blanc" et "rouge"). La lecture ne se fait pas le dimanche matin.
Il faut modifier les lignes 202 et 344, en remplaçant (autrement dit en supprimant le
Code : Tout sélectionner
break;
, ne pas toucher au break des lignes précédentes 201 et 343)
Code : Tout sélectionner
case 'Sun' : $mem['todayColor'] = $colors['rte'][1];break;

par
Code : Tout sélectionner
case 'Sun' : $mem['todayColor'] = $colors['rte'][1];

Voici le script corrigé, mais qui sera validé dimanche matin
Code : Tout sélectionner
<?php
/*****************************************************************************
** Script Tempo pour eedomus (Documentation : voir fichier md)
** Script qui permet de récupérer au format XML les données Tempo avec l'api rte, edf et sites Selectra (3 sites) :
** Les données sont stockées en mémoire et le polling sur les sites est réglé par la valeur de 'timer' : appels sur les sites seulement si données manquantes.
** Polling automatique au passage à 0h00, 6h00, 6h15, 6h30*, 8h00*, 11h30*, 12h15* et 22h (* si necessaire). Pour un fonctionnement efficace, on peut régler la fréquence des devices à une valeur faible (2 ou 5 minutes).
** Un polling complémentaire, est réglé par timer pour limiter les appels successifs des devices (timer = 20 par défaut)
** On peut restreindre l'utilisation des sources : src absent ou 0 ou 7 toutes les sources, 1 rte, 2 edf, 3 rte+edf, 4 selectra, 5 rte + selectra, 6 edf + selectra
** Il n'y a que quelques appels par jour : en général 1 (0 le samedi) plus 1 pour les tarifs (journalier ou hebdomadaire ou mensuel), quel que soit le nombre de devices créés. Le reste du temps les appels renvoient le contenu de la mémoire et gérent l'état actuel (0h, 6h et 22h).
****************************************************************************
**  - URL de la Requête 
**:   - http://localhost/script/?exec=edf_tempo.php
**    - ou http://localhost/script/?exec=edf_tempo.php&tarifs=[VAR1]&timer=[VAR2]&reset=[VAR3]
** avec
** VAR1 : tarifs (Bleu valeurs,Blanc valeurs, rouge valeurs) valeurs (hp,hc ou hc,hp) ou période de mise à jour [D ou W ou M] (Day,Week,Month) ou vide W par défaut (ex 0.1296,0.1609,0.1486,0.1894,0.1568,0.7562, ou W)
** VAR2 : vide ou durée du timer (minutes) 20 par défaut, si <0 lecture immédiate
** VAR3 : reset (0 par défaut, 1 sinon, si négatif 1 seul reset, sauf si changement de valeur négative) effacement mémoire et relecture des données
** - Fréquence de la Requête : 2 ou 5 pour mettre à jour l'affichage plus souvent lors des passage programmés; le polling réel est réglé par 'timer'
** autres commandes ajouter à la fin de la ligne de commande ou à la suite d'une variable :
** source &src=1 [0..7] (7 par défaut)
** nom mémoire : &mem=nom (OLDtempo par défaut)
** mode debug : &debug=0 (0 par défaut,-1,1) (-1 infos, 1 tout)
** modification état : &setstate=chp:val avec chp = [A,D,C,T] (Aujourdhui, Demain, Compte, Tarif), ou vide; pour chp=A ou D val = ND,BLUE,WHITE,RED; possible si manuel = 1 (0 sinon)
** manuel : &manuel=1 (par défaut) ou 0 (autorise setstate)
** simul : décalage temporel (heures décimales) : &simul=yyyyy (0 par défaut)
****************************************************************************
Resultats : //champ ou /root/tempo/champ (ou /root/debug/champ)
voir les champs en mode test ou dans sdk_print
********************************************************************************
urls compatibles : (normalement rte dès 6h15, Selectra dès 6h30, edf dès 8h)
api rte : https://www.services-rte.com/cms/open_data/v1/tempo?season=2024-2025
api edf : https://www.api-couleur-tempo.fr/api/joursTempo?periode=2024-2025,
autres (tarifs) la valeur #selectra ou #selectra2 est adaptée au site
  https://selectra.info/energie/fournisseurs/edf/tempo#selectra, 
  https://www.fournisseurs-electricite.com/edf/tarifs/tempo#selectra,
  https://prix-elec.com/tarifs/fournisseurs/edf/tempo#selectra2
******************************************************************************
** Evolution des versions :
** 2017-07-26 (DjMomo)    :V1.0 - Version initiale
** ....
** V4.0 : Restriction à Tempo, utilisation des API Rte, Edf et Selectra (opa95 et Merguez07, 2024-10-01) minimisation des appels (mise en cache local),  état du jour, du lendemain, actuel (couleur et tarif), décompte des jours (bleus, blancs, rouges)
*******************************************************************************/

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

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

//necessary
$mem_name = getArg('mem',false,MEM);
$reset_   = getArg('reset',false);//réinitialisation totale
if ($reset_=='') $reset_=0;
$timer_   = getArg('timer',false);//
if ($timer_=='') $timer_=DEFTIMER;
$timer    = abs(60*$timer_);// secondes
$simul    = getArg('simul',false,0);
$time_now = time() + $simul;
$debug    = getArg('debug',false,0);
$manual_  = getArg('manuel',false,MANUAL);
$action = '';
$set_state_  = strtoupper(getArg('setstate',false,''));
if ($set_state_ == ''){$set_state[0] = '';$set_state[1] = 0;
}else{
  $set_state = explode(':',$set_state_);
  if (!in_array($set_state[0],array('A','D','C','T'))) $set_state[0] = '';
  if (count($set_state)<2) $set_state[1] = '';
  //if ($set_state[1] == 'ND') $set_state[1] = '';
  $action = 'setstate';
}
if ($debug >0) var_dump($_GET);

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

//reset?
if ('' == $mem = loadVariable($mem_name)) $reset = 1;
else {
  if ($reset_>0) {$reset = 1;
  }elseif ($reset_<0) {//reset_ < 0
    $reset = ($reset_  && ($reset_ != $mem['st']['reset']))?1:0;//reset change de valeur
  }
  if (($time_now - $mem['fileTimestamp'])>86400) $reset = 1;//too old file
  if (!in_array($mem['todayColor'],$colors['rte'])) $reset=1;
  if (array_key_exists('manual',$mem['st'])) {
    $manual = ($manual_!='')?$manual_:$mem['st']['manual'];
  }else $manual = MANUAL;
}
if ($reset) {
  sdk_init($mem_name,$time_now);
}//poll print die
else $mem['st']['reset'] = $reset_;

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

if ($time_now < $mem['fileTimestamp']) { // simulation (recul)
  $action = 'simul';
  $timer  = -0.01;//minutes partial reset
}else{//search for modifications
  $today_week = date('D',$time_now);
  $hour_now   = date('His',$time_now)+0;
  $hour_file  = date('His',$mem['fileTimestamp'])+0;
  $mem['todayDate']  = sdk_day($time_now);
  $mem['tomoroDate'] = sdk_day($time_now,1);
  if ($today_week != $mem['todayWeek']) {//midnight
    $action = 'midnite';
  }elseif (($hour_file<TSTART) && ($hour_now>=TSTART)) {
    $action = 'read';$adjustFile=1;
  }elseif (($hour_file<TSTOP) && ($hour_now>=TSTOP)) {
    $action = 'read';$adjustFile=1;
  }else{
    $actions = array(TRTE=>'startrte',TSEL=>'startalt',TEDF=>'startedf',TMAT=>'poll',NOON=>'poll');
    foreach (array(TRTE,TSEL,TEDF,TMAT,NOON) as $timeOut){
      if (($hour_file<$timeOut) && ($hour_now>=$timeOut)){
        $action = $actions[$timeOut];break;}
    }
  }
  if ($action == ''){
    if (($time_now - $mem['fileTimestamp'])>$timer) {$action = 'timer';
    }elseif ($timer_<0) {$action = 'timer_';}
    else {$action = 'read';}
  }
}
switch ($action){
  case 'read' : break;
  case 'midnite' :
    $month_now = date('m',$time_now);
    $year_now = date('Y',$time_now);
    $hour_file_ = 0;
    $action = 'read';
    $mem['todayWeek'] = $today_week;
    if ($month_now>=9) $season = $year_now.'-'.($year_now+1);
    else $season = ($year_now-1).'-'.$year_now;
    $mem['count']['rte'] = $mem['count']['edf'] = $mem['count']['alt1'] = $mem['count']['alt2'] = $mem['count']['alt3'] = 0;//reset counters
    $mem['st']['tomoro'] = $mem['st']['count'] = 0;
    if ($mem['todayColor'] != $colors['rte'][0]) //!='ND'
      $mem['yesterColor'] = $mem['todayColor'];//oldvalue
    if (!in_array($mem['tomoroColor'],$colors['rte'])) $mem['tomoroColor'] = $colors['rte'][0];//ND
    elseif ($mem['tomoroColor'] != $colors['rte'][0]){ //!='ND'
      $mem['todayColor'] = $mem['tomoroColor'];//oldvalue
      $mem[$mem['todayColor']]['dec']++;
    }
    switch ($mem['todayWeek']) {
      case 'Sat' :
        $mem['tomoroColor'] = $colors['rte'][1];//Sunday
        $mem['st']['tomoro'] = $mem['tomoroDate'];
        break;
      case 'Sun' : $mem['todayColor'] = $colors['rte'][1];
      default : $mem['tomoroColor'] = $colors['rte'][0];
    }
    $mem[$mem['todayColor']]['rem'] = $mem[$mem['todayColor']]['tot'] - $mem[$mem['todayColor']]['dec'];
    $adjustFile = 1;
    break;
  default :
    $req_fields = array('tomoro' => 0,'count' => 0,'rates' => 0);//requested fields //opa95
    if ($action != 'setstate'){
      if ($hour_now < TRTE) $src['rte'] = 0;
      if ($hour_now < TSEL) $src['alt'] = 0;
      if ($hour_now < TEDF) $src['edf'] = 0;}
    $adjustFile = 1;
    switch ($action){
      case 'timer' :
        if ($mem['st']['tomoro'] == $mem['tomoroDate']){
          $action = 'read';
          break 2;
        }
        $req_fields['tomoro'] = $req_fields['count'] = 1;
        break;
      case 'timer_' :
        $mem['st']['rates'] = 0;
        $req_fields['rates'] = 1;
      case 'simul' :
        $mem['st']['tomoro'] = $mem['st']['count'] = 0;
        $req_fields['tomoro'] = $req_fields['count'] = 1;
        break;
      case 'startalt' : $req_fields['rates'] = 1;
      case 'startedf' :
      case 'startrte' :
        if (($mem['st']['tomoro'] != $mem['tomoroDate']) || ($mem['st']['count'] != $mem['tomoroDate']) || $req_fields['rates']) {
          $req_fields['tomoro'] = $req_fields['count'] = 1;
        }
        break;
      case 'setstate' : $action ='read';
        if ($set_state[0] == 'D') {
          $req_fields['tomoro'] = $req_fields['count'] = 1;
        }
        break;
      case 'poll' : break;
      default : $adjustFile = 0;
    }
    $result = sdk_poll($action,$req_fields);
    $adjustFile = ($result==1)?1: $adjustFile;
}
sdk_print($adjustFile);//die

function sdk_now()
{
  global $time_now;
  global $mem;
  $hour = date('His',$time_now);
  $mem['hchp'] = (($hour<TSTART) || ($hour>TSTOP))?'HC':'HP';
  if ($hour<TSTART) {
      $mem['nowDate']  = $mem['yesterDate'];
      $mem['nowColor'] = $mem['yesterColor'];
  }else{
      $mem['nowDate']  = $mem['todayDate'];
      $mem['nowColor'] = $mem['todayColor'];
  }
}

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

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

  $month = date('m',$time);
  $year = date('Y',$time);
  $nb_blue = 365-NBW-NBR;
  if ($month>=9) {
    $season = $year.'-'.($year+1);
    $nb_blue += date('L',strtotime('next year'));
  }else{
    $season = ($year-1).'-'.$year;
    $nb_blue += date('L',$time);
  }
  deleteVariable($mem_name);
  $mem = array ('version' => VER, 'season'=>$season,
    'todayDate'=>0,'todayColor'=>'ND','tomoroDate'=>0,'todayWeek'=>'x','tomoroColor'=>'ND',
    'yesterDate'=>0,'yesterColor'=>'ND',
    'nowDate'=>0,'nowColor'=>'ND',
    'hchp' => 'HP', 'tarifsRef' => 'ND',
    'BLUE' => array('rem'=>$nb_blue,'dec'=>0,'tot'=>$nb_blue,'HC'=>'0.1296','HP'=>'0.1609'),
    'WHITE' => array('rem'=>NBW,'dec'=>0,'tot'=>NBW,'HC'=>'0.1486','HP'=>'0.1894'),
    'RED' => array('rem'=>NBR,'dec'=>0,'tot'=>NBR,'HC'=>'0.1568','HP'=>'0.7562'),
    'ND' => array('HC'=>'0','HP'=>'0'),
    'ratePeriod'=>'W','count' => array('rte' => 0,'edf' => 0,'alt1' => 0,'alt2' => 0,'alt3' => 0),
    'st'=>array('tomoro'=>'0','count'=>0,'rates'=>-1,'reset'=>0,'fileTime'=>-1, 'manual'=>MANUAL),
   'fileTimestamp' => '0',
  ) ;
  $mem['st']['fileTime'] = date('His',$time_now);
  $adjustFile = 1;
  $mem['todayDate'] = date('Y-m-d',$time);
  $mem['tomoroDate'] = sdk_day($time,1);
  $mem['yesterDate'] = sdk_day($time,-1);
  $mem['todayWeek'] = date('D',$time);
  if (strpos($mem['todayDate'],'09-01'))
    $mem['yesterColor'] = $mem['todayColor'] = $colors['rte'][1];
  switch ($mem['todayWeek']) {
    case 'Sat' : $mem['tomoroColor'] = $colors['rte'][1];break;//dimanche
    case 'Sun' : $mem['todayColor'] = $colors['rte'][1];
    default : $mem['tomoroColor'] = $colors['rte'][0];
  }
  if ($reset_<0) $mem['st']['reset'] = $reset_;
  sdk_init_tarifs();
  if ($debug >0) echo "Action : init\n";
  $req_fields['tomoro'] = $req_fields['count'] = $req_fields['rates'] = 1;
  $result = sdk_poll('reset',$req_fields);
  $adjustFile = ($result==1)?1: $adjustFile;
  sdk_print();//die
}

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

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

function sdk_poll($action = 'read',&$req_fields)
{
  global $src;
  global $mem;
  global $reset_;
  global $time_now;
  global $colors;
  global $debug;
  global $adjustFile;
  if ($action=='reset'){
    $mem['st']['tomoro'] = $mem['st']['count'] = $mem['st']['rates']= 0;
    $req_fields['tomoro'] = $req_fields['count'] = $req_fields['rates'] = 1;
    $mem['st']['reset'] = $reset_;
  }
  if ($debug) echo "Polling : $action\n";
  if ($src['rte']) {
    $result = sdk_poll_rte_edf('rte',$req_fields,sdk_day($time_now,1));
    $adjustFile = ($result)?1: $adjustFile;
  }
  if ($src['edf']) {
    $result = sdk_poll_rte_edf('edf',$req_fields,sdk_day($time_now,1));
    $adjustFile = ($result==1)?1: $adjustFile;
  }

  if ($src['alt']){
    switch($mem['ratePeriod']){
      case 'W' : $alt = date('W',$time_now);break;
      case 'M' : $alt = date('m',$time_now);break;
      case 'D' : $alt = date('z',$time_now);break;
      default  : $alt = -1;
    }
    if ((($mem['st']['tomoro'] != $mem['tomoroDate']) || ($mem['st']['count'] != $mem['tomoroDate']) || ($mem['st']['rates'] != $alt))) {
      $result = sdk_poll_alt($alt,$req_fields);
      $adjustFile = ($result==1)?1: $adjustFile;
    }
  }
  foreach ($colors['rte'] as $key => $col){
    if (!$key) continue;
      $mem[$col]['rem'] = $mem[$col]['tot'] - $mem[$col]['dec'];
  }
  return $adjustFile;
}

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

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

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

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

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

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

          if ($req_fields['tomoro'] && ($mem['st']['tomoro'] != $mem['tomoroDate'])){
            $mem[$day0.'Color'] = $color0;
            $mem[$day1.'Color'] = $color1;
            if ($day1 == 'tomoro') $mem['st']['tomoro'] = $mem['tomoroDate'];
          }
          // bilan
          $sep2    = array(array('</'),array('##'));
          $sep    = array('<strong>');
          $nbTot = $mem['BLUE']['tot']+$mem['WHITE']['tot']+$mem['RED']['tot'];
          for ($i =0;$i<3;$i++) {
            $temp = strtolower(trim(sdk_multiextract($block,$sep,$sep2,$start)));
            //"289 jours tempo bleus"
            $nb = (int)$temp;
            $nbTot -= $nb;
            if ($req_fields['tomoro'] && ($mem['st']['count'] != $mem['tomoroDate'])){
              foreach ($colors['alt'] as $key => $col){
                if (strpos($temp,$key)>1) {
                  $mem[$colors['alt'][$key]]['rem'] = $nb;
                  $mem[$colors['alt'][$key]]['dec'] = $mem[$colors['alt'][$key]]['tot'] - $nb;
                  break;
                }
              }
          }
          $nbJours = (strtotime($mem['todayDate'])-strtotime(substr($mem['season'],0,4).'-08-31'))/86400;
          if ($nbTot == $nbJours) $mem['st']['count'] = $mem['tomoroDate'];
        }
        if ($req_fields['rates'] && ($mem['st']['rates'] != $alt)){
          $sep2  = array(array('<!-- END'),array('</tr'));
          $sep   = array('<th>Abonnement','<strong>','<strong>','</td>');
          $start = 0;
          $block = trim(strtolower(sdk_extract($respAlt,$sep,$sep2,$start,false,false)));//pas de MaJ $start
          $sep2  = array('&nbsp;');
          $sep   = array('<td>');
          $tarifs = 1;
          foreach ($colors['alt'] as $key => $col){
            if ($col==$colors['rte'][0]) continue;
            $temp = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
            if ($temp>0) $mem[$col]['HC'] = $temp;
              else $tarifs = 0;
            $temp = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
            if ($temp>0) $mem[$col]['HP'] = $temp;
              else $tarifs = 0;
          }
          if ($tarifs) {
            $mem['st']['rates'] = $alt;
            $mem['todayWeek'] != $alt;
          }
        }
        break;
      case 'selectra2' :
        $sep2  = array(array('<th>12 kVA'));
        $sep   = array('list-card--stretch">');
        $start = 0;
        $block = trim(sdk_extract($respAlt,$sep,$sep2,$start,false,false));//pas de MaJ $start
        $block = str_replace(array('bleus','blancs','rouges'),array('bleu','blanc','rouge'),$block);
        $err_num = 1;
        if (strlen($block) == 0) {$erreur = $err_num;break;}
        //lecture block
        //extraction infos Aujourd'hui
        // date
        $sep  = array('card__title">');
        $sep2 = array('</h');
        $temp  = trim(str_replace(array('Tempo','/'),' ',sdk_multiextract($block,$sep,$sep2,$start)));//MaJ $start //"vendredi 27 09"
        $day = explode(" ",$temp);
        $date = substr($mem['todayDate'],0,4).'-'.$day[2].'-'.$day[1];//"2024-09-11"
        $day0='today';$day1='tomoro';
        if ($date == $mem['yesterDate']) {$day0='yester';$day1='today';}
        //couleur0
        $sep2 = array('<');
        $sep  = array('span>');// couleur
        $color0 = $colors['alt'][strtolower(trim(trim(trim(sdk_multiextract($block,$sep,$sep2,$start)),'Tempo')))];
        //extraction infos demain
        $sep  = array('card__title">');
        $sep2 = array('</h');
        $temp  = trim(str_replace(array('Tempo','/'),' ',sdk_multiextract($block,$sep,$sep2,$start)));//MaJ $start //"vendredi 27 09"
        $day = explode(" ",$temp);
        $date = substr($mem['tomoroDate'],0,4).'-'.$day[2].'-'.$day[1];//"2024-09-11"
        //couleur0
        $sep2 = array('<');
        $sep  = array('span>');// couleur
        $color1 = $colors['alt'][strtolower(trim(trim(trim(sdk_multiextract($block,$sep,$sep2,$start)),'Tempo')))];// couleur1

        if ($req_fields['tomoro'] && ($mem['st']['tomoro'] != $mem['tomoroDate'])){
          $mem[$day0.'Color'] = $color0;
          $mem[$day1.'Color'] = $color1;
          if ($day1 == 'tomoro') $mem['st']['tomoro'] = $mem['tomoroDate'];
        }
        // bilan
        $sep2    = array(array('</p'),array('##'));
        $sep    = array('col-md-6">');
        if ($req_fields['count'] && ($mem['st']['count'] != $mem['tomoroDate'])){
          $mem['RED']['rem'] = trim(sdk_multiextract($block,$sep,$sep2,$start));
          $mem['RED']['dec'] = $mem['RED']['tot'] - $mem['RED']['rem'];
        }
        if ($req_fields['rates'] && ($mem['st']['rates'] !=  $alt)){
          $sep  = array(array('kVA</th>','</td>'));
          $sep2 = array('kVA');
          $temp = trim(sdk_multiextract($block,$sep,$sep2,$start));
          $sep2  = array('&nbsp;');
          $sep   = array('<td>');
          $tarifs = 1;
          foreach ($colors['alt'] as $key => $col){
            if ($col==$colors['rte'][0]) continue;
            $temp = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
            if ($temp>0) $mem[$col]['HC'] = $temp;
              else $tarifs = 0;
            $temp = trim(strtolower(sdk_multiextract($block,$sep,$sep2,$start)))+0;//MaJ $start
            if ($temp>0) $mem[$col]['HP'] = $temp;
              else $tarifs = 0;
          }
          if ($tarifs) {$mem['st']['rates'] = $alt;}
        }
        break;
      }
      if ($debug >0) {echo"Polling : alt$iurl\n";var_dump($mem['st']);}
    }
  }
  return $ret;
}

?>
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 : 899
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 18 invité(s)