https://forum.zendure.com/d/20119
Ich beende meinen Shelly-Ausflug mit dem finalen Script, das ich jetzt Akku-WatchDog nenne.
Das Script ist ordentlich parametrisiert und strukturiert, kann jeder nachvollziehen und nun für sich ausbauen.
Ich bin ja eher Home Assistent verpflichtet 😃
Was macht das Script
✅ Das Script liest Akkudaten der am Solarflow angeschlossenen Akkus aus. (minVol, maxVol,soclevel, temperatur)
✅ Wenn der electriclevel (SoC) des Systems größer 99% erreicht, wird eine Nachricht an einen Messenger geschickt.
✅ Wenn minVolunter einen Schwellwert fällt, wird eine Nachricht an einen Messenger geschickt.
✅ Alle Konfigurationsparameter (wie AppKey, ) sind jetzt oben im Script einstellbar.
✅ Benachrichtigungen für „Akku voll“ und „Zelle unter 3 V“ funktionieren hier mit Signal (aber anpassbar für Whatsapp, Telegram)
✅ Die Schwellwerte für die Benachrichtigungen der zu überwachenden Werte sind als Variablen definiert und können im Script oben angepasst werden .
Einrichten
Wirklich LESEN
https://github.com/surfer1264/Zendure-Stuff/wiki/Shelly-Script-Akkudaten-auslesen
HAPPY WINTER
Das Script
https://github.com/surfer1264/Zendure-Stuff/blob/main/Shelly_Akku_Volt
// ========== AkkuVolt Watchdog mit Signal-Benachrichtigungen ==========
// Erkennt Akku-Zustand und sendet Nachrichten bei:
// - Akku voll (>= 99 %)
// - Unterspannung einzelner Zellen (< 3.0 V)
print("⚡ Starte AkkuVolt-Watchdog — bitte vorsichtig benutzen!");
// ==================== EINSTELLUNGEN ====================
// MQTT-Topic deines BMS oder Gateways:
let mqttTopic = "MYAppKEY/#";
// Signal (CallMeBot) Einstellungen:
let signalPhone = "PHONE-STRING"; // z. B. +4917XXXXXXXX
let signalKey = "YOUR_API_KEY"; // dein API Key
// Schwellwerte:
let vollSchwelle = 99; // Prozent, ab wann Akku als „voll“ gilt (!!größer als ..!!)
let entladeReset = 95; // Prozent, ab wann erneute Vollmeldung erlaubt ist
let minVoltWarn = 3.0; // Volt, Unterspannungsgrenze (!!kleiner als..!!
let minVoltReset = 3.1; // Volt, Erholungsgrenze zum Zurücksetzen der Warnung
// ==================== VARIABLEN ====================
let Zen = 0; // Gesamt-Ladezustand
let bat = 9; // Akku-Arbeitsmodus
let modus = "OPEN "; // Textdarstellung Modus
let packs = {}; // Datenstruktur für alle Zellen
let lowVoltMsgSent = false; // Warnung über Unterspannung gesendet?
// ==================== HILFSFUNKTIONEN ====================
// Signal-Nachricht senden:
function sendSignalMessage(text) {
let url = "https://api.callmebot.com/signal/send.php" +
"?phone=" + signalPhone +
"&apikey=" + signalKey +
"&text=" + text;
print("📨 Sende Signal-Nachricht: " + url);
Shelly.call("HTTP.GET", { url: url }, function (result, error_code, error_msg) {
if (error_code === 0) {
print("✅ Nachricht erfolgreich gesendet.");
} else {
print("❌ Fehler beim Senden: " + error_msg);
}
});
}
// Ausgabe eines einzelnen Akkus:
function Druck(sn) {
let daten = packs[sn];
if (!daten) return;
print(modus +
sn + ": " +
(daten.soc !== undefined ? daten.soc + "%" : "-%") + " " +
(daten.minV !== undefined ? daten.minV + "V" : "-V") + " .. " +
(daten.maxV !== undefined ? daten.maxV + "V" : "-V") + " " +
(daten.maxT !== undefined ? daten.maxT + "°" : "-°"));
}
// Ausgabe aller Akkus:
function DruckAlle() {
for (let sn in packs) {
Druck(sn);
}
}
// ==================== MQTT HANDLER ====================
MQTT.subscribe(mqttTopic, function (topic, msg) {
let data = JSON.parse(msg);
// --- PACKDATEN ---
if (data.packData) {
for (let i = 0; i < data.packData.length; i++) {
let pack = data.packData[i];
let sn = pack.sn;
if (!packs[sn]) {
packs[sn] = { soc: undefined, minV: undefined, maxV: undefined, maxT: undefined };
}
// Werte übernehmen
if (pack.maxVol !== undefined) packs[sn].maxV = pack.maxVol / 100;
if (pack.minVol !== undefined) {
packs[sn].minV = pack.minVol / 100;
// --- Unterspannung prüfen ---
if (packs[sn].minV < minVoltWarn) {
if (!lowVoltMsgSent) {
lowVoltMsgSent = true;
sendSignalMessage("⚠️ Zelle " + sn + " hat nur " + packs[sn].minV + " V!");
}
} else if (packs[sn].minV > minVoltReset) {
lowVoltMsgSent = false;
}
}
if (pack.maxTemp !== undefined) packs[sn].maxT = pack.maxTemp - 273.1;
if (pack.socLevel !== undefined) packs[sn].soc = pack.socLevel;
Druck(sn);
}
}
// --- PACKZUSTAND ---
if (data.packState !== undefined) {
if (bat !== data.packState) {
bat = data.packState;
switch (bat) {
case 0: modus = "STBY "; break;
case 1: modus = "LOAD "; break;
case 2: modus = "UNLD "; break;
}
DruckAlle();
}
}
// --- GESAMTLADEZUSTAND ---
if (data.electricLevel !== undefined) {
if (Zen !== data.electricLevel) {
Zen = data.electricLevel;
DruckAlle();
if (Zen >= vollSchwelle) {
if (!packs.messageSent) {
packs.messageSent = true;
sendSignalMessage("🔋 Akku ist jetzt voll (" + Zen + "%)");
}
} else if (Zen < entladeReset) {
packs.messageSent = false;
}
}
}
});
print("📡 MQTT-Überwachung aktiv auf Topic:", mqttTopic);