v1.8.12: Mindest-Laufzeit pro Überschuss-Gerät
- min_on_minutes pro Gerät: Gerät bleibt mindestens X Minuten an auch wenn Überschuss unter Ausschaltschwelle fällt (Boiler-Fix) - Live-Tab zeigt verbleibende Mindestlaufzeit während Gerät läuft - get_states() liefert on_minutes für Laufzeit-Tracking Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
0dbf0266a8
commit
33ada90df4
@@ -996,6 +996,7 @@ function renderSurplusDeviceRow(dev) {
|
||||
<input type="text" placeholder="Z2M Friendly Name" list="z2m-device-list" style="flex:1;min-width:140px" value="${esc(dev.z2m_name||'')}" data-field="z2m_name">
|
||||
<input type="number" placeholder="Ab (W)" title="Schwellwert" style="width:76px" value="${dev.threshold_w||500}" min="0" step="50" data-field="threshold_w">
|
||||
<input type="number" placeholder="Hysterese (W)" title="Hysterese" style="width:90px" value="${dev.hysteresis_w||150}" min="0" step="50" data-field="hysteresis_w">
|
||||
<input type="number" placeholder="Min. Laufzeit (min)" title="Mindest-Laufzeit in Minuten" style="width:110px" value="${dev.min_on_minutes||0}" min="0" step="5" data-field="min_on_minutes">
|
||||
<label style="cursor:pointer;display:flex;align-items:center;gap:4px;font-size:12px;white-space:nowrap">
|
||||
<input type="checkbox" ${dev.enabled!==false?'checked':''} data-field="enabled" style="width:auto;margin:0"> Aktiv
|
||||
</label>
|
||||
@@ -1041,7 +1042,8 @@ function _collectSurplusDevices() {
|
||||
name: row.querySelector('[data-field=name]').value.trim(),
|
||||
z2m_name: row.querySelector('[data-field=z2m_name]').value.trim(),
|
||||
threshold_w: parseFloat(row.querySelector('[data-field=threshold_w]').value) || 0,
|
||||
hysteresis_w: parseFloat(row.querySelector('[data-field=hysteresis_w]').value) || 0,
|
||||
hysteresis_w: parseFloat(row.querySelector('[data-field=hysteresis_w]').value) || 0,
|
||||
min_on_minutes: parseFloat(row.querySelector('[data-field=min_on_minutes]').value) || 0,
|
||||
enabled: row.querySelector('[data-field=enabled]').checked,
|
||||
}));
|
||||
}
|
||||
@@ -1069,12 +1071,23 @@ function renderSurplusStatus(surplusData) {
|
||||
const rows = surplusData.devices
|
||||
.filter(d => d.enabled !== false)
|
||||
.map(d => {
|
||||
const on = states[d.z2m_name] === true;
|
||||
const st = states[d.z2m_name] || {};
|
||||
const on = st.on === true;
|
||||
const onMin = st.on_minutes ?? null;
|
||||
const minOn = d.min_on_minutes || 0;
|
||||
const dot = `<span style="width:8px;height:8px;border-radius:50%;display:inline-block;flex-shrink:0;background:${on?'var(--green)':'var(--border)'}"></span>`;
|
||||
let info = '';
|
||||
if (on && minOn > 0 && onMin !== null) {
|
||||
const remaining = Math.max(0, minOn - onMin);
|
||||
info = remaining > 0
|
||||
? `<span style="font-size:11px;color:var(--text-dim)">(${remaining}min Mindestlaufzeit)</span>`
|
||||
: `<span style="font-size:11px;color:var(--text-dim)">(${onMin}min)</span>`;
|
||||
}
|
||||
return `<div style="display:flex;align-items:center;gap:6px;font-size:12px;padding:4px 0">
|
||||
${dot}
|
||||
<span>${esc(d.name||d.z2m_name)}</span>
|
||||
<span style="color:var(--text-dim);font-size:11px">ab ${d.threshold_w}W</span>
|
||||
${info}
|
||||
<span style="margin-left:auto;font-weight:600;color:${on?'var(--green)':'var(--text-dim)'}">${on?'EIN':'AUS'}</span>
|
||||
</div>`;
|
||||
}).join('');
|
||||
|
||||
Reference in New Issue
Block a user