Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Solarwatt Energymanager flex Daten auslesen die Zweite

    NEWS

    • Amazon Alexa - ioBroker Skill läuft aus ?

    • Monatsrückblick – September 2025

    • Neues Video "KI im Smart Home" - ioBroker plus n8n

    Solarwatt Energymanager flex Daten auslesen die Zweite

    This topic has been deleted. Only users with topic management privileges can see it.
    • mcBirne
      mcBirne @DerAngler last edited by

      @derangler
      Hallo,
      Funktioniert die Lösung bei dir noch? Bei mir nicht mehr.

      D 1 Reply Last reply Reply Quote 0
      • D
        DerAngler @mcBirne last edited by DerAngler

        @mcbirne Nein, der Zugang ist seit einem update von Solarwatt ein anderer. Man muss sich zuerst auf dem Energymanager
        einloggen, dann wird vom Energymanager ein Session-Cookie vergeben.
        Nur mit diesem Session-Cookie kann man dann über iobroker die Daten auslesen. Ich habe vor 3 Tagen mit Hilfe von Gemini eine Abfrage geschrieben,
        die im Moment im Pobelauf ist und zu funktionieren scheint. Falls ich hier in 2 Tagen nix reingeschrieben habe, melde Dich nochmal. Entweder funktioniert
        die Lösung doch nicht dauerhaft , oder ich habe vergessen sie reinzustellen.

        mcBirne 1 Reply Last reply Reply Quote 1
        • mcBirne
          mcBirne @DerAngler last edited by

          @derangler keine Ahnung ob jetzt exakt 2 Tage rum sind. Aber leider habe ich es nicht hinbekommen und würde mich daher über deine Lösung freuen.

          D 1 Reply Last reply Reply Quote 0
          • D
            DerAngler @mcBirne last edited by DerAngler

            @mcbirne
            Moin, also bei mir scheint es zu laufen. Wie gesagt, das ist eine Coproduktion von Gemini und mir, da ich eigentlich zu wenig Ahnung habe. Falls Du oder jemand Tips hat, immer her damit.
            Instanzen Java Module.png
            Zuerst müssen noch zusätzliche Instanzen im Javamodul geladen werden. (Einfach nur die Namen eingeben).
            So sieht dann mein (total rudimentäres) Blockly aus:
            Abfrage Solarwatt Blockly.png
            und so mein Java Code:

            // Neue Module für die Cookie-Verwaltung MÜSSEN im JS-Adapter installiert sein:
            // 'axios', 'axios-cookiejar-support', 'tough-cookie'
            const axios = require('axios');
            // Korrigierter Import: Importiert die Wrapper-Funktion explizit
            const { wrapper } = require('axios-cookiejar-support'); 
            const tough = require('tough-cookie');
            
            // WICHTIG: Verwende die explizit importierte 'wrapper'-Funktion, um Axios zu konfigurieren.
            wrapper(axios); 
            
            // ******************************************************
            // !!! STEUERUNG FÜR DEBUG-MELDUNGEN HIER ANPASSEN !!!
            const DEBUG_MODE = true; 
            // ******************************************************
            
            
            // !!! HIER ANPASSEN: BASISDATEN !!!
            const BASIS_URL = 'http://HIER_DIE_IP';
            const LOGIN_POST_URL = `${BASIS_URL}/auth/login`; 
            const PASSWORT = 'DeinPW'; 
            const BENUTZERNAME = 'installer'; 
            // !!! HIER ANPASSEN ENDE !!!
            
            // Hilfsfunktion für Debug-Ausgaben
            function debugLog(message) {
                if (DEBUG_MODE) {
                    log(`[DEBUG] ${message}`, 'info');
                }
            }
            
            // Globaler Cookie-Speicher, der automatisch Cookies speichert und mitschickt
            const cookieJar = new tough.CookieJar(); 
            
            // ----------------------------------------------------
            // HELFERFUNKTION ZUM ABFRUFEN UND SPEICHERN EINES WERTES
            // ----------------------------------------------------
            
            /**
             * Ruft einen Wert von der angegebenen URL ab, parst ihn und speichert ihn in ioBroker.
             * @param {string} url - Die REST-URL des abzufragenden Items.
             * @param {string} dataPointId - Die ioBroker ID, in die der Wert geschrieben wird.
             * @param {string} debugName - Ein beschreibender Name für die Logs.
             */
            async function fetchAndSaveValue(url, dataPointId, debugName) {
                debugLog(`Starte Abruf für: ${debugName} an URL: ${url}`);
                
                // KORRIGIERTE LOGIK: Einheit (W/%) für das Log bestimmen.
                // Prüft, ob der Name (kleingeschrieben) "füllung" enthält.
                const isFilling = debugName.toLowerCase().includes('füllung');
                const unit = isFilling ? '%' : ' W'; // <-- Jetzt sollte % sicher erkannt werden.
                
                try {
                    const response = await axios.get(url, {
                        jar: cookieJar, 
                        withCredentials: true 
                    });
            
                    if (response.status !== 200) {
                        log(`Fehler beim Abruf von ${debugName}: HTTP Status ${response.status}`, 'error');
                        return;
                    }
            
                    let rohwertString = response.data.state;
            
                    if (!rohwertString || typeof rohwertString !== 'string') {
                        log(`Fehler beim Parsen von ${debugName}: Unerwartetes Format oder leer. Rohdaten: ${JSON.stringify(response.data)}`, 'error');
                        return;
                    }
            
                    let zuParsenderWert;
                    
                    // Logik: Unterscheidung nach Trennzeichen '|'
                    if (rohwertString.includes('|')) {
                        // STANDARD-LOGIK (Werte mit Pipe-Trenner)
                        zuParsenderWert = rohwertString.split('|')[1].trim(); 
                    } else {
                        // SPEZIAL-LOGIK (Werte ohne Pipe-Trenner, wie Speicherfüllung)
                        zuParsenderWert = rohwertString;
                        debugLog(`Spezial-Parsing für ${debugName} angewendet (kein '|' gefunden).`);
                    }
                    
                    // Konsolidierte Bereinigung und Umwandlung: Entfernt alle Zeichen außer Ziffern und Punkt.
                    let gereinigterWert = zuParsenderWert.replace(/[^\d.]/g, ''); 
                    let dezimalZahl = parseFloat(gereinigterWert);
                    let leistungGanzzahl = Math.round(dezimalZahl);
                    
                    if (isNaN(leistungGanzzahl)) {
                         log(`Fehler beim Parsen von ${debugName}: Wert konnte nicht in Zahl umgewandelt werden. Ursprünglicher String: "${zuParsenderWert}"`, 'error');
                         return;
                    }
            
                    // KORREKT: Verwendet die oben definierte Variable 'unit'
                    debugLog(`Wert für ${debugName} ausgelesen: ${leistungGanzzahl}${unit}`);
            
                    // Speicherung in ioBroker
                    if (typeof setState === 'function') { 
                        setState(dataPointId, leistungGanzzahl, true);
                    }
            
                    // KORREKT: Verwendet die oben definierte Variable 'unit'
                    log(`ERFOLG: ${debugName} (${leistungGanzzahl}${unit}) erfolgreich in Datenpunkt ${dataPointId} geschrieben.`, 'info');
            
                } catch (error) {
                    log(`Kritischer Fehler beim Abruf von ${debugName}: ${error.message}`, 'error');
                    if (error.response && error.response.status) {
                         log(`HTTP-Status beim Abruf von ${debugName}: ${error.response.status}`, 'error');
                    }
                }
            }
            
            
            // ----------------------------------------------------
            // AUTHENTIFIZIERUNG (Syntaxfehler-bereinigt)
            // ----------------------------------------------------
            
            /**
             * Führt den Authentifizierungsprozess durch. Das Cookie wird automatisch gespeichert.
             */
            async function authenticate() {
                log('Starte Authentifizierungs-Prozess (POST Login)...', 'info');
            
                const postData = `username=${BENUTZERNAME}&url=%2F&password=${PASSWORT}&submit=Login`;
                
                debugLog(`Versuche Login an: ${LOGIN_POST_URL}`);
            
                const loginHeaders = { 
                    'Content-Type': 'application/x-www-form-urlencoded',
                    'Referer': `${BASIS_URL}/logon.html` 
                };
                
                try {
                    await axios.post(LOGIN_POST_URL, 
                        postData, 
                        {
                            headers: loginHeaders,
                            jar: cookieJar, 
                            withCredentials: true, 
                            maxRedirects: 0, 
                            validateStatus: (status) => status >= 200 && status < 400 
                        }
                    );
                    
                    debugLog(`Login-POST erfolgreich beendet (Status 200). Prüfe Cookies im Jar.`);
            
                } catch (error) {
                    if (error.response && error.response.status >= 300 && error.response.status < 400) {
                        debugLog(`Login-POST erfolgreich (Status ${error.response.status} Redirect). Cookie sollte im Jar gespeichert sein.`);
                    } else if (error.response && error.response.status === 401) {
                         throw new Error('Login fehlgeschlagen. Status 401 (Unauthorized). Zugangsdaten falsch?');
                    } else {
                        const status = error.response ? error.response.status : 'N/A';
                        throw new Error(`Kritischer Fehler beim Login. Status: ${status}. Fehlermeldung: ${error.message}`);
                    }
                }
                
                // Nach dem Login den Erfolg prüfen und ggf. mit Folge-GET erzwingen
                const finalCookies = await cookieJar.getCookies(BASIS_URL);
                if (finalCookies.length === 0) {
                     debugLog('Kein Cookie nach POST gefunden. Versuche Folge-GET auf Startseite, um das Cookie zu erzwingen...');
                    try {
                        await axios.get(BASIS_URL, { jar: cookieJar, withCredentials: true });
                        const secondCookieCheck = await cookieJar.getCookies(BASIS_URL);
                        if (secondCookieCheck.length === 0) {
                            throw new Error('Kein Session-Cookie im Jar gespeichert.');
                        }
                    } catch (e) {
                         throw new Error(`Fataler Fehler beim Cookie-Check: ${e.message}`);
                    }
                }
                
                debugLog(`Authentifizierung erfolgreich. ${finalCookies.length} Cookies im Jar gefunden.`);
            }
            
            // ----------------------------------------------------
            // HAUPTFUNKTION
            // ----------------------------------------------------
            
            async function abfrageUndSpeichern() {
                
                // SCHRITT 1: Authentifizierung
                try {
                    await authenticate();
                } catch (e) {
                    log(`Fataler Fehler beim Authentifizierungsprozess: ${e.message}`, 'error');
                    return;
                }
            
                // SCHRITT 2: Datenabruf (Alle 6 Werte nacheinander)
                
                // 1. Netzbezug (W)
                await fetchAndSaveValue(
                    `${BASIS_URL}/rest/items/solarwattBattery_batteryflex_BatteryFlex_0BB8F3_harmonized_net_power_in`,
                    '0_userdata.0.Solaranlage.Batterie.Netzbezug',
                    'Netzbezug'
                );
                
                // 2. Netzeinspeisung (W)
                await fetchAndSaveValue(
                    `${BASIS_URL}/rest/items/solarwattBattery_batteryflex_BatteryFlex_0BB8F3_harmonized_net_power_out`,
                    '0_userdata.0.Solaranlage.Batterie.Netzeinspeisung',
                    'Netzeinspeisung'
                );
                
                // 3. Solarproduktion (W)
                await fetchAndSaveValue(
                    `${BASIS_URL}/rest/items/modbus_sunspec_sma_inverter_3016028132_acGeneral_ac_power`,
                    '0_userdata.0.Solaranlage.Batterie.Solarproduktion+', 
                    'Solarproduktion'
                );
            
                // 4. Speicherladung (W)
                await fetchAndSaveValue(
                    `${BASIS_URL}/rest/items/solarwattBattery_batteryflex_BatteryFlex_0BB8F3_harmonized_bat_power_in`,
                    '0_userdata.0.Solaranlage.Batterie.Speicherladung',
                    'Speicherladung'
                );
            
                // 5. Speicherentladung (W)
                await fetchAndSaveValue(
                    `${BASIS_URL}/rest/items/solarwattBattery_batteryflex_BatteryFlex_0BB8F3_harmonized_bat_power_out`,
                    '0_userdata.0.Solaranlage.Batterie.Speicherentladung',
                    'Speicherentladung'
                );
                
                // 6. Speicherfüllung (%)
                await fetchAndSaveValue(
                    `${BASIS_URL}/rest/items/solarwattBattery_batteryflex_BatteryFlex_0BB8F3_batteryChannelGroup_batteryStateOfCharge`,
                    '0_userdata.0.Solaranlage.Batterie.Speicherfüllung',
                    'Speicherfüllung' // <-- Hier wird der debugName gesetzt
                );
            
                log('INFO: Alle Abfragen abgeschlossen.', 'info');
            }
            
            // Startet den Prozess einmalig beim Start des Skripts
            abfrageUndSpeichern();
            

            Ist auch ein kleiner Debug Mode integriert.

            Die Datenpunkte müssen natürlich noch angepasst werden....

            Viel Spaß damit, über Rückmeldungen freue ich mich.
            LG

            mcBirne 1 Reply Last reply Reply Quote 0
            • mcBirne
              mcBirne @DerAngler last edited by

              @derangler
              Vielen Dank!
              ich habe meine URL eingatagen und mein Passwort eingegeben sowie die Variablen erstellt und deren Speicehrort angepasst.
              Leider erhalte ich immer folgende Meldungen

              javascript.0	14:58:29.281	info	
              Start JavaScript script.js.Strom.Werte_aus_Energimanager_abfragen (Blockly)
              javascript.0	14:58:29.294	info	
              Starte Authentifizierungs-Prozess (POST Login)...
              javascript.0	14:58:29.295	info	
              [DEBUG] Versuche Login an: http://192.168.178.xxx/auth/login
              javascript.0	14:58:29.296	info	
              registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
              javascript.0	14:58:29.377	info	
              [DEBUG] Login-POST erfolgreich beendet (Status 200). Prüfe Cookies im Jar.
              javascript.0	14:58:29.377	info	
              [DEBUG] Authentifizierung erfolgreich. 1 Cookies im Jar gefunden.
              javascript.0	14:58:29.378	info	
              [DEBUG] Starte Abruf für: Netzbezug an URL: http://192.168.178.xxx/rest/items/solarwattBattery_batteryflex_BatteryFlex_0BB8F3_harmonized_net_power_in
              javascript.0	14:58:29.413	error	
              Kritischer Fehler beim Abruf von Netzbezug: Request failed with status code 400
              javascript.0	14:58:29.414	error	
              HTTP-Status beim Abruf von Netzbezug: 400
              javascript.0	14:58:29.415	info	
              [DEBUG] Starte Abruf für: Netzeinspeisung an URL: http://192.168.178.xxx/rest/items/solarwattBattery_batteryflex_BatteryFlex_0BB8F3_harmonized_net_power_out
              javascript.0	14:58:29.449	error	
              Kritischer Fehler beim Abruf von Netzeinspeisung: Request failed with status code 400
              javascript.0	14:58:29.449	error	
              HTTP-Status beim Abruf von Netzeinspeisung: 400
              javascript.0	14:58:29.449	info	
              [DEBUG] Starte Abruf für: Solarproduktion an URL: http://192.168.178.xxx/rest/items/modbus_sunspec_sma_inverter_3016028132_acGeneral_ac_power
              javascript.0	14:58:29.481	error	
              Kritischer Fehler beim Abruf von Solarproduktion: Request failed with status code 400
              javascript.0	14:58:29.481	error	
              HTTP-Status beim Abruf von Solarproduktion: 400
              javascript.0	14:58:29.481	info	
              [DEBUG] Starte Abruf für: Speicherladung an URL: http://192.168.178.xxx/rest/items/solarwattBattery_batteryflex_BatteryFlex_0BB8F3_harmonized_bat_power_in
              javascript.0	14:58:29.516	error	
              Kritischer Fehler beim Abruf von Speicherladung: Request failed with status code 400
              javascript.0	14:58:29.516	error	
              HTTP-Status beim Abruf von Speicherladung: 400
              javascript.0	14:58:29.516	info	
              [DEBUG] Starte Abruf für: Speicherentladung an URL: http://192.168.178.xxx/rest/items/solarwattBattery_batteryflex_BatteryFlex_0BB8F3_harmonized_bat_power_out
              javascript.0	14:58:29.543	error	
              Kritischer Fehler beim Abruf von Speicherentladung: Request failed with status code 400
              javascript.0	14:58:29.543	error	
              HTTP-Status beim Abruf von Speicherentladung: 400
              javascript.0	14:58:29.543	info	
              [DEBUG] Starte Abruf für: Speicherfüllung an URL: http://192.168.178.xxx/rest/items/solarwattBattery_batteryflex_BatteryFlex_0BB8F3_batteryChannelGroup_batteryStateOfCharge
              javascript.0	14:58:29.572	error	
              Kritischer Fehler beim Abruf von Speicherfüllung: Request failed with status code 400
              javascript.0	14:58:29.572	error	
              HTTP-Status beim Abruf von Speicherfüllung: 400
              javascript.0	14:58:29.572	info	
              INFO: Alle Abfragen abgeschlossen.
              

              Ich glaube, er hat das Passwort samt Cookie, kann dann aber die Werte nicht finden oder rausschreiben oder speichern. Ich habe die Werte als Zahl angelegt. Ist das korrekt?

              D 1 Reply Last reply Reply Quote 0
              • D
                DerAngler last edited by DerAngler

                Nachtrag:
                Ich hatte gerade gesehen, dass ich meine Steampunkanzeige noch gar nicht im fertigen Zustand gepostet habe.
                Hier isse:
                20251024_145618.jpg
                Bei roter Hintergrundbeleuchtung wird kein Strom erzeugt bzw. ist die Batterie leer....

                1 Reply Last reply Reply Quote 1
                • D
                  DerAngler @mcBirne last edited by DerAngler

                  @mcbirne
                  Hallo,
                  ja Authentifizierung scheint ok zu sein,
                  Cookie scheint er zu haben,
                  Werte als Zahlen sind Richtig.

                  Was bei Dir noch anders sein könnte als bei mir: "0BB8F3"
                  Da weiß ich nicht, ob das bei allen "Solarwatts" gleich ist.

                  Muss jetzt leider los.
                  Viel Erfolg!

                  VG
                  DerAngler

                  mcBirne 1 Reply Last reply Reply Quote 0
                  • mcBirne
                    mcBirne @DerAngler last edited by

                    @derangler
                    Daran lag es tatsächlich. Bei mir ist der Wert 0BEC85. Nun funktioniert es.
                    Vielen Dank dafür!

                    Weist du zufällig auch, wie man damit das laden des Speichers triggern kann? Laut meinem Solarteur wird das laden des Speichers wohl über die Box getriggert (keine Ahnung ob das stimmt). Aber eigentlich wäre es ja super, wenn man den Speicher mit günstigem Netzstrom laden kann. Technisch müsste das ja möglich sein. Auf der Homepage kann man den Speicher auch für bis zu 4 Stunden ausschalten (kein Laden und Entladen). Leider bekomme ich das auf der Box auch nicht hin.

                    D 1 Reply Last reply Reply Quote 0
                    • D
                      DerAngler @mcBirne last edited by

                      @mcbirne
                      Sorry, da bin ich raus. Die Wollen ja gerade irgendwelche Extrafeatures und Pro Versionen für Geld an den Mann/Frau bringen. evtl. geht das damit....
                      Schön dass es bei Dir geklappt hat.
                      DA

                      mcBirne 1 Reply Last reply Reply Quote 0
                      • mcBirne
                        mcBirne @DerAngler last edited by

                        @derangler Schade. Ich ärgere mich etwas über meinen Solarwatt-Speicher. Es gibt andere, die man über Modbus ansteuern kann und damit auch das Laden anstößt. Technisch geht das mit dem von Solarwatt auch. Aber leider gibt Solarwatt keine Schnittstellenbeschreibung raus. Ganz im Gegenteil führen sie noch Hürden ein, um Daten auszulesen.
                        Leider scheint es auch bei irgendwelchen Profis nicht verbreitet zu sein. Sonst würde es bestimmt jemand hinbekommen.

                        Aber nochmal danke für deine Unterstützung.

                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post

                        Support us

                        ioBroker
                        Community Adapters
                        Donate
                        FAQ Cloud / IOT
                        HowTo: Node.js-Update
                        HowTo: Backup/Restore
                        Downloads
                        BLOG

                        544
                        Online

                        32.3k
                        Users

                        81.1k
                        Topics

                        1.3m
                        Posts

                        energymanager flex regex solarwatt
                        3
                        18
                        567
                        Loading More Posts
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes
                        Reply
                        • Reply as topic
                        Log in to reply
                        Community
                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                        The ioBroker Community 2014-2023
                        logo