Chauffe-eau en HC de nuit les jours faibles : decision quotidienne du bilan, workflow ECS sous controle du depot (VRM, prevision du jour), energie 24 h

This commit is contained in:
Tallagrand Thierry
2026-10-07 07:06:03 +02:00
parent 0e0c0a558d
commit c2824085c9
26 changed files with 3060 additions and 42 deletions

View File

@@ -1,47 +1,23 @@
#!/usr/bin/env node
// Usage: node tools/n8n-pull.mjs [workflowId] [outputFile]
// GET un workflow n8n et l'écrit en JSON (pretty) dans un fichier local.
// Clé API lue depuis ~/.config/opencode/opencode.json (mcp.n8n-mcp.environment).
// Usage: node tools/n8n-pull.mjs <workflowId> <fichierSortie>
// GET d'un workflow n8n vers un fichier local (mise sous controle du depot).
// Meme configuration d'API que n8n-push.mjs. N'ecrit rien sur le serveur.
import fs from 'fs';
import os from 'os';
import path from 'path';
const WORKFLOW_ID = process.argv[2] || 'ATswvGfG4KJUls0K';
const OUT = process.argv[3] || `workflows/pull-${WORKFLOW_ID}.json`;
const [ID, OUT] = process.argv.slice(2);
if (!ID || !OUT) { console.error('Usage: node tools/n8n-pull.mjs <workflowId> <fichierSortie>'); process.exit(1); }
function loadApiConfig() {
if (process.env.N8N_API_KEY) {
return {
url: process.env.N8N_URL || 'https://n8n.airtria.pro',
key: process.env.N8N_API_KEY
};
}
const cfgPath = path.join(os.homedir(), '.config/opencode/opencode.json');
const cfg = JSON.parse(fs.readFileSync(cfgPath, 'utf8'));
if (process.env.N8N_API_KEY) return { url: process.env.N8N_URL || 'https://n8n.airtria.pro', key: process.env.N8N_API_KEY };
const cfg = JSON.parse(fs.readFileSync(path.join(os.homedir(), '.config/opencode/opencode.json'), 'utf8'));
const env = cfg?.mcp?.['n8n-mcp']?.environment || {};
if (!env.N8N_API_KEY) {
console.error('Clé API n8n introuvable (env N8N_API_KEY ou opencode.json)');
process.exit(1);
}
return {
url: (env.N8N_API_URL || 'https://n8n.airtria.pro/api/v1').replace(/\/api\/v1\/?$/, ''),
key: env.N8N_API_KEY
};
if (!env.N8N_API_KEY) { console.error('Clé API n8n introuvable'); process.exit(1); }
return { url: (env.N8N_API_URL || 'https://n8n.airtria.pro/api/v1').replace(/\/api\/v1\/?$/, ''), key: env.N8N_API_KEY };
}
const { url, key } = loadApiConfig();
const res = await fetch(`${url}/api/v1/workflows/${WORKFLOW_ID}`, {
headers: { 'X-N8N-API-KEY': key }
});
if (!res.ok) {
console.error(`GET échoué: ${res.status} ${res.statusText}`);
console.error(await res.text());
process.exit(1);
}
const wf = await res.json();
fs.mkdirSync(path.dirname(OUT), { recursive: true });
const r = await fetch(`${url}/api/v1/workflows/${ID}`, { headers: { 'X-N8N-API-KEY': key } });
if (!r.ok) { console.error(`GET ${r.status}`); process.exit(1); }
const wf = await r.json();
fs.writeFileSync(OUT, JSON.stringify(wf, null, 2) + '\n');
console.log(`OK: "${wf.name}" (${wf.nodes?.length} nodes, active=${wf.active}) -> ${OUT}`);
console.log(`updatedAt: ${wf.updatedAt}`);
console.log(`${OUT} ← "${wf.name}" (${wf.nodes.length} nodes, active=${wf.active})`);