Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. ecoflow-connector-Script zur dynamischen Leistungsanpassung

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.5k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.0k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    2.7k

ecoflow-connector-Script zur dynamischen Leistungsanpassung

Geplant Angeheftet Gesperrt Verschoben JavaScript
1.6k Beiträge 127 Kommentatoren 744.5k Aufrufe 127 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • W Waly_de

    @sirdir
    Sorry, dass ich mich hier so rausnehmen. Aber ich hab wirklich im Moment üble Probleme, worüber ich jetzt hier nicht jammern möchte.
    Ich finde es aber auch extrem frustrierend, dass der Hersteller, obwohl wir hier Funktionserweiterungen entwickelt haben, ganz ohne Gegenleistung, die dazu führen, dass mehr Leute, auch im professionellen Bereich auf EF Produkte zurückgreifen, nicht einmal versucht, Kontakt aufzunehmen, geschweige denn Hilfe anbietet, im gegenteil. Die API Dokumentation ist relativ frustrierend, ich habe schon einige Versuche gemacht damit zu arbeiten, leider bisher ziemlich erfolglos.
    Natürlich wäre eine Umstellung auf die offizielle API sehr wünschenswert, solange das keine Nachteile bei der Geschwindigkeit oder der Qualität der Regulierung einbringt.
    Ich lade euch herzlich ein, an dieser API Anbindung zu arbeiten.
    Theoretisch gibt es dort auch einen MQTT server, der uns die relevanten Daten liefern kann.

    Hier die Einsiegsseite für die API
    https://developer-eu.ecoflow.com/us

    Hier mal einer meiner Versuche mit der API zu kommunizieren.
    Verbindung wird aufgebaut, aber es kommen keine Telegramme:
    Auch konnte ich keine Daten an meine Geräte senden.

    const axios = require('axios');
    const mqtt = require('mqtt');
    const crypto = require('crypto');
    
    // Konfigurationen
    const host = 'api-e.ecoflow.com';
    const mqttHost = 'mqtt.ecoflow.com';
    const mqttPort = 8883;
    const mqttProtocol = 'mqtts';
    const accessKey = 'DLXXXXXXXXXXXXXXXXXXXXXXXXX6D6'; // Ersetze dies mit deinem tatsächlichen Access Key
    const secretKey = 'XxXXXXXXXXXXXXXXXXXXXXXXXXXLA'; // Ersetze dies mit deinem tatsächlichen Secret Key
    const deviceSN = 'HW5XXXXXXXXXX55'; // Ersetze dies mit der tatsächlichen Seriennummer deines Geräts
    
    // Hilfsfunktion zur Erstellung eines HMAC-SHA256-Signatur
    function createSignature(params, secretKey) {
        const queryString = Object.keys(params)
            .sort()
            .map(key => `${key}=${params[key]}`)
            .join('&');
        return crypto.createHmac('sha256', secretKey).update(queryString).digest('hex');
    }
    
    // Zertifikate für MQTT abrufen
    async function getMQTTCertification() {
        const nonce = Math.floor(Math.random() * 1000000);
        const timestamp = Date.now();
        const params = {
            accessKey: accessKey,
            nonce: nonce,
            timestamp: timestamp
        };
    
        const signature = createSignature(params, secretKey);
    
        try {
            const response = await axios.get(`https://${host}/iot-open/sign/certification`, {
                headers: {
                    accessKey: accessKey,
                    nonce: nonce,
                    timestamp: timestamp,
                    sign: signature
                }
            });
            return response.data.data;
        } catch (error) {
            console.error('Fehler beim Abrufen der MQTT-Zertifikate:', error);
            throw error;
        }
    }
    
    // MQTT-Verbindung herstellen und Daten empfangen
    async function startMQTTClient() {
        try {
            const certification = await getMQTTCertification();
    
            const client = mqtt.connect(`${mqttProtocol}://${mqttHost}:${mqttPort}`, {
                username: certification.certificateAccount,
                password: certification.certificatePassword,
                protocol: mqttProtocol
            });
    
            const deviceTopic = `/open/${certification.certificateAccount}/${deviceSN}/quota`;
            const powerstreamTopic = `/open/${certification.certificateAccount}/${deviceSN}/status`;
    
    
    
            client.on('connect', () => {
                console.log('Verbunden mit dem MQTT-Broker');
    
                // Geräteliste anfordern
                //const deviceListTopic = `/open/${certification.certificateAccount.replace("open-", "")}/${deviceSN}/get`;
    			const deviceListTopic = `/open/${certification.certificateAccount}/${deviceSN}/get`;
                client.subscribe(deviceListTopic, (err) => {
                    if (!err) {
                        console.log(`Abonniert auf Geräteliste-Topic: ${deviceListTopic}`);
                        client.publish(deviceListTopic, JSON.stringify({}));
                    } else {
                        console.error('Fehler beim Abonnieren des Geräteliste-Themas:', err);
                    }
                });
    
                // Powerstream-Daten abonnieren
                client.subscribe(powerstreamTopic, (err) => {
                    if (!err) {
                        console.log(`Abonniert auf Powerstream-Daten: ${powerstreamTopic}`);
                    } else {
                        console.error('Fehler beim Abonnieren des Powerstream-Themas:', err);
                    }
                });
                 // Alle Topics abonnieren, um alle Nachrichten zu empfangen
                client.subscribe('#', (err) => {  // '#' ist ein Wildcard-Topic, das alle Topics abonniert
                    if (!err) {
                        console.log('Abonniert auf alle Topics (#)');
                    } else {
                        console.error('Fehler beim Abonnieren aller Topics:', err);
                    }
                });
            });
    
            
            client.on('message', (topic, message) => {
                // Ausgabe des empfangenen Telegramms
                console.log(`Nachricht empfangen von Topic ${topic}: ${message.toString()}`);
            });
    
            client.on('error', (err) => {
                console.error('MQTT-Verbindungsfehler:', err);
            });
    
            client.on('close', () => {
                console.log('MQTT-Verbindung geschlossen');
            });
    
        } catch (error) {
            console.error('Fehler beim Starten des MQTT-Clients:', error);
        }
    }
    
    startMQTTClient();
    

    Ihr müsst euch dafür als Entwickler registrieren (sehr einfach) und euch den
    accessKey und secretKey dort generieren.

    Bei mir treten diese Probleme übrigens nicht auf.
    Was mich noch interessieren würde: wenn keine Daten mehr am Skript ankommen, und ihr das Skript im iobroker einige Male neu startet, kommen dann wieder Daten?

    Mehr kann ich im Moment nicht beitragen. Sorry.

    W Offline
    W Offline
    Waly_de
    schrieb am zuletzt editiert von Waly_de
    #1510

    @waly_de okay, ich konnte heute noch ein bisschen Zeit aufbringen und hab es tatsächlich geschafft mit dem offiziellen API Server zu kommunizieren. Auch das Schreiben von Werten ist mir gelungen.
    Hier ist der Ansatz:

    const axios = require('axios');
    const mqtt = require('mqtt');
    const crypto = require('crypto');
    
    //****** HIER DEINE DATEN ******
    const accessKey = 'XXXXXXXXXXXXXXXX'; // Ersetze dies mit deinem tatsächlichen Access Key
    const secretKey = 'XXXXXXXXXXXXXXXX'; // Ersetze dies mit deinem tatsächlichen Secret Key
    const deviceSNs = ['XXXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXXX']; // Mehrere Geräte-Seriennummern
    const MQTT_Clientid = 1
    //*********************/
    
    
    // Konfigurationen
    const host = 'api-e.ecoflow.com';
    const mqttHost = 'mqtt.ecoflow.com';
    const mqttPort = 8883;
    const mqttProtocol = 'mqtts';
    const mqttCert = '0_userdata.0.ecoflow.mqttCert'
    // Globale Variablen für client und certification
    let client;
    let certification;
    
    if (!existsState(mqttCert)) {
        createState(mqttCert, "");
    }
    
    // Hilfsfunktion zur Erstellung eines HMAC-SHA256-Signatur
    function createSignature(params, secretKey) {
        const queryString = Object.keys(params)
            .sort()
            .map(key => `${key}=${params[key]}`)
            .join('&');
        return crypto.createHmac('sha256', secretKey).update(queryString).digest('hex');
    }
    
    // Funktion zur Überprüfung, ob Zertifikat bereits vorhanden ist
    async function loadMQTTCertification() {
        return new Promise((resolve, reject) => {
            // Überprüfen, ob der State existiert
    
            getState(mqttCert, (err, state) => {
                if (err) {
                    console.error('Fehler beim Überprüfen des Zertifikat-States:', err);
                    return reject(err);
                }
                if (state && state.val) {
                    try {
                        const storedCert = JSON.parse(state.val);
                        // Überprüfen, ob die Felder im Zertifikat vorhanden sind
                        if (storedCert.certificateAccount && storedCert.certificatePassword) {
                            console.log('Zertifikat aus ioBroker geladen');
                            return resolve(storedCert);
                        }
                    } catch (error) {
                        console.error('Fehler beim Parsen des Zertifikats:'+ error);
                    }
                }
                resolve(null); // Kein Zertifikat gefunden oder ungültig
            });
        });
    }
    
    // Zertifikate für MQTT abrufen und speichern
    async function getMQTTCertification() {
        const nonce = Math.floor(Math.random() * 1000000);
        const timestamp = Date.now();
        const params = {
            accessKey: accessKey,
            nonce: nonce,
            timestamp: timestamp
        };
    
        const signature = createSignature(params, secretKey);
    
        try {
            const response = await axios.get(`https://${host}/iot-open/sign/certification`, {
                headers: {
                    accessKey: accessKey,
                    nonce: nonce,
                    timestamp: timestamp,
                    sign: signature
                }
            });
    
            const certData = response.data.data;
            // Zertifikat in ioBroker speichern
            setState(mqttCert, JSON.stringify(certData), true);
            console.log('Zertifikat erfolgreich abgerufen und in ioBroker gespeichert');
            return certData;
        } catch (error) {
            console.error('Fehler beim Abrufen der MQTT-Zertifikate:'+ error);
            throw error;
        }
    }
    
    // Funktion zum Setzen von Parametern (z.B. permanentWatts) ohne client und certification als Parameter
    function setPermanentWatts(deviceSN, wattsValue) {
        if (!client || !certification) {
            console.error("MQTT-Client oder Zertifizierung nicht bereit.");
            return;
        }
    
        const setTopic = `/open/${certification.certificateAccount}/${deviceSN}/set`;
    
        const message = {
            id: Date.now(), // Einzigartige ID
            version: "1.0",
            cmdCode: "WN511_SET_PERMANENT_WATTS_PACK", // Befehlscode zum Setzen von permanentWatts
            params: {
                permanentWatts: wattsValue // Der Wert, den du setzen möchtest
            }
        };
    
        client.publish(setTopic, JSON.stringify(message), (err) => {
            if (!err) {
                console.log(`Befehl zum Setzen von permanentWatts auf ${wattsValue} W für Gerät ${deviceSN} wurde gesendet.`);
            } else {
                console.error(`Fehler beim Senden des permanentWatts-Befehls für Gerät ${deviceSN}:` + err);
            }
        });
    }
    
    // MQTT-Verbindung herstellen und Daten empfangen
    async function startMQTTClient() {
        try {
            // Zertifikat aus ioBroker laden, falls vorhanden
            certification = await loadMQTTCertification();
            if (!certification) {
                // Zertifikat neu generieren, wenn es nicht vorhanden ist
                certification = await getMQTTCertification();
            }
    
            client = mqtt.connect(`${mqttProtocol}://${mqttHost}:${mqttPort}`, {
                clientId: 'EcoFlowClient_' + MQTT_Clientid,
                username: certification.certificateAccount,
                password: certification.certificatePassword,
                protocol: mqttProtocol
            });
    
            client.on('connect', () => {
                console.log('Verbunden mit dem MQTT-Broker');
    
                // Abonnieren von Status und anderen Daten für jedes Gerät
                deviceSNs.forEach((deviceSN) => {
                    const quotaTopic = `/open/${certification.certificateAccount}/${deviceSN}/quota`;
                    const statusTopic = `/open/${certification.certificateAccount}/${deviceSN}/status`;
    
                    // Abonnieren des Status-Themas
                    client.subscribe(statusTopic, (err) => {
                        if (!err) {
                            console.log(`Abonniert auf Status-Topic: ${statusTopic}`);
                        } else {
                            console.error(`Fehler beim Abonnieren des Status-Themas für Gerät ${deviceSN}:` + err);
                        }
                    });
    
                    // Abonnieren des Quota-Themas
                    client.subscribe(quotaTopic, (err) => {
                        if (!err) {
                            console.log(`Abonniert auf Quota-Topic: ${quotaTopic}`);
                        } else {
                            console.error(`Fehler beim Abonnieren des Quota-Themas für Gerät ${deviceSN}:` + err);
                        }
                    });
                });
            });
    
            client.on('message', (topic, message) => {
                console.log(`Nachricht empfangen von Topic ${topic}: ${message.toString()}`);
            });
    
            client.on('error', (err) => {
                console.error('MQTT-Verbindungsfehler:' + err);
                client.end();  // Trenne die Verbindung bei einem Fehler
                console.log('Verbindung getrennt aufgrund eines Fehlers ' + err);
            });
    
            client.on('close', () => {
                console.log('MQTT-Verbindung geschlossen');
            });
    
        } catch (error) {
            console.error('Fehler beim Starten des MQTT-Clients:' + error);
        }
    }
    // Schließe die Verbindung, wenn das Skript gestoppt wird
    onStop(function (callback) {
        if (client) {
            client.end();
            log("Script gestoppt");
        }
        callback();
    }, 2000);
    // Start der MQTT-Client-Verbindung
    startMQTTClient();
    
    
    
    // Beispielaufruf von setPermanentWatts außerhalb von startMQTTClient()
    setTimeout(() => {
        setPermanentWatts(deviceSNs[0], 3000); // Setzt permanentWatts für ein bestimmtes Gerät auf 300 W
    }, 5000); // Warte 5 Sekunden, damit der Client verbunden ist
    

    Ich würde mich freuen, wenn ihr euch näher damit befasst. bevor ich das ins Skript einbauen kann, wird noch einige Zeit vergehen. Vielleicht schafft ja einer von euch.

    S 1 Antwort Letzte Antwort
    0
    • W Waly_de

      @waly_de okay, ich konnte heute noch ein bisschen Zeit aufbringen und hab es tatsächlich geschafft mit dem offiziellen API Server zu kommunizieren. Auch das Schreiben von Werten ist mir gelungen.
      Hier ist der Ansatz:

      const axios = require('axios');
      const mqtt = require('mqtt');
      const crypto = require('crypto');
      
      //****** HIER DEINE DATEN ******
      const accessKey = 'XXXXXXXXXXXXXXXX'; // Ersetze dies mit deinem tatsächlichen Access Key
      const secretKey = 'XXXXXXXXXXXXXXXX'; // Ersetze dies mit deinem tatsächlichen Secret Key
      const deviceSNs = ['XXXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXXX']; // Mehrere Geräte-Seriennummern
      const MQTT_Clientid = 1
      //*********************/
      
      
      // Konfigurationen
      const host = 'api-e.ecoflow.com';
      const mqttHost = 'mqtt.ecoflow.com';
      const mqttPort = 8883;
      const mqttProtocol = 'mqtts';
      const mqttCert = '0_userdata.0.ecoflow.mqttCert'
      // Globale Variablen für client und certification
      let client;
      let certification;
      
      if (!existsState(mqttCert)) {
          createState(mqttCert, "");
      }
      
      // Hilfsfunktion zur Erstellung eines HMAC-SHA256-Signatur
      function createSignature(params, secretKey) {
          const queryString = Object.keys(params)
              .sort()
              .map(key => `${key}=${params[key]}`)
              .join('&');
          return crypto.createHmac('sha256', secretKey).update(queryString).digest('hex');
      }
      
      // Funktion zur Überprüfung, ob Zertifikat bereits vorhanden ist
      async function loadMQTTCertification() {
          return new Promise((resolve, reject) => {
              // Überprüfen, ob der State existiert
      
              getState(mqttCert, (err, state) => {
                  if (err) {
                      console.error('Fehler beim Überprüfen des Zertifikat-States:', err);
                      return reject(err);
                  }
                  if (state && state.val) {
                      try {
                          const storedCert = JSON.parse(state.val);
                          // Überprüfen, ob die Felder im Zertifikat vorhanden sind
                          if (storedCert.certificateAccount && storedCert.certificatePassword) {
                              console.log('Zertifikat aus ioBroker geladen');
                              return resolve(storedCert);
                          }
                      } catch (error) {
                          console.error('Fehler beim Parsen des Zertifikats:'+ error);
                      }
                  }
                  resolve(null); // Kein Zertifikat gefunden oder ungültig
              });
          });
      }
      
      // Zertifikate für MQTT abrufen und speichern
      async function getMQTTCertification() {
          const nonce = Math.floor(Math.random() * 1000000);
          const timestamp = Date.now();
          const params = {
              accessKey: accessKey,
              nonce: nonce,
              timestamp: timestamp
          };
      
          const signature = createSignature(params, secretKey);
      
          try {
              const response = await axios.get(`https://${host}/iot-open/sign/certification`, {
                  headers: {
                      accessKey: accessKey,
                      nonce: nonce,
                      timestamp: timestamp,
                      sign: signature
                  }
              });
      
              const certData = response.data.data;
              // Zertifikat in ioBroker speichern
              setState(mqttCert, JSON.stringify(certData), true);
              console.log('Zertifikat erfolgreich abgerufen und in ioBroker gespeichert');
              return certData;
          } catch (error) {
              console.error('Fehler beim Abrufen der MQTT-Zertifikate:'+ error);
              throw error;
          }
      }
      
      // Funktion zum Setzen von Parametern (z.B. permanentWatts) ohne client und certification als Parameter
      function setPermanentWatts(deviceSN, wattsValue) {
          if (!client || !certification) {
              console.error("MQTT-Client oder Zertifizierung nicht bereit.");
              return;
          }
      
          const setTopic = `/open/${certification.certificateAccount}/${deviceSN}/set`;
      
          const message = {
              id: Date.now(), // Einzigartige ID
              version: "1.0",
              cmdCode: "WN511_SET_PERMANENT_WATTS_PACK", // Befehlscode zum Setzen von permanentWatts
              params: {
                  permanentWatts: wattsValue // Der Wert, den du setzen möchtest
              }
          };
      
          client.publish(setTopic, JSON.stringify(message), (err) => {
              if (!err) {
                  console.log(`Befehl zum Setzen von permanentWatts auf ${wattsValue} W für Gerät ${deviceSN} wurde gesendet.`);
              } else {
                  console.error(`Fehler beim Senden des permanentWatts-Befehls für Gerät ${deviceSN}:` + err);
              }
          });
      }
      
      // MQTT-Verbindung herstellen und Daten empfangen
      async function startMQTTClient() {
          try {
              // Zertifikat aus ioBroker laden, falls vorhanden
              certification = await loadMQTTCertification();
              if (!certification) {
                  // Zertifikat neu generieren, wenn es nicht vorhanden ist
                  certification = await getMQTTCertification();
              }
      
              client = mqtt.connect(`${mqttProtocol}://${mqttHost}:${mqttPort}`, {
                  clientId: 'EcoFlowClient_' + MQTT_Clientid,
                  username: certification.certificateAccount,
                  password: certification.certificatePassword,
                  protocol: mqttProtocol
              });
      
              client.on('connect', () => {
                  console.log('Verbunden mit dem MQTT-Broker');
      
                  // Abonnieren von Status und anderen Daten für jedes Gerät
                  deviceSNs.forEach((deviceSN) => {
                      const quotaTopic = `/open/${certification.certificateAccount}/${deviceSN}/quota`;
                      const statusTopic = `/open/${certification.certificateAccount}/${deviceSN}/status`;
      
                      // Abonnieren des Status-Themas
                      client.subscribe(statusTopic, (err) => {
                          if (!err) {
                              console.log(`Abonniert auf Status-Topic: ${statusTopic}`);
                          } else {
                              console.error(`Fehler beim Abonnieren des Status-Themas für Gerät ${deviceSN}:` + err);
                          }
                      });
      
                      // Abonnieren des Quota-Themas
                      client.subscribe(quotaTopic, (err) => {
                          if (!err) {
                              console.log(`Abonniert auf Quota-Topic: ${quotaTopic}`);
                          } else {
                              console.error(`Fehler beim Abonnieren des Quota-Themas für Gerät ${deviceSN}:` + err);
                          }
                      });
                  });
              });
      
              client.on('message', (topic, message) => {
                  console.log(`Nachricht empfangen von Topic ${topic}: ${message.toString()}`);
              });
      
              client.on('error', (err) => {
                  console.error('MQTT-Verbindungsfehler:' + err);
                  client.end();  // Trenne die Verbindung bei einem Fehler
                  console.log('Verbindung getrennt aufgrund eines Fehlers ' + err);
              });
      
              client.on('close', () => {
                  console.log('MQTT-Verbindung geschlossen');
              });
      
          } catch (error) {
              console.error('Fehler beim Starten des MQTT-Clients:' + error);
          }
      }
      // Schließe die Verbindung, wenn das Skript gestoppt wird
      onStop(function (callback) {
          if (client) {
              client.end();
              log("Script gestoppt");
          }
          callback();
      }, 2000);
      // Start der MQTT-Client-Verbindung
      startMQTTClient();
      
      
      
      // Beispielaufruf von setPermanentWatts außerhalb von startMQTTClient()
      setTimeout(() => {
          setPermanentWatts(deviceSNs[0], 3000); // Setzt permanentWatts für ein bestimmtes Gerät auf 300 W
      }, 5000); // Warte 5 Sekunden, damit der Client verbunden ist
      

      Ich würde mich freuen, wenn ihr euch näher damit befasst. bevor ich das ins Skript einbauen kann, wird noch einige Zeit vergehen. Vielleicht schafft ja einer von euch.

      S Offline
      S Offline
      sirdir
      schrieb am zuletzt editiert von sirdir
      #1511

      @waly_de Hey, danke. Hab das Script mal probiert, hab die Status Infos der konfigurierten Geräte bekommen. Hab dann versucht den gesendeten Befehl auf slowChgWatts für die Delta 2 Max zu ändern und plötzlich bekomme ich nur noch:

      MQTT-Verbindungsfehler:Error: Connection refused: Not authorized
      

      Keys stimmen. Seltsam.

      Noch zu deiner Frage beim ‘richtigen’ Script, ich weiss nicht, es war nicht konsistent. Ne weile kam z.B. einfach immer 0% beim Batteriestand zurück, auch nach Neustart des Scripts. In anderen Momenten schien ein Neustart zu helfen.

      Edit: Die Verbindung geht jetzt wieder, aber ich musste nen neuen Access Key erstellen, der alte war ‘verbrannt’… WTF?
      Das slowChgWatts muss ich mir nochmal genauer anschauen, das ist anscheinend in nem Array/Subtopic, k.A. wie das in MQTT aussieht.

      G 1 Antwort Letzte Antwort
      0
      • S sirdir

        @waly_de Hey, danke. Hab das Script mal probiert, hab die Status Infos der konfigurierten Geräte bekommen. Hab dann versucht den gesendeten Befehl auf slowChgWatts für die Delta 2 Max zu ändern und plötzlich bekomme ich nur noch:

        MQTT-Verbindungsfehler:Error: Connection refused: Not authorized
        

        Keys stimmen. Seltsam.

        Noch zu deiner Frage beim ‘richtigen’ Script, ich weiss nicht, es war nicht konsistent. Ne weile kam z.B. einfach immer 0% beim Batteriestand zurück, auch nach Neustart des Scripts. In anderen Momenten schien ein Neustart zu helfen.

        Edit: Die Verbindung geht jetzt wieder, aber ich musste nen neuen Access Key erstellen, der alte war ‘verbrannt’… WTF?
        Das slowChgWatts muss ich mir nochmal genauer anschauen, das ist anscheinend in nem Array/Subtopic, k.A. wie das in MQTT aussieht.

        G Offline
        G Offline
        giovanne
        schrieb am zuletzt editiert von
        #1512

        @sirdir , musst mit den mqtt Client IDs aufpassen, die sind limitiert pro Tag soweit man bisher weiß. Sobald Client ID Limit erreicht ist werden die certificateAccount Daten für mqtt wohl gesperrt und Connection per mqtt geht nicht mehr.
        Zu dem Zeitpunkt funktioniert http mit den Secret/Key noch.
        Für mqtt hilft dann aktuell tatsächlich wohl nur neue Secret/Key erstellen.

        Musst de mal stöbern wenn mehr wissen willst. Bei HA integration ist zb seit v1.1.0 auch eingebaut daß immer die gleiche Client ID pro integration verwendet wird, gab da vorher auch Probleme da für jedes Gerät zuvor eine eigene Client ID verwendet wurde und dadurch das Limit ruck zuck erreicht war ...

        S 1 Antwort Letzte Antwort
        0
        • G giovanne

          @sirdir , musst mit den mqtt Client IDs aufpassen, die sind limitiert pro Tag soweit man bisher weiß. Sobald Client ID Limit erreicht ist werden die certificateAccount Daten für mqtt wohl gesperrt und Connection per mqtt geht nicht mehr.
          Zu dem Zeitpunkt funktioniert http mit den Secret/Key noch.
          Für mqtt hilft dann aktuell tatsächlich wohl nur neue Secret/Key erstellen.

          Musst de mal stöbern wenn mehr wissen willst. Bei HA integration ist zb seit v1.1.0 auch eingebaut daß immer die gleiche Client ID pro integration verwendet wird, gab da vorher auch Probleme da für jedes Gerät zuvor eine eigene Client ID verwendet wurde und dadurch das Limit ruck zuck erreicht war ...

          S Offline
          S Offline
          sirdir
          schrieb am zuletzt editiert von
          #1513

          @giovanne Stimmt, in die HA Integration wollte ich mal rein schauen weil mir nicht ganz klar ist, wie die messages genau aufgebaut sein müssen. Aber wenn es da so enge Limiten gibt, ist das eh wenig nützlich, da werden ja z.T. alle paar Sekunden neue Einspeisewerte gesendet zur Zeit…

          S 1 Antwort Letzte Antwort
          0
          • S sirdir

            @giovanne Stimmt, in die HA Integration wollte ich mal rein schauen weil mir nicht ganz klar ist, wie die messages genau aufgebaut sein müssen. Aber wenn es da so enge Limiten gibt, ist das eh wenig nützlich, da werden ja z.T. alle paar Sekunden neue Einspeisewerte gesendet zur Zeit…

            S Offline
            S Offline
            sirdir
            schrieb am zuletzt editiert von
            #1514

            Hab zumindest das jetzt mal hingekriegt. Funktioniert halt wesentlich besser, wenn man das Datenformat unter MQTT nachschaut und nicht unter HTTP :)

            W 1 Antwort Letzte Antwort
            0
            • S sirdir

              Hab zumindest das jetzt mal hingekriegt. Funktioniert halt wesentlich besser, wenn man das Datenformat unter MQTT nachschaut und nicht unter HTTP :)

              W Offline
              W Offline
              Waly_de
              schrieb am zuletzt editiert von
              #1515

              @sirdir guter Hinweis mit der Client ID.
              Ich hab das Grip mal angepasst und eine Client ID fest vergeben. Damit sollte das Problem erledigt sein.

              const axios = require('axios');
              const mqtt = require('mqtt');
              const crypto = require('crypto');
               
              //****** HIER DEINE DATEN ******
              const accessKey = 'XXXXXXXXXXXXXXXX'; // Ersetze dies mit deinem tatsächlichen Access Key
              const secretKey = 'XXXXXXXXXXXXXXXX'; // Ersetze dies mit deinem tatsächlichen Secret Key
              const deviceSNs = ['XXXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXXX']; // Mehrere Geräte-Seriennummern
              const MQTT_Clientid = 1
              //*********************/
               
               
              // Konfigurationen
              const host = 'api-e.ecoflow.com';
              const mqttHost = 'mqtt.ecoflow.com';
              const mqttPort = 8883;
              const mqttProtocol = 'mqtts';
              const mqttCert = '0_userdata.0.ecoflow.mqttCert'
              // Globale Variablen für client und certification
              let client;
              let certification;
               
              if (!existsState(mqttCert)) {
                  createState(mqttCert, "");
              }
               
              // Hilfsfunktion zur Erstellung eines HMAC-SHA256-Signatur
              function createSignature(params, secretKey) {
                  const queryString = Object.keys(params)
                      .sort()
                      .map(key => `${key}=${params[key]}`)
                      .join('&');
                  return crypto.createHmac('sha256', secretKey).update(queryString).digest('hex');
              }
               
              // Funktion zur Überprüfung, ob Zertifikat bereits vorhanden ist
              async function loadMQTTCertification() {
                  return new Promise((resolve, reject) => {
                      // Überprüfen, ob der State existiert
               
                      getState(mqttCert, (err, state) => {
                          if (err) {
                              console.error('Fehler beim Überprüfen des Zertifikat-States:', err);
                              return reject(err);
                          }
                          if (state && state.val) {
                              try {
                                  const storedCert = JSON.parse(state.val);
                                  // Überprüfen, ob die Felder im Zertifikat vorhanden sind
                                  if (storedCert.certificateAccount && storedCert.certificatePassword) {
                                      console.log('Zertifikat aus ioBroker geladen');
                                      return resolve(storedCert);
                                  }
                              } catch (error) {
                                  console.error('Fehler beim Parsen des Zertifikats:'+ error);
                              }
                          }
                          resolve(null); // Kein Zertifikat gefunden oder ungültig
                      });
                  });
              }
               
              // Zertifikate für MQTT abrufen und speichern
              async function getMQTTCertification() {
                  const nonce = Math.floor(Math.random() * 1000000);
                  const timestamp = Date.now();
                  const params = {
                      accessKey: accessKey,
                      nonce: nonce,
                      timestamp: timestamp
                  };
               
                  const signature = createSignature(params, secretKey);
               
                  try {
                      const response = await axios.get(`https://${host}/iot-open/sign/certification`, {
                          headers: {
                              accessKey: accessKey,
                              nonce: nonce,
                              timestamp: timestamp,
                              sign: signature
                          }
                      });
               
                      const certData = response.data.data;
                      // Zertifikat in ioBroker speichern
                      setState(mqttCert, JSON.stringify(certData), true);
                      console.log('Zertifikat erfolgreich abgerufen und in ioBroker gespeichert');
                      return certData;
                  } catch (error) {
                      console.error('Fehler beim Abrufen der MQTT-Zertifikate:'+ error);
                      throw error;
                  }
              }
               
              // Funktion zum Setzen von Parametern (z.B. permanentWatts) ohne client und certification als Parameter
              function setPermanentWatts(deviceSN, wattsValue) {
                  if (!client || !certification) {
                      console.error("MQTT-Client oder Zertifizierung nicht bereit.");
                      return;
                  }
               
                  const setTopic = `/open/${certification.certificateAccount}/${deviceSN}/set`;
               
                  const message = {
                      id: Date.now(), // Einzigartige ID
                      version: "1.0",
                      cmdCode: "WN511_SET_PERMANENT_WATTS_PACK", // Befehlscode zum Setzen von permanentWatts
                      params: {
                          permanentWatts: wattsValue // Der Wert, den du setzen möchtest
                      }
                  };
               
                  client.publish(setTopic, JSON.stringify(message), (err) => {
                      if (!err) {
                          console.log(`Befehl zum Setzen von permanentWatts auf ${wattsValue} W für Gerät ${deviceSN} wurde gesendet.`);
                      } else {
                          console.error(`Fehler beim Senden des permanentWatts-Befehls für Gerät ${deviceSN}:` + err);
                      }
                  });
              }
               
              // MQTT-Verbindung herstellen und Daten empfangen
              async function startMQTTClient() {
                  try {
                      // Zertifikat aus ioBroker laden, falls vorhanden
                      certification = await loadMQTTCertification();
                      if (!certification) {
                          // Zertifikat neu generieren, wenn es nicht vorhanden ist
                          certification = await getMQTTCertification();
                      }
               
                      client = mqtt.connect(`${mqttProtocol}://${mqttHost}:${mqttPort}`, {
                          clientId: 'EcoFlowClient_' + MQTT_Clientid,
                          username: certification.certificateAccount,
                          password: certification.certificatePassword,
                          protocol: mqttProtocol
                      });
               
                      client.on('connect', () => {
                          console.log('Verbunden mit dem MQTT-Broker');
               
                          // Abonnieren von Status und anderen Daten für jedes Gerät
                          deviceSNs.forEach((deviceSN) => {
                              const quotaTopic = `/open/${certification.certificateAccount}/${deviceSN}/quota`;
                              const statusTopic = `/open/${certification.certificateAccount}/${deviceSN}/status`;
               
                              // Abonnieren des Status-Themas
                              client.subscribe(statusTopic, (err) => {
                                  if (!err) {
                                      console.log(`Abonniert auf Status-Topic: ${statusTopic}`);
                                  } else {
                                      console.error(`Fehler beim Abonnieren des Status-Themas für Gerät ${deviceSN}:` + err);
                                  }
                              });
               
                              // Abonnieren des Quota-Themas
                              client.subscribe(quotaTopic, (err) => {
                                  if (!err) {
                                      console.log(`Abonniert auf Quota-Topic: ${quotaTopic}`);
                                  } else {
                                      console.error(`Fehler beim Abonnieren des Quota-Themas für Gerät ${deviceSN}:` + err);
                                  }
                              });
                          });
                      });
               
                      client.on('message', (topic, message) => {
                          console.log(`Nachricht empfangen von Topic ${topic}: ${message.toString()}`);
                      });
               
                      client.on('error', (err) => {
                          console.error('MQTT-Verbindungsfehler:' + err);
                          client.end();  // Trenne die Verbindung bei einem Fehler
                          console.log('Verbindung getrennt aufgrund eines Fehlers ' + err);
                      });
               
                      client.on('close', () => {
                          console.log('MQTT-Verbindung geschlossen');
                      });
               
                  } catch (error) {
                      console.error('Fehler beim Starten des MQTT-Clients:' + error);
                  }
              }
              // Schließe die Verbindung, wenn das Skript gestoppt wird
              onStop(function (callback) {
                  if (client) {
                      client.end();
                      log("Script gestoppt");
                  }
                  callback();
              }, 2000);
              // Start der MQTT-Client-Verbindung
              startMQTTClient();
               
               
               
              // Beispielaufruf von setPermanentWatts außerhalb von startMQTTClient()
              setTimeout(() => {
                  setPermanentWatts(deviceSNs[0], 3000); // Setzt permanentWatts für ein bestimmtes Gerät auf 300 W
              }, 5000); // Warte 5 Sekunden, damit der Client verbunden ist
              
              
              G S 2 Antworten Letzte Antwort
              0
              • W Waly_de

                @sirdir guter Hinweis mit der Client ID.
                Ich hab das Grip mal angepasst und eine Client ID fest vergeben. Damit sollte das Problem erledigt sein.

                const axios = require('axios');
                const mqtt = require('mqtt');
                const crypto = require('crypto');
                 
                //****** HIER DEINE DATEN ******
                const accessKey = 'XXXXXXXXXXXXXXXX'; // Ersetze dies mit deinem tatsächlichen Access Key
                const secretKey = 'XXXXXXXXXXXXXXXX'; // Ersetze dies mit deinem tatsächlichen Secret Key
                const deviceSNs = ['XXXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXXX']; // Mehrere Geräte-Seriennummern
                const MQTT_Clientid = 1
                //*********************/
                 
                 
                // Konfigurationen
                const host = 'api-e.ecoflow.com';
                const mqttHost = 'mqtt.ecoflow.com';
                const mqttPort = 8883;
                const mqttProtocol = 'mqtts';
                const mqttCert = '0_userdata.0.ecoflow.mqttCert'
                // Globale Variablen für client und certification
                let client;
                let certification;
                 
                if (!existsState(mqttCert)) {
                    createState(mqttCert, "");
                }
                 
                // Hilfsfunktion zur Erstellung eines HMAC-SHA256-Signatur
                function createSignature(params, secretKey) {
                    const queryString = Object.keys(params)
                        .sort()
                        .map(key => `${key}=${params[key]}`)
                        .join('&');
                    return crypto.createHmac('sha256', secretKey).update(queryString).digest('hex');
                }
                 
                // Funktion zur Überprüfung, ob Zertifikat bereits vorhanden ist
                async function loadMQTTCertification() {
                    return new Promise((resolve, reject) => {
                        // Überprüfen, ob der State existiert
                 
                        getState(mqttCert, (err, state) => {
                            if (err) {
                                console.error('Fehler beim Überprüfen des Zertifikat-States:', err);
                                return reject(err);
                            }
                            if (state && state.val) {
                                try {
                                    const storedCert = JSON.parse(state.val);
                                    // Überprüfen, ob die Felder im Zertifikat vorhanden sind
                                    if (storedCert.certificateAccount && storedCert.certificatePassword) {
                                        console.log('Zertifikat aus ioBroker geladen');
                                        return resolve(storedCert);
                                    }
                                } catch (error) {
                                    console.error('Fehler beim Parsen des Zertifikats:'+ error);
                                }
                            }
                            resolve(null); // Kein Zertifikat gefunden oder ungültig
                        });
                    });
                }
                 
                // Zertifikate für MQTT abrufen und speichern
                async function getMQTTCertification() {
                    const nonce = Math.floor(Math.random() * 1000000);
                    const timestamp = Date.now();
                    const params = {
                        accessKey: accessKey,
                        nonce: nonce,
                        timestamp: timestamp
                    };
                 
                    const signature = createSignature(params, secretKey);
                 
                    try {
                        const response = await axios.get(`https://${host}/iot-open/sign/certification`, {
                            headers: {
                                accessKey: accessKey,
                                nonce: nonce,
                                timestamp: timestamp,
                                sign: signature
                            }
                        });
                 
                        const certData = response.data.data;
                        // Zertifikat in ioBroker speichern
                        setState(mqttCert, JSON.stringify(certData), true);
                        console.log('Zertifikat erfolgreich abgerufen und in ioBroker gespeichert');
                        return certData;
                    } catch (error) {
                        console.error('Fehler beim Abrufen der MQTT-Zertifikate:'+ error);
                        throw error;
                    }
                }
                 
                // Funktion zum Setzen von Parametern (z.B. permanentWatts) ohne client und certification als Parameter
                function setPermanentWatts(deviceSN, wattsValue) {
                    if (!client || !certification) {
                        console.error("MQTT-Client oder Zertifizierung nicht bereit.");
                        return;
                    }
                 
                    const setTopic = `/open/${certification.certificateAccount}/${deviceSN}/set`;
                 
                    const message = {
                        id: Date.now(), // Einzigartige ID
                        version: "1.0",
                        cmdCode: "WN511_SET_PERMANENT_WATTS_PACK", // Befehlscode zum Setzen von permanentWatts
                        params: {
                            permanentWatts: wattsValue // Der Wert, den du setzen möchtest
                        }
                    };
                 
                    client.publish(setTopic, JSON.stringify(message), (err) => {
                        if (!err) {
                            console.log(`Befehl zum Setzen von permanentWatts auf ${wattsValue} W für Gerät ${deviceSN} wurde gesendet.`);
                        } else {
                            console.error(`Fehler beim Senden des permanentWatts-Befehls für Gerät ${deviceSN}:` + err);
                        }
                    });
                }
                 
                // MQTT-Verbindung herstellen und Daten empfangen
                async function startMQTTClient() {
                    try {
                        // Zertifikat aus ioBroker laden, falls vorhanden
                        certification = await loadMQTTCertification();
                        if (!certification) {
                            // Zertifikat neu generieren, wenn es nicht vorhanden ist
                            certification = await getMQTTCertification();
                        }
                 
                        client = mqtt.connect(`${mqttProtocol}://${mqttHost}:${mqttPort}`, {
                            clientId: 'EcoFlowClient_' + MQTT_Clientid,
                            username: certification.certificateAccount,
                            password: certification.certificatePassword,
                            protocol: mqttProtocol
                        });
                 
                        client.on('connect', () => {
                            console.log('Verbunden mit dem MQTT-Broker');
                 
                            // Abonnieren von Status und anderen Daten für jedes Gerät
                            deviceSNs.forEach((deviceSN) => {
                                const quotaTopic = `/open/${certification.certificateAccount}/${deviceSN}/quota`;
                                const statusTopic = `/open/${certification.certificateAccount}/${deviceSN}/status`;
                 
                                // Abonnieren des Status-Themas
                                client.subscribe(statusTopic, (err) => {
                                    if (!err) {
                                        console.log(`Abonniert auf Status-Topic: ${statusTopic}`);
                                    } else {
                                        console.error(`Fehler beim Abonnieren des Status-Themas für Gerät ${deviceSN}:` + err);
                                    }
                                });
                 
                                // Abonnieren des Quota-Themas
                                client.subscribe(quotaTopic, (err) => {
                                    if (!err) {
                                        console.log(`Abonniert auf Quota-Topic: ${quotaTopic}`);
                                    } else {
                                        console.error(`Fehler beim Abonnieren des Quota-Themas für Gerät ${deviceSN}:` + err);
                                    }
                                });
                            });
                        });
                 
                        client.on('message', (topic, message) => {
                            console.log(`Nachricht empfangen von Topic ${topic}: ${message.toString()}`);
                        });
                 
                        client.on('error', (err) => {
                            console.error('MQTT-Verbindungsfehler:' + err);
                            client.end();  // Trenne die Verbindung bei einem Fehler
                            console.log('Verbindung getrennt aufgrund eines Fehlers ' + err);
                        });
                 
                        client.on('close', () => {
                            console.log('MQTT-Verbindung geschlossen');
                        });
                 
                    } catch (error) {
                        console.error('Fehler beim Starten des MQTT-Clients:' + error);
                    }
                }
                // Schließe die Verbindung, wenn das Skript gestoppt wird
                onStop(function (callback) {
                    if (client) {
                        client.end();
                        log("Script gestoppt");
                    }
                    callback();
                }, 2000);
                // Start der MQTT-Client-Verbindung
                startMQTTClient();
                 
                 
                 
                // Beispielaufruf von setPermanentWatts außerhalb von startMQTTClient()
                setTimeout(() => {
                    setPermanentWatts(deviceSNs[0], 3000); // Setzt permanentWatts für ein bestimmtes Gerät auf 300 W
                }, 5000); // Warte 5 Sekunden, damit der Client verbunden ist
                
                
                G Offline
                G Offline
                giovanne
                schrieb am zuletzt editiert von
                #1516

                @waly_de , gern geschehen 😉

                1 Antwort Letzte Antwort
                1
                • W Waly_de

                  @sirdir guter Hinweis mit der Client ID.
                  Ich hab das Grip mal angepasst und eine Client ID fest vergeben. Damit sollte das Problem erledigt sein.

                  const axios = require('axios');
                  const mqtt = require('mqtt');
                  const crypto = require('crypto');
                   
                  //****** HIER DEINE DATEN ******
                  const accessKey = 'XXXXXXXXXXXXXXXX'; // Ersetze dies mit deinem tatsächlichen Access Key
                  const secretKey = 'XXXXXXXXXXXXXXXX'; // Ersetze dies mit deinem tatsächlichen Secret Key
                  const deviceSNs = ['XXXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXXX']; // Mehrere Geräte-Seriennummern
                  const MQTT_Clientid = 1
                  //*********************/
                   
                   
                  // Konfigurationen
                  const host = 'api-e.ecoflow.com';
                  const mqttHost = 'mqtt.ecoflow.com';
                  const mqttPort = 8883;
                  const mqttProtocol = 'mqtts';
                  const mqttCert = '0_userdata.0.ecoflow.mqttCert'
                  // Globale Variablen für client und certification
                  let client;
                  let certification;
                   
                  if (!existsState(mqttCert)) {
                      createState(mqttCert, "");
                  }
                   
                  // Hilfsfunktion zur Erstellung eines HMAC-SHA256-Signatur
                  function createSignature(params, secretKey) {
                      const queryString = Object.keys(params)
                          .sort()
                          .map(key => `${key}=${params[key]}`)
                          .join('&');
                      return crypto.createHmac('sha256', secretKey).update(queryString).digest('hex');
                  }
                   
                  // Funktion zur Überprüfung, ob Zertifikat bereits vorhanden ist
                  async function loadMQTTCertification() {
                      return new Promise((resolve, reject) => {
                          // Überprüfen, ob der State existiert
                   
                          getState(mqttCert, (err, state) => {
                              if (err) {
                                  console.error('Fehler beim Überprüfen des Zertifikat-States:', err);
                                  return reject(err);
                              }
                              if (state && state.val) {
                                  try {
                                      const storedCert = JSON.parse(state.val);
                                      // Überprüfen, ob die Felder im Zertifikat vorhanden sind
                                      if (storedCert.certificateAccount && storedCert.certificatePassword) {
                                          console.log('Zertifikat aus ioBroker geladen');
                                          return resolve(storedCert);
                                      }
                                  } catch (error) {
                                      console.error('Fehler beim Parsen des Zertifikats:'+ error);
                                  }
                              }
                              resolve(null); // Kein Zertifikat gefunden oder ungültig
                          });
                      });
                  }
                   
                  // Zertifikate für MQTT abrufen und speichern
                  async function getMQTTCertification() {
                      const nonce = Math.floor(Math.random() * 1000000);
                      const timestamp = Date.now();
                      const params = {
                          accessKey: accessKey,
                          nonce: nonce,
                          timestamp: timestamp
                      };
                   
                      const signature = createSignature(params, secretKey);
                   
                      try {
                          const response = await axios.get(`https://${host}/iot-open/sign/certification`, {
                              headers: {
                                  accessKey: accessKey,
                                  nonce: nonce,
                                  timestamp: timestamp,
                                  sign: signature
                              }
                          });
                   
                          const certData = response.data.data;
                          // Zertifikat in ioBroker speichern
                          setState(mqttCert, JSON.stringify(certData), true);
                          console.log('Zertifikat erfolgreich abgerufen und in ioBroker gespeichert');
                          return certData;
                      } catch (error) {
                          console.error('Fehler beim Abrufen der MQTT-Zertifikate:'+ error);
                          throw error;
                      }
                  }
                   
                  // Funktion zum Setzen von Parametern (z.B. permanentWatts) ohne client und certification als Parameter
                  function setPermanentWatts(deviceSN, wattsValue) {
                      if (!client || !certification) {
                          console.error("MQTT-Client oder Zertifizierung nicht bereit.");
                          return;
                      }
                   
                      const setTopic = `/open/${certification.certificateAccount}/${deviceSN}/set`;
                   
                      const message = {
                          id: Date.now(), // Einzigartige ID
                          version: "1.0",
                          cmdCode: "WN511_SET_PERMANENT_WATTS_PACK", // Befehlscode zum Setzen von permanentWatts
                          params: {
                              permanentWatts: wattsValue // Der Wert, den du setzen möchtest
                          }
                      };
                   
                      client.publish(setTopic, JSON.stringify(message), (err) => {
                          if (!err) {
                              console.log(`Befehl zum Setzen von permanentWatts auf ${wattsValue} W für Gerät ${deviceSN} wurde gesendet.`);
                          } else {
                              console.error(`Fehler beim Senden des permanentWatts-Befehls für Gerät ${deviceSN}:` + err);
                          }
                      });
                  }
                   
                  // MQTT-Verbindung herstellen und Daten empfangen
                  async function startMQTTClient() {
                      try {
                          // Zertifikat aus ioBroker laden, falls vorhanden
                          certification = await loadMQTTCertification();
                          if (!certification) {
                              // Zertifikat neu generieren, wenn es nicht vorhanden ist
                              certification = await getMQTTCertification();
                          }
                   
                          client = mqtt.connect(`${mqttProtocol}://${mqttHost}:${mqttPort}`, {
                              clientId: 'EcoFlowClient_' + MQTT_Clientid,
                              username: certification.certificateAccount,
                              password: certification.certificatePassword,
                              protocol: mqttProtocol
                          });
                   
                          client.on('connect', () => {
                              console.log('Verbunden mit dem MQTT-Broker');
                   
                              // Abonnieren von Status und anderen Daten für jedes Gerät
                              deviceSNs.forEach((deviceSN) => {
                                  const quotaTopic = `/open/${certification.certificateAccount}/${deviceSN}/quota`;
                                  const statusTopic = `/open/${certification.certificateAccount}/${deviceSN}/status`;
                   
                                  // Abonnieren des Status-Themas
                                  client.subscribe(statusTopic, (err) => {
                                      if (!err) {
                                          console.log(`Abonniert auf Status-Topic: ${statusTopic}`);
                                      } else {
                                          console.error(`Fehler beim Abonnieren des Status-Themas für Gerät ${deviceSN}:` + err);
                                      }
                                  });
                   
                                  // Abonnieren des Quota-Themas
                                  client.subscribe(quotaTopic, (err) => {
                                      if (!err) {
                                          console.log(`Abonniert auf Quota-Topic: ${quotaTopic}`);
                                      } else {
                                          console.error(`Fehler beim Abonnieren des Quota-Themas für Gerät ${deviceSN}:` + err);
                                      }
                                  });
                              });
                          });
                   
                          client.on('message', (topic, message) => {
                              console.log(`Nachricht empfangen von Topic ${topic}: ${message.toString()}`);
                          });
                   
                          client.on('error', (err) => {
                              console.error('MQTT-Verbindungsfehler:' + err);
                              client.end();  // Trenne die Verbindung bei einem Fehler
                              console.log('Verbindung getrennt aufgrund eines Fehlers ' + err);
                          });
                   
                          client.on('close', () => {
                              console.log('MQTT-Verbindung geschlossen');
                          });
                   
                      } catch (error) {
                          console.error('Fehler beim Starten des MQTT-Clients:' + error);
                      }
                  }
                  // Schließe die Verbindung, wenn das Skript gestoppt wird
                  onStop(function (callback) {
                      if (client) {
                          client.end();
                          log("Script gestoppt");
                      }
                      callback();
                  }, 2000);
                  // Start der MQTT-Client-Verbindung
                  startMQTTClient();
                   
                   
                   
                  // Beispielaufruf von setPermanentWatts außerhalb von startMQTTClient()
                  setTimeout(() => {
                      setPermanentWatts(deviceSNs[0], 3000); // Setzt permanentWatts für ein bestimmtes Gerät auf 300 W
                  }, 5000); // Warte 5 Sekunden, damit der Client verbunden ist
                  
                  
                  S Offline
                  S Offline
                  sirdir
                  schrieb am zuletzt editiert von sirdir
                  #1517

                  @waly_de das war @giovanne :)

                  Ich hab das Format jetzt verstanden un konnte diverse Werte setzen.

                  Was mir noch nicht ganz klar ist, der z.B. batSoc taucht im quota wohl nur auf, wenn er sich ändert… abfragen kann man den nicht?
                  und z.B. die Einspeisekontrolle ein/ausschalten, dafür gibt’s keinen Parameter? Dann liesse sich das Script ja schon mal nicht komplett umschreiben…

                  G S 2 Antworten Letzte Antwort
                  0
                  • S sirdir

                    @waly_de das war @giovanne :)

                    Ich hab das Format jetzt verstanden un konnte diverse Werte setzen.

                    Was mir noch nicht ganz klar ist, der z.B. batSoc taucht im quota wohl nur auf, wenn er sich ändert… abfragen kann man den nicht?
                    und z.B. die Einspeisekontrolle ein/ausschalten, dafür gibt’s keinen Parameter? Dann liesse sich das Script ja schon mal nicht komplett umschreiben…

                    G Offline
                    G Offline
                    giovanne
                    schrieb am zuletzt editiert von giovanne
                    #1518

                    @sirdir , aktiv abfragen kannst wenn es per mqtt nicht geht, mit http. Auch setzen geht (alternativ) per http.

                    Ich nutze mqtt auch mehr fürs monitoring, man subscribed /abonniert ja topic die einen interessieren und dementsprechend finde ich es korrekt das nur Änderungen mitgeteilt werden.
                    Aktiv schalten und co dann per http...

                    Aber gibt sicherlich verschiedene Wege nach Rom 😜

                    Edit: ich glaube Einspeisekontrolle fehlt tatsächlich (vermutlich) noch, war zumindest damals so. Die kam ja erst in späterer Firmware und müsste von Ecoflow in die API aufgenommen werden (wenn nicht vorhanden).
                    Ich nutze die nicht deshalb habe ich die nicht weiter verfolgt.

                    S 1 Antwort Letzte Antwort
                    0
                    • G giovanne

                      @sirdir , aktiv abfragen kannst wenn es per mqtt nicht geht, mit http. Auch setzen geht (alternativ) per http.

                      Ich nutze mqtt auch mehr fürs monitoring, man subscribed /abonniert ja topic die einen interessieren und dementsprechend finde ich es korrekt das nur Änderungen mitgeteilt werden.
                      Aktiv schalten und co dann per http...

                      Aber gibt sicherlich verschiedene Wege nach Rom 😜

                      Edit: ich glaube Einspeisekontrolle fehlt tatsächlich (vermutlich) noch, war zumindest damals so. Die kam ja erst in späterer Firmware und müsste von Ecoflow in die API aufgenommen werden (wenn nicht vorhanden).
                      Ich nutze die nicht deshalb habe ich die nicht weiter verfolgt.

                      S Offline
                      S Offline
                      sirdir
                      schrieb am zuletzt editiert von sirdir
                      #1519

                      @giovanne OK, ich brauch das mit der Einspeisekontrolle… 
                      So oder so, ist doch ne ganz schöne Arbeit das Originalscript anzupassen, zumal ich das erst mal richtg analysieren müsste.
                      Ich fühl mich so doof, hab jetzt nochmal den http Weg versuchen wollen und mit der Funktion von Wally zu signieren versucht, aber der Wert den ich raus krieg wenn ich die Parameter aus dem Beispiel von Ecoflow übergebe stimmt nicht überein…

                      Edit: Man sollte Funktionen, die man benutzt vielleicht auch mal anschauen :) er sortiert das ja um.. ohne das stimmt der Wert.

                      1 Antwort Letzte Antwort
                      0
                      • A Offline
                        A Offline
                        Accu
                        schrieb am zuletzt editiert von Accu
                        #1520

                        jetzt hats mich auch erwischt und das Script speist nicht mehr ein. Muss irgendwann letzte Nacht um 5 Uhr morgens passiert sein. Seltsamerweise lief es jetzt all die Zeit problemlos, bis ich gestern an der Anlage rumgespielt hatte und den Powerstream AC-seitig vom Strom getrennt hatte. Was ein Mist. Der Realpower -Wert wird in den Objekten noch angezeigt. Woran sieht man eigentlich, dass von EF MQTT nichts mehr zuürck kommt in den Objekten?

                        Gibt es irgendwelche Alternativen was man jetzt machen kann? wie habt ihr das alle jetzt gelöst. Vorallem dass ich die Überschussladung jetzt nicht mehr nutzen kann nervt ohne Ende.

                        Im Skript schein er bestimmte Werte vom PS nicht mehr zu lesen.

                        IMG_0099.jpeg

                        R 1 Antwort Letzte Antwort
                        0
                        • A Accu

                          jetzt hats mich auch erwischt und das Script speist nicht mehr ein. Muss irgendwann letzte Nacht um 5 Uhr morgens passiert sein. Seltsamerweise lief es jetzt all die Zeit problemlos, bis ich gestern an der Anlage rumgespielt hatte und den Powerstream AC-seitig vom Strom getrennt hatte. Was ein Mist. Der Realpower -Wert wird in den Objekten noch angezeigt. Woran sieht man eigentlich, dass von EF MQTT nichts mehr zuürck kommt in den Objekten?

                          Gibt es irgendwelche Alternativen was man jetzt machen kann? wie habt ihr das alle jetzt gelöst. Vorallem dass ich die Überschussladung jetzt nicht mehr nutzen kann nervt ohne Ende.

                          Im Skript schein er bestimmte Werte vom PS nicht mehr zu lesen.

                          IMG_0099.jpeg

                          R Offline
                          R Offline
                          Ralf77
                          schrieb am zuletzt editiert von Ralf77
                          #1521

                          @accu das ist normal soweit ich weiß und and dauert immer kurze Zeit nach eine, Neustart, bis wieder entsprechend historische Werte angelegt sind. Das sollte alles schon wieder funktionieren. Di3se Meldung bekomme ich auch, wenn ich neu starte… nach ein paar Minuten geht es dann wieder normal weiter.

                          Generell habe ich aber auch ein Problem… Immer gegen 2 Uhr in der Nacht verdoppelt der ioBroker die Einspeisung. Keine Ahnung, was das ist… wir schlafen da alle und es ist auch genügend Energie im Speicher. Das ist so jetzt schon die 2 Nacht. Jemand eine Ahnung, was das sein kann?

                          f8343db1-48cc-4e7b-b207-4c6dd25c9e24-image.jpeg

                          A 1 Antwort Letzte Antwort
                          0
                          • S sirdir

                            @waly_de das war @giovanne :)

                            Ich hab das Format jetzt verstanden un konnte diverse Werte setzen.

                            Was mir noch nicht ganz klar ist, der z.B. batSoc taucht im quota wohl nur auf, wenn er sich ändert… abfragen kann man den nicht?
                            und z.B. die Einspeisekontrolle ein/ausschalten, dafür gibt’s keinen Parameter? Dann liesse sich das Script ja schon mal nicht komplett umschreiben…

                            S Offline
                            S Offline
                            sirdir
                            schrieb am zuletzt editiert von sirdir
                            #1522

                            @Waly_de Ich hab jetzt die für mich wichtigsten Dinge implementiert (ohne Feed-Prio, weil das wohl nicht geht) und es klappt so weit. Eine Frage, ist es normal, dass die Verbindung in unregelmässigen Abständen (wenige Sekunden) geschlossen und wieder aufgebaut wird?

                            O 1 Antwort Letzte Antwort
                            0
                            • S sirdir

                              @Waly_de Ich hab jetzt die für mich wichtigsten Dinge implementiert (ohne Feed-Prio, weil das wohl nicht geht) und es klappt so weit. Eine Frage, ist es normal, dass die Verbindung in unregelmässigen Abständen (wenige Sekunden) geschlossen und wieder aufgebaut wird?

                              O Offline
                              O Offline
                              Odi77
                              schrieb am zuletzt editiert von Odi77
                              #1523

                              @sirdir Ich hatte seit ich die gleiche "clientId" wie Waly_de im Test-Skript verwendet hatte ("Ecoflow_1") den selben Effekt.
                              Ich habe nun einen komplett kryptischen jedoch konstanten Wert gewählt. - Nun scheint dieses Problem behoben zu sein.

                              S 1 Antwort Letzte Antwort
                              0
                              • O Odi77

                                @sirdir Ich hatte seit ich die gleiche "clientId" wie Waly_de im Test-Skript verwendet hatte ("Ecoflow_1") den selben Effekt.
                                Ich habe nun einen komplett kryptischen jedoch konstanten Wert gewählt. - Nun scheint dieses Problem behoben zu sein.

                                S Offline
                                S Offline
                                sirdir
                                schrieb am zuletzt editiert von
                                #1524

                                @odi77 Versuch ich mal - also auch fix, nicht generiert pro neustart oder so? Lustig ist auch, dass es nicht immer auftrat. Jetzt, nach ändern der ClientID seh ich’s auch nicht, aber eben, war auch vorher nicht immer so.

                                1 Antwort Letzte Antwort
                                0
                                • R Ralf77

                                  @accu das ist normal soweit ich weiß und and dauert immer kurze Zeit nach eine, Neustart, bis wieder entsprechend historische Werte angelegt sind. Das sollte alles schon wieder funktionieren. Di3se Meldung bekomme ich auch, wenn ich neu starte… nach ein paar Minuten geht es dann wieder normal weiter.

                                  Generell habe ich aber auch ein Problem… Immer gegen 2 Uhr in der Nacht verdoppelt der ioBroker die Einspeisung. Keine Ahnung, was das ist… wir schlafen da alle und es ist auch genügend Energie im Speicher. Das ist so jetzt schon die 2 Nacht. Jemand eine Ahnung, was das sein kann?

                                  f8343db1-48cc-4e7b-b207-4c6dd25c9e24-image.jpeg

                                  A Offline
                                  A Offline
                                  Accu
                                  schrieb am zuletzt editiert von
                                  #1525

                                  @ralf77 gestern lief mein Skript plötzlich wieder. Ab heute Morgen 5 uhr wieder das gleich wie am Tag zu vor. Es speist nicht mehr ein.
                                  Hast du irgendeinenen Tipp?

                                  S R 2 Antworten Letzte Antwort
                                  0
                                  • A Accu

                                    @ralf77 gestern lief mein Skript plötzlich wieder. Ab heute Morgen 5 uhr wieder das gleich wie am Tag zu vor. Es speist nicht mehr ein.
                                    Hast du irgendeinenen Tipp?

                                    S Offline
                                    S Offline
                                    sirdir
                                    schrieb am zuletzt editiert von sirdir
                                    #1526

                                    @accu Hast du dasselbe Problem wie ich vielleicht? Zusatzakku geht schlafen oder so? (battErrorCode: 8 ) und PS speist deswegen nichts ein. Hab jetzt mein Script so angepasst, dass in dem Fall der andere PS das Doppelte Einspeist, bis die Batterie irgendwann aufwacht…
                                    Weiss auch nicht warum das mit der Batterie jetzt passiert und ob das auch irgendwie von Ecoflow gesteuert wird…

                                    1 Antwort Letzte Antwort
                                    0
                                    • A Accu

                                      @ralf77 gestern lief mein Skript plötzlich wieder. Ab heute Morgen 5 uhr wieder das gleich wie am Tag zu vor. Es speist nicht mehr ein.
                                      Hast du irgendeinenen Tipp?

                                      R Offline
                                      R Offline
                                      Ralf77
                                      schrieb am zuletzt editiert von
                                      #1527

                                      @accu gestern war bei mir auch wieder alles ok. Keine Ahnung warum…

                                      Hast Du mal geschaut, ob Du irgendwo eine geplante Aufgabe noch aktiv hast oder eine Automatisierung aktiv ist?

                                      Ich hatte es bisher noch nie, dass die Einspeisung komplett gestoppt wurde. Das kommt eigentlich bei mir nur vor, wenn ich z.B gesetzte Limits erreicht habe oder ich ein Abschalten durch Wechsel in den Speicher-Prio Modus aktiviert hatte .

                                      Oder hast Du im Script eventuell den BattPrio Modus mit gewissen Zuständen verknüpft?

                                      S 1 Antwort Letzte Antwort
                                      0
                                      • R Ralf77

                                        @accu gestern war bei mir auch wieder alles ok. Keine Ahnung warum…

                                        Hast Du mal geschaut, ob Du irgendwo eine geplante Aufgabe noch aktiv hast oder eine Automatisierung aktiv ist?

                                        Ich hatte es bisher noch nie, dass die Einspeisung komplett gestoppt wurde. Das kommt eigentlich bei mir nur vor, wenn ich z.B gesetzte Limits erreicht habe oder ich ein Abschalten durch Wechsel in den Speicher-Prio Modus aktiviert hatte .

                                        Oder hast Du im Script eventuell den BattPrio Modus mit gewissen Zuständen verknüpft?

                                        S Offline
                                        S Offline
                                        sirdir
                                        schrieb am zuletzt editiert von
                                        #1528

                                        @ralf77 Bei mir definitiv keine geplaneten Aufgaben etc. Steuerte alles über das Script. Irgendwas passiert manchmal bei manchen Leuten. Hab auch schon von welchen gehört die sagten, sie kriegen nur noch daten geliefert wenn sie die App aufmachen. Ich hab gesehen, dass das Script 0 einspeisen wollte, obwohl bedarf da war. Jemand, dem ich beim Setup geholfen habe hatte das auch schon mehrmals… Bei mir kam noch mehr dazu, warhscheinlich eben wegen der Batterie die sich schlafen legt oder vielleicht auch Serverprobleme, jedenfalls hatte ich plötzlich 2x0% SOC und sowas. Ich hab jetzt alles auf die offizielle API umgestellt. Nicht so sophisticated wie Waly’s Script, aber für mich tut’s jetzt seit ner Weile perfekt.

                                        G 1 Antwort Letzte Antwort
                                        1
                                        • S sirdir

                                          @ralf77 Bei mir definitiv keine geplaneten Aufgaben etc. Steuerte alles über das Script. Irgendwas passiert manchmal bei manchen Leuten. Hab auch schon von welchen gehört die sagten, sie kriegen nur noch daten geliefert wenn sie die App aufmachen. Ich hab gesehen, dass das Script 0 einspeisen wollte, obwohl bedarf da war. Jemand, dem ich beim Setup geholfen habe hatte das auch schon mehrmals… Bei mir kam noch mehr dazu, warhscheinlich eben wegen der Batterie die sich schlafen legt oder vielleicht auch Serverprobleme, jedenfalls hatte ich plötzlich 2x0% SOC und sowas. Ich hab jetzt alles auf die offizielle API umgestellt. Nicht so sophisticated wie Waly’s Script, aber für mich tut’s jetzt seit ner Weile perfekt.

                                          G Offline
                                          G Offline
                                          gooflo
                                          schrieb am zuletzt editiert von
                                          #1529

                                          @sirdir cool, dass Du es auf die offizielle API umgestellt hast. Teilst Du Deinen Code mit uns?

                                          S 1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          829

                                          Online

                                          32.4k

                                          Benutzer

                                          81.5k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe