Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -743,29 +743,54 @@ class NutrientCalculator:
|
|
743 |
}
|
744 |
return labels.get(element, element)
|
745 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
746 |
def calculate(self):
|
747 |
-
|
748 |
-
|
749 |
-
|
750 |
-
|
751 |
-
|
752 |
-
|
753 |
-
|
754 |
-
|
755 |
-
|
756 |
-
|
757 |
-
|
758 |
-
|
759 |
-
|
760 |
-
|
761 |
-
|
762 |
-
|
763 |
-
|
|
|
764 |
|
765 |
-
|
766 |
-
|
767 |
-
|
768 |
-
|
769 |
|
770 |
def _apply(self, fert_name, main_element, required_ppm):
|
771 |
if required_ppm <= 0:
|
|
|
743 |
}
|
744 |
return labels.get(element, element)
|
745 |
|
746 |
+
|
747 |
+
def _balance_nitrogen(self):
|
748 |
+
# Целевые значения NH₄⁺ и NO₃⁻
|
749 |
+
total_parts = self.NO3_RATIO + self.NH4_RATIO
|
750 |
+
target_nh4 = (self.TOTAL_NITROGEN * self.NH4_RATIO) / total_parts
|
751 |
+
target_no3 = self.TOTAL_NITROGEN - target_nh4
|
752 |
+
|
753 |
+
# Вклад NH₄NO₃
|
754 |
+
nh4no3_nh4 = target_nh4
|
755 |
+
nh4no3_no3 = nh4no3_nh4 # NH₄NO₃ вносит оба вида азота
|
756 |
+
self._apply("Аммоний азотнокислый", "N (NH4+)", nh4no3_nh4)
|
757 |
+
|
758 |
+
# Оставшийся NO₃⁻ (цель - вклад NH₄NO₃)
|
759 |
+
remaining_no3 = target_no3 - nh4no3_no3
|
760 |
+
if remaining_no3 > 0.1:
|
761 |
+
# Распределить между Ca(NO₃)₂ и KNO₃ (например, 70/30)
|
762 |
+
ca_no3_part = remaining_no3 * 0.7
|
763 |
+
k_no3_part = remaining_no3 * 0.3
|
764 |
+
self._apply("Кальциевая селитра", "N (NO3-)", ca_no3_part)
|
765 |
+
self._apply("Калий азотнокислый", "N (NO3-)", k_no3_part)
|
766 |
+
|
767 |
+
|
768 |
+
|
769 |
+
|
770 |
def calculate(self):
|
771 |
+
try:
|
772 |
+
# 1. Всё, что не связано с азотом (например, Mg)
|
773 |
+
self._apply("Сульфат магния", "Mg", self.target_profile['Mg'])
|
774 |
+
|
775 |
+
# 2. Балансировка азота (NH₄⁺/NO₃⁻)
|
776 |
+
self._balance_nitrogen() # <-- Ваш новый блок
|
777 |
+
|
778 |
+
# 3. Кальций и фосфор (после азота!)
|
779 |
+
self._apply("Кальциевая селитра", "Ca", self.target_profile['Ca'])
|
780 |
+
self._apply("Монофосфат калия", "P", self.target_profile['P'])
|
781 |
+
|
782 |
+
# 4. Калий и сера (коррекция)
|
783 |
+
self._apply_k_sulfate()
|
784 |
+
|
785 |
+
# 5. Последние проверки (например, дефицит калия)
|
786 |
+
k_deficit = self.target_profile['K'] - self.actual_profile['K']
|
787 |
+
if k_deficit > 0.1:
|
788 |
+
self._apply("Калий азотнокислый", "K", k_deficit)
|
789 |
|
790 |
+
return self.results
|
791 |
+
except Exception as e:
|
792 |
+
print(f"Ошибка: {str(e)}")
|
793 |
+
raise
|
794 |
|
795 |
def _apply(self, fert_name, main_element, required_ppm):
|
796 |
if required_ppm <= 0:
|