Re: MAJ Tempo EDF
Publié : 06 oct. 2024, 18:30
Essayer quoi
Tu peux nous partager ton script ?
Tu peux nous partager ton script ?
Reprenez le contrôle de votre domotique
https://easydomoticz.com/forum/
Code : Tout sélectionner
#!/usr/bin/pythonSalut Marcus,marcus_54 a écrit : 06 oct. 2024, 18:08 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
Code : Tout sélectionner
--[[Récupération des informations TEMPO de RTE. Couleurs Bleu, Blanc ou Rouge
Couleur du jour, et nombre de jours restants pour chaque couleur(BLEU, BLANC et ROUGE).
Inspiré du script de "Lost" ici: https://easydomoticz.com/forum/viewtopic.php?p=122000#p122000 version de septembre 2024.
--------------------------------------------
------------ Variables à éditer ------------
--------------------------------------------
]]--
local urlTempoJoursRTE = 'https://www.services-rte.com/cms/open_data/v1/tempo?season=' --- Nombre de jours restants pour chaque couleur.
local scriptName = 'script_time_Tempo_Couleur_RTE'
local scriptVersion = '1.5'
local tempoCount = {blue=0, white=0, red=0}
local coloursFR = {BLUE = "BLEU", WHITE = "BLANC", RED = "ROUGE", UNDEFINED = "NON_DEFINI"}
local tempoColor = {J="GRIS", J1="GRIS"} -- Couleur tempo sur jour J et J+1
local tempoDay = {J="NON_DEFINI", J1="NON_DEFINI"} -- Jour Tempo J et J+1
local tempoSeason = nil
local Hvalid = '10:30:00' -- Heure de validation d'ENEDIS pour la couleur TEMPO (10h30) valeur: hh:mm:ss.
local nbrTempoRouge = 22 -- Nombre de jours Tempo ROUGE dans l'année.
local nbrTempoBlanc = 43 -- Nombre de jours Tempo BLANC dans l'année.
local nbrTempoBleu = 300 -- Nombre de jours Tempo BLEU dans l'année.
--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------
return {
on = { timer = {'at 06:51', 'at 10:00-22:00 at *:51' },
system = { 'start' }, -- Pour execution en cas d'arret de plusieurs jours.
httpResponses = { scriptName } -- doit correspondre au "callback" passé par l'url à traiter.
},
logging = { -- level = domoticz.LOG_DEBUG,
-- level = domoticz.LOG_INFO, -- Seulement un niveau peut être actif; commenter les autres
level = domoticz.LOG_ERROR, -- Only one level can be active; comment others
-- level = domoticz.LOG_MODULE_EXEC_INFO,
marker = scriptName..' v'..scriptVersion },
execute = function(domoticz, item)
local Time = require('Time')
local nowDate = domoticz.time -- Recupération heure du traitement.
local TEMPOJ = domoticz.variables('TempoJ') -- Variable Couleur TEMPO du jour.
local TEMPOJ1 = domoticz.variables('TempoJ1') -- Variable Couleur TEMPO lu lendemain.
local DateTempoJ = domoticz.time.dateToDate(domoticz.time.rawDateTime,'yyyy-mm-dd hh:MM:ss','yyyy-mm-dd') -- Date du jour TEMPOJ
local DateTempoJ1 = domoticz.time.dateToDate(domoticz.time.addDays(1).rawDateTime,'yyyy-mm-dd hh:MM:ss','yyyy-mm-dd') -- Date du jour TEMPOJ1
local DateValid = Time(DateTempoJ..' '..Hvalid) -- Date et heure de validation d'ENEDIS pour la couleur TEMPO (10h30).
-- Si traitement déjà réalisé et validé apres 10h30.
if (TEMPOJ1.value ~= "GRIS" and DateValid.compare(TEMPOJ1.lastUpdate).compare == 1 and TEMPOJ1.lastUpdate.hoursAgo < 12) then -- Test si le traitement apres 10h30 (validation RTE) est passé pour sortir.
return
elseif TEMPOJ1.value == "GRIS" and nowDate.hour > 20 then -- Test si aucune valeur récupérée durant la journée et alerte par email.
domoticz.notify("Alerte Tempo","Alerte pas de mise à jour de la couleur TEMPO pour demain", domoticz.PRIORITY_NORMAL)
end
-- Récupération saison tempo (démarrage au 1er Septembre) pour url RTE.
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
domoticz.log("La saison tempo est: "..tempoSeason,domoticz.LOG_DEBUG)
urlTempoJoursRTE = urlTempoJoursRTE..tempoSeason -- Mise à jour de l'url avec la saison Tempo.
domoticz.log("Url de récuperation des jours Tempo est: "..urlTempoJoursRTE,domoticz.LOG_DEBUG)
if item.isTimer or item.isSystemEvent then
domoticz.openURL({
url = urlTempoJoursRTE,
method = 'GET',
headers = {["User-Agent"]= "Wget/1.20.3 (linux-gnu)",["Content-Type"]="application/json"},
callback = scriptName, -- voir la reponse "httpResponses" à la suite.
})
elseif (item.isHTTPResponse) and (item.ok) then -- Traitement de la reponse à l'url chez RTE.
if (item.isJSON) then
local tempoSeasonData = domoticz.utils.fromJSON(item.data)
domoticz.log(tempoSeasonData, domoticz.LOG_DEBUG)
for k,v in pairs(tempoSeasonData.values) do
-- Calcul du nombre de jours par couleur depuis le deput de la saison
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 == DateTempoJ then tempoColor.J = v -- Récupération de la couleur tempo du jour.
elseif k == DateTempoJ1 then tempoColor.J1 = v -- Récupération de la couleur tempo du lendemain.
end
end
end
tempoCount.blue = nbrTempoBleu - tempoCount.blue -- nombre de jours BLEU restant pour la saison Tempo.
tempoCount.white = nbrTempoBlanc - tempoCount.white -- nombre de jours BLANC restant pour la saison Tempo.
tempoCount.red = nbrTempoRouge - tempoCount.red -- nombre de jours ROUGE restant pour la saison Tempo.
tempoDay = {J = coloursFR[tempoColor.J], J1=coloursFR[tempoColor.J1]} --Couleur des jours TEMPOJ et TEMPOJ1
--- Update variables pour TEMPO RTE
domoticz.variables('Tempo_J_Blanc').set(tempoCount.white)
domoticz.variables('Tempo_J_Rouge').set(tempoCount.red)
domoticz.variables('Tempo_J_Bleu').set(tempoCount.blue)
domoticz.variables('TempoJ').set(tempoDay.J)
domoticz.variables('TempoJ1').set(tempoDay.J1)
-- Envoi de mail pour information Jour Rouge demain.
if tempoDay.J1 == "ROUGE" and DateValid.compare(nowDate).compare == 1 then -- demain jour ROUGE
message = 'Demain le: '..DateTempoJ1..' la couleur TEMPO sera: ROUGE'
domoticz.notify("Alerte TEMPO jour ROUGE", message, domoticz.PRIORITY_EMERGENCY)
elseif tempoDay.J1 == "ROUGE" then -- demain jour ROUGE
message = 'Demain le: '..DateTempoJ1..' la couleur provisoire TEMPO sera: ROUGE'
domoticz.notify("Alerte TEMPO provisoire jour ROUGE", message, domoticz.PRIORITY_EMERGENCY)
end
-- Envoi de mail pour information Jour Blanc demain.
if tempoDay.J1 == "BLANC" and DateValid.compare(nowDate).compare == 1 then -- demain jour BLANC
message = 'Demain le: '..DateTempoJ1..' la couleur TEMPO sera: BLANC'
domoticz.notify("Alerte TEMPO jour BLANC", message, domoticz.PRIORITY_EMERGENCY)
elseif tempoDay.J1 == "BLANC" then -- demain jour BLANC
message = 'Demain le: '..DateTempoJ1..' la couleur provisoire TEMPO sera: BLANC'
domoticz.notify("Alerte TEMPO provisoire jour BLANC", message, domoticz.PRIORITY_EMERGENCY)
end
domoticz.log("Nombre de jours bleu restant: "..tempoCount.blue, domoticz.LOG_DEBUG)
domoticz.log("Nombre de jours blanc restant: "..tempoCount.white, domoticz.LOG_DEBUG)
domoticz.log("Nombre de jours rouge restant: "..tempoCount.red, domoticz.LOG_DEBUG)
domoticz.log("Couleur Tempo du jour: "..tempoDay.J, domoticz.LOG_DEBUG)
domoticz.log("Couleur Tempo de demain: "..tempoDay.J1, domoticz.LOG_DEBUG)
else
domoticz.log('Réponse KO : '..item.statusText, domoticz.LOG_FORCE)
end
end
}
Code : Tout sélectionner
-- RTE version
-- Check url extracted from browser/network log accessing :
-- https://www.services-rte.com/fr/visualisez-les-donnees-publiees-par-rte/calendrier-des-offres-de-fourniture-de-type-tempo.html
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", RED = "ROUGE", UNDEFINED = "NON_DEFINI"}
tempoCount = {blue=0, white=0, red=0}
tempoColor = {J="UNDEFINED", J1="UNDEFINED", FJ="?", FJ1="?"}
tempoDay = {J="NON_DEFINI", J1="NON_DEFINI", FJ="?", FJ1="?"}
-- 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
-- Get J/J1 fallback info
if k == tempoDate.J.."-fallback" then tempoColor.FJ = v
elseif k == tempoDate.J1.."-fallback" then tempoColor.FJ1 = v
end
--print(k.." = "..v) -- DEBUG
end
tempoDay = {J = coloursFR[tempoColor.J], J1=coloursFR[tempoColor.J1], FJ = tempoColor.FJ, FJ1 = tempoColor.FJ1}
return tempoDay, tempoCount
end
Code : Tout sélectionner
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.." (Fallback = "..tempoDay.FJ.."/"..tempoDay.FJ1..").")
-- Only update when next day "color" is defined and it's fallback info is false.
if ((tempoDay.J1 ~= "NON_DEFINI") and (tempoDay.FJ1 == "false")) 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
Code : Tout sélectionner
$ grep -i "lua: tempo" /tmp/domoticz.txt
2024-10-14 06:00:01.439 Status: LUA: TEMPO : Monday:BLEU - Tuesday:NON_DEFINI (Fallback = false/?).
2024-10-14 06:15:01.588 Status: LUA: TEMPO : Monday:BLEU - Tuesday:BLEU (Fallback = false/false).
2024-10-14 06:15:01.588 Status: LUA: TEMPO : Updated !
2024-10-15 06:00:01.477 Status: LUA: TEMPO : Tuesday:BLEU - Wednesday:NON_DEFINI (Fallback = false/?).
2024-10-15 06:15:00.916 Status: LUA: TEMPO : Tuesday:BLEU - Wednesday:BLEU (Fallback = false/false).
2024-10-15 06:15:00.916 Status: LUA: TEMPO : Updated !
J'ai le user password par défaut admin domoticz (je teste ça sur un raspberry PI de test et je suis sur un réseau de confiance)user:password ou mettre son LAN en réseau de confiance.
Code : Tout sélectionner
Erreur lors de l'envoi du log à Domoticz: 401
Code : Tout sélectionner
#!/usr/bin/env python
import requests
from datetime import date
import time
# Variables pour Domoticz
domoticz_ip = '192.168.0.203:8084'
idx_couleur_jour = '21'
idx_couleur_jour_j1 = '22'
vname_couleur_jour = 'Couleur TEMPO J'
vname_couleur_jour_j1 = 'Couleur TEMPO J1'
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)