NEWS
Venus V3.0 API Token
-
danke für eure Rückmeldungen.
Ich bin da aktuell noch mitten in der Umsetzung.
Grundsätzlich funktioniert die reine Skriptlösung – man braucht also keinen zusätzlichen Docker oder andere externe Tools. JS-Skripte im ioBroker reichen völlig aus.Derzeit arbeite ich eher an der Steuerung und Logik. Ziel ist u.a. eine SoC-Berücksichtigung, die Marstek selbst nicht vorsieht. Also z.B.: Akku nur bis XX % laden oder nur bis XX % entladen – frei im Skript einstellbar.
Außerdem möchte ich eine regelbare Lade-/Entladeleistung integrieren.
In der App kann man zwar Grenzen setzen (z.B. max. 800 W oder 2.500 W), aber:Bei der Entladung halten sich die Speicher an die eingestellte Begrenzung (u.a. wegen Leitungs-/Brandschutz).
Beim Laden leider nicht – selbst wenn man 800 W vorgibt, ziehen die Speicher problemlos 2.500 W. Für die Leitungen macht es aber keinen Unterschied, ob der Strom „+“ oder „–“ ist (Laden/Entladen) – belastet werden sie gleich stark.
Da ich selbst nicht programmieren kann, nutze ich KI zur Unterstützung. Allerdings stoße ich dabei immer wieder (trotz bezahlter Tarife) auf Sperren und Timeouts, was das Ganze ziemlich ausbremst.
Als Nächstes möchte ich eine Mehr-Speicher-Lösung sauber umsetzen. Erste Ansätze habe ich bereits bei mir integriert. Auch der API-Abruf läuft momentan noch in einem separaten Skript – den würde ich dann einarbeiten, sobald die Basis stabil läuft.
-
@gismoh
Hallo gismoh
habe die venus V3.0 und habe mir lan und API freischalten lassen
wie komme ich an den API Token?Gruß Stephan
@stephan61
Hallo stephan61,
hatte es via http Toolkit gemacht.Beste Grüße!
-
@stephan61
Hallo stephan61,
hatte es via http Toolkit gemacht.Beste Grüße!
-
Hallo ich versuche meine Marstek Venus E 3 über die locale Api abzufragen.
habe folgenden Code
const client = dgram.createSocket('udp4'); const venusIp = '192.168.178.15'; // Ersetzen Sie durch die tatsächliche IP const venusPort = 30000; // Standardport der lokalen API // Funktion zum Senden eines Befehls und Empfangen der Antwort function sendApiCommand(command, callback) { const message = Buffer.from(JSON.stringify(command)); client.send(message, venusPort, venusIp, (err) => { if (err) { console.error(`Fehler beim Senden des UDP-Befehls: ${err}`); if (callback) callback(err, null); } }); // Listener für Antworten client.on('message', (msg, rinfo) => { try { const response = JSON.parse(msg.toString()); if (callback) callback(null, response); client.close(); // Socket nach Antwort schließen oder offen lassen, je nach Bedarf } catch (e) { console.error(`Fehler beim Parsen der JSON-Antwort: ${e}`); } }); } // Beispiel: Abfrage des Batteriestatus const statusCommand = { "command": "Bat.GetStatus", "param": {"id": 0} }; sendApiCommand(statusCommand, (err, data) => { if (!err && data) { console.log("Batteriestatus erhalten:", data); // Datenpunkte in ioBroker erstellen/aktualisieren (Beispiel) setState('0_userdata.0.MarstekVenus.Status', JSON.stringify(data)); setState('0_userdata.0.MarstekVenus.SOC', data.soc); } }); code_textleider kommt keine Antwort
Anbei die Apibeschreibung Marstek_Device_Open_API_EN_.Rev1.0.pdf -
Dass du keine Antworten bekommst liegt vermutlich an der Firmware Version. Ich habe auch die letzten Tage rumgetestet und irgendwann mal 2-3 Antworten bekommen und dann ohne Änderungen keine mehr. Ich habe dann im PV Forum gesehen, dass es deutlich aktuellere FW Versionen mit API Fixes gibt, die muss man aber über die Feedback Funktion in der Marstek App beim Support anfragen und freischalten lassen. Damit kann ich jetzt auch die API abfragen. Hier mal mein sehr rudimentäres TS Script mit dem ich die aktuelle Leistung und Batteriestand abfragen kann:
const DEVICE_IP = "192.168.1.143"; // IP deines Marstek Venus E 3.0 const DEVICE_PORT = 30000; // UDP-Port laut App const dgram = require("dgram"); const socket = dgram.createSocket("udp4"); // Datenpunkte const SOC_STATE = "0_userdata.0.marstek.soc"; const GRID_POWER_STATE = "0_userdata.0.marstek.gridPower"; createState(SOC_STATE, 0, { name: "State of Charge", unit: "%", type: "number", role: "value.battery" }); createState(GRID_POWER_STATE, 0, { name: "Grid Power", unit: "W", type: "number", role: "value.power" }); // JSON-RPC Requests const batRequest = JSON.stringify({ id: 1, method: "Bat.GetStatus", params: { id: 0 } }); const esRequest = JSON.stringify({ id: 2, method: "ES.GetStatus", params: { id: 0 } }); const discoverRequest = JSON.stringify({ id: 0, method: "Marstek.GetDevice", params: { ble_mac: "0" } }); // UDP-Antwortverarbeitung socket.on("message", (msg: Buffer) => { try { const response = JSON.parse(msg.toString()); log("UDP Antwort: " + msg.toString(), "info"); if (response.result) { if (response.id === 1 && response.result.soc !== undefined) { setState(SOC_STATE, parseFloat(response.result.soc)); } if (response.id === 2 && response.result.ongrid_power !== undefined) { setState(GRID_POWER_STATE, parseFloat(response.result.ongrid_power)); setState(SOC_STATE, parseFloat(response.result.bat_soc)); } } } catch (err) { log("Fehler beim Parsen der Antwort: " + err, "error"); } }); // Fehlerbehandlung socket.on("error", (err) => { log("UDP Fehler: " + err.message, "error"); }); // Zyklisches Abfragen schedule("*/30 * * * * *", () => { // log("Sende Bat.GetStatus an Marstek", "info"); // socket.send(batRequest, 0, batRequest.length, DEVICE_PORT, DEVICE_IP); //log("Sende ES.GetStatus an Marstek", "info"); socket.send(esRequest, 0, esRequest.length, DEVICE_PORT, DEVICE_IP); }); // // Einmaliger Discovery-Request zum Start // setTimeout(() => { // log("Sende Discovery-Request (Marstek.GetDevice)", "info"); // socket.send(discoverRequest, 0, discoverRequest.length, DEVICE_PORT, DEVICE_IP); // }, 10000); // Socket starten socket.bind(); // kein fester Source-Port nötigLäuft damit zuverlässig. Und ich denke alle anderen Sachen aus der API Doku kann man dann auch recht einfach umsetzen, ist ja überschaubar von der Komplexität.
-
Hallo !
vielen Dank für den Code !Api freischalten geht seit etwa Dezember direkt in der App.
Geht einwandfrei !
--> ein bischen Offtopic: Sollte jemand lieber mit Blockly "programmieren" geht das sehr einfach mit exec aufrufen (mit netcat = nc)
echo '{"id":1,"method":"Bat.GetStatus","params":{"id":0}}' | nc -u -w 1 192.168.178.xyz 30000
Alles andere aus der API kann man damit auch abfragen / übertragen / Modes setzen etc. Habs grad probiert. Wichtig ist nur das vorher einmalig :
echo '{ "id": 0, "method": "Marstek.GetDevice", "params": { "ble_mac":"0" } } ' | nc -u -w 1 192.168.178.255 30000 gesendet wird damit er die UDP API aktiviert.
Manchmnal antwort mein Marstek Venus E v3 erst beim 2ten mal. Offenbar muss er nach längerer Zeit immer erst auffwachen.