Accès à la couleur du jour Tempo EDF (électricité de France)

A priori ca semble comme ça qu’il faut faire ?

Oui :wink:

Bonjour a tous,

Depuis plusieurs jours la couleur J+1 ne fonctionne plus ?

Merci de votre aide,

Alexandre

Bonjour Alexandre,

Est-ce que l’appel à la fonction qui met à jour les différentes variable est bien exécuté après 11:00 du matin ?

Je viens de tester (à 18:05) et c’est ok pour moi.

Jacques

Bonjour Jacques,
En effet mon script s’éxecutais à 8h le matin.
Jusqu’ici ca fonctionnait très bien, mais en effet, EDF communique officiellement à 11h :wink:
Merci pour la réponse.
Cdt
Alexandre

Bonjour,
Tout d’abord merci à tout ceux qui oeuvre pour la communauté.

Je reviens sur le script de sebyldino. Lorsque je le teste dans Homescript, ça marche bien:
image

Mais lorsque je le mets dans un flow, je créé d’abord les variables Jour J et Jour J+1 puis je lance le script avec l’instruction Run. Le souci que j’ai c’est que les variables Jour J et Jour J+1 ne se mette pas à jour.
J’ai essayé avec un autre script et c’est pareil. Je suppose donc qu’il y a un truc que je ne fais pas bien.
Est-ce que quelqu’un pourrait me dire SVP.
Merci beaucoup

Bonjour,

Peux tu partager le script que tu utilises stp. (mets le entre balise script “</>” dans ta réponse ).

let today = new Date()
let todayFormatted = today.toISOString().split('T')[0]

const res = await fetch('https://particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant='+ todayFormatted)

if (!res.ok) {
  throw new Error(res.statusText);
}

// Get the body JSON
const body = await res.json();

var EDFCouleurJour = (`${body.couleurJourJ}`)
var EDFCouleurDemain = (`${body.couleurJourJ1}`)

console.log(EDFCouleurJour)
console.log(EDFCouleurDemain)

await tag('JourJ',EDFCouleurJour);
await tag('JourJ+1', EDFCouleurDemain);

return true;

J’ai supprimé l’espace dans JourJ car je me suis dis que c’était peut-être ça ? (mais non visiblement)
J’ai ajouté l’instruction console pour voir le résultat dans la console.

Merci de ton aide

Pour moi le script fonctionne.


J’ai lancé le script que tu viens de partager et j’ai bien les tags. (Tes tags sont ceux sans espace).
Un redémarrage de Homeyscript ou de Homey peut être.

J’ai compris mon erreur:
Je regarde le contenu de la variable en cliquant sur Variables situé dans la page des flows:
image

Je vois que toi tu regardes la valeur de la variable en cliquant sur une variable située sur l’instruction.
Et là du coup ça marche.
En fait je ne regardais la valeur de la variable pas au bon endroit.

Merci beaucoup :+1:
Bonne journée

1 Like

Bonjour;

Je trouve ce système vraiment bien malheureusement je suis confronté à un problème. Je suis avec un contrat EJP et pas Tempo. Malheureusement je n’arrive pas à trouver quelque part le résultat via API afin d’avoir le même comportement que pour le script EDFTempo et c’est bien dommage.
Je suis pas des plus à l’aise sur ce domaine, peut-être que quelqu’un pourra apporter une solution. :slight_smile:

Merci pour toute aide apportée !

Une méthode un peu “batarde” consiste à aller lire le code source d’un site web avec Homeyscript:

Ça fonctionne mais si le site effectue des mise à jour ça peu coincer un jour…

Je partage le code.

const url = 'https://www.hellowatt.fr/ejp-demain-observatoire-edf/';
const startExpression1 = '<span class="is-ejp">';
const endExpression1 = '</span>';
const startExpression2 = '<div class="remaining-day-right">';
const endExpression2 = '</span>';
var counter = 0;
var today;
var tomorrow;
var remainingDays;



//==============================================
//         Get text between expression
//==============================================
function extractText(text, startExpression, endExpression) {
  const regex = new RegExp(`${startExpression}(.*?)${endExpression}`, 'gs');
  let match;

  while ((match = regex.exec(text)) !== null) {
    const result = match[1].trim();
    counter++;
    if (counter == 1) today = result;
    if (counter == 2) tomorrow = result;
  }
  tagDays();
}



//==============================================
//    Get text with number between expression
//==============================================
function extractTextWithNumber(text, startExpression, endExpression) {
  const regex = new RegExp(`${startExpression}(.*?\\d.*?)${endExpression}`, 'gs');
  const match = regex.exec(text);
  if (match !== null) {
    const result = match[1].trim();
    return result;
  }
  return null;
}



//==============================================
//                Extract number
//==============================================
function extractNumber(inputString) {
  const digitsRegex = /\d+/g;
  const matches = inputString.match(digitsRegex);

  if (matches !== null) {
    remainingDays = matches.join('');
    tagRemainingDays();
    return matches.join('');
  }

  return null;
}


//==============================================
//                  FETCH URL
//==============================================
fetch(url)
  .then(response => response.text())
  .then(html => {
    extractText(html, startExpression1, endExpression1);
    const stringWithNumber = extractTextWithNumber(html, startExpression2, endExpression2);
    extractNumber(stringWithNumber);
  })
  .catch(error => console.error('Error:', error));


  
async function tagDays() {
  await tag("EJP-Jour J", today);
  await tag("EJP-Jour J+1", tomorrow);
  log('Today:', today);
  log('Tomorrow:', tomorrow);

}

async function tagRemainingDays() {
  await tag("EJP Rouge Restants", Number(remainingDays));
  log("Remainig days:", remainingDays);
}

A noter que d’après EDF: " En période EJP, la couleur du lendemain est actualisée en général tous les jours la veille entre 13h et 15h (sauf cas exceptionnel)."
Et que la période est du “1er novembre 2023 au 31 mars 2024

1 Like

Punaise, un grand merci à toi ça fonctionne nickel et je pense que ça va m’aider beaucoup à faire quelques économies. J’ai essayé de comprendre le pourquoi du comment mais…pas simple.
J’ai créer un fllow (Advanced) dans la continuité du script et aimerais le partager afin de peut-être aider quelqu’un dans ma situation et pourquoi pas avoir des retours dessus mais je trouve pas comment le faire :sweat_smile: .

Un petit exemple:

Je peux modifier le code juste pour faire un tag “oui/non”

image

const url = 'https://www.hellowatt.fr/ejp-demain-observatoire-edf/';
const startExpression1 = '<span class="is-ejp">';
const endExpression1 = '</span>';
const startExpression2 = '<div class="remaining-day-right">';
const endExpression2 = '</span>';
var counter = 0;
var today;
var tomorrow;
var todayIsRed;
var tomorrowIsRed;
var remainingDays;



//==============================================
//         Get text between expression
//==============================================
function extractText(text, startExpression, endExpression) {
  const regex = new RegExp(`${startExpression}(.*?)${endExpression}`, 'gs');
  let match;

  while ((match = regex.exec(text)) !== null) {
    const result = match[1].trim();
    counter++;
    if (counter == 1) today = result;
    if (counter == 2) tomorrow = result;
  }
  tagDays();
}



//==============================================
//    Get text with number between expression
//==============================================
function extractTextWithNumber(text, startExpression, endExpression) {
  const regex = new RegExp(`${startExpression}(.*?\\d.*?)${endExpression}`, 'gs');
  const match = regex.exec(text);
  if (match !== null) {
    const result = match[1].trim();
    return result;
  }
  return null;
}



//==============================================
//                Extract number
//==============================================
function extractNumber(inputString) {
  const digitsRegex = /\d+/g;
  const matches = inputString.match(digitsRegex);

  if (matches !== null) {
    remainingDays = matches.join('');
    tagRemainingDays();
    return matches.join('');
  }

  return null;
}


//==============================================
//                  FETCH URL
//==============================================
fetch(url)
  .then(response => response.text())
  .then(html => {
    extractText(html, startExpression1, endExpression1);
    const stringWithNumber = extractTextWithNumber(html, startExpression2, endExpression2);
    extractNumber(stringWithNumber);
  })
  .catch(error => console.error('Error:', error));


  
async function tagDays() {
  if(today == "Jour rouge EJP") todayIsRed = true;
  else todayIsRed = false;
  if(tomorrow == "Jour rouge EJP") tomorrowIsRed = true;
  else tomorrowIsRed = false;
  await tag("EJP-Jour J", today);
  await tag("EJP-Jour J+1", tomorrow);
  await tag("EJP Jour-J rouge", todayIsRed);
  await tag("EJP Jour-J+1 rouge", tomorrowIsRed);
  log('Today:', today);
  log(todayIsRed);
  log('Tomorrow:', tomorrow);
  log(tomorrowIsRed);

}

async function tagRemainingDays() {
  await tag("EJP Rouge Restants", Number(remainingDays));
  log("Remainig days:", remainingDays);
}

Oui voilà avec la carte ET est celle que je pensais utilisé comme tu le montres. Je pense, pour le moment, adopter des répercussions que les jours Rouge (Coupure de la PAC et chauffe avec insert uniquement). Pour avoir le côté visuel rapidement sur l’app, je réfléchis à créer un bouton virtuel qui sera actionné en cas de jour EJP ou non et en faire une conditions par la même occasion dans mes autres flows, notamment chauffage.

Concernant l’ajout du tag “Oui/Non” , lorsque je copie et test ton code, cet ajout ne fonctionne pas et me retourne un “False”.

Capture d'écran 2023-12-07 152718

Oui c’est nomal. C’est la valeur du tag oui/non. (true = oui, false = non).
Si c’est un jour rouge ce sera true (tu verra “oui” dans le tag), si c’est un jour non rouge ce sera false (tu verra non dans le tag).

Comme ceci si tu préfères:

image

const url = 'https://www.hellowatt.fr/ejp-demain-observatoire-edf/';
const startExpression1 = '<span class="is-ejp">';
const endExpression1 = '</span>';
const startExpression2 = '<div class="remaining-day-right">';
const endExpression2 = '</span>';
var counter = 0;
var today;
var tomorrow;
var todayIsRed;
var tomorrowIsRed;
var remainingDays;



//==============================================
//         Get text between expression
//==============================================
function extractText(text, startExpression, endExpression) {
  const regex = new RegExp(`${startExpression}(.*?)${endExpression}`, 'gs');
  let match;

  while ((match = regex.exec(text)) !== null) {
    const result = match[1].trim();
    counter++;
    if (counter == 1) today = result;
    if (counter == 2) tomorrow = result;
  }
  tagDays();
}



//==============================================
//    Get text with number between expression
//==============================================
function extractTextWithNumber(text, startExpression, endExpression) {
  const regex = new RegExp(`${startExpression}(.*?\\d.*?)${endExpression}`, 'gs');
  const match = regex.exec(text);
  if (match !== null) {
    const result = match[1].trim();
    return result;
  }
  return null;
}



//==============================================
//                Extract number
//==============================================
function extractNumber(inputString) {
  const digitsRegex = /\d+/g;
  const matches = inputString.match(digitsRegex);

  if (matches !== null) {
    remainingDays = matches.join('');
    tagRemainingDays();
    return matches.join('');
  }

  return null;
}


//==============================================
//                  FETCH URL
//==============================================
fetch(url)
  .then(response => response.text())
  .then(html => {
    extractText(html, startExpression1, endExpression1);
    const stringWithNumber = extractTextWithNumber(html, startExpression2, endExpression2);
    extractNumber(stringWithNumber);
  })
  .catch(error => console.error('Error:', error));


  
async function tagDays() {
  if(today == "Jour rouge EJP") todayIsRed = true;
  else todayIsRed = false;
  if(tomorrow == "Jour rouge EJP") tomorrowIsRed = true;
  else tomorrowIsRed = false;
  await tag("EJP-Jour J", today);
  await tag("EJP-Jour J+1", tomorrow);
  await tag("EJP Jour-J rouge", todayIsRed);
  await tag("EJP Jour-J+1 rouge", tomorrowIsRed);
  log("\nAujourd'hui est un: ", today);
  log("Aujourd'hui est un jour rouge: ", todayIsRed + " (false = non, true = oui)");
  log('\nDemain sera un: ', tomorrow);
  log("Demain sera un jour rouge: ", tomorrowIsRed + " (false = non, true = oui)" );

}

async function tagRemainingDays() {
  await tag("EJP Rouge Restants", Number(remainingDays));
  log("\nJours rouges restants:", remainingDays);
}

Bonjour,

En effet, j’ai pas percuté sur le coup :sweat_smile: . Au final je me sers uniquement du “Jour non EJP” et “Jour rouge EJP”.
J’ai pu mettre en place un petit flow pour :

  • Etre notifié la veille du statut J+1

  • Relancer le script en début de journée pour mettre à jour les variables de la journée en cours pour mes équipements

  • Pour le côté simplicité et visuel, grâce à un virtual devices “ON/OFF” j’ai créer un “Mode EJP” qui me sert de conditions, notamment dans mes flows de chauffages avec PAC et seche serviettes.

Encore un grand merci pour ton aide, je partage mon flow si cela peut aider quelqu’un.

1 Like

Merci à tous pour les explications je me suis inspiré de vos scripts pour faire des notif tempo :+1:

1 Like