diff --git a/haos-addon/src/main.py b/haos-addon/src/main.py
index e87daaf..79029f7 100644
--- a/haos-addon/src/main.py
+++ b/haos-addon/src/main.py
@@ -188,7 +188,12 @@ def _poll_loop(inv_cfg: Dict[str, Any], stop: threading.Event):
inv_id, inverter.name, host, interval)
elif inverter.protocol == "kathrein":
reader = WallboxReader(host=host, port=port)
- ems = EmsController()
+ ems = EmsController(
+ min_pv_power=inv_cfg.get("ems_min_pv", 1400),
+ pv_timeout_h=inv_cfg.get("ems_timeout", 4.0),
+ target_hour=inv_cfg.get("ems_target_hour", 6),
+ phases=inv_cfg.get("ems_phases", 3),
+ )
log.info("[%s] Poll-Loop: %s @ %s:%s (Kathrein EMS) alle %ds",
inv_id, inverter.name, host, port, interval)
else:
diff --git a/haos-addon/src/web/index.html b/haos-addon/src/web/index.html
index 5587262..8237164 100644
--- a/haos-addon/src/web/index.html
+++ b/haos-addon/src/web/index.html
@@ -226,6 +226,26 @@
+
+
+
EMS — Ladesteuerung
+
+
+
Mindestleistung für PV-Laden (min. 6A × 230V = 1380W)
+
+
+
Nach dieser Zeit ohne Überschuss startet Zwangsladen
+
+
+
Zielzeit für vollgeladenes Auto (z.B. 6 = 06:00 Uhr)
+
+
+
+
@@ -437,20 +457,31 @@ function renderInverterList() {
el.innerHTML = cards + `
+ Gerät hinzufügen
`;
}
+function toggleEmsSection(model) {
+ document.getElementById("ems-section").style.display =
+ model === "KATHREIN_WALLBOX" ? "" : "none";
+}
+
async function openModal(invId) {
await loadModels();
const modal = document.getElementById("modal-backdrop");
+ const modelSel = document.getElementById("modal-model");
+ modelSel.onchange = () => toggleEmsSection(modelSel.value);
if (invId) {
const inv = invertersList.find(i => i.id === invId) || {};
document.getElementById("modal-title").textContent = "Gerät bearbeiten";
document.getElementById("modal-id").value = inv.id || "";
document.getElementById("modal-name").value = inv.name || "";
- document.getElementById("modal-model").value = inv.inverter_model || "MIC_1500_TL_X";
+ modelSel.value = inv.inverter_model || "MIC_1500_TL_X";
document.getElementById("modal-ip").value = inv.modbus_ip || "";
document.getElementById("modal-port").value = inv.modbus_port || 502;
document.getElementById("modal-addr").value = inv.modbus_address || 1;
document.getElementById("modal-prefix").value = inv.mqtt_topic_prefix || "";
document.getElementById("modal-interval").value = inv.update_interval || 30;
+ document.getElementById("ems-min-pv").value = inv.ems_min_pv ?? 1400;
+ document.getElementById("ems-timeout").value = inv.ems_timeout ?? 4;
+ document.getElementById("ems-target-hour").value = inv.ems_target_hour ?? 6;
+ document.getElementById("ems-phases").value = inv.ems_phases ?? 3;
} else {
document.getElementById("modal-title").textContent = "Gerät hinzufügen";
document.getElementById("modal-id").value = "";
@@ -460,7 +491,12 @@ async function openModal(invId) {
document.getElementById("modal-addr").value = "1";
document.getElementById("modal-prefix").value = "growatt/wechselrichter" + (invertersList.length + 1);
document.getElementById("modal-interval").value = "30";
+ document.getElementById("ems-min-pv").value = "1400";
+ document.getElementById("ems-timeout").value = "4";
+ document.getElementById("ems-target-hour").value = "6";
+ document.getElementById("ems-phases").value = "3";
}
+ toggleEmsSection(modelSel.value);
modal.classList.add("open");
}
@@ -477,16 +513,23 @@ async function saveInverter() {
const r = await fetchJSON(api("api/new-id"), {method: "POST"});
id = r.id;
}
+ const model = document.getElementById("modal-model").value;
const inv = {
id,
name: document.getElementById("modal-name").value.trim() || "Wechselrichter",
- inverter_model: document.getElementById("modal-model").value,
+ inverter_model: model,
modbus_ip: document.getElementById("modal-ip").value.trim(),
modbus_port: parseInt(document.getElementById("modal-port").value),
modbus_address: parseInt(document.getElementById("modal-addr").value),
mqtt_topic_prefix: document.getElementById("modal-prefix").value.trim(),
update_interval: parseInt(document.getElementById("modal-interval").value),
};
+ if (model === "KATHREIN_WALLBOX") {
+ inv.ems_min_pv = parseInt(document.getElementById("ems-min-pv").value);
+ inv.ems_timeout = parseFloat(document.getElementById("ems-timeout").value);
+ inv.ems_target_hour = parseInt(document.getElementById("ems-target-hour").value);
+ inv.ems_phases = parseInt(document.getElementById("ems-phases").value);
+ }
const idx = invertersList.findIndex(i => i.id === id);
if (idx >= 0) invertersList[idx] = inv; else invertersList.push(inv);
try {