Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -979,121 +979,6 @@ if __name__ == "__main__":
|
|
979 |
|
980 |
|
981 |
|
982 |
-
class WebNutrientCalculator:
|
983 |
-
def __init__(self, volume_liters=1.0):
|
984 |
-
self.volume = volume_liters
|
985 |
-
self.results = {}
|
986 |
-
self.target_profile = {}
|
987 |
-
self.actual_profile = {}
|
988 |
-
self.fertilizers = {}
|
989 |
-
self.total_ec = 0.0
|
990 |
-
|
991 |
-
def web_calculate(self, profile_settings, fertilizer_constants):
|
992 |
-
"""Основная функция расчета для веб-интерфейса"""
|
993 |
-
try:
|
994 |
-
# 1. Устанавливаем целевой профиль из параметров
|
995 |
-
self.target_profile = {
|
996 |
-
'P': float(profile_settings['P']),
|
997 |
-
'K': float(profile_settings['K']),
|
998 |
-
'Mg': float(profile_settings['Mg']),
|
999 |
-
'Ca': float(profile_settings['Ca']),
|
1000 |
-
'S': float(profile_settings['S']),
|
1001 |
-
'N (NO3-)': float(profile_settings['N (NO3-)']),
|
1002 |
-
'N (NH4+)': float(profile_settings['N (NH4+)'])
|
1003 |
-
}
|
1004 |
-
|
1005 |
-
# 2. Устанавливаем параметры удобрений
|
1006 |
-
self.fertilizers = fertilizer_constants
|
1007 |
-
|
1008 |
-
# 3. Выполняем расчет по новой логике
|
1009 |
-
self._web_apply("Сульфат магния", "Mg", self.target_profile['Mg'])
|
1010 |
-
self._web_apply("Кальциевая селитра", "Ca", self.target_profile['Ca'])
|
1011 |
-
self._web_apply("Монофосфат калия", "P", self.target_profile['P'])
|
1012 |
-
self._web_apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
|
1013 |
-
|
1014 |
-
# 4. Коррекция NO3
|
1015 |
-
current_no3 = self.actual_profile.get('N (NO3-)', 0)
|
1016 |
-
no3_needed = self.target_profile['N (NO3-)'] - current_no3
|
1017 |
-
if no3_needed > 0.1:
|
1018 |
-
self._web_apply("Калий азотнокислый", "N (NO3-)", no3_needed)
|
1019 |
-
|
1020 |
-
# 5. Коррекция K и S
|
1021 |
-
self._web_apply_k_sulfate()
|
1022 |
-
|
1023 |
-
# 6. Финалный расчет EC
|
1024 |
-
self.total_ec = self._web_calculate_ec()
|
1025 |
-
|
1026 |
-
return self._web_get_results()
|
1027 |
-
|
1028 |
-
except Exception as e:
|
1029 |
-
print(f"WebCalculator error: {str(e)}")
|
1030 |
-
raise
|
1031 |
-
|
1032 |
-
def _web_apply(self, fert_name, main_element, required_ppm):
|
1033 |
-
"""Аналог оригинального _apply для веб-версии"""
|
1034 |
-
if required_ppm <= 0:
|
1035 |
-
return
|
1036 |
-
|
1037 |
-
content = self.fertilizers[fert_name][main_element]
|
1038 |
-
grams = (required_ppm * self.volume) / (content * 1000)
|
1039 |
-
|
1040 |
-
if fert_name not in self.results:
|
1041 |
-
self.results[fert_name] = {
|
1042 |
-
'grams': 0.0,
|
1043 |
-
'adds': {}
|
1044 |
-
}
|
1045 |
-
|
1046 |
-
self.results[fert_name]['grams'] += grams
|
1047 |
-
|
1048 |
-
# Расчет вносимых элементов
|
1049 |
-
for element, percent in self.fertilizers[fert_name].items():
|
1050 |
-
added_ppm = (grams * percent * 1000) / self.volume
|
1051 |
-
self.results[fert_name]['adds'][element] = added_ppm
|
1052 |
-
self.actual_profile[element] = self.actual_profile.get(element, 0) + added_ppm
|
1053 |
-
|
1054 |
-
def _web_apply_k_sulfate(self):
|
1055 |
-
"""Аналог оригинального _apply_k_sulfate"""
|
1056 |
-
fert = "Калий сернокислый"
|
1057 |
-
k_def = self.target_profile['K'] - self.actual_profile.get('K', 0)
|
1058 |
-
s_def = self.target_profile['S'] - self.actual_profile.get('S', 0)
|
1059 |
-
|
1060 |
-
if s_def > 0.1:
|
1061 |
-
self._web_apply(fert, "S", s_def)
|
1062 |
-
|
1063 |
-
def _web_calculate_ec(self):
|
1064 |
-
"""Упрощенный расчет EC для веб-версии"""
|
1065 |
-
ec_coefficients = {
|
1066 |
-
'P': 0.0012, 'K': 0.0018, 'Mg': 0.0015,
|
1067 |
-
'Ca': 0.0016, 'S': 0.0014,
|
1068 |
-
'N (NO3-)': 0.0017, 'N (NH4+)': 0.0019
|
1069 |
-
}
|
1070 |
-
|
1071 |
-
total_ec = 0.0
|
1072 |
-
for element, ppm in self.actual_profile.items():
|
1073 |
-
total_ec += ppm * ec_coefficients.get(element, 0.0015)
|
1074 |
-
|
1075 |
-
return round(total_ec, 2)
|
1076 |
-
|
1077 |
-
def _web_get_results(self):
|
1078 |
-
"""Форматирование результатов для веб"""
|
1079 |
-
return {
|
1080 |
-
'fertilizers': [
|
1081 |
-
{
|
1082 |
-
'name': name,
|
1083 |
-
'grams': round(data['grams'], 3),
|
1084 |
-
'adds': {k: round(v, 2) for k, v in data['adds'].items()}
|
1085 |
-
}
|
1086 |
-
for name, data in self.results.items()
|
1087 |
-
],
|
1088 |
-
'profile': [
|
1089 |
-
{'element': k, 'ppm': round(v, 2)}
|
1090 |
-
for k, v in self.actual_profile.items()
|
1091 |
-
],
|
1092 |
-
'ec': self.total_ec,
|
1093 |
-
'volume': self.volume
|
1094 |
-
}
|
1095 |
-
}), 500
|
1096 |
-
|
1097 |
|
1098 |
@app.route('/calculation', methods=['POST'])
|
1099 |
def handle_calculation():
|
|
|
979 |
|
980 |
|
981 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
982 |
|
983 |
@app.route('/calculation', methods=['POST'])
|
984 |
def handle_calculation():
|