Bonjour,
Ci-joint un flow Node-RED pour récupérer les données TEMPO depuis l’API RTE.
Ce flow permet de récupérer la couleur du jour, celle du lendemain, ainsi que le nombre de jours passés et restants par couleur.
Il vous suffit de souscrire à l’API RTE et de renseigner vos identifiants dans le flow, comme indiqué dans le README.
Le flow gère l’authentification oauth2 et le renouvellement automatique du token.
https://github.com/Ikes72/nodered-rte-tempo-flow/tree/main
1 « J'aime »
Ludoc
Janvier 12, 2025, 5:56
2
Bonjour, et merci pour le travail.
Concernant oauth2, il faut installer un nœud en particulier ?
Merci
Edit, boulet de service, je me réponds :
Required Node-RED nodes:
* node-red-contrib-oauth2
Ludoc
Janvier 14, 2025, 3:13
3
Bonjour,
J’ai enfin pu essayer avec les identifiants RTE, mais j’obtiens un message d’erreur dans le 1er flow « RTE authentication management » :
Merci.
Salut,
Si tu mets un node debug avant le node oauth2, il y a quoi dans le message?
Ludoc
Janvier 14, 2025, 10:07
5
Salut,
J’ai mis un debug, qui me retourne « undefined »
J’ai cru à une histoire de credentials, du coup je me suis réabonné, et remis les nouveaux login/mdp. Pas mieux.
Merci.
Il faut que tu configures le node debug que tu as rajouté en ‹ complete object ›.
Bizarre, l’URL n’existe pas. Essaies en faisant un refresh du serveur Node-red avec F5.
Ludoc
Janvier 15, 2025, 4:27
9
Après F5 & F12/vider le cache, pas mieux
Tu peux poster le code du node avant le oauth2.
Ludoc
Janvier 15, 2025, 4:43
11
/**
* @fileoverview OAuth2 token management for RTE API
* @author Ikes
* @version 1.0.0
*/
/**
* Configuration constants
* @constant {Object} CONFIG
*/
const CONFIG = {
TOKEN_ENDPOINT: 'https://digital.iservices.rte-france.com/token/oauth/',
REFRESH_INTERVAL_MINUTES: 60,
TIMEZONE: 'Europe/Paris'
};
/**
* Main handler for OAuth2 token management
* @param {Object} msg - Message object from Node-RED
* @returns {void}
*/
function handleOAuth2(msg) {
// Retrieve current OAuth2 data from flow context
let oauth2Data = flow.get('rteToken') || {
accessTokenURL: CONFIG.TOKEN_ENDPOINT,
accessToken: '',
tokenType: '',
tokenRefreshDelay: CONFIG.REFRESH_INTERVAL_MINUTES * 60000,
tokenRefreshTimer: null
};
// Handles OAuth2 response
if (msg.oauth2Response) {
return handleOAuth2Response(msg.oauth2Response, oauth2Data);
}
// Send OAuth2 request
sendOAuth2Request(oauth2Data);
}
/**
* Handles OAuth2 response and manages token refresh scheduling
* @param {Object} response - OAuth2 response object
* @param {string} response.access_token - Access token
* @param {string} response.token_type - Token type
* @param {Object} oauth2Data - Current OAuth2 data from flow context
* @returns {void}
*/
function handleOAuth2Response(response, oauth2Data) {
// Update token information
oauth2Data.accessToken = response.access_token;
oauth2Data.tokenType = response.token_type;
// Store updated data in flow context
flow.set('rteToken', oauth2Data);
// Clear existing timer if present
if (oauth2Data.tokenRefreshTimer) {
clearTimeout(oauth2Data.tokenRefreshTimer);
}
// Set up new refresh timer
oauth2Data.tokenRefreshTimer = setTimeout(
() => sendOAuth2Request(oauth2Data),
oauth2Data.tokenRefreshDelay
);
}
/**
* Sends OAuth2 request with client credentials
* @param {Object} oauth2Data - The OAuth2 configuration data
* @param {string} oauth2Data.accessTokenURL - The token endpoint URL
* @param {number} oauth2Data.tokenRefreshDelay - Milliseconds until token refresh
* @returns {void}
*/
function sendOAuth2Request(oauth2Data) {
const clientID = env.get('RTE_CLIENT_ID');
const secretID = env.get('RTE_SECRET_ID');
if (!clientID || !secretID) {
node.error('Missing RTE credentials in environment variables');
node.status({
fill: 'red',
shape: 'dot',
text: 'Missing credentials'
});
return;
}
const nextRefresh = new Date(Date.now() + oauth2Data.tokenRefreshDelay);
node.status({
fill: 'blue',
shape: 'dot',
text: `Refresh token at ${nextRefresh.toLocaleTimeString('fr-FR', { timeZone: CONFIG.TIMEZONE })}`
});
/**
* @type {Object} oauth2Request - OAuth2 request object
* @property {Object} credentials - Client credentials
* @property {string} credentials.grant_type - OAuth2 grant type
* @property {string} credentials.client_id - Client ID
* @property {string} credentials.client_secret - Client secret
* @property {string} credentials.scope - OAuth2 scope (empty in this case)
*/
node.send({
oauth2Request: {
access_token_url: oauth2Data.accessTokenURL,
credentials: {
grant_type: 'client_credentials',
client_id: clientID,
client_secret: secretID,
scope: ''
}
}
});
node.done();
}
// Entry point
handleOAuth2(msg);
Je fais le test ce soir de redéployer le flow sur mon nr, car je ne vois rien de spécial.
Les credentials sont bien renseignés dans les paramètres du flow ?
Ludoc
Janvier 15, 2025, 5:29
13
Oui, ils sont bien renseignés, j’ai même recréé une nouvelle appli rte pour le coup.
Euh, je viens de recharger le flow dans un nouvel onglet et ça a l’air de fonctionner, et avec les mêmes login/mdp, j’ai pas tout compris
Désolé pour le dérangement, et le temps perdu.
Merci.
Je pense que le node ne trouvait pas les variables d’environnement et ça bloquait son exécution.
1 « J'aime »