Page 22 sur 23

Re: MAJ Tempo EDF

Publié : 30 janv. 2025, 21:50
par lost
Keros a écrit : 30 janv. 2025, 12:23 Après cela dépend de sa région : entre le sud et le cœur des Alpes, le ressentit ne doit pas être le même.
Ce jour, c'était globalement pas super froid... par contre, quasiment 9GW quasi continu en export à rapporter aux 70GW de conso du pays.
https://www.rte-france.com/eco2mix/la-p ... ar-filiere

En résumé, nos efforts servent à gagner des sous car les moulins à vent sans vent et le PV sans soleil de nos voisins (surtout allemands) ne donnent pas grand chose!

Je n'ai pas de problème avec cela, des pays ont fait des choix débiles en mode réactif pur après Fukushima (et on a même fait la connerie de fermer Fessenheim pour leur complaire) qu'ils paient. Mais a condition que les efforts restent récompensés nous concernant et pas au point de prendre des risques pour la suite de cet hiver: Des navires gaziers en route vers l'Asie ont été détournés pour ravitailler l'Europe avec des réserves dangereusement basses récemment.

C'est pas super froid mais en effet globalement tendu tout de même et on se fout carrément de ceux qui font des efforts pour les tarifs de février! AMHA, certains à la CRE vont regretter de n'avoir compté que l'avantage prix kWh moyen vs coût des centrales à construire pour encaisser les pics si trop de monde sort de Tempo fin novembre prochain.

Re: MAJ Tempo EDF

Publié : 07 févr. 2025, 16:29
par lost
Keros a écrit : 30 janv. 2025, 12:23 Après cela dépend de sa région : entre le sud et le cœur des Alpes, le ressentit ne doit pas être le même.
Certes, je suis d'ailleurs étonné que RTE ne se donne pas la possibilité, désormais facilitée (compteurs connectés, infos en ligne), de gérer les couleurs de manière plus fine qu'un bon vieux truc national: Par région/département(/ville?), cela leur offrirait bien plus de flexibilité pour moduler l'équilibrage production-distribution/conso.

Quand on voit l'usine à gaz saisonnière (https://selectra.info/energie/actualite ... vrier-2025) qui se prépare sur les HP/HC désormais imposés à partir de 9kVA, loin des formules "méridiennes" existantes (2h-7h/14h-17h par exemple, fixes à l'année), Tempo aurait sans doute été plus simple à faire évoluer de manière plus découpée: Juste à ajouter son code postal à la requête HTTP (si on lit pas direct sur son Linky) pour connaître la couleur locale du lendemain.

Je pense qu'ils pourraient même alors se permettre de baisser le nb de jours rouges et/ou limiter les possibilités de consécutifs avec, baissant la contrainte que cela représente, la possibilité d'attirer plus de monde qu'actuellement.

Par contre, Tempo reste avec les horaires HP/HC actuels, ce que certains pourront regretter selon les besoins tandis que d'autres pourront y venir si bcp de besoins en nocturne type VE: https://selectra.info/energie/actualite ... vrier-2025

En tout cas le message actuel de ne baisser significativement qu'HP/Rouge (=>peanuts à gagner sur un tempo bien géré, manière de récompenser ceux qui jouent le jeu?) et de garder le reste quasi stable, quand on prétends vouloir en finir avec les gens qui calculent qu'a l'année un Tempo sans changer ses habitudes est plus rentable, c'est quand même un sacré pb de logique inversée... ou d’honnêteté!

A priori, du monde s'est un peu interrogé cette année, entre le cumul et le traitement de défaveur tarifaire, même si comme tu le soulignes c'est difficile d'être affirmatif qu'il s'agisse d'une volonté de nous dire "au revoir et pas merci", après la panique post-Ukraine depuis 2022:
https://selectra.info/energie/actualite ... vrier-2025

Re: MAJ Tempo EDF

Publié : 09 févr. 2025, 17:46
par guardianClaude
Bonjour à tous. Papi 80 ans
Nouveau sur le site et en domoticz
Domoticz Version : 2024.7 installé
Fonctionne pour la commande de volet avec une connexion internet valide.
J’ai testé le code ci-dessous trouvé par Pierrot72 » 27 déc. 2024, 14:39

Code : Tout sélectionner

#!/usr/bin/env python

import requests
from datetime import date
import time

# Variables pour Domoticz
domoticz_ip = 'xxx.xxx.x.xx: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)

La réponse est
Status: Une erreur s'est produite: HTTPSConnectionPool(host='www.api-couleur-tempo.fr', port=443): Max retries exceeded with url: /api/jourTempo/today (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x75e78100>: Failed to establish a new connection: [Errno 113] No route to host'))
Un grand merci à celui qui m’apportera une réponse.

Re: MAJ Tempo EDF

Publié : 10 févr. 2025, 08:15
par lost
Samedi 8 la maj a été très tardive. Entre 11h45 et 12h00.
Bon un dimanche étant forcément bleu y'avait pas bcp de suspense.
Pas regardé le script mais s'il gère mal les retards éventuels de maj cela explique sans doute cette erreur.
Ici ca passe en prime pas par la source RTE donc on cumule un peu les possibilités de pb.

Re: MAJ Tempo EDF

Publié : 26 déc. 2025, 15:55
par Michel13
Bonjour,
Je viens déposer ma petite contribution sur l’acquisition des couleurs tempo.

De ce que j’ai pu lire en parcourant (rapidement, trop de pages) ce sujet, beaucoup utilisent les services d’api-couleur-tempo.fr. Bien que je ne mette pas en doute la fiabilité de ce service, le passé nous a plusieurs fois démontré que rien n’est acquis puisque les services tiers auxquels on s’est adressé ont disparus. http://domogeek.entropialux.com/tempoedf, et plus récemment https://particulier.edf.fr/services/res ... TempoStore, qui a cessé de fonctionner fin 2024. Rien ne prouve qu’api-couleur-tempo.fr ne subisse pas le même sort.
C'est pourquoi j'ai jugé préférable de demander les données directement à RTE, plutôt que d'utiliser un service tiers susceptible de disparaître du jour au lendemain.

Voici la méthode que j'ai mise en place pour mes propres besoins et que je partage ici.

En pratique, j'ai utilisé les deux sources pour récupérer les informations du jour et du lendemain, et j'ai comparé les résultats afin de vérifier leur bon fonctionnement et leur cohérence. J'ai privilégié la récupération des données auprès de RTE et, si celles-ci sont indisponibles, je les récupère auprès d'api-couleur-tempo.fr.

Notez que je ne suis pas expert en programmation et que j'ai donc largement utilisé ChatGPT, que j’ai laissé tombé au profit de Claude.ai, pour écrire ce script. Il est probablement possible de l'améliorer, et je suis ouvert à toute suggestion.

Commençons par RTE.
1. Rendez-vous sur le site web https://data.rte-france.com/web/guest# pour vous inscrire.
2. Cliquez sur « Créer mon compte ». Saisissez les informations requises et validez. Vous devez attendre l'e-mail de confirmation avant de continuer. Cette première étape n'a pas été simple, car je n'ai jamais reçu l'e-mail qui m'aurait permis d'accéder à mon compte. Sans lui, il m'était impossible de poursuivre. J'ai dû contacter l'assistance téléphonique (rte-hotline@rte-france.com) pour qu'ils débloquent mon adresse e-mail et activent mon compte.
3. Une fois connecté à votre compte, recherchez l'API « Tempo Like Supply Contract », puis cliquez sur « Découvrir l’API » et « S'abonner à l’API » pour créer une application.
4. Donnez un nom à votre application ; vous pourrez l'utiliser ultérieurement pour d'autres API. Sélectionnez « Web/Serveur » comme type, saisissez une description et enregistrez.
5. Une fois votre application créée, rendez-vous dans l'onglet « Mes applications » où vous trouverez l'application que vous venez de créer. Cliquez dessus pour l'ouvrir. En bas, vous devriez voir l'API « Tempo Like Supply Contract » associée.
6. Votre application devrait afficher votre « ID client » et votre « ID secret ». Bien que ces valeurs soient importantes, nous avons besoin de leur version encodée en Base64. Cliquez sur le bouton « Copier en Base64 » et enregistrez cette copie pour l'utiliser dans le script. Ces informations vous permettront d'obtenir le jeton d'accès à l'API.
En effet, la récupération d'informations depuis le site web RTE se déroule en deux étapes :
1. Obtenir le jeton OAuth2 à l'aide des identifiants encodés en Base64 de votre application. Ce jeton est valable une heure.
2. Interroger l'API pour récupérer les données JSON correspondant à votre requête à l'aide du jeton d'authentification.
Pour sécuriser votre « ID client » et votre « ID secret », créez un fichier nommé « rte_api.key » où vous stockez votre ID client et votre ID secret en Base64. Je les ai enregistrés dans /home/pi/domoticz/scripts/. Vous devrez indiquer au script où vous les avez enregistrés.

Passons maintenant à Domoticz.
Nous allons d'abord créer deux sélecteurs virtuels nommés « Tempo Aujourd'hui » et « Tempo Demain ». Pour chacun d'eux, nous définissons trois niveaux : Bleu = 10, Blanc = 20 et Rouge = 30. Vous pouvez désactiver le niveau 0 (Arrêt) pour le premier sélecteur si nécessaire. Il ne reste plus qu'à installer le script dzVents ci-dessous dans la section Événements, à remplacer les Idx des deux commutateurs de sélection par ceux de votre Domoticz et à indiquer le chemin d'accès à votre fichier rte_api.key dans la section « Récupération RTE » :

Code : Tout sélectionner

-- Script de récupération des informations Tempo J et J+1
-- À partir de l'API RTE en priorité (https://data.rte-france.com)
-- et les données du site www.api-couleur-tempo.fr en secours

return {
    active = true,
    on = { timer = { 'at 06:15', 'at 11:15' } },

    execute = function(dz)

        ---------------------------------------
        -- Configuration des devices (IDX)
        ---------------------------------------
        local TEMPO_AUJOURDHUI_IDX = 999  -- À REMPLACER par votre IDX
        local TEMPO_DEMAIN_IDX = 999      -- À REMPLACER par votre IDX

        dz.log("⏳ Récupération des couleurs Tempo via RTE (priorité) + fallback Tiers...", dz.LOG_INFO)

        ---------------------------------------
        -- Fonctions utilitaires
        ---------------------------------------
        
        -- Détection automatique du fuseau horaire (heure d'été/hiver)
        local function getFrenchTimezone()
            -- Méthode simple : comparer l'heure locale et UTC
            -- En hiver : UTC+1, en été : UTC+2
            local now = os.time()
            local utcDate = os.date("!*t", now)  -- Date UTC
            local localDate = os.date("*t", now) -- Date locale
            
            -- Calculer la différence en heures
            local utcTime = utcDate.hour * 3600 + utcDate.min * 60 + utcDate.sec
            local localTime = localDate.hour * 3600 + localDate.min * 60 + localDate.sec
            local diff = (localTime - utcTime) / 3600
            
            -- Gérer le passage de minuit
            if diff < -12 then diff = diff + 24 end
            if diff > 12 then diff = diff - 24 end
            
            -- En France : +1 en hiver, +2 en été
            local offset = math.floor(diff + 0.5)
            
            -- RTE utilise l'heure française : UTC+2 en été, UTC+1 en hiver
            return string.format("+%02d:00", offset)
        end
        
        local function codeToLevelRTE(val)
            if val == "BLUE" then return 10, "BLEU"
            elseif val == "WHITE" then return 20, "BLANC"
            elseif val == "RED" then return 30, "ROUGE"
            else return 0, "Pas d'info"
            end
        end

        local function codeToLevelTiers(code)
            code = tonumber(code)
            if code == 1 then return 10, "BLEU"
            elseif code == 2 then return 20, "BLANC"
            elseif code == 3 then return 30, "ROUGE"
            else return 0, "Pas d'info"
            end
        end

        -- Lecture de la clé API depuis un fichier
        local function loadAPIKey(path)
            local f, err = io.open(path, "r")
            if not f then
                return nil, "❌ Impossible de charger la clé API RTE : " .. (err or "")
            end
            local raw = f:read("*a")
            f:close()
            if not raw or raw == "" then
                return nil, "❌ Clé API RTE vide après lecture"
            end
            -- Nettoyage espaces / retours chariot éventuels
            local key = raw:gsub("^%s+", ""):gsub("%s+$", "")
            return key
        end

        local function getToken(apiKey)
            local maxRetries = 2
            local retryDelay = 3
            
            for attempt = 1, maxRetries do
                local handle = io.popen(
                    "curl -s -X POST 'https://digital.iservices.rte-france.com/token/oauth/' " ..
                    "-H 'Content-Type: application/x-www-form-urlencoded' " ..
                    "-H 'Authorization: Basic " .. apiKey .. "' " ..
                    "-d 'grant_type=client_credentials'"
                )
                local result = handle:read("*a")
                handle:close()
                
                local data = dz.utils.fromJSON(result)
                if data and data.access_token then
                    if attempt > 1 then
                        dz.log("✅ Token RTE obtenu après " .. attempt .. " tentative(s)", dz.LOG_INFO)
                    end
                    return data.access_token
                end
                
                if attempt < maxRetries then
                    dz.log("⚠️ Échec obtention token RTE (tentative " .. attempt .. "/" .. maxRetries .. "), réessai dans " .. retryDelay .. "s", dz.LOG_WARNING)
                    os.execute("sleep " .. retryDelay)
                end
            end
            
            dz.log("❌ Impossible d'obtenir un token RTE après " .. maxRetries .. " tentatives", dz.LOG_ERROR)
            return nil
        end

        local function getRTEData(token, start_date, end_date)
            local url = "https://digital.iservices.rte-france.com/open_api/tempo_like_supply_contract/v1/tempo_like_calendars" ..
                        "?start_date=" .. start_date ..
                        "&end_date=" .. end_date ..
                        "&fallback_status=true"

            local cmd = "curl -s -X GET '" .. url .. "' " ..
                        "-H 'Accept: application/json' " ..
                        "-H 'Authorization: Bearer " .. token .. "'"

            local handle = io.popen(cmd)
            local result = handle:read("*a")
            handle:close()
            return dz.utils.fromJSON(result)
        end

        local function getTiersData()
            local urls = {
                ["Tempo Aujourd'hui"] = "https://www.api-couleur-tempo.fr/api/jourTempo/today",
                ["Tempo Demain"]      = "https://www.api-couleur-tempo.fr/api/jourTempo/tomorrow"
            }
            local out = {}
            for name, url in pairs(urls) do
                local handle = io.popen("curl -s '" .. url .. "'")
                local result = handle:read("*a")
                handle:close()
                local data = dz.utils.fromJSON(result)
                if data and data.codeJour then
                    local lvl, couleur = codeToLevelTiers(data.codeJour)
                    out[name] = { level = lvl, couleur = couleur }
                else
                    dz.log("⚠️ Donnée Tiers manquante pour " .. name, dz.LOG_WARNING)
                end
            end
            return out
        end

        ---------------------------------------
        -- Récupération RTE
        ---------------------------------------
        local apiKey, err = loadAPIKey("/chemin/vers/votre/rte_api.key")  -- À MODIFIER
        if not apiKey then
            dz.log(err, dz.LOG_ERROR)
        end
        
        local token = getToken(apiKey)
        local dataRTE = {}
        
        if token then
            -- Détection automatique du timezone français
            local timezone = getFrenchTimezone()
            local today = os.date("%Y-%m-%dT00:00:00") .. timezone
            local afterTomorrow = os.date("%Y-%m-%dT00:00:00", os.time() + 2*24*3600) .. timezone

            dz.log("🔍 Plage demandée à RTE: " .. today .. " → " .. afterTomorrow, dz.LOG_INFO)

            local json = getRTEData(token, today, afterTomorrow)
            if json and json.tempo_like_calendars and json.tempo_like_calendars.values then
                dz.log("🔍 Données RTE reçues : " .. #json.tempo_like_calendars.values .. " entrée(s)", dz.LOG_INFO)
                for _, entry in ipairs(json.tempo_like_calendars.values) do
                    local lvl, couleur = codeToLevelRTE(entry.value)
                    local startDate = entry.start_date:sub(1,10)
                    local todayDate = os.date("%Y-%m-%d")
                    local tomorrowDate = os.date("%Y-%m-%d", os.time() + 24*3600)

                    if startDate == todayDate then
                        dataRTE["Tempo Aujourd'hui"] = { level = lvl, couleur = couleur }
                    elseif startDate == tomorrowDate then
                        dataRTE["Tempo Demain"] = { level = lvl, couleur = couleur }
                    end
                end
                -- Log récapitulatif de ce qui a été trouvé dans RTE
                if dataRTE["Tempo Aujourd'hui"] then
                    dz.log("✅ RTE fournit Tempo Aujourd'hui: " .. dataRTE["Tempo Aujourd'hui"].couleur, dz.LOG_INFO)
                else
                    dz.log("⚠️ RTE ne fournit PAS Tempo Aujourd'hui", dz.LOG_WARNING)
                end
                if dataRTE["Tempo Demain"] then
                    dz.log("✅ RTE fournit Tempo Demain: " .. dataRTE["Tempo Demain"].couleur, dz.LOG_INFO)
                else
                    dz.log("⚠️ RTE ne fournit PAS Tempo Demain", dz.LOG_WARNING)
                end
            else
                dz.log("⚠️ Réponse RTE invalide ou vide", dz.LOG_WARNING)
            end
        end

        ---------------------------------------
        -- Récupération Tiers (fallback)
        ---------------------------------------
        local dataTiers = getTiersData()

        ---------------------------------------
        -- Choix final et mise à jour (RTE prioritaire, puis Tiers)
        ---------------------------------------
        local finalVals = {}
        local sourcesUsed = {}

        -- Table de correspondance nom logique -> IDX
        local devices = {
            ["Tempo Aujourd'hui"] = TEMPO_AUJOURDHUI_IDX,
            ["Tempo Demain"] = TEMPO_DEMAIN_IDX
        }

        for _, deviceName in ipairs({ "Tempo Aujourd'hui", "Tempo Demain" }) do
            local src = nil
            local couleur = nil
            local level = 0

            -- Priorité RTE, fallback Tiers
            if dataRTE[deviceName] then
                src = "RTE"
                level = dataRTE[deviceName].level
                couleur = dataRTE[deviceName].couleur
            elseif dataTiers[deviceName] then
                src = "Tiers (fallback)"
                level = dataTiers[deviceName].level
                couleur = dataTiers[deviceName].couleur
            end

            -- Appliquer / logger
            if src then
                dz.log("🎯 " .. deviceName .. " : " .. (couleur or "inconnu") .. " (source = " .. src .. ")", dz.LOG_INFO)
                
                -- Mise à jour du device par son IDX (plus fiable que par nom)
                local deviceIdx = devices[deviceName]
                dz.devices(deviceIdx).switchSelector(level)
            else
                dz.log("❌ Aucune donnée disponible pour " .. deviceName, dz.LOG_ERROR)
            end

            finalVals[deviceName] = { src = src, couleur = couleur, level = level }
            if src then
                table.insert(sourcesUsed, src)
            end

            -- Comparaison si les deux sources sont présentes pour ce device
            if dataRTE[deviceName] and dataTiers[deviceName] then
                if dataRTE[deviceName].couleur ~= dataTiers[deviceName].couleur then
                    dz.log("⚠️ DIVERGENCE : RTE = " .. dataRTE[deviceName].couleur ..
                           " / Tiers = " .. dataTiers[deviceName].couleur, dz.LOG_ERROR)
                else
                    dz.log("✅ Cohérence confirmée pour " .. deviceName, dz.LOG_INFO)
                end
            end
        end  -- fin for

        -- Log récapitulatif des sources utilisées
        if #sourcesUsed > 0 then
            local uniqueSources = {}
            for _, s in ipairs(sourcesUsed) do
                uniqueSources[s] = true
            end
            local sourcesList = {}
            for s in pairs(uniqueSources) do
                table.insert(sourcesList, s)
            end
            dz.log("📊 Sources utilisées : " .. table.concat(sourcesList, ", "), dz.LOG_INFO)
        end

        dz.log("------ Fin récupération Tempo", dz.LOG_INFO)
    end
}
Les données des jours « J » et « J+1 » sont normalement disponibles respectivement à 6h00 et 11h00. Le script est exécuté deux fois, avec un retard de 15 minutes afin de garantir la disponibilité des données sur les deux sites web. En réalité, les données sont déjà disponibles chez RTE à partir de 20h la veille au soir. Aussi, les couleurs « J » et « J+1 » sont récupérées dès la première demande. J’ai appliqué un retard de 15 minutes car cela me convient pour l’exécution d’autres scripts qui dépendent des données tempo mais vous pouvez très bien changer l’heure ou la méthode de collecte des infos.

Vous noterez que la requête tient compte du décalage horaire été/hiver (été 2h GMT, hiver 1h GMT). En effet, si la correction n’est pas faite, le json retourné est incomplet et notamment la donnée pour « J+1 ».

Ce script est réduit par rapport à celui que j’utilise pour mon application. J’y ai rajouté entre autres choses un dernier passage à 20h15 et des envois de sms en cas de non récupération des données Tempo.
Vous pouvez bien sûr le modifier selon vos besoins, par exemple pour récupérer des données plus complètes sur le site web de RTE (données disponibles depuis 2014, jusqu'à un maximum de 366 jours par requête). Pour plus d'informations sur les méthodes de récupération des données Tempo auprès de RTE, vous pouvez consulter et télécharger la documentation disponible directement via l'API.

Alors certains vont me dire que les données récupérées sur le site d’api-couleur-tempo.fr sont directement issues de RTE, qu’il est inutile de le faire à la fois chez RTE et api-couleur-tempo.fr puisque la source est la même. Certes, mais la donnée du lendemain n’est pas dispo à 6h comme chez RTE (qui je le rappelle donne cette info la veille dès 20h). Mais comme il peut arriver que le site de RTE ne soit pas dispo, le fallback d’api-couleur-tempo.fr permet de récupérer tout de même l’info. Et ça m’est arrivé, la preuve par le log :
2025-12-24 06:15:01 - Tempo Demain (IDX:161) = BLEU (source: RTE)
2025-12-24 06:15:01 - DIVERGENCE Tempo Demain : RTE=BLEU vs Tiers=Pas d'info
2025-12-24 11:15:01 - Tempo Aujourd'hui (IDX:160) = BLEU (source: RTE)
2025-12-24 11:15:01 - Tempo Demain (IDX:161) = BLEU (source: RTE)
2025-12-25 06:15:01 - Tempo Aujourd'hui (IDX:160) = BLEU (source: Tiers (fallback))
2025-12-25 06:15:01 - Tempo Demain (IDX:161) = Pas d'info (source: Tiers (fallback))

2025-12-25 11:15:01 - Tempo Aujourd'hui (IDX:160) = BLEU (source: RTE)
2025-12-25 11:15:01 - Tempo Demain (IDX:161) = BLANC (source: RTE)

Re: MAJ Tempo EDF

Publié : 26 déc. 2025, 18:52
par Keros
Merci de ton partage.

Beaucoup utilise l'api RTE directement ;)

Perso, si le site RTE n'est pas dispo ou n'a pas les infos, je retente une heure après. Ce n'est qu'à 18h que je me suis mis une alerte si je n'arrivais pas à récupérer l'info. Cela m'est peut-être arrivé quelquefois, mais c'était généralement à cause d'un problème de connexion de mon côté.

Pour info, on suit un système qui essaye de prédire la couleur des jours à J+9 Lien vers le sujet

Re: MAJ Tempo EDF

Publié : 27 déc. 2025, 08:11
par lost
Michel13 a écrit : 26 déc. 2025, 15:55 Les données des jours « J » et « J+1 » sont normalement disponibles respectivement à 6h00 et 11h00. (...) En réalité, les données sont déjà disponibles chez RTE à partir de 20h la veille au soir. Aussi, les couleurs « J » et « J+1 » sont récupérées dès la première demande.
Via RTE j'ai en effet dans au moins 95% des cas l'info lendemain dispo dès 6h15. Parfois 15/30mn après (mon script retente toutes les 15mn à partir de 6h tant qu'info lendemain pas présente), mais rarement au delà de 7h.

Par contre en fouillant les messages tu aurais vu qu'il existe une URL (c'est celle utilisée en interne par la page grand public RTE de couleur Tempo, mise en évidence par un navigateur mis en mode analyse réseau, F12 -> Reseau sous Firefox, au chargement de la page, avec une ligne de requête GET à https://www.services-rte.com/cms/open_d ... =2025-2026) permettant un fonctionnement presque aussi simple que l'ancienne EDF. On y a juste la saison en cours (une ancienne fonctionne aussi, dont on récupère alors l'intégralité) à indiquer et un JSON retournant les couleurs de tous les jours écoulés depuis le 01/09 de la saison Tempo en cours est retourné.

Certes, on récupère tout et pas seulement J/J+1 mais cela permet de faire les totaux des couleurs écoulées (la totalité va chez moi dans un seul virtuel de type texte qui synthétise l'info à jour) donc c'est pas perdu... et par rapport à un processus d'identification à une API qui en a besoin, ce ne sera pas plus lourd... et évite de se fader des pb d'authentification (voir création compte) pour récupérer une info ouverte.

Re: MAJ Tempo EDF

Publié : 27 déc. 2025, 12:45
par Michel13
Keros a écrit : 26 déc. 2025, 18:52 Pour info, on suit un système qui essaye de prédire la couleur des jours à J+9 Lien vers le sujet
Merci pour cette info, bien que je n'en ai pas une utilité immédiate. Les prédictions, c'est pour les Nostradamus. Je préfère m'appuyer sur du concret :lol:
lost a écrit : 27 déc. 2025, 08:11 Par contre en fouillant les messages tu aurais vu qu'il existe une URL (c'est celle utilisée en interne par la page grand public RTE de couleur Tempo, mise en évidence par un navigateur mis en mode analyse réseau, F12 -> Reseau sous Firefox, au chargement de la page, avec une ligne de requête GET à https://www.services-rte.com/cms/open_d ... =2025-2026)
Il me semble effectivement avoir vu cette possibilité lorsque j'ai cherché à récupérer les infos de couleurs tempo mais j'ai préféré me tourner vers l'api car elle ne nécessitait pas de charger tout un fichier qui grossi chaque jour un peu plus pour récupérer les infos des deux derniers jours. Et puis c'est certes plus compliqué mais tellement plus classe je trouve de passer par l'api ;)
A moins que la requête https puisse être formulée pour une durée ciblée plutôt qu'une saison entière, ce que je ne sais pas.

Re: MAJ Tempo EDF

Publié : 27 déc. 2025, 18:16
par lost
C'est la saison entière, mais bon, même au 31 août avec la totale des 365j le JSON complet reste un chargement raisonnable (voir avantageux sans la surcharge d'un processus d'identification en passant par l'API, plus susceptible en prime d'échouer au moindre gag ou évolution côté serveur) et c'est de toutes manières ainsi que procède le site RTE qui ne fait que mettre cela en forme.

Je ne sais pas si on peut parler de plus ou moins "classe", mais perso je suis bien dans la philo KISS (Keep It Simple Stupid) et trouve assez délirant d'obliger à un compte pour récupérer une info ouverte en devant s'authentifier... Le site couleur-tempo, quand on regarde comment il est codé (c'est sur github), utilise aussi l'url sans authentification et depuis bien des années. Malheureusement, il ne fournit l'info que dans le respect des heures officielles.

Re: MAJ Tempo EDF

Publié : 11 janv. 2026, 09:50
par manuloup
@Lost, Ce matin, le fichier ne marche plus. Problème temporaire ?