homelab-brain/smart-home/scripts/grafana_shot.js
root b61ac66367 docs(smart-home): dokumentiere Heizung/Brenner komplett, alle Zugänge in homelab.conf
- smart-home/HEIZUNG.md: komplette Doku zur Ölbrenner-Erkennung (brennerstarts.py),
  Schwellwerte, Rekonstruktion, Dashboard-Panels, Troubleshooting
- smart-home/STATE.md: klare Tabelle mit allen Dienst-URLs (public+intern) und
  Logins — Grafana/ioBroker/InfluxDB laufen ALLE in CT 143 auf pve-mu-3
- homelab.conf: CT_143_MU3 Beschreibung korrigiert (war "Raspi-Broker"),
  neue Variablen GRAFANA_URL_*/IOBROKER_URL_*/INFLUX_URL_INTERN + User/Pass
  (=PW_DEFAULT) damit beim nächsten Mal keine Fragen aufkommen
- smart-home/scripts/: alle relevanten Skripte ins Repo:
  grafana_shot.js (Puppeteer-Login mit admin/astral66)
  add_month_panel.py (idempotente Monatskacheln im Heizung-Dashboard)
  brenner_rekonstruktion.py + cleanup_reconstruct.py + check_april.py
  patch_brenner.sh (Anpassung der Schwellwerte nach Regelkurven-Änderung)
- MASTER_INDEX.md: Verweis auf HEIZUNG.md

Made-with: Cursor
2026-04-20 22:31:32 +02:00

59 lines
1.6 KiB
JavaScript

const puppeteer = require('/opt/webpage-screenshot-mcp/node_modules/puppeteer');
(async () => {
const url = process.argv[2];
const out = process.argv[3] || '/tmp/shot.png';
const user = process.env.GF_USER || 'admin';
const pass = process.env.GF_PASS || 'astral66';
const base = new URL(url);
const loginUrl = `${base.protocol}//${base.host}/login`;
const browser = await puppeteer.launch({
headless: true,
args: [
'--no-sandbox',
'--disable-dev-shm-usage',
'--disable-gpu',
],
defaultViewport: { width: 1920, height: 1400 },
});
const page = await browser.newPage();
const res = await page.evaluate(
async (loginUrl, user, pass) => {
const r = await fetch(loginUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ user, password: pass }),
});
return r.status;
},
loginUrl,
user,
pass
).catch(() => null);
await page.goto(loginUrl, { waitUntil: 'domcontentloaded' });
await page.evaluate(
async (loginUrl, user, pass) => {
await fetch(loginUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
credentials: 'include',
body: JSON.stringify({ user, password: pass }),
});
},
loginUrl,
user,
pass
);
await page.goto(url, { waitUntil: 'networkidle2', timeout: 60000 });
await new Promise((r) => setTimeout(r, 6000));
await page.screenshot({ path: out, fullPage: false });
console.log('saved', out);
await browser.close();
})().catch((e) => {
console.error('ERR', e.message);
process.exit(1);
});