[DzVents] Tempo via l'API RTE

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.
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

[DzVents] Tempo via l'API RTE

Message par Neutrino »

Bonjour à tous,
Voyant certains galérer avec la récupération des couleurs des jours TEMPO, je me suis penché sur l'API RTE.
Déjà en fonction avec EcoWatt, il faut s'inscrire sur le site, créer une application, s'abonner à l'API et récupérer une clé.

Voici le script dzVents:

Code : Tout sélectionner

local scriptName = 'tempo'
local scriptVersion = '1.0'
--[[
 
- Créez un compte sur le site de RTE (https://data.rte-france.com/web/guest)
- Allez sur l'API Tempo Like Supply Contract (https://data.rte-france.com/catalog/-/api/consumption/Tempo-Like-Supply-Contract/v1.1)
- Cliquez sur "Abonnez-vous à l'API", créez une nouvelle application
- Récuperez votre clé en cliquant sur "Copier en base 64"

]]

--                                        Dummy à créer :
local TempoJ = "Tempo" -- Text device J
local TempoJ1 = "Tempo Demain" -- Text device J+1

local cleAPI = "VW5lIGJpw6hyZSBnYWduw6llIHBvdXIgbGUgcHJlbWllciBxdWkgdHJvdXZlIMOnYQ=="

return {
	--active = false,
	active = true,
	logging = {
		level = domoticz.LOG_DEBUG, -- Uncomment to override the dzVents global logging setting
		marker = scriptName..' '..scriptVersion
	},	
	on = {
		timer = {'at 01:40'},
		--timer = {'every 1 minutes'},
		httpResponses = {
			scriptName,
			scriptName..'at',
		},	
	},
	data = {

		--access_token = {}
		access_token = { history = true, maxItems = 1, maxMinutes = 110 }
	},		

	execute = function(domoticz, item) 
		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..'at',
				})
			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 = "https://digital.iservices.rte-france.com/open_api/ecowatt/v4/sandbox/signals"
				local Time = require('Time')
				local now = Time() -- current time
				local demain = now.addDays(2)
				local url = "https://digital.iservices.rte-france.com/open_api/tempo_like_supply_contract/v1/tempo_like_calendars"
				url = url .. "?start_date="..domoticz.time.rawDate..
					"T00:00:00%2B01:00&end_date="..demain.rawDate.."T00:00:00%2B01:00&fallback_status=true"
				domoticz.log('Requesting data from RTE', domoticz.LOG_DEBUG)
				domoticz.openURL({
					url = url,
					method = 'GET',
					headers =  { ['Content-Type'] = 'application/json;charset=UTF-8',
								['Authorization'] = 'Bearer '..domoticz.data.access_token.get(1).data},
					
					callback = scriptName,
				})
			end
			
			
		end

		if not item.isHTTPResponse then 
			--domoticz.log("Erreur HTTP",domoticz.LOG_ERROR)
			return 
		end

		local response = item
		if response.trigger == scriptName..'at' then
			local contents = response.json
			domoticz.data.access_token.add(contents.access_token)
			domoticz.log('access_token : '..domoticz.data.access_token.getLatest().data, domoticz.LOG_DEBUG)
			
		elseif response.trigger == scriptName then
			domoticz.log(response.data, domoticz.LOG_DEBUG)
			local contents = response.json.tempo_like_calendars
			if contents.values[1].start_date:match(domoticz.time.rawDate) then
				domoticz.log("Aujourd'hui "..contents.values[1].value)
				domoticz.log("Demain "..contents.values[2].value)
				TempoJ.updateText(contents.values[1].value)
				TempoJ1.updateText(contents.values[2].value)
				
			else
				domoticz.log("Aujourd'hui "..contents.values[2].value)
				domoticz.log("Demain "..contents.values[1].value)
				TempoJ.updateText(contents.values[2].value)
				TempoJ1.updateText(contents.values[1].value)
			end
			
			
			
			
		
		elseif (not response.ok) or (response.trigger ~= scriptName) then
			domoticz.log('Last http response was not what expected. Trigger: '..response.trigger, domoticz.LOG_ERROR)
			domoticz.log(response.data, domoticz.LOG_ERROR)
			return
		

		end
		
	end
}
ça affiche la couleur pour aujourd'hui et demain dans un Text.
A améliorer avec un switch selector ;)
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
lost
Messages : 1511
Inscription : 12 nov. 2016, 11:01

Re: [DzVents] Tempo via l'API RTE

Message par lost »

Hello,

Il y a aussi moyen de s'en sortir avec... l'info ouverte tirée de la page RTE qui les donne. Pas besoin de faire du web-scrapping compliqué en prime, car cette page appelle elle même un lien qui donne un JSON des infos saison en cours: Elle se contente de mettre cela en forme calendaire. L'avantage c'est que pas besoin d'inscription/jeton...

Cf: viewtopic.php?p=122097#p122097

Maintenant, tu as aussi pu préférer aller vers ce qui est documenté niveau API... même si c'est toujours pénible de fermer par défaut l'accès à une info par ailleurs ouverte.

Maintenant, vu comme c'est fichu dans la page grand public, le lien du JSON me parait difficile à filtrer pour eux s'il leur en prenait la fantaisie: C'est un lien, donc c'est côté client que cela se tire! Avec juste le JS de la page "chapeau" qui encapsule cela qui mets en forme côté client. Pas possible donc de filtrer sur une IP interne de RTE sans revoir globalement le fonctionnement de la page.

L'autre avantage c'est qu'on a l'info entre 6h et 6h15 pour le moment! :D
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: [DzVents] Tempo via l'API RTE

Message par Neutrino »

J'ai pas de contrat Tempo, je voulais juste voir ce qu'il existait en "officiel". :mrgreen:
L'avantage, c'est que l'API est documentée et qu'on est informé si elle change, contrairement à un JSON d'une page qui peut disparaitre ou être modifiée sans préavis.
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
lost
Messages : 1511
Inscription : 12 nov. 2016, 11:01

Re: [DzVents] Tempo via l'API RTE

Message par lost »

Oui c'est généralement une bonne idée de faire ainsi... mais ce json est indiqué plus fiable que l'API officielle par le developpeur du site api-couleur-tempo.fr qui a quelques années de recul. Y'a des commentaires sur son github et dans le code.

Le coup du compte/jeton c'est lourd qd même...
Répondre