MAJ Tempo EDF

Forum pour tous les autres protocoles : Enocean, X10, les cartes piface.razberry ...
Pour les questions concernant le choix de protocoles, merci d'utiliser le forum Les autres objets.
lost
Messages : 1511
Inscription : 12 nov. 2016, 11:01

Re: MAJ Tempo EDF

Message par lost »

La MAJ chez RTE semble faite entre 6h et 6h15 au final. Au moins les jours bleux ou cela n'hésite pas.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: MAJ Tempo EDF

Message par Keros »

06h, me fait plutôt penser à l'horaire de changement de couleur. Tu es sûr que c'est la donnée du lendemain que tu vois ?
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
lost
Messages : 1511
Inscription : 12 nov. 2016, 11:01

Re: MAJ Tempo EDF

Message par lost »

Oui, tant que je n'ai pas de match sur la date du lendemain je tente toutes les 15mn. Comme je voulais connaître l'heure de MAJ j'ai mis une plage de check de 5h à 12h et j'ai bien vu passer en log les 5 essais infructueux avant que ce soit bon à 6h15.

Afin de ne pas charger inutilement leurs serveurs, j'ai mis à partir de 6h désormais. Je verrais si cela s'y tiens ou s'il y a des variations car je pense qu'en ce moment la décision bleu ne fait guère de doute 1 semaine à l'avance. Peut-être que ce sera parfois MAJ plus tard, chez EDF la veille de certains jours rouges j'ai vu 1/2h ou 1h plus tard, car avait pu hésiter entre mettre du blanc ou du rouge en attendant des prévisions météo affinées pour le lendemain par exemple.

Là je verrais à l'usage mais je pense que ce sera dans tous les cas plus tôt que côté EDF car c'est RTE qui est la source de l'info de toutes manières.
lost
Messages : 1511
Inscription : 12 nov. 2016, 11:01

Re: MAJ Tempo EDF

Message par lost »

Je confirme, pour une MAJ RTE entre 6h et 6h15 actuellement, ce matin encore:

Code : Tout sélectionner

2024-09-08 06:00:01.517  Status: LUA: TEMPO : Sunday:BLEU - Monday:NON_DEFINI
2024-09-08 06:15:00.781  Status: LUA: TEMPO : Sunday:BLEU - Monday:BLEU
2024-09-08 06:15:00.781  Status: LUA: TEMPO : Updated !
La fonction qui gère la MAJ de l'info ayant été faite pour renvoyer des valeurs compatibles avec le comportement de l'API EDF qui ne fonctionne plus actuellement, les couleurs sont francisées et tant qu'on n'a pas la date du lendemain dans le JSON retourné par RTE elle renvoie "NON_DEFINI" en couleur:

EDIT: Certains bouts de code corrigés/complétés ici:
viewtopic.php?p=122439#p122439

Code : Tout sélectionner

urlTempoRTE   = 'https://www.services-rte.com/cms/open_data/v1/tempo?season='
local function getTempoRTE(time_epoch)
    -- Match (old) EDF API
    coloursFR  = {BLUE = "BLEU", WHITE = "BLANC", UNDEFINED = "NON_DEFINI"}
    tempoCount = {blue=0, white=0, red=0}
    tempoColor = {J="UNDEFINED", J1="UNDEFINED"}
    tempoDay   = {J="NON_DEFINI", J1="NON_DEFINI"}

    -- Build tempo season string (tempo year change at 1st of september) for RTE url
    now     = time_epoch
    nowDate = os.date("*t", now)
    if (nowDate.month >= 1) and (nowDate.month <= 8) then
        tempoSeason=tostring(nowDate.year - 1)..'-'..tostring(nowDate.year)
    else
        tempoSeason=tostring(nowDate.year)..'-'..tostring(nowDate.year + 1)
    end

    --print("Current Tempo season : "..tempoSeason.."\n")  -- DEBUG

    -- Get all data for current tempo season
    tempoSeasonURL  = 'https://www.services-rte.com/cms/open_data/v1/tempo?season='..tempoSeason
    tempoSeasonData = getUrlJson(tempoSeasonURL)

    if (tempoSeasonData == nil) then
        print("TEMPO : Warning, no data/color received from RTE ; Network issue?")
        return tempoDay, tempoCount
    end 

    --print("\nValues :") -- DEBUG
    --print(json:encode_pretty(tempoSeasonData.values))

    tempoDate  = {J=tostring(os.date("%Y-%m-%d", now)), J1=tostring(os.date("%Y-%m-%d", now + 86400))}

    -- Table walk for day colour/current counts...
    for k,v in pairs(tempoSeasonData.values) do
        -- Calculate current tempo year colours count
        if     v == "BLUE"  then tempoCount.blue  = tempoCount.blue  + 1
        elseif v == "WHITE" then tempoCount.white = tempoCount.white + 1
        elseif v == "RED"   then tempoCount.red   = tempoCount.red   + 1
        end
    
        -- Get J/J1 colors
        if     k == tempoDate.J  then tempoColor.J  = v
        elseif k == tempoDate.J1 then tempoColor.J1 = v
        end

        --print(k.." = "..v)  -- DEBUG
    end

    tempoDay = {J = coloursFR[tempoColor.J], J1=coloursFR[tempoColor.J1]}
    return tempoDay, tempoCount
end
Qui encapsule l'appel à wget ainsi, utilisant lui-même la lib json fournie dans le répertoire script:

Code : Tout sélectionner

--
-- Internal fct :
-- Get json answer EDF or RTE http/json API.
--
local function getUrlJson(url)
    config  = assert(io.popen('curl --retry 1 --connect-timeout 2 -m 4  \"'..url..'\"'))
    tempo   = config:read('*all')
    config:close()

    jsonOut = json:decode(tempo)
    return(jsonOut)
end
Puis la logique de décision de MAJ (une plage d'heures pleines combiné au last_update pour arrêter les requêtes une fois la MAJ du jour OK) des 2 variables utilisateur couleur jour/lendemain utilisée par d'autres scripts et du device text domoticz (+notif mail si ça change du bleu!) contenant couleur et totaux bleu/blanc/rouge en cours, visible sur la webUI (je détaille pas toutes les dépendances propre à mon système, c'est juste pour voir la logique du truc et appel/usage de la fonction de base ci dessus ; à chacun d'adapter si intéressé):

Code : Tout sélectionner

--hCheckRange = {11, 16} -- Begin/end hours for updates check (EDF : should be done ~11h00)
hCheckRange = {6, 13} -- Begin/end hours for updates check (RTE : Done earlier)

time = os.date("*t")

-- TEMPO "COLOR" UPDATE:
-- Exec every 15mn in hereupper hours range until next day status is defined,
-- retrying while last update > range to handle tempory fails (site unreachable...).
if ((time.min % 15 == 0) and (time.hour >= hCheckRange[1]) and (time.hour < hCheckRange[2]) and (timeLastUpdate(tempoName, false) > ((hCheckRange[2] - hCheckRange[1])* 3600))) then
    jsonLib = assert(loadfile(jsonLibPath))
    json    = (jsonLib)()
    
    epoch       = os.time()
    dateDay     = tostring(os.date("%A"), epoch)
    dateNextDay = tostring(os.date('%A',  epoch + 86400))
    
    tempoDay, tempoCount = getTempoRTE(epoch)
    --tempoDay, tempoCount = getTempoEDF(epoch)
    
    tempoText = dateDay..":"..tempoDay.J.." - "..dateNextDay..":"..tempoDay.J1
    print("TEMPO : "..tempoText)
    
    -- Only update when next day "color" is defined.
    if (tempoDay.J1 ~= "NON_DEFINI") then
        commandArray[#commandArray+1]={['Variable:'..tempoVarJ] = tempoDay.J}
        commandArray[#commandArray+1]={['Variable:'..tempoVarJ1] = tempoDay.J1}

        tempoText = tempoText..' ('..tempoCount.blue..'/'..tempoCount.white..'/'..tempoCount.red..')'
        commandArray[#commandArray+1]={['UpdateDevice'] = otherdevices_idx[tempoName].."|0|"..tempoText}

        -- Send notification mail if today or tomorrow prices are high...
        if ((tempoDay.J ~= "BLEU") or (tempoDay.J1 ~= "BLEU")) then
            commandArray[#commandArray+1]={['SendEmail'] = 'TEMPO Demain : '..tempoDay.J1..'#'..tempoText..'#'..emailNotifyAlarm}
        end

        print("TEMPO : Updated !")
    end
end 
Ça devrait fixer les idées sur comment je procède.

L'ancienne fonction qui récupérait chez EDF, à remettre si cela devait retomber en marche et compatible avec la partie commune ci dessus, getTempoEDF() et getTempoRTE() étant interchangeables côté appel. EDF offrait une réponse plus courte, surtout au fur et à mesure du nb de jours écoulés depuis le début de la saison Tempo en cours, mais nécessitait 2 requêtes/url contre 1 chez RTE.

Code : Tout sélectionner

urlTempoColor = 'https://particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant='
urlTempoCount = 'https://particulier.edf.fr/services/rest/referentiel/getNbTempoDays?TypeAlerte=TEMPO'
local function getTempoEDF(time_epoch)
    tempoCount = {blue=0, white=0, red=0}
    tempoDay   = {J="NON_DEFINI", J1="NON_DEFINI"}
    
    today     = tostring(os.date("%Y-%m-%d"), time_epoch)
    jsonTempo = getUrlJson(urlTempoColor..today)
    --print(jsonTempo.couleurJourJ)
    --print(jsonTempo.couleurJourJ1)

    if (jsonTempo == nil) then
        print("TEMPO : Warning, no data/color received ; Network issue?")
        return tempoDay, tempoCount
    end 

    tempoJ  = string.gsub(jsonTempo.couleurJourJ,  "TEMPO_", "")
    tempoJ1 = string.gsub(jsonTempo.couleurJourJ1, "TEMPO_", "")
    
    tempoDay = {J = tempoJ, J1 = tempoJ1}
    
    -- Only go ahead with counts when next day "color" is defined.
    if (tempoJ1 ~= "NON_DEFINI") then
        -- Get/add remaining days count information...
        jsonTempo = getUrlJson(urlTempoCount)
        --print(jsonTempo.PARAM_NB_J_BLEU)
        --print(jsonTempo.PARAM_NB_J_BLANC)
        --print(jsonTempo.PARAM_NB_J_ROUGE)

        if (jsonTempo == nil) then
            print("TEMPO : Warning, no data/count received from EDF ; Network issue?")
        else
            tempoCount = {blue=jsonTempo.PARAM_NB_J_BLEU, white=jsonTempo.PARAM_NB_J_BLANC, red=jsonTempo.PARAM_NB_J_ROUGE}
        end
    end
    return tempoDay, tempoCount
end
Dernière modification par lost le 02 déc. 2024, 11:10, modifié 2 fois.
Pierrot72
Messages : 22
Inscription : 21 mai 2019, 19:10

Re: MAJ Tempo EDF

Message par Pierrot72 »

J'amène ma pierre à l'édifice.
J'utilise deux variables utilisateur pour traiter couleur J et J+1
C'est un script en python, je le lance tous les jours à midi et ça marche nickel.

Veuillez à bien mettre l'IP de votre domoticz et l'IDX des deux variables (en haut du script tempo.py)

Donc dans /home/pi/domoticz/scripts j'ai deux fichier: tempo.sh et tempo.py

tempo.sh :

Code : Tout sélectionner

#!/bin/bash

python3 /home/pi/domoticz/scripts/tempo.py
et

tempo.py

Code : Tout sélectionner

#!/usr/bin/env python

import requests
from datetime import date
import time

# Variables pour Domoticz
domoticz_ip = '192.168.0.10:8080'
idx_couleur_jour = '109'
idx_couleur_jour_j1 = '110'
vname_couleur_jour = 'Couleur TEMPO J'
vname_couleur_jour_j1 = 'Couleur TEMPO J+1'

def map_code_to_color(code):
    # Mapping des codes de jour à des couleurs spécifiques
    mapping = {
        0: "Non défini",
        1: "Bleu",
        2: "Blanc",
        3: "Rouge"
    }
    return mapping.get(code, "Inconnu")

def get_tempo_colors():
    # URLs de l'API
    url_today = 'https://www.api-couleur-tempo.fr/api/jourTempo/today'
    url_tomorrow = 'https://www.api-couleur-tempo.fr/api/jourTempo/tomorrow'

    try:
        # Requête pour obtenir la couleur du jour
        response_today = requests.get(url_today)
        if response_today.status_code == 200:
            data_today = response_today.json()
            couleur_jour = map_code_to_color(data_today.get('codeJour', 0))
        else:
            log_to_domoticz(f"Erreur lors de la requête pour la couleur du jour: {response_today.status_code}")
            return None, None

        # Requête pour obtenir la couleur du lendemain
        response_tomorrow = requests.get(url_tomorrow)
        if response_tomorrow.status_code == 200:
            data_tomorrow = response_tomorrow.json()
            couleur_jour_j1 = map_code_to_color(data_tomorrow.get('codeJour', 0))
        else:
            log_to_domoticz(f"Erreur lors de la requête pour la couleur du lendemain: {response_tomorrow.status_code}")
            return couleur_jour, None

        return couleur_jour, couleur_jour_j1

    except Exception as e:
        log_to_domoticz(f"Une erreur s'est produite: {e}")
        return None, None

def update_domoticz_variables(couleur_jour, couleur_jour_j1):
    # URL de l'API JSON de Domoticz
    url_domoticz = f'http://{domoticz_ip}/json.htm'

    # Paramètres pour mettre à jour la variable de couleur du jour (J) dans Domoticz
    params_couleur_jour = {'type': 'command', 'param': 'updateuservariable', 'idx': idx_couleur_jour, 'vname': vname_couleur_jour, 'vtype': 2, 'vvalue': couleur_jour}

    # Paramètres pour mettre à jour la variable de couleur du jour suivant (J+1) dans Domoticz
    params_couleur_jour_j1 = {'type': 'command', 'param': 'updateuservariable', 'idx': idx_couleur_jour_j1, 'vname': vname_couleur_jour_j1, 'vtype': 2, 'vvalue': couleur_jour_j1}

    try:
        # Envoyer la requête pour mettre à jour la variable de couleur du jour (J) dans Domoticz
        response_couleur_jour = requests.get(url_domoticz, params=params_couleur_jour)

        # Vérifier si la requête a réussi
        if response_couleur_jour.status_code != 200:
            log_to_domoticz(f"Erreur lors de la mise à jour de la couleur TEMPO J dans Domoticz: {response_couleur_jour.status_code}")

        # Envoyer la requête pour mettre à jour la variable de couleur du jour suivant (J+1) dans Domoticz
        response_couleur_jour_j1 = requests.get(url_domoticz, params=params_couleur_jour_j1)

        # Vérifier si la requête a réussi
        if response_couleur_jour_j1.status_code != 200:
            log_to_domoticz(f"Erreur lors de la mise à jour de la couleur TEMPO J+1 dans Domoticz: {response_couleur_jour_j1.status_code}")

    except Exception as e:
        log_to_domoticz(f"Une erreur s'est produite lors de la mise à jour des variables dans Domoticz: {e}")

def log_to_domoticz(message):
    # URL pour ajouter un log dans Domoticz
    url_log = f'http://{domoticz_ip}/json.htm?type=command&param=addlogmessage&message={message}'

    try:
        response = requests.get(url_log)
        if response.status_code != 200:
            print(f"Erreur lors de l'envoi du log à Domoticz: {response.status_code}")
    except Exception as e:
        print(f"Une erreur s'est produite lors de l'envoi du log à Domoticz: {e}")

# Appel de la fonction pour obtenir les couleurs Tempo du jour en cours et du jour suivant
couleur_jour, couleur_jour_j1 = get_tempo_colors()

# Affichage des résultats et enregistrement des logs
if couleur_jour is not None and couleur_jour_j1 is not None:
    log_to_domoticz("* Les valeurs EDF Tempo ont bien été mises à jour")
    log_to_domoticz(f"* Aujourd'hui est un jour : {couleur_jour}")
    log_to_domoticz(f"* Demain est un jour : {couleur_jour_j1}")

    # Appel de la fonction pour mettre à jour les variables dans Domoticz
    update_domoticz_variables(couleur_jour, couleur_jour_j1)
else:
    log_to_domoticz("Impossible d'obtenir les couleurs Tempo.")

# Attendre 3 secondes avant de fermer
time.sleep(3)
Domoticz 4.xx Windows 10 x64
Alain78
Messages : 75
Inscription : 05 févr. 2022, 09:18

Re: MAJ Tempo EDF

Message par Alain78 »

Bonjour à tous,

Un petit rappel sur les horaires de publications de la couleur des jours TEMPO.

Site RTE: https://www.services-rte.com/fr/visuali ... tempo.html

Et un extrait: RTE diffuse un pré-signalement à titre purement informatif entre 8h et 10h30. L'information pré-signalée ne présage pas de l'information définitive et n'engage pas RTE. Exceptée la couleur du jour du lendemain publiée à 10h30, les autres informations disponibles sur cette page sont fournies à titre purement informatif par RTE qui ne pourra être tenu responsable de l'usage qui pourrait être fait de ces données.

Donc bien lancer une requête après 10h30 pour être sure de la couleur.

J'utilise l' API "Tempo Like Supply Contract" sur RTE depuis plusieurs années et jamais de problème contrairement au site d'EDF qui est souvent très en retard.

Cordialement
lost
Messages : 1511
Inscription : 12 nov. 2016, 11:01

Re: MAJ Tempo EDF

Message par lost »

Bonjour,

En effet, comme le précise Alain78 c'est l'info à 10h30 qui engage RTE. Mais si on regarde via les liens cités ce que propose la page RTE, il s'agit en fait d'une remise en forme de l'info de l'URL saison ci dessus via le JS de la page. On voit la requête passer en mode F12/réseau sur un navigateur et en rechargeant la page:
RTE_Tempo.jpg
RTE_Tempo.jpg (138.85 Kio) Consulté 1883 fois
Donc il y a à mon sens moyen d'avoir l'info bien plus tôt et retenter régulièrement pour les jours ou cela tarde et que l'on n'a pas encore la date du lendemain dans le JSON.

La seule interrogation à laquelle je n'ai pas réponse, c'est l'info datée "fallback" contenant un booléen (true/false): Personnellement, je ne l'ai pour le moment pas vu à true ni dans les données regardées manuellement ni dans les données historiques de saisons précédentes (mais je n'ai dû en regarder que 2 ou 3).

RTE indique que cela correspond à une info "dégradée" sans en indiquer la signification précise pour eux. Mon petit doigt me dit, au vu du nom anglais, qu'il pourrait s'agir d'une information qui ne serait pas encore définitive quand ce flag est à "true" au lieu de "false" comme je l'ai toujours vu pour le moment.

Je pense que je vais modifier mon script pour au moins le logguer, ce qui permettra au besoin de ne pas mettre à jour le widget et les variables utilisateur tant qu'il n'est pas lu à false.

Bref, j'aurais l'info tôt l'essentiel du temps et plus tard quand cela hésite.

En tout cas le dump ci-dessus illustre que la source est fiable car elle correspond à ce que le site grand public de RTE mets en forme.
Wolfen38
Messages : 1983
Inscription : 19 oct. 2017, 14:49

Re: MAJ Tempo EDF

Message par Wolfen38 »

Pierrot72 a écrit : 10 sept. 2024, 01:37 J'amène ma pierre à l'édifice.
Je viens d'installer ton script, ca a l'air de bien fonctionner. Enfin on se rendra mieux compte quand les 1ers jours blancs arriveront, mais ca semble OK.

Merci beaucoup pour ton aide, j'ai plein de choses de basées sur la couleur du jour, c'était bien les boules que ca ne fonctionne plus.
lost
Messages : 1511
Inscription : 12 nov. 2016, 11:01

Re: MAJ Tempo EDF

Message par lost »

J'avais pour ma part ajouté log et check de l'info fallback donnée côté source/RTE, que je suppose indiquer une info encore provisoire (pré-signalement évoqué par Alain78 ci avant) tant que ce flag serait à true. Pour le moment c'est MAJ sur la même tranche horaire que la couleur (et toujours vu direct à false depuis le changement de mon script).

2024-09-17 06:00:01.136 Status: LUA: TEMPO : Tuesday:BLEU - Wednesday:NON_DEFINI (Fallback = false/?).
2024-09-17 06:15:00.718 Status: LUA: TEMPO : Tuesday:BLEU - Wednesday:BLEU (Fallback = false/false).
2024-09-17 06:15:00.719 Status: LUA: TEMPO : Updated !

A suivre...
marcus_54
Messages : 425
Inscription : 28 févr. 2018, 12:15

Re: MAJ Tempo EDF

Message par marcus_54 »

Bonsoir,
Je viens d'essayer
j'ai ceci au lancement :

Code : Tout sélectionner

marc@test:~/domoticz/scripts $ ./tempo.sh
Erreur lors de l'envoi du log à Domoticz: 401
Erreur lors de l'envoi du log à Domoticz: 401
Erreur lors de l'envoi du log à Domoticz: 401
Erreur lors de l'envoi du log à Domoticz: 401
Erreur lors de l'envoi du log à Domoticz: 401
Domoticz 2024.7
Domoticz sur RPI 4B+ : MQTT; MQTTMapper; Zigbee; RFlink DIY 433; Téléinfo; DS18B20; Capteur; compteur eau wmbusmeter, NanoLeaf...
Répondre