Skip to content

Commit 8ad9468

Browse files
authored
Version 2026.03.0.rc3 (#565)
* Fixed error with flex setting of "dc_to_bat max power" or "bat_to_dc max power" (reported by @dabit) * Fixed error not planning heatpump in first interval when not in run-mode (reported by @f.welvering) * Missing hour-values (solar-inverters) are filled up by zero's (suggested by @dabit) * Fixed error when "-" is used in name of solar-devices (reported by @patrickvorgers and @Asclepius8) * Versie 2026.03.0.rc2
1 parent 37ceb88 commit 8ad9468

File tree

6 files changed

+57
-17
lines changed

6 files changed

+57
-17
lines changed

dao/prog/da_base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,7 @@ def get_setting_state(
526526
else: # setting_value is een string (entity?)
527527
try:
528528
state = self.get_state(setting_value).state
529-
return state
529+
return float(state)
530530
except Exception:
531531
logging.warning(f"No value found for {key}, {setting_value}")
532532
return default
@@ -620,7 +620,7 @@ def calc_solar_predictions(
620620
interval_s = self.interval_s
621621
else:
622622
interval_s = 900 if interval == "15min" else 3600
623-
solar_name = solar_option["name"].replace(" ", "_")
623+
solar_name = solar_option["name"].replace(" ", "_").replace("-","_")
624624
if ml_prediction:
625625
solar_predictor = SolarPredictor()
626626
try:

dao/prog/da_report.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1044,6 +1044,38 @@ def get_sensor_data(
10441044
elif dim == "MWh":
10451045
df_raw[col_name] = df_raw[col_name] * 1000
10461046
# Print the raw DataFrame
1047+
1048+
# fill 0 for missing records
1049+
if agg =="uur":
1050+
columns = list(df_raw.columns.values)
1051+
df_insert = pd.DataFrame(columns=columns)
1052+
"""
1053+
# vanaf hier voor de test:
1054+
df_raw.reset_index(drop=True, inplace=True)
1055+
df_raw.drop([2, 3, 4], inplace=True)
1056+
df_raw.index = df_raw["tijd"]
1057+
# tot hier voor de test
1058+
"""
1059+
prev_row = None
1060+
for row in df_raw.itertuples():
1061+
if prev_row is not None:
1062+
new_tijd = prev_row.tijd + datetime.timedelta(hours=1)
1063+
while new_tijd < row.tijd:
1064+
new_row_values = [
1065+
new_tijd.strftime("%Y-%m-%d %H:%M")[11:14]+"00",
1066+
pd.to_datetime(new_tijd),
1067+
pd.to_datetime(new_tijd),
1068+
new_tijd.timestamp(),
1069+
0,
1070+
prev_row.dim
1071+
]
1072+
df_insert.loc[len(df_insert.index)] = new_row_values
1073+
new_tijd += datetime.timedelta(hours=1)
1074+
prev_row = row
1075+
if len(df_insert) > 0:
1076+
df_insert.index= df_insert["tijd"]
1077+
df_raw = pd.concat([df_raw, df_insert])
1078+
df_raw.sort_index(inplace=True)
10471079
logging.debug(f"sensordata raw, sensor {sensor},\n {df_raw.to_string()}\n")
10481080
return df_raw
10491081

dao/prog/day_ahead.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ def __init__(self, file_name=None):
5353
def calc_optimum(
5454
self, _start_dt: dt.datetime | None = None, _start_soc: float | None = None
5555
):
56-
# _start_dt = datetime.datetime(year=2026, month=1, day=13, hour=23, minute=0)
57-
# _start_soc = 11.0
56+
# _start_dt = datetime.datetime(year=2026, month=2, day=25, hour=14, minute=30)
57+
# _start_soc = 78.0
5858
if _start_dt is not None or _start_soc is not None:
5959
self.debug = True
6060
logging.info(f"Debug = {self.debug}")
@@ -294,15 +294,15 @@ def calc_optimum(
294294
solar_prog = self.calc_solar_predictions(
295295
self.solar[s], start_interval_dt, end, self.interval
296296
)
297-
solar_name = self.solar[s]["name"].replace(" ", "_")
297+
solar_name = self.solar[s]["name"].replace(" ", "_").replace("-","_")
298298
prog_data[solar_name] = solar_prog["prediction"]
299299
for b in range(B):
300300
for s in range(len(self.battery_options[b]["solar"])):
301301
solar_option = self.battery_options[b]["solar"][s]
302302
solar_prog = self.calc_solar_predictions(
303303
solar_option, start_interval_dt, end, self.interval
304304
)
305-
solar_name = solar_option["name"].replace(" ", "_")
305+
solar_name = solar_option["name"].replace(" ", "_").replace("-","_")
306306
prog_data[solar_name] = solar_prog["prediction"]
307307

308308
# prog_data = prog_data.reset_index()
@@ -326,7 +326,7 @@ def calc_optimum(
326326
hour_fraction.append(self.interval_s / 3600)
327327
interval_fraction.append(1)
328328
for s in range(solar_num):
329-
solar_name = self.solar[s]["name"].replace(" ", "_")
329+
solar_name = self.solar[s]["name"].replace(" ", "_").replace("-","_")
330330
prod = max(0, getattr(row, solar_name)) * interval_fraction[-1]
331331
solar_prod[s].append(prod)
332332
pv_total += prod
@@ -338,7 +338,7 @@ def calc_optimum(
338338
for b in range(B):
339339
for s in range(len(self.battery_options[b]["solar"])):
340340
solar_option = self.battery_options[b]["solar"][s]
341-
solar_name = solar_option["name"].replace(" ", "_")
341+
solar_name = solar_option["name"].replace(" ", "_").replace("-","_")
342342
prod = max(0, getattr(row, solar_name)) * interval_fraction[-1]
343343
if pv_dc_num <= 9:
344344
pv_dc_varcode.append("pv_dc_" + str(pv_dc_num))
@@ -981,9 +981,10 @@ def calc_optimum(
981981

982982
"""
983983
constraints reduced charging power at low or high soc
984-
max_power[u] <= max_power_0 + helling x (soc[u] – soc_0)
985-
max_power[u] <= max_power_0 + helling x soc[u] – helling x soc_0
986-
max_power[u] - helling x soc[u] <= max_power_0 - helling x soc-0
984+
max_power[u] x 1000 <= max_power_0 + helling x (soc[u] – soc_0)
985+
max_power[u] x 1000 <= max_power_0 + helling x soc[u] – helling x soc_0
986+
max_power[u] x 1000 - helling x soc[u] <= max_power_0 - helling x soc_0
987+
987988
"""
988989
# low soc
989990
for b in range(B):
@@ -992,7 +993,7 @@ def calc_optimum(
992993
helling = int(red_power[rpl]["helling"])
993994
for u in range(U):
994995
model += (
995-
dc_from_bat[b][u] - helling * soc[b][u]
996+
dc_from_bat[b][u] * 1000 - helling * soc[b][u]
996997
<= red_power[rpl]["power"] - helling * red_power[rpl]["soc"]
997998
)
998999
# high soc
@@ -1002,7 +1003,7 @@ def calc_optimum(
10021003
helling = int(red_power[rph]["helling"])
10031004
for u in range(U):
10041005
model += (
1005-
dc_to_bat[b][u] - helling * soc[b][u]
1006+
dc_to_bat[b][u] * 1000 - helling * soc[b][u]
10061007
<= red_power[rph]["power"] - helling * red_power[rph]["soc"]
10071008
)
10081009

@@ -2496,7 +2497,7 @@ def calc_optimum(
24962497
for j in range(blocks_num):
24972498
for u in range(U):
24982499
model += (u - (hp_start_index[j] + block_len[j] - 1)) <= (
2499-
u * (1 - hp_bl_on[j][u])
2500+
U * (1 - hp_bl_on[j][u])
25002501
)
25012502

25022503
# constraint 3

dao/prog/solar_predictor.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -934,7 +934,7 @@ def train_solar_option(
934934
self, weather_data: pd.DataFrame, solar_dict: Dict, start: dt.datetime
935935
):
936936
name = self.config.get(["name"], solar_dict, "default")
937-
self.solar_name = name.replace(" ", "_")
937+
self.solar_name = name.replace(" ", "_").replace("-","_")
938938
self.tilt = self.get_property_from_dict("tilt", solar_dict, 45)
939939
self.azimut = self.get_property_from_dict("orientation", solar_dict, 0) + 180
940940
self.solar_capacity = self.get_property_from_dict("capacity", solar_dict, 5)
@@ -1034,7 +1034,7 @@ def check_prediction(prediction, irradiance):
10341034
return result
10351035

10361036
name = self.config.get(["name"], solar_dict, "default")
1037-
self.solar_name = name.replace(" ", "_")
1037+
self.solar_name = name.replace(" ", "_").replace("-","_")
10381038
self.tilt = self.get_property_from_dict("tilt", solar_dict, 45)
10391039
self.azimut = self.get_property_from_dict("orientation", solar_dict, 0) + 180
10401040
self.solar_capacity = self.get_property_from_dict("capacity", solar_dict, 5)

release-testing/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Changelog 刀 DAO
22
# Day Ahead Optimizer
3+
# 2026.03.0.rc2
4+
5+
- Fixed error with flex setting of "dc_to_bat max power" or "bat_to_dc max power" (reported by @DaBit)
6+
- Fixed error not planning heatpump in first interval when not in run-mode (reported by @f.welvering)
7+
- Missing hour-values (solar-inverters) are filled up by zero's (suggested by @DaBit)
8+
- Fixed error when "-" is used in name of solar-devices (reported by @patrickvorgers and @Asclepius8)
9+
310
# 2026.03.0.rc1
411
- Made optional battery settings "bat_to_dc max power" and "dc_to_bat max power" flex-setting (feature request by @DaBit)
512
- Reduce power during charging at high soc and during discharging at low soc (feature requests form @bartzzz and @arjenhiemstra)

release-testing/config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
name: 刀 Day Ahead Optimizer (TESTING)
3-
version: 2026.03.0.rc1
3+
version: 2026.03.0.rc2
44
stage: experimental
55
slug: day_ahead_opt-testing
66
description: Beta version of DAO. Use only for testing!

0 commit comments

Comments
 (0)