Données TEMPO via Node-RED

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 »

Bonjour, et merci pour le travail.

Concernant oauth2, il faut installer un nœud en particulier ?

Merci :wink:

Edit, boulet de service, je me réponds :

Required Node-RED nodes:

* node-red-contrib-oauth2

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?

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 ›.

Bonjour,

voilà l’erreur :

Merci.

Bizarre, l’URL n’existe pas. Essaies en faisant un refresh du serveur Node-red avec F5.

Après F5 & F12/vider le cache, pas mieux

Tu peux poster le code du node avant le oauth2.

/**
 * @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 ?

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 :wink:

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 »