Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -684,6 +684,17 @@ NO3_RATIO = 9.000
|
|
684 |
NH4_RATIO = 1.00
|
685 |
VOLUME_LITERS = 100
|
686 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
687 |
# Целевые значения
|
688 |
BASE_PROFILE = {
|
689 |
'P': 31.000,
|
@@ -696,22 +707,11 @@ BASE_PROFILE = {
|
|
696 |
}
|
697 |
|
698 |
FERTILIZERS = {
|
699 |
-
# Кальциевая селитра (Ca(NO3)2) - стандарт: 15.5% N (NO3-), 19% Ca
|
700 |
"Кальциевая селитра": {"N (NO3-)": 0.155, "Ca": 0.19},
|
701 |
-
|
702 |
-
# Калий азотнокислый (KNO3) - стандарт: 13.7% N (NO3-), 38.3% K
|
703 |
"Калий азотнокислый": {"N (NO3-)": 0.137, "K": 0.383},
|
704 |
-
|
705 |
-
# Калий сернокислый (K2SO4) - стандарт: 44.8% K, 18.4% S
|
706 |
"Калий сернокислый": {"K": 0.448, "S": 0.184},
|
707 |
-
|
708 |
-
# Аммоний азотнокислый (NH4NO3) - стандарт: 17.5% N (NO3-), 17.5% N (NH4+)
|
709 |
"Аммоний азотнокислый": {"N (NO3-)": 0.175, "N (NH4+)": 0.175},
|
710 |
-
|
711 |
-
# Сульфат магния (MgSO4·7H2O) - стандарт: 9.8% Mg, 13% S
|
712 |
"Сульфат магния": {"Mg": 0.098, "S": 0.13},
|
713 |
-
|
714 |
-
# Монофосфат калия (KH2PO4) - скорректировано под 49.9% P2O5 и 33.1% K2O
|
715 |
"Монофосфат калия": {"P": 0.218, "K": 0.275}
|
716 |
}
|
717 |
|
@@ -722,6 +722,7 @@ class NutrientCalculator:
|
|
722 |
self.target_profile = BASE_PROFILE.copy()
|
723 |
self.actual_profile = {k: 0.0 for k in BASE_PROFILE}
|
724 |
self.fertilizers = FERTILIZERS
|
|
|
725 |
|
726 |
# Расчёт азота
|
727 |
total_parts = NO3_RATIO + NH4_RATIO
|
@@ -733,24 +734,19 @@ class NutrientCalculator:
|
|
733 |
}
|
734 |
|
735 |
def calculate(self):
|
736 |
-
# Используем значения из базового профиля
|
737 |
self._apply("Сульфат магния", "Mg", self.target_profile['Mg'])
|
738 |
self._apply("Кальциевая селитра", "Ca", self.target_profile['Ca'])
|
739 |
self._apply("Монофосфат калия", "P", self.target_profile['P'])
|
740 |
self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
|
741 |
|
742 |
-
# Сначала покрываем NO3- из кальциевой селитры и аммонийной
|
743 |
current_no3 = self.actual_profile['N (NO3-)']
|
744 |
no3_needed = self.target_profile['N (NO3-)'] - current_no3
|
745 |
|
746 |
-
# Добавляем калий азотнокислый для покрытия оставшегося NO3-
|
747 |
if no3_needed > 0.1:
|
748 |
self._apply("Калий азотнокислый", "N (NO3-)", no3_needed)
|
749 |
|
750 |
-
# Затем покрываем калий и серу
|
751 |
self._apply_k_sulfate()
|
752 |
|
753 |
-
# Проверяем и покрываем оставшийся калий калий азотнокислым
|
754 |
k_deficit = self.target_profile['K'] - self.actual_profile['K']
|
755 |
if k_deficit > 0.1:
|
756 |
self._apply("Калий азотнокислый", "K", k_deficit)
|
@@ -767,7 +763,8 @@ class NutrientCalculator:
|
|
767 |
if fert_name not in self.results:
|
768 |
result = {
|
769 |
'граммы': 0.0,
|
770 |
-
'миллиграммы': 0
|
|
|
771 |
}
|
772 |
for element in self.fertilizers[fert_name]:
|
773 |
result[f'внесет {self._label(element)}'] = 0.0
|
@@ -776,41 +773,20 @@ class NutrientCalculator:
|
|
776 |
self.results[fert_name]['граммы'] += grams
|
777 |
self.results[fert_name]['миллиграммы'] += int(grams * 1000)
|
778 |
|
|
|
779 |
for element, percent in self.fertilizers[fert_name].items():
|
780 |
added_ppm = grams * percent * 1000 / self.volume
|
781 |
self.results[fert_name][f'внесет {self._label(element)}'] += added_ppm
|
782 |
self.actual_profile[element] += added_ppm
|
783 |
-
|
784 |
-
def _apply_k_sulfate(self):
|
785 |
-
fert = "Калий сернокислый"
|
786 |
-
k_def = self.target_profile['K'] - self.actual_profile['K']
|
787 |
-
s_def = self.target_profile['S'] - self.actual_profile['S']
|
788 |
|
789 |
-
|
790 |
-
|
791 |
-
|
792 |
-
# Рассчитываем необходимое количество для покрытия дефицита серы
|
793 |
-
if s_def > 0.1:
|
794 |
-
s_content = self.fertilizers[fert]["S"]
|
795 |
-
grams_s = s_def * self.volume / (s_content * 1000)
|
796 |
-
|
797 |
-
k_content = self.fertilizers[fert]["K"]
|
798 |
-
k_from_s = grams_s * k_content * 1000 / self.volume
|
799 |
-
|
800 |
-
if k_from_s > k_def and k_def > 0.1:
|
801 |
-
# Если серы нужно больше, чем нужно для калия, ограничиваем
|
802 |
-
grams = k_def * self.volume / (k_content * 1000)
|
803 |
-
else:
|
804 |
-
grams = grams_s
|
805 |
-
|
806 |
-
self._apply(fert, "S", s_def)
|
807 |
|
808 |
-
|
809 |
-
return "NO3" if el == "N (NO3-)" else "NH4" if el == "N (NH4+)" else el
|
810 |
|
811 |
def calculate_ec(self):
|
812 |
-
|
813 |
-
return round(total_ppm / 700, 2)
|
814 |
|
815 |
def print_report(self):
|
816 |
print("\n" + "="*60)
|
@@ -837,9 +813,11 @@ class NutrientCalculator:
|
|
837 |
fert,
|
838 |
round(data['граммы'], 3),
|
839 |
data['миллиграммы'],
|
|
|
840 |
"\n".join(adds)
|
841 |
])
|
842 |
-
print(tabulate(fert_table,
|
|
|
843 |
|
844 |
print("\nОСТАТОЧНЫЙ ДЕФИЦИТ:")
|
845 |
deficit = {
|
@@ -860,6 +838,5 @@ if __name__ == "__main__":
|
|
860 |
|
861 |
|
862 |
|
863 |
-
|
864 |
if __name__ == '__main__':
|
865 |
app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860)))
|
|
|
684 |
NH4_RATIO = 1.00
|
685 |
VOLUME_LITERS = 100
|
686 |
|
687 |
+
# Коэффициенты электропроводности для каждого элемента (мСм/см на ppm)
|
688 |
+
EC_COEFFICIENTS = {
|
689 |
+
'P': 0.0012,
|
690 |
+
'K': 0.0018,
|
691 |
+
'Mg': 0.0015,
|
692 |
+
'Ca': 0.0016,
|
693 |
+
'S': 0.0014,
|
694 |
+
'N (NO3-)': 0.0017,
|
695 |
+
'N (NH4+)': 0.0019
|
696 |
+
}
|
697 |
+
|
698 |
# Целевые значения
|
699 |
BASE_PROFILE = {
|
700 |
'P': 31.000,
|
|
|
707 |
}
|
708 |
|
709 |
FERTILIZERS = {
|
|
|
710 |
"Кальциевая селитра": {"N (NO3-)": 0.155, "Ca": 0.19},
|
|
|
|
|
711 |
"Калий азотнокислый": {"N (NO3-)": 0.137, "K": 0.383},
|
|
|
|
|
712 |
"Калий сернокислый": {"K": 0.448, "S": 0.184},
|
|
|
|
|
713 |
"Аммоний азотнокислый": {"N (NO3-)": 0.175, "N (NH4+)": 0.175},
|
|
|
|
|
714 |
"Сульфат магния": {"Mg": 0.098, "S": 0.13},
|
|
|
|
|
715 |
"Монофосфат калия": {"P": 0.218, "K": 0.275}
|
716 |
}
|
717 |
|
|
|
722 |
self.target_profile = BASE_PROFILE.copy()
|
723 |
self.actual_profile = {k: 0.0 for k in BASE_PROFILE}
|
724 |
self.fertilizers = FERTILIZERS
|
725 |
+
self.total_ec = 0.0 # Накопленное значение EC
|
726 |
|
727 |
# Расчёт азота
|
728 |
total_parts = NO3_RATIO + NH4_RATIO
|
|
|
734 |
}
|
735 |
|
736 |
def calculate(self):
|
|
|
737 |
self._apply("Сульфат магния", "Mg", self.target_profile['Mg'])
|
738 |
self._apply("Кальциевая селитра", "Ca", self.target_profile['Ca'])
|
739 |
self._apply("Монофосфат калия", "P", self.target_profile['P'])
|
740 |
self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
|
741 |
|
|
|
742 |
current_no3 = self.actual_profile['N (NO3-)']
|
743 |
no3_needed = self.target_profile['N (NO3-)'] - current_no3
|
744 |
|
|
|
745 |
if no3_needed > 0.1:
|
746 |
self._apply("Калий азотнокислый", "N (NO3-)", no3_needed)
|
747 |
|
|
|
748 |
self._apply_k_sulfate()
|
749 |
|
|
|
750 |
k_deficit = self.target_profile['K'] - self.actual_profile['K']
|
751 |
if k_deficit > 0.1:
|
752 |
self._apply("Калий азотнокислый", "K", k_deficit)
|
|
|
763 |
if fert_name not in self.results:
|
764 |
result = {
|
765 |
'граммы': 0.0,
|
766 |
+
'миллиграммы': 0,
|
767 |
+
'вклад в EC': 0.0
|
768 |
}
|
769 |
for element in self.fertilizers[fert_name]:
|
770 |
result[f'внесет {self._label(element)}'] = 0.0
|
|
|
773 |
self.results[fert_name]['граммы'] += grams
|
774 |
self.results[fert_name]['миллиграммы'] += int(grams * 1000)
|
775 |
|
776 |
+
fert_ec = 0.0
|
777 |
for element, percent in self.fertilizers[fert_name].items():
|
778 |
added_ppm = grams * percent * 1000 / self.volume
|
779 |
self.results[fert_name][f'внесет {self._label(element)}'] += added_ppm
|
780 |
self.actual_profile[element] += added_ppm
|
781 |
+
fert_ec += added_ppm * EC_COEFFICIENTS[element]
|
|
|
|
|
|
|
|
|
782 |
|
783 |
+
self.results[fert_name]['вклад в EC'] += fert_ec
|
784 |
+
self.total_ec += fert_ec
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
785 |
|
786 |
+
# ... остальные методы остаются без изменений ...
|
|
|
787 |
|
788 |
def calculate_ec(self):
|
789 |
+
return round(self.total_ec, 2)
|
|
|
790 |
|
791 |
def print_report(self):
|
792 |
print("\n" + "="*60)
|
|
|
813 |
fert,
|
814 |
round(data['граммы'], 3),
|
815 |
data['миллиграммы'],
|
816 |
+
round(data['вклад в EC'], 3),
|
817 |
"\n".join(adds)
|
818 |
])
|
819 |
+
print(tabulate(fert_table,
|
820 |
+
headers=["Удобрение", "Граммы", "Миллиграммы", "EC (мСм/см)", "Добавит"]))
|
821 |
|
822 |
print("\nОСТАТОЧНЫЙ ДЕФИЦИТ:")
|
823 |
deficit = {
|
|
|
838 |
|
839 |
|
840 |
|
|
|
841 |
if __name__ == '__main__':
|
842 |
app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860)))
|