- 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
59 lines
1.6 KiB
JavaScript
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);
|
|
});
|