Re: MAJ Tempo EDF
Publié : 07 sept. 2024, 09:56
La MAJ chez RTE semble faite entre 6h et 6h15 au final. Au moins les jours bleux ou cela n'hésite pas.
Reprenez le contrôle de votre domotique
https://easydomoticz.com/forum/
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 !
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
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
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
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
Code : Tout sélectionner
#!/bin/bash
python3 /home/pi/domoticz/scripts/tempo.pyCode : 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¶m=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)
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.
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