[LUA] Script pour connaitre la couleur du jour pour Tempo d'EDF et script pour la couleur Tempo du lendemain

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
lost
Messages : 1511
Inscription : 12 nov. 2016, 11:01

Re: [LUA] Script pour connaitre la couleur du jour pour Tempo d'EDF et script pour la couleur Tempo du lendemain

Message par lost »

Keros a écrit : 13 mars 2023, 21:51 Il me semble que la mise à jour de l'info du lendemain se fait à 13h. Je fais tourner mon script à 13h05 : aucune erreur pour récupérer l'info.
Visiblement, c'est bien autour de 11h. Ce matin au vu de mes logs cela a été fait entre 11h00 et 11h10:

Code : Tout sélectionner

2023-03-15 11:00:00.832  Status: LUA: TEMPO : Wednesday:BLEU - Thursday:NON_DEFINI
2023-03-15 11:10:00.862  Status: LUA: TEMPO : Wednesday:BLEU - Thursday:BLEU
2023-03-15 11:10:00.862  Status: LUA: TEMPO : Updated !
J'ai en effet modifié le script afin de tenir compte de la chaine J1 qui semble à partir de minuit jusqu'à la MAJ indiquer "NON_DEFINI".

J'essaie donc désormais sur une plage de 3h entre 11h et 14h, toutes les 10mn, tant que la seconde chaîne n'indique pas encore la couleur du lendemain. Cela assure en même temps d'avoir l'info même si le site EDF a des vapeurs temporaires.

Cela donne désormais chez moi:

Code : Tout sélectionner

-- Script to get tempo coulours for current + next day and feed a dummy text device
-- that must be created from Domoticz interface.
--
-- User editable settings (tempoIdx/Name = virtual text switch IDX/Name),
-- updates check time range must not cross midnight and be ordered (hCheck1 < hCheck2).

jsonLibPath = '/home/pi/domoticz/scripts/lua/JSON.lua' -- UPDATE USER NAME IN PATH !!!
hCheck1     = 11 -- Begin hour for updates check (should be done ~11h00)
hCheck2     = 14 -- End   hour for updates check
tempoIdx    = 707
tempoName   = 'Tempo'

--
-- Internal fct :
-- Get current script exec time & compute last 'device' or 'uservariable' update time.
--
local function timeLastUpdate(devOrVar, isUserVar)
    t1  = os.time()
    
    if (isUserVar == true) then
        sT0 = uservariables_lastupdate[devOrVar]
    else
        sT0 = otherdevices_lastupdate[devOrVar]
    end

    -- Returns a date time like 2016-12-02 15:30:10
    -- => Format as os.time & compute diff :

    year    = string.sub(sT0, 1, 4)
    month   = string.sub(sT0, 6, 7)
    day     = string.sub(sT0, 9, 10)
    hour    = string.sub(sT0, 12, 13)
    minutes = string.sub(sT0, 15, 16)
    seconds = string.sub(sT0, 18, 19)
    t0      = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
    tDiff   = os.difftime(t1, t0)

    return(tDiff)
end

-- MAIN

commandArray = {}

time = os.date("*t")

-- Exec every 10mn in hereupper hours range until next day status is defined,
-- retrying while last update > range to handle tempory fails (EDF site unreachable...).
if ((time.min % 10 == 0) and (time.hour >= hCheck1) and (time.hour < hCheck2) and (timeLastUpdate(tempoName, false) > ((hCheck2 - hCheck1)*3600))) then
    jsonLib = assert(loadfile(jsonLibPath))
    json = (jsonLib)()

    today  = tostring(os.date("%Y-%m-%d"))
    config = assert(io.popen('curl --retry 1 --connect-timeout 2 -m 4  \"https://particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant='..today..'\"'))
    tempo  = config:read('*all')
    -- Returned JSON format : {"couleurJourJ":"TEMPO_ROUGE","couleurJourJ1":"TEMPO_ROUGE"}
    config:close()
    
    jsonTempo = json:decode(tempo)
    --print(jsonTempo.couleurJourJ)	        			
    --print(jsonTempo.couleurJourJ1)
    
    tempoJ  = string.gsub(jsonTempo.couleurJourJ,  "TEMPO_", "")
    tempoJ1 = string.gsub(jsonTempo.couleurJourJ1, "TEMPO_", "")
    
    dateDay     = tostring(os.date("%A"))
    dateNextDay = tostring(os.date('%A', (os.time()+ 86400)))
    
    tempoText = dateDay..":"..tempoJ.." - "..dateNextDay..":"..tempoJ1
    print("TEMPO : "..tempoText)
    
    -- Only update when next day "color" is defined.
    if (tempoJ1 ~= "NON_DEFINI") then
        commandArray['UpdateDevice'] = tempoIdx.."|0|"..tempoText
	print("TEMPO : Updated !")
    end
end

return commandArray
Dernière modification par lost le 15 mars 2023, 16:22, modifié 1 fois.
Alain78
Messages : 75
Inscription : 05 févr. 2022, 09:18

Re: [LUA] Script pour connaitre la couleur du jour pour Tempo d'EDF et script pour la couleur Tempo du lendemain

Message par Alain78 »

Bonjour,

Pour la fiabilité des la donnée concernant la Couleur TEMPO du jour, voici la solution pour la prendre à la source.(RTE)

API sur RTE pour récupération Couleur jour TEMPO.
https://data.rte-france.com/catalog/-/a ... tract/v1.1

S'abonner et générer un token (gratuit)

La publication se fait tous les jours à 10h30. Et a priori pas de problème de délais contrairement au site EDF qui est souvent très en retard. (je récupére à partir de 10h36 et 2 autres fois en cas de PB)

Pour ceux que cela intéresse je vous communique le script réalisé pour gérer la récupération de cette valeur (inspiré du script original)

J'utilise 3 Variables ( TempoJ,TempoJ1 et Tempo_HP-HC) ou je stocke les informations TEMPO que je peux interroger par différents scripts pour optimiser la consommation.

à 22h j'ai un script qui passe la variable "Tempo_HP-HC" de "HP" à "HC" et vice versa à 6h du matin.
à 6h la couleur du TEMPOJ1 (lendemain) est mise dans TEMPOJ (Couleur Tempo du jour) et met la couleur du TEMPOJ1 à Gris (Indéfini)

Génération d'une Alerte par mail et sur l'appli mobile en cas de jour "ROUGE"
Je garde l’accès au site EDF pour récupérer le nombre de jours restant pour chaque couleurs.

Code : Tout sélectionner

-- Récuperation informations pour la couleur TEMPO du jour.
-- Script: script_time_RTE_Tempo_Color
-- Version 2023-02-23

local scriptName = 'script_time_Tempo_Color_RTE'
local scriptVersion = '1.0'

local cleAPI = 'Clef....'
local urlTempoColorRTE = 'https://digital.iservices.rte-france.com/open_api/tempo_like_supply_contract/v1/tempo_like_calendars' --- couleur TEMPO du jour et jour + 1

return {
    on = {  timer = { 'at 10:36', 'at 10:46', 'at 10:56' },
        	httpResponses = { scriptName..'01', scriptName..'02' } -- must match with the callback passed to the openURL command
         },
            logging =   {   level    =   domoticz.LOG_ERROR,
                            -- 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 },
	        data = {
		            --access_token = {}
		              access_token = { history = true, maxItems = 1, maxMinutes = 110 }
	},		

	execute = function(domoticz, item) 
	    
        local DateTempoJ1  = domoticz.time.dateToDate(domoticz.time.addDays(1).rawDateTime,'yyyy-mm-dd hh:MM:ss','yyyy-mm-dd')
        local TEMPOJ1  = domoticz.variables('TempoJ1') -- Variable Couleur TEMPO de demain.

		if item.isTimer then
			if domoticz.data.access_token.size == 0 then 
				--or domoticz.data.access_token.get(1).time.secondsAgo > 6000 then
			
				local url = "https://digital.iservices.rte-france.com/token/oauth/"
				domoticz.log('Requesting data from RTE', domoticz.LOG_DEBUG)
				domoticz.openURL({
					url = url,
					method = 'POST',
					headers =  { ['Content-Type'] = 'application/x-www-form-urlencoded',
							     ['Authorization'] = 'Basic '..cleAPI},
					callback = scriptName..'01',
				    })
			else
				domoticz.log('access_token age: '..domoticz.data.access_token.get(1).time.secondsAgo, domoticz.LOG_DEBUG)
				domoticz.log('access_token : '..domoticz.data.access_token.get(1).data, domoticz.LOG_DEBUG)
				local url = urlTempoColorRTE
				domoticz.log('Requesting data from RTE', domoticz.LOG_DEBUG)
				domoticz.openURL({
					url = url,
					method = 'GET',
					headers =  { ['Content-Type'] = 'application/json;charset=utf-8',
					             ['Accept'] = 'application/json',
								 ['Authorization'] = 'Bearer '..domoticz.data.access_token.get(1).data},
					callback = scriptName..'02',
			    	})
			end
        elseif (item.isHTTPResponse and item.ok) then  
    	    if item.trigger == scriptName..'01' then
		        local contents = domoticz.utils.fromJSON(item.data)
		        domoticz.data.access_token.add(contents.access_token)
		        domoticz.log('access_token : '..domoticz.data.access_token.getLatest().data, domoticz.LOG_DEBUG)
		        domoticz.log('access_token age: '..domoticz.data.access_token.get(1).time.secondsAgo, domoticz.LOG_DEBUG)
				local url = urlTempoColorRTE
				domoticz.log('Requesting data from RTE', domoticz.LOG_DEBUG)
				domoticz.openURL({
					url = url,
					method = 'GET',
					headers =  { ['Content-Type'] = 'application/json;charset=utf-8',
					             ['Accept'] = 'application/json',
								 ['Authorization'] = 'Bearer '..domoticz.data.access_token.get(1).data},
					callback = scriptName..'02',
			    	})
		    elseif item.trigger == scriptName..'02' then
			    local contents = domoticz.utils.fromJSON(item.data)
			    local StartDateTempo = string.sub (contents.tempo_like_calendars.values[1].start_date, 1, 10)
			    if DateTempoJ1 == StartDateTempo then
			        local ColorTempo = contents.tempo_like_calendars.values[1].value
			        if ColorTempo == "BLUE" then
			             ColorTempo = "BLEU"
			        elseif ColorTempo == "RED" then
			             ColorTempo = "ROUGE"
			        elseif ColorTempo == "WHITE" then
			             ColorTempo = "BLANC"
    			    end
			        message = 'Demain : '..StartDateTempo..' La couleur TEMPO sera: '..ColorTempo
			        print(message)
			        if TEMPOJ1.value ~= ColorTempo then -- test si valeur précedente est identique
    			        TEMPOJ1.set(ColorTempo)
    			        if ColorTempo == "ROUGE" and TEMPOJ1.value ~= "ROUGE" then
        		            domoticz.notify("Alerte TEMPO jour ROUGE", message, domoticz.PRIORITY_EMERGENCY)
    			        end
    			    end
    	        end
	        end
		else
			domoticz.log('Last http response was not what expected. Trigger: '..item.trigger, domoticz.LOG_ERROR)
			domoticz.log(item.data, domoticz.LOG_ERROR)
		end
	end
}
Et le script de bascule à 06h et 22h

Code : Tout sélectionner

--------------------------------------------
-- Changement des jours et HP - HC à 22h et 6h.
--------------------------------------------
local scriptName        = 'script_time_Tempo_HP-HC'
local scriptVersion     = '1.0'

return {
    on = {  
        timer =     { 'at 05:55', 'at 22:07' },
        system =    { 'start' },
        },

            logging =   {      level    =   domoticz.LOG_ERROR,
                            -- 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 DateTempoJ = domoticz.time.dateToDate(domoticz.time.rawDateTime,'yyyy-mm-dd hh:MM:ss','yyyy-mm-dd')
        local Heure      = domoticz.time.dateToDate(domoticz.time.rawDateTime,'yyyy-mm-dd hh:MM:ss','hh')
        local TEMPOJ     = domoticz.variables('TempoJ') -- Variable Couleur TEMPO du jour.
        local TEMPOJ1    = domoticz.variables('TempoJ1') -- Variable Couleur TEMPO de demain.
        local TEMPOH     = domoticz.variables('Tempo_HP-HC') -- Variable HP-HC TEMPO.
        
        if item.isTimer then
            if Heure == "05" then -- Passage HP + changement de couleur TEMPO
                TEMPOH.set("HP")    -- Heure pleine
    			if TEMPOJ1.value == "ROUGE" then -- Aujourd'hui jour ROUGE
			        message = 'Aujourd\'hui : '..DateTempoJ..' La couleur TEMPO est: ROUGE'
        		    domoticz.notify("Alerte TEMPO jour ROUGE", message, domoticz.PRIORITY_EMERGENCY)
                    domoticz.variables('Color_Luxy').set("Rouge-Flash")
    			end
                TEMPOJ.set(TEMPOJ1.value)   -- passage de la couleur tempo avec celle de demain
                TEMPOJ1.set("GRIS") -- Mise à indéterminée pour la couleur du lendemain
            elseif Heure == "22" then -- Passage HC
                TEMPOH.set("HC") -- Heure creuse
            end
        elseif item.isSystemEvent then
            if (tonumber(Heure) >= 6 and tonumber(Heure) < 22) then
                TEMPOH.set("HP") -- Heure pleine
            else
                TEMPOH.set("HC") -- Heure creuse   
            end
        end
    end
} 
Le résultat:
Couleur tempo
Couleur tempo
Tempo.jpg (23.23 Kio) Consulté 2579 fois
Les variables peuvent être remplacées par un switch ou autre.

Alain
Dernière modification par Alain78 le 05 août 2023, 07:57, modifié 3 fois.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: [LUA] Script pour connaitre la couleur du jour pour Tempo d'EDF et script pour la couleur Tempo du lendemain

Message par Keros »

Je n'avais jamais vu qu'on pouvais récupérer les infos depuis RTE "directement".
Merci pour l'info et les scripts Alain.
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: [LUA] Script pour connaitre la couleur du jour pour Tempo d'EDF et script pour la couleur Tempo du lendemain

Message par lost »

C'est certes intéressant d'avoir une autre source, mais que je trouve assez ballot c'est de ne pas offrir l'info sans devoir créer un compte ici normalement parfaitement inutile.

Mais c'est une habitude (à mon sens contre-productive, voir stupide) chez RTE/Enedis: Même cet hiver annoncé tendu, ce qui avait été mis en place avait le même type de contrainte pour diffuser l'information.

Le message était en gros "pour nous simplifier la vie et limiter les risque de coupures, merci de créer un compte pour accéder à une info.. pourtant ouverte et non nominative": J'aimerais connaître le nb d'inscrit vs nb de foyers, cela doit être epsilonesque.
Dernière modification par Keros le 15 mars 2023, 18:54, modifié 1 fois.
Raison : Citation supprimée. Merci de ne pas citer le message précédent lors d'une réponse directe.
Alain78
Messages : 75
Inscription : 05 févr. 2022, 09:18

Re: [LUA] Script pour connaitre la couleur du jour pour Tempo d'EDF et script pour la couleur Tempo du lendemain

Message par Alain78 »

Bonjour,

Pour RTE ils ne fournissent les informations pour les Administrations et les partenaires, ils n'ont pas vocation à fournir des accès grand public. Le fait de mettre des token, cela limite les accès en automatique. Si un id + Token accède trop souvent, ils bloquent le compte.

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

Re: [LUA] Script pour connaitre la couleur du jour pour Tempo d'EDF et script pour la couleur Tempo du lendemain

Message par lost »

Certes, mais ils pourraient simplement faire un ban temporaire d'une IP qui s'excite trop sur l'URL (surtout autour de l'heure de MAJ, au delà être plus relax pour permettre par exemple les test de nos scripts!) pour résoudre les pb d'abus.

On a déjà tous une telle tétrachiée de comptes pour les choses ou c'est indispensable, forcément quand cela ne l'est pas ce n'est guère tentant! Si le but est de limiter les accès car ils n'ont pas l'infra pour servir tout le monde, ne répends pas trop la nouvelle: Probable qu'ils fermeraient le robinet!
Dernière modification par Keros le 15 mars 2023, 18:54, modifié 1 fois.
Raison : Citation supprimée. Merci de ne pas citer le message précédent lors d'une réponse directe.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: [LUA] Script pour connaitre la couleur du jour pour Tempo d'EDF et script pour la couleur Tempo du lendemain

Message par Keros »

Il y a un truc que je ne comprends pas :
Ce signal définit les jours de couleur identifiés dans le tarif réglementé de vente TEMPO, il est consitué de 40 jours blancs et de 20 jours rouges.
300 jours bleus - 43 jours blancs - 22 jours rouges

Qui dit vrai :mrgreen:

:arrow: les infos sur le site RTE sont incorrectes. Et vu la faute de frappe à consitué, je pense que personne n'a jamais vérifié ce qui était écrit sur la page.
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
Alain78
Messages : 75
Inscription : 05 févr. 2022, 09:18

Re: [LUA] Script pour connaitre la couleur du jour pour Tempo d'EDF et script pour la couleur Tempo du lendemain

Message par Alain78 »

Bonjour,

Oui je pense que le commentaire date de 2019 (CONSOMMATION Créée le 24/10/2019 V 1.1) et que personne n'a pensé à le mettre à jours. Mais la donnée fournie par l'API est bonne car utilisée par tous les distributeurs dont EDF.

Alain
Dernière modification par Keros le 16 mars 2023, 12:28, modifié 1 fois.
Raison : Citation ssupprimée. Merci de ne pas citer le message précédent lors d'une réponse directe.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: [LUA] Script pour connaitre la couleur du jour pour Tempo d'EDF et script pour la couleur Tempo du lendemain

Message par Keros »

J'ai le Tempo depuis 2014 et il y a toujours eu 22 jours.

J'essayerai de mettre les deux scripts en parallèle .... avec une grosse alarme si les infos sont différentes :mrgreen:
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
Alain78
Messages : 75
Inscription : 05 févr. 2022, 09:18

Re: [LUA] Script pour connaitre la couleur du jour pour Tempo d'EDF et script pour la couleur Tempo du lendemain

Message par Alain78 »

Bonjour,

Sur le site Services de RTE les infos sont à jours aussi: https://www.services-rte.com/fr/visuali ... tempo.html

Je pense que ce n'est que le commentaire sur l'Application qui a été mis par un petit stagiaire et qui n'avait pas les bonnes infos.. :lol:
Dernière modification par Keros le 16 mars 2023, 21:03, modifié 1 fois.
Raison : Citation supprimée. Merci de ne pas citer le message précédent lors d'une réponse directe.
Répondre