Spaces:
Sleeping
Sleeping
Update app/internal_loads.py
Browse files- app/internal_loads.py +92 -12
app/internal_loads.py
CHANGED
@@ -962,7 +962,8 @@ def display_schedules_tab():
|
|
962 |
for hour in range(24):
|
963 |
st.session_state[f"weekday_slider_{hour}"] = tpl["weekday"][hour]
|
964 |
st.session_state[f"weekend_slider_{hour}"] = tpl["weekend"][hour]
|
965 |
-
st.
|
|
|
966 |
|
967 |
# ---------------------- UI FORM for name/description only ----------------------
|
968 |
with st.form("schedule_form"):
|
@@ -982,15 +983,19 @@ def display_schedules_tab():
|
|
982 |
with col_we:
|
983 |
st.markdown("<div style='text-align:center; font-weight:bold; font-size:18px;'>Weekend</div>", unsafe_allow_html=True)
|
984 |
|
|
|
985 |
hide_elements = """
|
986 |
-
|
987 |
-
|
988 |
-
|
989 |
-
|
990 |
-
|
991 |
-
|
|
|
|
|
|
|
|
|
992 |
"""
|
993 |
-
|
994 |
st.markdown(hide_elements, unsafe_allow_html=True)
|
995 |
|
996 |
weekday_values = []
|
@@ -1011,7 +1016,7 @@ def display_schedules_tab():
|
|
1011 |
step=0.1,
|
1012 |
value=st.session_state.get(f"weekday_slider_{hour}", 0.0),
|
1013 |
label_visibility="collapsed",
|
1014 |
-
format=
|
1015 |
)
|
1016 |
weekday_values.append(val)
|
1017 |
|
@@ -1024,7 +1029,7 @@ def display_schedules_tab():
|
|
1024 |
step=0.1,
|
1025 |
value=st.session_state.get(f"weekend_slider_{hour}", 0.0),
|
1026 |
label_visibility="collapsed",
|
1027 |
-
format=
|
1028 |
)
|
1029 |
weekend_values.append(val)
|
1030 |
|
@@ -1040,13 +1045,18 @@ def display_schedules_tab():
|
|
1040 |
"weekday": weekday_values,
|
1041 |
"weekend": weekend_values
|
1042 |
}
|
1043 |
-
|
|
|
|
|
|
|
1044 |
st.session_state.schedule_editor = DEFAULT_STATE.copy()
|
1045 |
for hour in range(24):
|
1046 |
st.session_state.pop(f"weekday_slider_{hour}", None)
|
1047 |
st.session_state.pop(f"weekend_slider_{hour}", None)
|
1048 |
st.success(f"Schedule '{name}' saved successfully.")
|
1049 |
-
|
|
|
|
|
1050 |
# ---------------------- Show Saved ----------------------
|
1051 |
st.markdown("### Saved Schedules")
|
1052 |
if schedules:
|
@@ -1054,6 +1064,76 @@ def display_schedules_tab():
|
|
1054 |
else:
|
1055 |
st.info("No schedules saved yet.")
|
1056 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1057 |
def is_schedule_in_use(schedule_name: str) -> bool:
|
1058 |
"""
|
1059 |
Check if a schedule is in use by any people, lighting, equipment, or ventilation/infiltration systems.
|
|
|
962 |
for hour in range(24):
|
963 |
st.session_state[f"weekday_slider_{hour}"] = tpl["weekday"][hour]
|
964 |
st.session_state[f"weekend_slider_{hour}"] = tpl["weekend"][hour]
|
965 |
+
st.session_state.module_rerun_flags["internal_loads"] = True
|
966 |
+
st.rerun()
|
967 |
|
968 |
# ---------------------- UI FORM for name/description only ----------------------
|
969 |
with st.form("schedule_form"):
|
|
|
983 |
with col_we:
|
984 |
st.markdown("<div style='text-align:center; font-weight:bold; font-size:18px;'>Weekend</div>", unsafe_allow_html=True)
|
985 |
|
986 |
+
# Hide slider values, min, and max labels
|
987 |
hide_elements = """
|
988 |
+
<style>
|
989 |
+
div[data-testid="stSliderTickBarMin"],
|
990 |
+
div[data-testid="stSliderTickBarMax"],
|
991 |
+
div.stSlider > div > div > div > div[data-testid="stTickBar"] > div > div {
|
992 |
+
display: none;
|
993 |
+
}
|
994 |
+
div.stSlider > div > div > div > div > div > div {
|
995 |
+
visibility: hidden;
|
996 |
+
}
|
997 |
+
</style>
|
998 |
"""
|
|
|
999 |
st.markdown(hide_elements, unsafe_allow_html=True)
|
1000 |
|
1001 |
weekday_values = []
|
|
|
1016 |
step=0.1,
|
1017 |
value=st.session_state.get(f"weekday_slider_{hour}", 0.0),
|
1018 |
label_visibility="collapsed",
|
1019 |
+
format="%.1f"
|
1020 |
)
|
1021 |
weekday_values.append(val)
|
1022 |
|
|
|
1029 |
step=0.1,
|
1030 |
value=st.session_state.get(f"weekend_slider_{hour}", 0.0),
|
1031 |
label_visibility="collapsed",
|
1032 |
+
format="%.1f"
|
1033 |
)
|
1034 |
weekend_values.append(val)
|
1035 |
|
|
|
1045 |
"weekday": weekday_values,
|
1046 |
"weekend": weekend_values
|
1047 |
}
|
1048 |
+
if editor_state.get("is_edit") and editor_state.get("original_name") != name:
|
1049 |
+
# Remove old schedule name if renamed
|
1050 |
+
if editor_state.get("original_name") in schedules:
|
1051 |
+
del schedules[editor_state["original_name"]]
|
1052 |
st.session_state.schedule_editor = DEFAULT_STATE.copy()
|
1053 |
for hour in range(24):
|
1054 |
st.session_state.pop(f"weekday_slider_{hour}", None)
|
1055 |
st.session_state.pop(f"weekend_slider_{hour}", None)
|
1056 |
st.success(f"Schedule '{name}' saved successfully.")
|
1057 |
+
st.session_state.module_rerun_flags["internal_loads"] = True
|
1058 |
+
st.rerun()
|
1059 |
+
|
1060 |
# ---------------------- Show Saved ----------------------
|
1061 |
st.markdown("### Saved Schedules")
|
1062 |
if schedules:
|
|
|
1064 |
else:
|
1065 |
st.info("No schedules saved yet.")
|
1066 |
|
1067 |
+
def display_schedules_table(schedules: Dict[str, Any]):
|
1068 |
+
"""Display schedules in a table format with edit/delete buttons."""
|
1069 |
+
if not schedules:
|
1070 |
+
return
|
1071 |
+
|
1072 |
+
# Create table data
|
1073 |
+
table_data = []
|
1074 |
+
for name, schedule in schedules.items():
|
1075 |
+
weekday_peak = max(schedule.get("weekday", [0]))
|
1076 |
+
weekend_peak = max(schedule.get("weekend", [0]))
|
1077 |
+
|
1078 |
+
table_data.append({
|
1079 |
+
"Name": name,
|
1080 |
+
"Description": schedule.get("description", "No description"),
|
1081 |
+
"Weekday Peak": f"{weekday_peak:.2f}",
|
1082 |
+
"Weekend Peak": f"{weekend_peak:.2f}",
|
1083 |
+
"Actions": name
|
1084 |
+
})
|
1085 |
+
|
1086 |
+
if table_data:
|
1087 |
+
df = pd.DataFrame(table_data)
|
1088 |
+
|
1089 |
+
# Display table
|
1090 |
+
st.dataframe(df.drop('Actions', axis=1), use_container_width=True)
|
1091 |
+
|
1092 |
+
# Display action buttons
|
1093 |
+
st.write("**Actions:**")
|
1094 |
+
for i, row in enumerate(table_data):
|
1095 |
+
schedule_name = row["Actions"]
|
1096 |
+
|
1097 |
+
col1, col2, col3 = st.columns([2, 1, 1])
|
1098 |
+
|
1099 |
+
with col1:
|
1100 |
+
st.write(f"{i+1}. {schedule_name}")
|
1101 |
+
|
1102 |
+
with col2:
|
1103 |
+
if st.button("Edit", key=f"edit_schedule_{schedule_name}_{i}"):
|
1104 |
+
# Set up editor for editing
|
1105 |
+
schedule_data = schedules[schedule_name]
|
1106 |
+
st.session_state.schedule_editor = {
|
1107 |
+
"is_edit": True,
|
1108 |
+
"original_name": schedule_name,
|
1109 |
+
"name": schedule_name,
|
1110 |
+
"description": schedule_data.get("description", ""),
|
1111 |
+
"template": "None",
|
1112 |
+
"weekday": schedule_data.get("weekday", [0.0] * 24),
|
1113 |
+
"weekend": schedule_data.get("weekend", [0.0] * 24)
|
1114 |
+
}
|
1115 |
+
# Initialize sliders with current values
|
1116 |
+
for hour in range(24):
|
1117 |
+
st.session_state[f"weekday_slider_{hour}"] = schedule_data.get("weekday", [0.0] * 24)[hour]
|
1118 |
+
st.session_state[f"weekend_slider_{hour}"] = schedule_data.get("weekend", [0.0] * 24)[hour]
|
1119 |
+
st.session_state.module_rerun_flags["internal_loads"] = True
|
1120 |
+
st.rerun()
|
1121 |
+
|
1122 |
+
with col3:
|
1123 |
+
# Check if schedule is in use or a default template before allowing deletion
|
1124 |
+
if schedule_name not in DEFAULT_SCHEDULE_TEMPLATES:
|
1125 |
+
if is_schedule_in_use(schedule_name):
|
1126 |
+
st.write("(In Use)")
|
1127 |
+
else:
|
1128 |
+
if st.button("Delete", key=f"delete_schedule_{schedule_name}_{i}"):
|
1129 |
+
# Delete schedule
|
1130 |
+
del schedules[schedule_name]
|
1131 |
+
st.success(f"Schedule '{schedule_name}' deleted!")
|
1132 |
+
st.session_state.module_rerun_flags["internal_loads"] = True
|
1133 |
+
st.rerun()
|
1134 |
+
else:
|
1135 |
+
st.write("(Default)")
|
1136 |
+
|
1137 |
def is_schedule_in_use(schedule_name: str) -> bool:
|
1138 |
"""
|
1139 |
Check if a schedule is in use by any people, lighting, equipment, or ventilation/infiltration systems.
|