Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -712,11 +712,14 @@ EC_COEFFICIENTS = {
|
|
712 |
'N (NO3-)': 0.0017, 'N (NH4+)': 0.0019
|
713 |
}
|
714 |
|
715 |
-
# Целевые значения
|
716 |
BASE_PROFILE = {
|
717 |
-
|
718 |
-
|
719 |
-
|
|
|
|
|
|
|
|
|
720 |
}
|
721 |
|
722 |
NUTRIENT_CONTENT_IN_FERTILIZERS = {
|
@@ -726,9 +729,20 @@ NUTRIENT_CONTENT_IN_FERTILIZERS = {
|
|
726 |
"Аммоний азотнокислый": {"N (NO3-)": 0.17499, "N (NH4+)": 0.17499},
|
727 |
"Сульфат магния": {"Mg": 0.09861, "S": 0.13010},
|
728 |
"Монофосфат калия": {"P": 0.218, "K": 0.275},
|
729 |
-
"Сульфат кальция": {"Ca": 0.23, "S": 0.186}
|
730 |
}
|
731 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
732 |
class NutrientCalculator:
|
733 |
def __init__(self, volume_liters=1.0):
|
734 |
self.volume = volume_liters
|
@@ -749,6 +763,17 @@ class NutrientCalculator:
|
|
749 |
"NH4+": self.target_profile['N (NH4+)']
|
750 |
}
|
751 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
752 |
def _label(self, element):
|
753 |
"""Форматирование названий элементов для вывода"""
|
754 |
labels = {
|
@@ -759,43 +784,48 @@ class NutrientCalculator:
|
|
759 |
|
760 |
def calculate(self):
|
761 |
try:
|
762 |
-
#
|
763 |
-
|
764 |
-
if ca_needed > 0.1:
|
765 |
-
self._apply("Сульфат кальция", "Ca", ca_needed)
|
766 |
-
|
767 |
-
# 2. Вносим кальциевую селитру для Ca и NO3
|
768 |
-
ca_needed_after_sulfate = self.target_profile['Ca'] - self.actual_profile['Ca']
|
769 |
-
if ca_needed_after_sulfate > 0.1:
|
770 |
-
self._apply("Кальциевая селитра", "Ca", ca_needed_after_sulfate)
|
771 |
-
|
772 |
-
# 3. Вносим остальные элементы
|
773 |
-
self._apply("Сульфат магния", "Mg", self.target_profile['Mg'])
|
774 |
-
self._apply("Монофосфат калия", "P", self.target_profile['P'])
|
775 |
-
self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
|
776 |
-
|
777 |
-
# 4. Компенсируем NO3
|
778 |
-
current_no3 = self.actual_profile['N (NO3-)']
|
779 |
-
no3_needed = self.target_profile['N (NO3-)'] - current_no3
|
780 |
-
|
781 |
-
if no3_needed > 0.1:
|
782 |
-
self._apply("Калий азотнокислый", "N (NO3-)", no3_needed)
|
783 |
|
784 |
-
#
|
785 |
-
|
786 |
-
if k_deficit > 0.1:
|
787 |
-
self._apply("Калий сернокислый", "K", k_deficit)
|
788 |
|
789 |
-
#
|
790 |
-
|
791 |
-
if s_deficit > 0.1:
|
792 |
-
self._apply("Калий сернокислый", "S", s_deficit)
|
793 |
|
794 |
return self.results
|
795 |
except Exception as e:
|
796 |
print(f"Ошибка при расчёте: {str(e)}")
|
797 |
raise
|
798 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
799 |
def _apply(self, fert_name, main_element, required_ppm):
|
800 |
if required_ppm <= 0:
|
801 |
return
|
@@ -833,6 +863,15 @@ class NutrientCalculator:
|
|
833 |
def calculate_ec(self):
|
834 |
return round(self.total_ec, 2)
|
835 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
836 |
def print_initial_nitrogen_report(self):
|
837 |
try:
|
838 |
print("Исходный расчёт азота:")
|
|
|
712 |
'N (NO3-)': 0.0017, 'N (NH4+)': 0.0019
|
713 |
}
|
714 |
|
|
|
715 |
BASE_PROFILE = {
|
716 |
+
"P": 60,
|
717 |
+
"K": 300,
|
718 |
+
"Mg": 70,
|
719 |
+
"Ca": 150,
|
720 |
+
"S": 120,
|
721 |
+
"N (NO3-)": 175,
|
722 |
+
"N (NH4+)": 15
|
723 |
}
|
724 |
|
725 |
NUTRIENT_CONTENT_IN_FERTILIZERS = {
|
|
|
729 |
"Аммоний азотнокислый": {"N (NO3-)": 0.17499, "N (NH4+)": 0.17499},
|
730 |
"Сульфат магния": {"Mg": 0.09861, "S": 0.13010},
|
731 |
"Монофосфат калия": {"P": 0.218, "K": 0.275},
|
732 |
+
"Сульфат кальция": {"Ca": 0.23, "S": 0.186}
|
733 |
}
|
734 |
|
735 |
+
EC_COEFFICIENTS = {
|
736 |
+
'P': 0.0012, 'K': 0.0018, 'Mg': 0.0015,
|
737 |
+
'Ca': 0.0016, 'S': 0.0014,
|
738 |
+
'N (NO3-)': 0.0017, 'N (NH4+)': 0.0019
|
739 |
+
}
|
740 |
+
|
741 |
+
# Глобальные константы для азота
|
742 |
+
TOTAL_NITROGEN = 190 # Общее количество азота
|
743 |
+
NO3_RATIO = 7 # Соотношение NO3:NH4
|
744 |
+
NH4_RATIO = 1
|
745 |
+
|
746 |
class NutrientCalculator:
|
747 |
def __init__(self, volume_liters=1.0):
|
748 |
self.volume = volume_liters
|
|
|
763 |
"NH4+": self.target_profile['N (NH4+)']
|
764 |
}
|
765 |
|
766 |
+
# Веса компенсации
|
767 |
+
self.compensation_weights = {
|
768 |
+
"Ca": {"weight": 0.3, "fert": "Сульфат кальция", "main_element": "Ca"},
|
769 |
+
"K": {"weight": 0.2, "fert": "Калий азотнокислый", "main_element": "K"},
|
770 |
+
"Mg": {"weight": 0.2, "fert": "Сульфат магния", "main_element": "Mg"},
|
771 |
+
"P": {"weight": 0.1, "fert": "Монофосфат калия", "main_element": "P"},
|
772 |
+
"S": {"weight": 0.1, "fert": "Калий сернокислый", "main_element": "S"},
|
773 |
+
"N (NO3-)": {"weight": 0.05, "fert": "Калий азотнокислый", "main_element": "N (NO3-)"},
|
774 |
+
"N (NH4+)": {"weight": 0.05, "fert": "Аммоний азотнокислый", "main_element": "N (NH4+)"}
|
775 |
+
}
|
776 |
+
|
777 |
def _label(self, element):
|
778 |
"""Форматирование названий элементов для вывода"""
|
779 |
labels = {
|
|
|
784 |
|
785 |
def calculate(self):
|
786 |
try:
|
787 |
+
# Первый проход: компенсация основных элементов
|
788 |
+
self._compensate_main_elements()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
789 |
|
790 |
+
# Второй проход: компенсация азота
|
791 |
+
self._compensate_nitrogen()
|
|
|
|
|
792 |
|
793 |
+
# Третий проход: компенсация второстепенных элементов
|
794 |
+
self._compensate_secondary_elements()
|
|
|
|
|
795 |
|
796 |
return self.results
|
797 |
except Exception as e:
|
798 |
print(f"Ошибка при расчёте: {str(e)}")
|
799 |
raise
|
800 |
|
801 |
+
def _compensate_main_elements(self):
|
802 |
+
"""Компенсация основных элементов (Ca, Mg, P)"""
|
803 |
+
for element, weight_data in self.compensation_weights.items():
|
804 |
+
if element in ["Ca", "Mg", "P"]:
|
805 |
+
fert_name = weight_data["fert"]
|
806 |
+
main_element = weight_data["main_element"]
|
807 |
+
required_ppm = self.target_profile[main_element] - self.actual_profile[main_element]
|
808 |
+
if required_ppm > 0.1:
|
809 |
+
self._apply(fert_name, main_element, required_ppm)
|
810 |
+
|
811 |
+
def _compensate_nitrogen(self):
|
812 |
+
"""Компенсация азота (NO3-, NH4+)"""
|
813 |
+
for nitrogen_type in ["N (NO3-)", "N (NH4+)"]:
|
814 |
+
required_ppm = self.target_profile[nitrogen_type] - self.actual_profile[nitrogen_type]
|
815 |
+
if required_ppm > 0.1:
|
816 |
+
fert_name = self.compensation_weights[nitrogen_type]["fert"]
|
817 |
+
self._apply(fert_name, nitrogen_type, required_ppm)
|
818 |
+
|
819 |
+
def _compensate_secondary_elements(self):
|
820 |
+
"""Компенсация второстепенных элементов (K, S)"""
|
821 |
+
for element, weight_data in self.compensation_weights.items():
|
822 |
+
if element in ["K", "S"]:
|
823 |
+
fert_name = weight_data["fert"]
|
824 |
+
main_element = weight_data["main_element"]
|
825 |
+
required_ppm = self.target_profile[main_element] - self.actual_profile[main_element]
|
826 |
+
if required_ppm > 0.1:
|
827 |
+
self._apply(fert_name, main_element, required_ppm)
|
828 |
+
|
829 |
def _apply(self, fert_name, main_element, required_ppm):
|
830 |
if required_ppm <= 0:
|
831 |
return
|
|
|
863 |
def calculate_ec(self):
|
864 |
return round(self.total_ec, 2)
|
865 |
|
866 |
+
def print_initial_nitrogen_report(self):
|
867 |
+
try:
|
868 |
+
print("Исходный расчёт азота:")
|
869 |
+
print(f" NO3-: {self.initial_n_profile['NO3-']} ppm")
|
870 |
+
print(f" NH4+: {self.initial_n_profile['NH4+']} ppm")
|
871 |
+
except Exception as e:
|
872 |
+
print(f"Ошибка при выводе отчёта: {str(e)}")
|
873 |
+
raise
|
874 |
+
|
875 |
def print_initial_nitrogen_report(self):
|
876 |
try:
|
877 |
print("Исходный расчёт азота:")
|