Skip to content
This repository was archived by the owner on Aug 14, 2026. It is now read-only.

Commit d100a12

Browse files
committed
extra fixes
1 parent 4b5975f commit d100a12

4 files changed

Lines changed: 23 additions & 13 deletions

File tree

‎app.py‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -349,11 +349,13 @@ def scheduler_loop():
349349
# Get free energy TOU params
350350
free_energy_start, free_energy_end, free_energy_soc = get_free_energy_tou_params()
351351

352-
logger.info(f"Check: in_window={in_window}, soc={soc}, cutoff={cutoff_soc}, reserve={min_soc_reserve}, weather_skip={weather_skip}, free_energy={in_free_energy_window}")
352+
# Check if force discharge is enabled
353+
force_discharge_enabled = schedule.get("enabled", True)
354+
logger.info(f"Check: enabled={force_discharge_enabled}, in_window={in_window}, soc={soc}, cutoff={cutoff_soc}, reserve={min_soc_reserve}, weather_skip={weather_skip}, free_energy={in_free_energy_window}")
353355

354356
# Determine if we should be in force discharge mode
355-
# Force discharge when: in window AND SoC above cutoff AND NOT weather skip
356-
should_force_discharge = in_window and (soc is None or soc > cutoff_soc) and not weather_skip
357+
# Force discharge when: enabled AND in window AND SoC above cutoff AND NOT weather skip
358+
should_force_discharge = force_discharge_enabled and in_window and (soc is None or soc > cutoff_soc) and not weather_skip
357359

358360
if weather_skip and in_window:
359361
logger.info(f"Skipping discharge due to weather: {weather_reason}")

‎config.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"device_sn": "YOUR_DEVICE_SN"
99
},
1010
"schedule": {
11+
"enabled": true,
1112
"force_discharge_start": "17:30",
1213
"force_discharge_end": "19:30",
1314
"min_soc_reserve": 20,

‎templates/index.html‎

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -774,7 +774,7 @@ <h2>Inverter TOU Settings</h2>
774774
<tr><td colspan="4" style="text-align: center; color: #888;">Loading...</td></tr>
775775
</tbody>
776776
</table>
777-
<div class="tou-legend"><span style="color: #4ecca3;">*</span> Force discharge &nbsp; <span style="color: #3498db;">⚡</span> Free energy</div>
777+
<div class="tou-legend">💰 Force discharge &nbsp; ⚡ Free energy</div>
778778
</div>
779779

780780
<!-- Weather Forecast -->
@@ -835,7 +835,12 @@ <h2>Schedule Settings</h2>
835835
<div class="schedule-grid">
836836
<!-- Force Discharge Window -->
837837
<div class="schedule-section">
838-
<div class="schedule-section-title"><span style="color: #4ecca3;">*</span> Force Discharge</div>
838+
<div class="schedule-section-title">
839+
<label style="display: flex; align-items: center; gap: 6px; cursor: pointer;">
840+
<input type="checkbox" id="forceDischargeEnabled" checked>
841+
💰 Force Discharge
842+
</label>
843+
</div>
839844
<form id="scheduleForm" class="schedule-form">
840845
<div class="schedule-row">
841846
<div class="setting-item">
@@ -849,12 +854,12 @@ <h2>Schedule Settings</h2>
849854
</div>
850855
<div class="schedule-row">
851856
<div class="setting-item">
852-
<label>Normal SoC</label>
853-
<input type="number" id="minSocReserve" min="5" max="100" value="20">
857+
<label>Min Reserve %</label>
858+
<input type="number" id="minSocReserve" min="5" max="100" value="20" title="Battery reserve - system stops using battery at this level">
854859
</div>
855860
<div class="setting-item">
856-
<label>Discharge SoC</label>
857-
<input type="number" id="cutoffSoc" min="5" max="100" value="50">
861+
<label>Stop Discharge %</label>
862+
<input type="number" id="cutoffSoc" min="5" max="100" value="50" title="Force discharge stops when battery reaches this level">
858863
</div>
859864
</div>
860865
<button type="submit" class="btn btn-primary btn-sm">Save</button>
@@ -865,7 +870,7 @@ <h2>Schedule Settings</h2>
865870
<div class="schedule-section-title">
866871
<label style="display: flex; align-items: center; gap: 6px; cursor: pointer;">
867872
<input type="checkbox" id="freeEnergyEnabled">
868-
<span style="color: #3498db;">⚡</span> Free Energy Charge
873+
⚡ Free Energy Charge
869874
</label>
870875
</div>
871876
<form id="freeEnergySettingsForm" class="schedule-form">
@@ -1217,7 +1222,7 @@ <h2>Schedule Settings</h2>
12171222
let timeDisplay = `${startTime} - ${endTime}`;
12181223
let rowClass = '';
12191224
if (isDischargeWindow) {
1220-
timeDisplay = `* ${startTime} - ${endTime}`;
1225+
timeDisplay = `💰 ${startTime} - ${endTime}`;
12211226
rowClass = 'tou-target';
12221227
} else if (isFreeEnergyWindow) {
12231228
timeDisplay = `⚡ ${startTime} - ${endTime}`;
@@ -1336,6 +1341,7 @@ <h2>Schedule Settings</h2>
13361341

13371342
// Update form only if user is not actively editing
13381343
if (!isEditingSettings) {
1344+
document.getElementById('forceDischargeEnabled').checked = schedule.enabled !== false;
13391345
document.getElementById('startTime').value = schedule.force_discharge_start || '17:30';
13401346
document.getElementById('endTime').value = schedule.force_discharge_end || '19:30';
13411347
document.getElementById('minSocReserve').value = schedule.min_soc_reserve || 20;
@@ -1377,6 +1383,7 @@ <h2>Schedule Settings</h2>
13771383
document.getElementById('scheduleForm').addEventListener('submit', async (e) => {
13781384
e.preventDefault();
13791385
const schedule = {
1386+
enabled: document.getElementById('forceDischargeEnabled').checked,
13801387
force_discharge_start: document.getElementById('startTime').value,
13811388
force_discharge_end: document.getElementById('endTime').value,
13821389
min_soc_reserve: parseInt(document.getElementById('minSocReserve').value),

‎weather_client.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,8 +211,8 @@ def estimate_solar_output_hourly(self, panel_capacity_kw: float, date_str: str)
211211
total_kwh += period_kwh
212212
logger.debug(f"Hour {hour}: clouds={clouds}, cond={condition}, weather_factor={weather_factor:.2f}, kwh={period_kwh:.1f}")
213213

214-
# If we don't have enough data points, return None to fall back to simple calc
215-
if len(hours_with_data) < 3:
214+
# Need at least 1 data point to make any estimate
215+
if len(hours_with_data) < 1:
216216
return None
217217

218218
return round(total_kwh, 1) if total_kwh > 0 else None

0 commit comments

Comments
 (0)