Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -703,7 +703,7 @@ NUTRIENT_CONTENT_IN_FERTILIZERS = {
|
|
703 |
"Калий азотнокислый": {"N (NO3-)": 0.136, "K": 0.382},
|
704 |
"Калий сернокислый": {"K": 0.44874, "S": 0.18401},
|
705 |
"Аммоний азотнокислый": {"N (NO3-)": 0.17499, "N (NH4+)": 0.17499},
|
706 |
-
"Сульфат магния": {"Mg": 0.09861, "S": 0.13010},
|
707 |
"Монофосфат калия": {"P": 0.218, "K": 0.275}
|
708 |
}
|
709 |
|
@@ -735,23 +735,19 @@ class NutrientCalculator:
|
|
735 |
|
736 |
def calculate(self):
|
737 |
try:
|
738 |
-
# Применяем удобрения в правильном порядке
|
739 |
self._apply("Сульфат магния", "Mg", self.target_profile['Mg'])
|
740 |
self._apply("Кальциевая селитра", "Ca", self.target_profile['Ca'])
|
741 |
self._apply("Монофосфат калия", "P", self.target_profile['P'])
|
742 |
self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
|
743 |
|
744 |
-
# Восполняем дефицит NO3-
|
745 |
current_no3 = self.actual_profile['N (NO3-)']
|
746 |
no3_needed = self.target_profile['N (NO3-)'] - current_no3
|
747 |
|
748 |
if no3_needed > 0.1:
|
749 |
self._apply("Калий азотнокислый", "N (NO3-)", no3_needed)
|
750 |
|
751 |
-
# Восполняем дефицит S и K
|
752 |
self._apply_k_sulfate()
|
753 |
|
754 |
-
# Восполняем оставшийся дефицит K
|
755 |
k_deficit = self.target_profile['K'] - self.actual_profile['K']
|
756 |
if k_deficit > 0.1:
|
757 |
self._apply("Калий азотнокислый", "K", k_deficit)
|
@@ -804,20 +800,19 @@ class NutrientCalculator:
|
|
804 |
return
|
805 |
|
806 |
try:
|
807 |
-
# Рассчитываем сколько нужно внести для покрытия дефицита S
|
808 |
if s_def > 0.1:
|
809 |
s_content = self.fertilizers[fert]["S"]
|
810 |
-
|
811 |
|
812 |
-
# Проверяем, не приведет ли это к избытку K
|
813 |
k_content = self.fertilizers[fert]["K"]
|
814 |
-
|
815 |
|
816 |
-
if
|
817 |
-
|
818 |
-
|
819 |
-
|
820 |
-
|
|
|
821 |
except Exception as e:
|
822 |
print(f"Ошибка при расчёте сульфата калия: {str(e)}")
|
823 |
raise
|
@@ -825,62 +820,61 @@ class NutrientCalculator:
|
|
825 |
def calculate_ec(self):
|
826 |
return round(self.total_ec, 2)
|
827 |
|
828 |
-
def print_report(self):
|
829 |
-
|
830 |
-
|
831 |
-
|
832 |
-
|
833 |
-
|
834 |
-
|
835 |
-
|
836 |
-
|
837 |
-
|
838 |
-
|
839 |
-
|
840 |
-
|
841 |
-
|
842 |
-
|
843 |
-
|
844 |
-
|
845 |
-
|
846 |
-
|
847 |
-
|
848 |
-
|
849 |
-
|
850 |
-
|
851 |
-
|
852 |
-
|
853 |
-
|
854 |
-
|
855 |
-
|
856 |
-
|
857 |
-
|
858 |
-
|
859 |
-
|
860 |
-
|
861 |
-
|
862 |
-
|
863 |
-
|
864 |
-
|
865 |
-
|
866 |
-
|
867 |
-
|
868 |
-
|
869 |
-
|
870 |
-
|
871 |
-
|
872 |
-
|
873 |
-
|
874 |
|
875 |
if __name__ == "__main__":
|
876 |
try:
|
877 |
calculator = NutrientCalculator(volume_liters=VOLUME_LITERS)
|
878 |
calculator.calculate()
|
879 |
-
calculator.print_report()
|
880 |
except Exception as e:
|
881 |
print(f"Критическая ошибка: {str(e)}")
|
882 |
|
883 |
|
884 |
-
|
885 |
if __name__ == '__main__':
|
886 |
app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860)))
|
|
|
703 |
"Калий азотнокислый": {"N (NO3-)": 0.136, "K": 0.382},
|
704 |
"Калий сернокислый": {"K": 0.44874, "S": 0.18401},
|
705 |
"Аммоний азотнокислый": {"N (NO3-)": 0.17499, "N (NH4+)": 0.17499},
|
706 |
+
"Сульфат магния": {"Mg": 0.09861, "S": 0.13010},
|
707 |
"Монофосфат калия": {"P": 0.218, "K": 0.275}
|
708 |
}
|
709 |
|
|
|
735 |
|
736 |
def calculate(self):
|
737 |
try:
|
|
|
738 |
self._apply("Сульфат магния", "Mg", self.target_profile['Mg'])
|
739 |
self._apply("Кальциевая селитра", "Ca", self.target_profile['Ca'])
|
740 |
self._apply("Монофосфат калия", "P", self.target_profile['P'])
|
741 |
self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
|
742 |
|
|
|
743 |
current_no3 = self.actual_profile['N (NO3-)']
|
744 |
no3_needed = self.target_profile['N (NO3-)'] - current_no3
|
745 |
|
746 |
if no3_needed > 0.1:
|
747 |
self._apply("Калий азотнокислый", "N (NO3-)", no3_needed)
|
748 |
|
|
|
749 |
self._apply_k_sulfate()
|
750 |
|
|
|
751 |
k_deficit = self.target_profile['K'] - self.actual_profile['K']
|
752 |
if k_deficit > 0.1:
|
753 |
self._apply("Калий азотнокислый", "K", k_deficit)
|
|
|
800 |
return
|
801 |
|
802 |
try:
|
|
|
803 |
if s_def > 0.1:
|
804 |
s_content = self.fertilizers[fert]["S"]
|
805 |
+
grams_s = (s_def * self.volume) / (s_content * 1000)
|
806 |
|
|
|
807 |
k_content = self.fertilizers[fert]["K"]
|
808 |
+
k_from_s = (grams_s * k_content * 1000) / self.volume
|
809 |
|
810 |
+
if k_from_s > k_def and k_def > 0.1:
|
811 |
+
grams = (k_def * self.volume) / (k_content * 1000)
|
812 |
+
else:
|
813 |
+
grams = grams_s
|
814 |
+
|
815 |
+
self._apply(fert, "S", s_def)
|
816 |
except Exception as e:
|
817 |
print(f"Ошибка при расчёте сульфата калия: {str(e)}")
|
818 |
raise
|
|
|
820 |
def calculate_ec(self):
|
821 |
return round(self.total_ec, 2)
|
822 |
|
823 |
+
def print_report(self):
|
824 |
+
try:
|
825 |
+
print("\n" + "="*60)
|
826 |
+
print("ПРОФИЛЬ ПИТАТЕЛЬНОГО РАСТВОРА (ИТОГО):")
|
827 |
+
print("="*60)
|
828 |
+
table = [[el, round(self.actual_profile[el], 1)] for el in self.actual_profile]
|
829 |
+
print(tabulate(table, headers=["Элемент", "ppm"]))
|
830 |
+
|
831 |
+
print("\nИсходный расчёт азота:")
|
832 |
+
for form, val in self.initial_n_profile.items():
|
833 |
+
print(f" {form}: {round(val, 1)} ppm")
|
834 |
+
|
835 |
+
print("\n" + "="*60)
|
836 |
+
print(f"РАСЧЕТ ДЛЯ {self.volume} ЛИТРОВ РАСТВОРА")
|
837 |
+
print("="*60)
|
838 |
+
print(f"Общая концентрация: {round(sum(self.actual_profile.values()), 1)} ppm")
|
839 |
+
print(f"EC: {self.calculate_ec()} mS/cm")
|
840 |
+
|
841 |
+
print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ:")
|
842 |
+
fert_table = []
|
843 |
+
for fert, data in self.results.items():
|
844 |
+
adds = [f"+{k}: {v:.1f} ppm" for k, v in data.items() if k.startswith('внесет')]
|
845 |
+
fert_table.append([
|
846 |
+
fert,
|
847 |
+
round(data['граммы'], 3),
|
848 |
+
data['миллиграммы'],
|
849 |
+
round(data['вклад в EC'], 3),
|
850 |
+
"\n".join(adds)
|
851 |
+
])
|
852 |
+
print(tabulate(fert_table,
|
853 |
+
headers=["Удобрение", "Граммы", "Миллиграммы", "EC (мСм/см)", "Добавит"]))
|
854 |
+
|
855 |
+
print("\nОСТАТОЧНЫЙ ДЕФИЦИТ:")
|
856 |
+
deficit = {
|
857 |
+
k: round(self.target_profile[k] - self.actual_profile[k], 1)
|
858 |
+
for k in self.target_profile
|
859 |
+
if abs(self.target_profile[k] - self.actual_profile[k]) > 0.1
|
860 |
+
}
|
861 |
+
if deficit:
|
862 |
+
for el, val in deficit.items():
|
863 |
+
print(f" {el}: {val} ppm")
|
864 |
+
else:
|
865 |
+
print(" Все элементы покрыты полностью")
|
866 |
+
except Exception as e:
|
867 |
+
print(f"Ошибка при выводе отчёта: {str(e)}")
|
868 |
+
raise
|
869 |
|
870 |
if __name__ == "__main__":
|
871 |
try:
|
872 |
calculator = NutrientCalculator(volume_liters=VOLUME_LITERS)
|
873 |
calculator.calculate()
|
874 |
+
calculator.print_report() # Правильный вызов метода класса
|
875 |
except Exception as e:
|
876 |
print(f"Критическая ошибка: {str(e)}")
|
877 |
|
878 |
|
|
|
879 |
if __name__ == '__main__':
|
880 |
app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860)))
|