Ich habe es mit Websockets / Binary Message nicht hinbekommen. Ich bleibe bei dem Script - auch wenn es einiges an overhead generiert. Aber es funktioniert sehr gut und ich klicke da ja nicht jeden Tag drauf :)
Anbei jetzt mein Script zum Steuern:
const puppeteer = require('puppeteer');
// Hilfsfunktion für kurze Pause
const delay = (ms) => new Promise(res => setTimeout(res, ms));
// Konfiguration aller Wallbox-Aktionen
const ACTIONS = {
ECO: {
trigger: '0_userdata.0.Wallbox.SET_ECO',
selector: 'body > div.page > main > div:nth-child(3) > div.mud-card-actions > button:nth-child(1) > span'
},
FULL: {
trigger: '0_userdata.0.Wallbox.SET_FULL',
selector: 'body > div.page > main > div:nth-child(3) > div.mud-card-actions > button:nth-child(2) > span'
},
SOLAR: {
trigger: '0_userdata.0.Wallbox.SET_SOLAR',
selector: 'body > div.page > main > div:nth-child(3) > div.mud-card-actions > button:nth-child(3) > span'
},
START_CHARGING: {
trigger: '0_userdata.0.Wallbox.START_CHARGING',
selector: 'body > div.page > main > div:nth-child(2) > div.mud-card-actions > button:nth-child(1) > span'
},
STOP_CHARGING: {
trigger: '0_userdata.0.Wallbox.STOP_CHARGING',
selector: 'body > div.page > main > div:nth-child(2) > div.mud-card-actions > button:nth-child(2) > span'
}
};
async function wallboxKlick(actionName, selector) {
console.log(`Starte Browser für Aktion: ${actionName}`);
const browser = await puppeteer.launch({
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
try {
const page = await browser.newPage();
await page.goto('http://192.168.188.110/wallbox', {
waitUntil: 'networkidle2',
timeout: 30000
});
// Warten bis Element sichtbar
await page.waitForSelector(selector, {
visible: true,
timeout: 10000
});
// Klick ausführen
await page.click(selector);
console.log(`Aktion ${actionName} erfolgreich ausgeführt!`);
} catch (e) {
console.error(`Fehler bei Aktion ${actionName}: ${e.message}`);
} finally {
await browser.close();
console.log('Browser geschlossen.');
// Kurz warten und Status aktualisieren
await delay(2000);
setState("0_userdata.0.Wallbox.Refresh", true);
}
}
// Trigger für alle Aktionen anlegen
for (const [actionName, config] of Object.entries(ACTIONS)) {
on({
id: config.trigger,
val: true,
ack: false
}, async (obj) => {
await wallboxKlick(actionName, config.selector);
// Trigger zurücksetzen
setState(obj.id, false, true);
});
}
und das Script zum abrufen des Status (alle 10 Min und wenn die View aktualisiert wird)
const puppeteer = require('puppeteer');
// Ziel-Datenpunkte
const dpStatus = '0_userdata.0.Wallbox.Status';
const dpMode = '0_userdata.0.Wallbox.Mode';
async function updateWallboxData() {
console.log('Abfrage Wallbox-Daten (Status & Mode) gestartet...');
const browser = await puppeteer.launch({
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
try {
const page = await browser.newPage();
await page.goto('http://192.168.188.110/wallbox', {
waitUntil: 'networkidle2',
timeout: 30000
});
// 1. Status auslesen (h6)
const statusSelector = 'body > div.page > main > div:nth-child(4) > div > p';
await page.waitForSelector(statusSelector, { timeout: 10000 });
const statusText = await page.$eval(statusSelector, el => el.innerText);
setState(dpStatus, statusText, true);
// 2. Modus auslesen (p)
const modeSelector = 'body > div.page > main > div:nth-child(4) > div > h6';
await page.waitForSelector(modeSelector, { timeout: 5000 });
const modeText = await page.$eval(modeSelector, el => el.innerText);
setState(dpMode, modeText, true);
console.log(`Daten aktualisiert: Status "${statusText}", Mode "${modeText}"`);
} catch (e) {
console.error('Fehler beim Auslesen der Wallbox-Daten: ' + e.message);
} finally {
await browser.close();
}
}
// Trigger: Alle 10 Minuten automatisch
schedule("*/10 * * * *", () => {
updateWallboxData();
});
// Manueller Trigger
on({id: '0_userdata.0.Wallbox.Refresh', val: true, ack: false}, () => {
updateWallboxData();
setState('0_userdata.0.Wallbox.Refresh', false, true);
});
Wie gesagt - funktioniert bisher ohne Probleme und jetzt kümmere ich mich erstmal um eine hübsche View, Telegramm-Nachrichten und Einbindung des eUP - es gibt immer was zu tun :)
Gruß
Marcus