Hallo zusammen,
danke für die tolle Arbeit. Ich habe das Script nun ein paar Tage eingesetzt und war sehr zufrieden.
Ich hatte nur das Problem, dass manchmal einfach keine Daten mehr kamen und ich das Script ca. 1 x am Tag neu starten musste. Am Internet kann es nicht liegen, denn ich habe keine Zwangstrennungen.
Ich hatte dann noch die Idee, dass es ja irgendwie sinnvoll wäre, wenn man die Abfrage ein bisschen an die Pumpenlaufzeit anpasst. Wenn diese nämlich nicht läuft, dann sind die Werte ja ohnehin verfälscht.
Daher jetzt eine Anpassung des Scripts, welches das Abfrageintervall nach dem Status der Filterpumpe richtet - zudem hoffe ich, dass damit auch die "Hänger" besser werden.
Und da ich ein ehrlicher Mensch bin: Ich kann nur sehr wenig JavaScript - das Script habe nicht ich gemacht, sondern es ist ein Produkt einer KI. Ich habe das originale Script verwendet und der KI halt noch mitgeteilt, was meine Probleme sind und wie ich es gerne hätte.
Ohne die tolle Vorarbeit hier wäre das nicht möglich gewesen, weil ich der KI sonst niemals hätte sagen können, was ich eigentlich will. Dafür ein großes Dankeschön!!!
In Zeile "91" müsst ihr noch den Datenpunkt zur Abfrage des Zustandes der Pumpe eintragen. Bei mir ist es ein openknx-Pfad. Zur besseren Auffindbarkeit, habe ich "openknx.blabla" geschrieben. Und natürlich oben eure Logindaten nicht vergessen.
const fetch = require('node-fetch');
let user = "USERNAME (Mailadresse)";
let password = "PASSWORT";
let dpPH = "0_userdata.0.bayrol.ph";
let dpMV = "0_userdata.0.bayrol.mv";
let dpCC = "0_userdata.0.bayrol.cc";
let requesttimeRunning = 30 * 1000; // 30 Sekunden
let requesttimeIdle = 15 * 60 * 1000; // 15 Minuten
const useragent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36";
let intervalID;
async function main() {
console.log('Starte das Bayrol-Datenabfrage-Skript...');
let sessionid = await getSession();
let cid = await login(user, password, sessionid);
if (cid) {
console.log('Prüfe den Status der Filterpumpe...');
checkFilterPumpStatus(sessionid, cid);
}
}
async function getSession() {
try {
const response = await fetch("https://www.bayrol-poolaccess.de/webview/index.php", {
headers: {
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"accept-language": "de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7",
"cache-control": "no-cache",
"pragma": "no-cache",
"sec-ch-ua": "\"Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"Google Chrome\";v=\"120\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "document",
"sec-fetch-mode": "navigate",
"sec-fetch-site": "none",
"sec-fetch-user": "?1",
"upgrade-insecure-requests": "1",
"User-Agent": useragent
},
method: "GET"
});
let headers = await response.headers;
console.log(`Session-ID erhalten: ${getSessionId(headers.get("set-cookie"))}`);
return getSessionId(headers.get("set-cookie"));
} catch (error) {
console.error(`Fehler beim Abrufen der Session-ID: ${error.message}`);
}
}
async function login(user, password, sessionid) {
try {
let body = `username=${encodeURIComponent(user)}&password=${encodeURIComponent(password)}&login=Anmelden`;
const response = await fetch("https://www.bayrol-poolaccess.de/webview/p/login.php?r=reg", {
headers: {
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"accept-language": "de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7",
"cache-control": "no-cache",
"content-type": "application/x-www-form-urlencoded",
"pragma": "no-cache",
"sec-ch-ua": "\"Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"Google Chrome\";v=\"120\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "document",
"sec-fetch-mode": "navigate",
"sec-fetch-site": "same-origin",
"sec-fetch-user": "?1",
"upgrade-insecure-requests": "1",
"cookie": `PHPSESSID=${sessionid}`,
"Referer": "https://www.bayrol-poolaccess.de/webview/p/login.php",
"Referrer-Policy": "strict-origin-when-cross-origin",
"User-Agent": useragent
},
body: body,
method: "POST"
});
let text = await response.text();
console.log(`CID erhalten: ${getCID(text)}`);
return getCID(text);
} catch (error) {
console.error(`Fehler beim Login: ${error.message}`);
}
}
async function checkFilterPumpStatus(sessionid, cid) {
try {
// Hier prüfen wir den Status der Filterpumpe
const filterPumpStatus = getState('openknx.blabla').val;
console.log(`Status der Filterpumpe: ${filterPumpStatus}`);
if (filterPumpStatus) {
console.log('Filterpumpe läuft. Abfrageintervall auf 30 Sekunden gesetzt.');
if (intervalID) clearInterval(intervalID);
intervalID = setInterval(() => getData(sessionid, cid), requesttimeRunning);
} else {
console.log('Filterpumpe nicht aktiv. Abfrageintervall auf 15 Minuten gesetzt.');
if (intervalID) clearInterval(intervalID);
intervalID = setInterval(() => {
checkFilterPumpStatus(sessionid, cid); // Erneut den Status prüfen
}, requesttimeIdle);
}
} catch (error) {
console.error(`Fehler beim Prüfen des Filterpumpenstatus: ${error.message}`);
}
}
async function getData(sessionid, cid) {
try {
const response = await fetch(`https://www.bayrol-poolaccess.de/webview/getdata.php?cid=${cid}`, {
headers: {
"accept": "*/*",
"accept-language": "de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7",
"cache-control": "no-cache",
"pragma": "no-cache",
"sec-ch-ua": "\"Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"Google Chrome\";v=\"120\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"x-requested-with": "XMLHttpRequest",
"cookie": `PHPSESSID=${sessionid}`,
"Referer": "https://www.bayrol-poolaccess.de/webview/p/plants.php",
"Referrer-Policy": "strict-origin-when-cross-origin",
"User-Agent": useragent
},
method: "GET"
});
let text = await response.text();
let data = extractValues(text);
writeData(data);
console.log(`Daten erfolgreich abgerufen: ${JSON.stringify(data)}`);
} catch (error) {
console.error(`Fehler beim Abrufen der Daten: ${error.message}`);
}
}
function writeData(obj) {
try {
setState(dpCC, parseFloat(obj.CC));
setState(dpMV, parseFloat(obj.MV));
setState(dpPH, parseFloat(obj.PH));
} catch (error) {
console.error(`Fehler beim Schreiben der Daten: ${error.message}`);
}
}
function extractValues(text) {
const regexPH = /[pH]<\/span><h1>([\d\.]+)<\/h1>/gm;
const regexMV = /[mV]<\/span><h1>([\d\.]+)<\/h1>/gm;
const regexCC = /[°C]<\/span><h1>([\d\.]+)<\/h1>/gm;
let data = {
PH: (regexPH.exec(text) || [])[1] || 0,
MV: (regexMV.exec(text) || [])[1] || 0,
CC: (regexCC.exec(text) || [])[1] || 0,
};
return data;
}
function getSessionId(setcookie) {
const match = setcookie.match(/PHPSESSID=([^;]+)/);
return match ? match[1] : '';
}
function getCID(html) {
const match = html.match(/var clients = [(\d+)];/);
return match ? match[1] : null;
}
// Start des Scripts
main();
Ich hoffe, es hilft dem einen oder anderen.