Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -704,7 +704,7 @@ def nutri_call():
|
|
| 704 |
|
| 705 |
from tabulate import tabulate
|
| 706 |
|
| 707 |
-
# Входные данные
|
| 708 |
INPUT_DATA = {
|
| 709 |
"fertilizerConstants": {
|
| 710 |
"Кальциевая селитра": {"N (NO3-)": 0.11863, "Ca": 0.16972},
|
|
@@ -713,11 +713,11 @@ INPUT_DATA = {
|
|
| 713 |
"Сульфат магния": {"Mg": 0.10220, "S": 0.13483},
|
| 714 |
"Монофосфат калия": {"P": 0.22761, "K": 0.28731},
|
| 715 |
"Калий сернокислый": {"K": 0.44874, "S": 0.18401},
|
| 716 |
-
"Кальций хлорид": {"Ca": 0.272} # Хлор
|
| 717 |
},
|
| 718 |
"profileSettings": {
|
| 719 |
-
"P": 60, "K": 194, "Mg": 48.5, "Ca": 121.25, "S": 79.445,
|
| 720 |
-
"NO3_RAT":
|
| 721 |
}
|
| 722 |
}
|
| 723 |
|
|
@@ -734,12 +734,13 @@ class NutrientCalculator:
|
|
| 734 |
'Mg': self.profile["Mg"],
|
| 735 |
'Ca': self.profile["Ca"],
|
| 736 |
'S': self.profile["S"],
|
|
|
|
| 737 |
'N (NO3-)': self.profile["TOTAL_NITROG"] * (self.profile["NO3_RAT"] / total_parts),
|
| 738 |
'N (NH4+)': self.profile["TOTAL_NITROG"] * (1 / total_parts)
|
| 739 |
}
|
| 740 |
|
| 741 |
self.actual = {k: 0.0 for k in self.target}
|
| 742 |
-
self.results = {}
|
| 743 |
|
| 744 |
def calculate(self):
|
| 745 |
# 1. Вносим аммонийный азот
|
|
@@ -768,9 +769,6 @@ class NutrientCalculator:
|
|
| 768 |
content = self.fertilizers[name][element]
|
| 769 |
grams = (target_ppm * self.volume) / (content * 1000)
|
| 770 |
|
| 771 |
-
if name not in self.results:
|
| 772 |
-
self.results[name] = {'граммы': 0.0}
|
| 773 |
-
|
| 774 |
self.results[name]['граммы'] += grams
|
| 775 |
|
| 776 |
for el, val in self.fertilizers[name].items():
|
|
@@ -815,44 +813,6 @@ class NutrientCalculator:
|
|
| 815 |
'total_ppm': round(sum(self.actual.values()), 3)
|
| 816 |
}
|
| 817 |
|
| 818 |
-
def generate_report(self, results):
|
| 819 |
-
fert_table = []
|
| 820 |
-
for name, data in results['fertilizers'].items():
|
| 821 |
-
fert_table.append([name, f"{data} г"])
|
| 822 |
-
|
| 823 |
-
element_table = []
|
| 824 |
-
for el in sorted(self.target.keys()):
|
| 825 |
-
element_table.append([
|
| 826 |
-
el,
|
| 827 |
-
f"{self.target[el]} ppm",
|
| 828 |
-
f"{results['actual_profile'][el]} ppm",
|
| 829 |
-
f"{results['actual_profile'][el] - self.target[el]:+.2f} ppm"
|
| 830 |
-
])
|
| 831 |
-
|
| 832 |
-
report = "РЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ:\n"
|
| 833 |
-
report += tabulate(fert_table, headers=["Удобрение", "Количество"], tablefmt="grid")
|
| 834 |
-
|
| 835 |
-
report += "\n\nБАЛАНС ЭЛЕМЕНТОВ:\n"
|
| 836 |
-
report += tabulate(element_table,
|
| 837 |
-
headers=["Элемент", "Цель", "Факт", "Отклонение"],
|
| 838 |
-
tablefmt="grid")
|
| 839 |
-
|
| 840 |
-
report += f"\n\nОбщая концентрация: {results['total_ppm']} ppm"
|
| 841 |
-
|
| 842 |
-
if results['deficits']:
|
| 843 |
-
report += "\n\nВНИМАНИЕ: Обнаружены небольшие отклонения:"
|
| 844 |
-
for el, diff in results['deficits'].items():
|
| 845 |
-
report += f"\n- {el}: не хватает {abs(diff)} ppm"
|
| 846 |
-
|
| 847 |
-
return report
|
| 848 |
-
|
| 849 |
-
# Запуск расчета
|
| 850 |
-
calculator = NutrientCalculator(INPUT_DATA)
|
| 851 |
-
results = calculator.calculate()
|
| 852 |
-
print(calculator.generate_report(results))
|
| 853 |
-
|
| 854 |
-
|
| 855 |
-
|
| 856 |
@app.route('/calculation', methods=['POST'])
|
| 857 |
def handle_calculation():
|
| 858 |
try:
|
|
@@ -920,7 +880,6 @@ def handle_calculation():
|
|
| 920 |
|
| 921 |
|
| 922 |
|
| 923 |
-
|
| 924 |
|
| 925 |
|
| 926 |
if __name__ == '__main__':
|
|
|
|
| 704 |
|
| 705 |
from tabulate import tabulate
|
| 706 |
|
| 707 |
+
# Входные данные (пример)
|
| 708 |
INPUT_DATA = {
|
| 709 |
"fertilizerConstants": {
|
| 710 |
"Кальциевая селитра": {"N (NO3-)": 0.11863, "Ca": 0.16972},
|
|
|
|
| 713 |
"Сульфат магния": {"Mg": 0.10220, "S": 0.13483},
|
| 714 |
"Монофосфат калия": {"P": 0.22761, "K": 0.28731},
|
| 715 |
"Калий сернокислый": {"K": 0.44874, "S": 0.18401},
|
| 716 |
+
"Кальций хлорид": {"Ca": 0.272, "Cl": 0.483} # Хлор теперь учитывается
|
| 717 |
},
|
| 718 |
"profileSettings": {
|
| 719 |
+
"P": 60, "K": 194, "Mg": 48.5, "Ca": 121.25, "S": 79.445, "Cl": 0, # Добавлен Cl
|
| 720 |
+
"NO3_RAT": 1.5, "TOTAL_NITROG": 138.57, "liters": 100
|
| 721 |
}
|
| 722 |
}
|
| 723 |
|
|
|
|
| 734 |
'Mg': self.profile["Mg"],
|
| 735 |
'Ca': self.profile["Ca"],
|
| 736 |
'S': self.profile["S"],
|
| 737 |
+
'Cl': self.profile.get("Cl", 0), # Добавлен Cl
|
| 738 |
'N (NO3-)': self.profile["TOTAL_NITROG"] * (self.profile["NO3_RAT"] / total_parts),
|
| 739 |
'N (NH4+)': self.profile["TOTAL_NITROG"] * (1 / total_parts)
|
| 740 |
}
|
| 741 |
|
| 742 |
self.actual = {k: 0.0 for k in self.target}
|
| 743 |
+
self.results = {fert: {'граммы': 0.0} for fert in self.fertilizers} # Инициализация всех удобрений
|
| 744 |
|
| 745 |
def calculate(self):
|
| 746 |
# 1. Вносим аммонийный азот
|
|
|
|
| 769 |
content = self.fertilizers[name][element]
|
| 770 |
grams = (target_ppm * self.volume) / (content * 1000)
|
| 771 |
|
|
|
|
|
|
|
|
|
|
| 772 |
self.results[name]['граммы'] += grams
|
| 773 |
|
| 774 |
for el, val in self.fertilizers[name].items():
|
|
|
|
| 813 |
'total_ppm': round(sum(self.actual.values()), 3)
|
| 814 |
}
|
| 815 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 816 |
@app.route('/calculation', methods=['POST'])
|
| 817 |
def handle_calculation():
|
| 818 |
try:
|
|
|
|
| 880 |
|
| 881 |
|
| 882 |
|
|
|
|
| 883 |
|
| 884 |
|
| 885 |
if __name__ == '__main__':
|