Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. SegaPro

    NEWS

    • ioBroker goes Matter ... Matter Adapter in Stable

    • 15. 05. Wartungsarbeiten am ioBroker Forum

    • Monatsrückblick - April 2025

    S
    • Profile
    • Following 0
    • Followers 0
    • Topics 3
    • Posts 38
    • Best 0
    • Groups 1

    SegaPro

    @SegaPro

    0
    Reputation
    12
    Profile views
    38
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    SegaPro Follow
    Starter

    Latest posts made by SegaPro

    • RE: Bayrol Webportal

      @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

      posted in Visualisierung
      S
      SegaPro
    • RE: Bayrol Webportal

      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. 🙂

      posted in Visualisierung
      S
      SegaPro
    • RE: Rechnen von S0 funktioniert nach Update nicht mehr richtig?

      @paul53 sagte in Rechnen von S0 funktioniert nach Update nicht mehr richtig?:

      on({id: 'knx.0.Sensoren.Verbrauchsdaten.Strom_Erzeugung', change: "gt" }, function (obj) {

      Das funktioniert schon wesentlich besser (also bis jetzt).

      Vielen vielen Dank dafür.

      Er "hängt" allerdings etwas und zeigt immer 20 - 50 Watt weniger an, als tatsächlich erzeugt wird. Kann man das vielleicht noch etwas optimieren?

      Viele Grüße

      posted in JavaScript
      S
      SegaPro
    • RE: Rechnen von S0 funktioniert nach Update nicht mehr richtig?

      @paul53

      Es handelt sich um einen Binäraktor von MDT.

      Dieser zählt die Impulse und sendet dann seinen "Zählerstand" .

      Das ist das "knx.0.Sensoren.Verbrauchsdaten.Strom_Erzeugung". Diesen Wert sendet er alle 5 Impulse.

      Das mache ich deswegen, damit der KNX-Bus nicht so zugeballert wird, wenn der Wechselrichter auf maximaler Leistung fährt (5 KW).

      Also bislang war es zumindest so:

      Der Aktor zählt nach jedem Impuls aufwärts. Aktuell steht er bei 6560
      Den nächsten Wert würde er dann bei 6565 senden.

      Ich verstehe nicht, wieso das jetzt so lange funktioniert hat und nun nach dem Update plötzlich nicht mehr.

      Hat jemand eine Idee? Würde ungern ein Rollback auf die alte Version machen. Irgendwas muss sich geändert haben - ich komme nur einfach nicht dahinter.

      Liebe Grüße

      posted in JavaScript
      S
      SegaPro
    • RE: Rechnen von S0 funktioniert nach Update nicht mehr richtig?

      @paul53 sagte in Rechnen von S0 funktioniert nach Update nicht mehr richtig?:

      on({id: 'knx.0.Sensoren.Verbrauchsdaten.Strom_Erzeugung', change: "gt" }, function (obj) {

      Jetzt zeigt er so um die 16xxx Watt an.

      Ich habe gerade noch einmal geschaut. Ich glaube ich habe in meinem vorherigen Post eine falsche Aussage getroffen:

      Der Binäraktor sendet alle 5 Werte eine Änderung. Also es müssen 5 Signale auf den S0 gekommen sein, damit der Binäraktor den Wert sendet.

      MDT schreibt dazu:

      Sendedifferenz 0-65535
      [2]
      wird die Sendedifferenz erreicht,
      sendet der Binäreingang den
      aktuellen Wert

      Dieser Wert ist auf "5" gesetzt.

      Auf dem Zähler selbst steht: 0,5 Wh/imp

      Sorry, dass ich vorher eine falsche Aussage getroffen hab.

      posted in JavaScript
      S
      SegaPro
    • Rechnen von S0 funktioniert nach Update nicht mehr richtig?

      Hallo zusammen,

      ich habe ein Update von Node v14 auf v16 gemacht. NPM ging von 6.13 auf 8.19.

      Zu meiner Verwunderung, gab es keine größeren Probleme. Allerdings habe ich jetzt Probleme mit meinem Zähler, der den aktuellen Ertrag meines Wechselrichters misst.

      Am Wechselrichter ist ein S0Bus, der eben entsprechende Impulse an einen Binäraktor sendet. Dieser sendet im Takt von 5 Sekunden den Wert seines eigenes Zählers. Er zählt also quasi nur seine eigenen Impulse.

      Ich habe ein kleines Script, welches dann daraus entsprechend die aktuelle Leistung des Wechselrichters erreichnet. Die Summe ergibt sich aus der Änderung des Zählers innerhalb der letzten 5 Sekunden.

      Dieses Konstrukt hat jetzt zwei Jahre absolut perfekt funktioniert. Nun nach den genannten Updates tut es das nicht mehr.

      Die Werte werden korrekt angezeigt - springen zwischendurch aber plötzlich nach oben.

      Beispiel: aktuelle Leistung Wechselrichter: 1000 Watt

      Script errechnet: ca 980 Watt (gibt immer eine leichte Toleranz - stört mich jedoch nicht weiter).

      Jetzt kommt die Sonne kurz etwas besser durch, Leistung geht hoch auf 1500 Watt.

      Das Script zeigt an: 98XX W

      Und springt dann nach kurzer Zeit wieder runter auf den echten Wert - bis ca. 20 Sekunden später das gleiche passiert.

      Ich bin leider nur mittelmäßig fit in JS und rechnen liegt mir überhaupt nicht.

      Kann mir vielleicht jemand einen Tipp geben?

      Anbei das Script

      on({ id: 'knx.0.Sensoren.Verbrauchsdaten.Strom_Erzeugung', change: "any" }, function (obj) {
          if (getState("knx.0.Sensoren.Verbrauchsdaten.Strom_Erzeugung"/*Strom Erzeugung*/).val > 0) {
              var totalSeconds = (Date.now() - obj.oldState.ts) / 1000;
              var devil = 3600 * 1000 / (400 * totalSeconds);
              setState("javascript.0.Verbrauchszaehler.Stromerzeugung", Math.round(devil));
          }
      });
      
      

      Ich danke euch für eure Hilfe

      posted in JavaScript
      S
      SegaPro
    • RE: Test Adapter wireless-mbus v0.10.x

      @thomas-braun sagte in Test Adapter wireless-mbus v0.7.x:

      sudo -H -u iobroker groups

      @lvogt

      sudo -H -u iobroker groups
      iobroker tty dialout
      
      posted in Tester
      S
      SegaPro
    • RE: Test Adapter wireless-mbus v0.10.x

      @lvogt sagte in Test Adapter wireless-mbus v0.7.x:

      ls -l /dev/ttyUSB*

      Hi @lvogt ,

      Danke, dass Du mich unterstützt.

      ls -l /dev/ttyUSB*
      crw-rw---- 1 root dialout 188, 0 27. Mai 15:33 /dev/ttyUSB0
      crw-rw---- 1 root dialout 188, 1 30. Mai 11:30 /dev/ttyUSB1
      

      Viele Grüße

      posted in Tester
      S
      SegaPro
    • RE: Test Adapter wireless-mbus v0.10.x

      Danke für eure Antworten,

      ein "iob fix" hat leider nicht geholfen. Hatte es direkt getestet. So recht weiß ich nun auch nicht mehr, wonach ich noch gucken könnte.

      Wünsche euch einen schönen Start in die neue Woche.

      posted in Tester
      S
      SegaPro
    • RE: Test Adapter wireless-mbus v0.10.x

      @thomas-braun sagte in Test Adapter wireless-mbus v0.7.x:

      ls -l /dev/serial/by-id

      ls -l /dev/serial/by-id
      insgesamt 0
      lrwxrwxrwx 1 root root 13 23. Mai 10:18 usb-FTDI_FT230X_Basic_UART_D309V01Y-if00-port0 -> ../../ttyUSB0
      lrwxrwxrwx 1 root root 13 25. Mai 11:07 usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0 -> ../../ttyUSB1
      lrwxrwxrwx 1 root root 13 23. Mai 10:18 usb-Texas_Instruments_TI_CC2531_USB_CDC___0X00124B0014D9E43B-if00 -> ../../ttyACM0
      
      posted in Tester
      S
      SegaPro
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo