NEWS
Bayrol Webportal
-
@oliverio Guten Morgen
Das ist die letzte Version:
javascript.0 07:31:23.019 error script.js.common.Pool.Byrol: TypeError: Cannot read properties of null (reading '1') javascript.0 07:31:23.019 error at extractValues (script.js.common.Pool.Byrol:115:26) javascript.0 07:31:23.019 error at getData (script.js.common.Pool.Byrol:96:13) javascript.0 07:31:23.019 error at main (script.js.common.Pool.Byrol:19:14)
Das wären noch die Meldungen vom debug:
javascript.0 2024-06-25 07:29:45.191 error at main (script.js.common.Pool.Byrol:19:14) javascript.0 2024-06-25 07:29:45.191 error at processTicksAndRejections (node:internal/process/task_queues:95:5 javascript.0 2024-06-25 07:29:45.191 error at getData (script.js.common.Pool.Byrol:96:13) javascript.0 2024-06-25 07:29:45.191 error at extractValues (script.js.common.Pool.Byrol:115:26) javascript.0 2024-06-25 07:29:45.191 error script.js.common.Pool.Byrol: TypeError: Cannot read properties of null (reading '1') javascript.0 2024-06-25 07:29:43.819 info script.js.common.Pool.Byrol: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions javascript.0 2024-06-25 07:29:43.810 info Start JavaScript script.js.common.Pool.Byrol (Javascript/js)
-
Hat einer von den Skriptbastlern github und kann das Script dort einstellen ?
Das ist ja unnötig Ärger hier. -
-
@oliverio
Jetzt funktioniert es -
wenn ihr wollt, könnt ihr eure Erfahrungen hier auch nochmal schreiben
https://forum.iobroker.net/topic/73975/problem-mit-backslash-im-codeblock
scheint sich bisher nix getan zu haben
-
Ich habe diesen Thread hier völlig aus den Augen verloren und bin heute erst wieder darauf gestoßen.
Vielen Dank für die Mühe, das Script zu programmieren.Ich habe es gleich ausprobiert. Es funktioniert bisher einwandfrei.
Die Werte wollte ich schon lange haben
Vielen Dank dafür!!!! -
@oliverio Perfekt ! Danke ! Habe meine TXT weiter oben gelöscht und auf github verwiesen.
-
Hallo,
ich habe das Problem, dass Nachts nach Zwangstrennung meines Providers das Script einen Fehler ausgibt und danach nicht mehr läuft. Muss dann händisch das Script einmal stoppen und starten.
Kann man irgendwie diesen Fehler abfangen, damit das Script weiterläuft?
Folgende Fehlermeldung wird ausgegeben:javascript.0 2024-07-13 15:41:06.119 error at processTicksAndRejections (node:internal/process/task_queues:95:5) javascript.0 2024-07-13 15:41:06.118 error at getData (script.js.Bayrol:102:13) javascript.0 2024-07-13 15:41:06.118 error at extractValues (script.js.Bayrol:129:26) javascript.0 2024-07-13 15:41:06.118 error script.js.Bayrol: TypeError: Cannot read properties of null (reading '1')
Edit:
Habe es jetzt mit einer try-catch Anweisung in der Funktion extractValues gelöst -
@hab83
Bei mir war aktuell auch diese Meldung und seit gestern hat das Script gar keine Daten mehr abgerufen.Dann habe ich in einem Browser mal die URL aus dem Script https://www.bayrol-poolaccess.de/webview/index.php direkt aufgerufen.. Da war ein Hinweis für Portugal und Frankreich, dass es ein Update gibt. Einmal die Checkbox "nicht mehr Anzeigen" bestätigt.. seitdem kommen wieder daten.
-
Ja, das ist das problematische beim scrapen.
Sobald sich der bildschirmaufbau nur minimal änder ist das Risiko da das es nicht mehr funktioniert -
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.
-
in zeile 174 siehst du main()
das ruft die eigentliche funktion auf.
wenn du sonst nix machst, führt das skript alles genau einmal aus
und ist dann beendet.um es nur zu bestimmten zeiten oder rythmus auszuführen
musst du das main innerhalb einer schedule funktion aufrufen
https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#schedule
mit schedule kannst du dann als pattern die zeitpunkte definieren.
wenn dann noch ein pumpenstatus dazukommt, dann da mit if auch noch den datenpunk abfragen und mit dem gewünschten status abgleichen.im link siehst du ein einfaches beispiel.
wenn du nicht weiterkommst, dann kannst du hier nochmal fragen -
@oliverio
Das wundert mich jetzt ein bisschen, denn ich habe es nun seit einigen Stunden erfolgreich laufen.Also ich zweifele keinesfalls deine Einwände an - du bist mir um Welten überlegen - und Dein Einwand ist sogar duch mich nachvollziehbar.
Allerdings läuft das Script:
javascript.0 18:11:14.976 info script.js.Pool.Bayrol: Daten erfolgreich abgerufen: {"PH":"7.4","MV":"732","CC":"50.0"} javascript.0 18:11:44.974 info script.js.Pool.Bayrol: Daten erfolgreich abgerufen: {"PH":"7.4","MV":"732","CC":"50.0"} javascript.0 18:12:14.975 info script.js.Pool.Bayrol: Daten erfolgreich abgerufen: {"PH":"7.4","MV":"730","CC":"50.0"} javascript.0 18:12:44.976 info script.js.Pool.Bayrol: Daten erfolgreich abgerufen: {"PH":"7.4","MV":"730","CC":"50.0"} javascript.0 18:13:15.091 info script.js.Pool.Bayrol: Daten erfolgreich abgerufen: {"PH":"7.4","MV":"730","CC":"50.0"}
Pünktlich alle 30 Sekunden wird abgerufen.
Einen Temperaturfühler habe ich nicht - daher stehen da 50°C
Viele Grüße
-
@segapro
ja,
da in der Mitte ist ja ein Intervall
Die Zeiten sind eigentlich okay. Wenn das Gerät nicht immer antwortet, könntest du die Zeiten mal etwas vergrößern.
ansonsten sieht doch alles gut aus? -
Hallo,
hat jemand schon mal die Abfrage lokal über die iP versucht?
Versuche auch meine Bayrol Relax Power (ohne Umwege) in iObroker zu bekommen.Mfg
-
@habedere Ich habe die Bayrol automatic ph/cl. Ich wüsste nicht, dass die eine lokale API hat. Deine Bayrol Relax Power ist jedoch ein gänzlich anderes Gerät.
-
@qwertz
Wusste ich auch nicht - klappt aber… -
@habedere wie ist denn die url dieser seite ?
-
-
@qwertz Ich bezog mich auf die lokale API, die Habedere als Screenshot gezeigt hat.