Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -679,7 +679,6 @@ def view_image():
|
|
679 |
|
680 |
|
681 |
|
682 |
-
|
683 |
from tabulate import tabulate
|
684 |
|
685 |
# Константы для расчёта
|
@@ -716,16 +715,11 @@ class NutrientCalculator:
|
|
716 |
self.profile = BASE_PROFILE.copy()
|
717 |
self.total_ppm = sum(BASE_PROFILE.values()) + TOTAL_NITROGEN
|
718 |
self.fertilizers = FERTILIZERS
|
719 |
-
self.final_profile = BASE_PROFILE.copy()
|
720 |
|
721 |
# Рассчитываем целевые значения азота
|
722 |
total_parts = NO3_RATIO + NH4_RATIO
|
723 |
self.target_no3 = TOTAL_NITROGEN * (NO3_RATIO / total_parts)
|
724 |
self.target_nh4 = TOTAL_NITROGEN * (NH4_RATIO / total_parts)
|
725 |
-
self.initial_n_profile = {
|
726 |
-
"NO3-": self.target_no3,
|
727 |
-
"NH4+": self.target_nh4
|
728 |
-
}
|
729 |
|
730 |
def calculate(self):
|
731 |
# 1. Вносим сульфат магния (Mg)
|
@@ -749,9 +743,6 @@ class NutrientCalculator:
|
|
749 |
# Пересчитываем фактическое содержание азота
|
750 |
self._recalculate_nitrogen()
|
751 |
|
752 |
-
# Обновляем финальный профиль
|
753 |
-
self._update_final_profile()
|
754 |
-
|
755 |
return self.results
|
756 |
|
757 |
def _apply_fertilizer(self, name, ppm_needed, main_element, additions):
|
@@ -762,18 +753,12 @@ class NutrientCalculator:
|
|
762 |
for element, label in additions.items():
|
763 |
added_amount = grams * self.fertilizers[name][element] * 1000 / self.volume
|
764 |
added[label] = round(added_amount, 1)
|
765 |
-
# Уменьшаем дефицит по этому элементу
|
766 |
-
if element in self.final_profile:
|
767 |
-
self.final_profile[element] -= added_amount
|
768 |
|
769 |
self.results[name] = {
|
770 |
'граммы': round(grams, 3),
|
771 |
'миллиграммы': int(grams * 1000),
|
772 |
**added
|
773 |
}
|
774 |
-
|
775 |
-
# Уменьшаем дефицит по основному элементу
|
776 |
-
self.final_profile[main_element] -= ppm_needed
|
777 |
|
778 |
def _apply_potassium_sulfate(self):
|
779 |
# Рассчитываем необходимое количество для покрытия дефицита
|
@@ -794,10 +779,6 @@ class NutrientCalculator:
|
|
794 |
'внесет K': round(added_k, 1),
|
795 |
'внесет S': round(added_s, 1)
|
796 |
}
|
797 |
-
|
798 |
-
# Обновляем финальный профиль
|
799 |
-
self.final_profile['K'] -= added_k
|
800 |
-
self.final_profile['S'] -= added_s
|
801 |
|
802 |
def _apply_potassium_nitrate(self):
|
803 |
# Рассчитываем остаточную потребность в калии
|
@@ -814,10 +795,6 @@ class NutrientCalculator:
|
|
814 |
'внесет K': round(added_k, 1),
|
815 |
'внесет NO3': round(added_n, 1)
|
816 |
}
|
817 |
-
|
818 |
-
# Обновляем финальный профиль
|
819 |
-
self.final_profile['K'] -= added_k
|
820 |
-
self.final_profile['N (NO3-)'] += added_n
|
821 |
|
822 |
def _recalculate_nitrogen(self):
|
823 |
# Суммируем весь внесенный азот
|
@@ -828,41 +805,30 @@ class NutrientCalculator:
|
|
828 |
self.profile['N (NO3-)'] = total_no3
|
829 |
self.profile['N (NH4+)'] = total_nh4
|
830 |
|
831 |
-
def _update_final_profile(self):
|
832 |
-
# Обновляем финальный профиль с учетом внесенных элементов
|
833 |
-
for fert, data in self.results.items():
|
834 |
-
for key, value in data.items():
|
835 |
-
if key.startswith('внесет'):
|
836 |
-
element = key.split(': ')[0].replace('внесет ', '')
|
837 |
-
if element == 'NO3':
|
838 |
-
element = 'N (NO3-)'
|
839 |
-
elif element == 'NH4':
|
840 |
-
element = 'N (NH4+)'
|
841 |
-
|
842 |
-
if element in self.final_profile:
|
843 |
-
self.final_profile[element] -= value
|
844 |
-
|
845 |
def calculate_ec(self):
|
846 |
return round(self.total_ppm / 700, 2)
|
847 |
|
848 |
def print_report(self):
|
849 |
print("\n" + "="*60)
|
850 |
-
print("ПРОФИЛЬ ПИТАТЕЛЬНОГО
|
851 |
print("="*60)
|
852 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
853 |
print(tabulate(table, headers=["Элемент", "ppm"]))
|
854 |
-
|
855 |
-
print("\nИсходный расчёт азота:")
|
856 |
-
for form, value in self.initial_n_profile.items():
|
857 |
-
print(f" {form}: {value} ppm")
|
858 |
-
|
859 |
print("\n" + "="*60)
|
860 |
print(f"РАСЧЕТ ДЛЯ {self.volume} ЛИТРОВ РАСТВОРА")
|
861 |
print("="*60)
|
862 |
print(f"Общая концентрация: {round(self.total_ppm, 1)} ppm")
|
863 |
print(f"EC: {self.calculate_ec()} mS/cm")
|
|
|
864 |
|
865 |
-
print("\nРЕКОМЕНДУЕМЫЕ
|
866 |
fert_table = []
|
867 |
for fert, data in self.results.items():
|
868 |
details = [f"+{k}: {v} ppm" for k, v in data.items() if k.startswith('внесет')]
|
@@ -874,14 +840,6 @@ class NutrientCalculator:
|
|
874 |
])
|
875 |
print(tabulate(fert_table, headers=["Удобрение", "Граммы", "Миллиграммы", "Добавит"]))
|
876 |
|
877 |
-
print("\nОСТАТОЧНЫЙ ДЕФИЦИТ:")
|
878 |
-
deficit = {k: round(abs(v), 1) for k, v in self.final_profile.items() if abs(v) > 0.1}
|
879 |
-
if deficit:
|
880 |
-
for el, val in deficit.items():
|
881 |
-
print(f" {el}: {val} ppm")
|
882 |
-
else:
|
883 |
-
print(" Все элементы покрыты полностью")
|
884 |
-
|
885 |
if __name__ == "__main__":
|
886 |
calculator = NutrientCalculator(volume_liters=VOLUME_LITERS)
|
887 |
calculator.calculate()
|
|
|
679 |
|
680 |
|
681 |
|
|
|
682 |
from tabulate import tabulate
|
683 |
|
684 |
# Константы для расчёта
|
|
|
715 |
self.profile = BASE_PROFILE.copy()
|
716 |
self.total_ppm = sum(BASE_PROFILE.values()) + TOTAL_NITROGEN
|
717 |
self.fertilizers = FERTILIZERS
|
|
|
718 |
|
719 |
# Рассчитываем целевые значения азота
|
720 |
total_parts = NO3_RATIO + NH4_RATIO
|
721 |
self.target_no3 = TOTAL_NITROGEN * (NO3_RATIO / total_parts)
|
722 |
self.target_nh4 = TOTAL_NITROGEN * (NH4_RATIO / total_parts)
|
|
|
|
|
|
|
|
|
723 |
|
724 |
def calculate(self):
|
725 |
# 1. Вносим сульфат магния (Mg)
|
|
|
743 |
# Пересчитываем фактическое содержание азота
|
744 |
self._recalculate_nitrogen()
|
745 |
|
|
|
|
|
|
|
746 |
return self.results
|
747 |
|
748 |
def _apply_fertilizer(self, name, ppm_needed, main_element, additions):
|
|
|
753 |
for element, label in additions.items():
|
754 |
added_amount = grams * self.fertilizers[name][element] * 1000 / self.volume
|
755 |
added[label] = round(added_amount, 1)
|
|
|
|
|
|
|
756 |
|
757 |
self.results[name] = {
|
758 |
'граммы': round(grams, 3),
|
759 |
'миллиграммы': int(grams * 1000),
|
760 |
**added
|
761 |
}
|
|
|
|
|
|
|
762 |
|
763 |
def _apply_potassium_sulfate(self):
|
764 |
# Рассчитываем необходимое количество для покрытия дефицита
|
|
|
779 |
'внесет K': round(added_k, 1),
|
780 |
'внесет S': round(added_s, 1)
|
781 |
}
|
|
|
|
|
|
|
|
|
782 |
|
783 |
def _apply_potassium_nitrate(self):
|
784 |
# Рассчитываем остаточную потребность в калии
|
|
|
795 |
'внесет K': round(added_k, 1),
|
796 |
'внесет NO3': round(added_n, 1)
|
797 |
}
|
|
|
|
|
|
|
|
|
798 |
|
799 |
def _recalculate_nitrogen(self):
|
800 |
# Суммируем весь внесенный азот
|
|
|
805 |
self.profile['N (NO3-)'] = total_no3
|
806 |
self.profile['N (NH4+)'] = total_nh4
|
807 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
808 |
def calculate_ec(self):
|
809 |
return round(self.total_ppm / 700, 2)
|
810 |
|
811 |
def print_report(self):
|
812 |
print("\n" + "="*60)
|
813 |
+
print("ПРОФИЛЬ ПИТАТЕЛЬНОГО РАСТВОРА:")
|
814 |
print("="*60)
|
815 |
+
|
816 |
+
# Выводим базовые значения + пересчитанный азот
|
817 |
+
profile_to_show = BASE_PROFILE.copy()
|
818 |
+
profile_to_show['N (NO3-)'] = self.profile['N (NO3-)']
|
819 |
+
profile_to_show['N (NH4+)'] = self.profile['N (NH4+)']
|
820 |
+
|
821 |
+
table = [[el, round(val, 1)] for el, val in profile_to_show.items()]
|
822 |
print(tabulate(table, headers=["Элемент", "ppm"]))
|
823 |
+
|
|
|
|
|
|
|
|
|
824 |
print("\n" + "="*60)
|
825 |
print(f"РАСЧЕТ ДЛЯ {self.volume} ЛИТРОВ РАСТВОРА")
|
826 |
print("="*60)
|
827 |
print(f"Общая концентрация: {round(self.total_ppm, 1)} ppm")
|
828 |
print(f"EC: {self.calculate_ec()} mS/cm")
|
829 |
+
print(f"Общий азот: {TOTAL_NITROGEN} ppm (NO3-: {round(self.target_no3,1)} ppm, NH4+: {round(self.target_nh4,1)} ppm)")
|
830 |
|
831 |
+
print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ (6 штук):")
|
832 |
fert_table = []
|
833 |
for fert, data in self.results.items():
|
834 |
details = [f"+{k}: {v} ppm" for k, v in data.items() if k.startswith('внесет')]
|
|
|
840 |
])
|
841 |
print(tabulate(fert_table, headers=["Удобрение", "Граммы", "Миллиграммы", "Добавит"]))
|
842 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
843 |
if __name__ == "__main__":
|
844 |
calculator = NutrientCalculator(volume_liters=VOLUME_LITERS)
|
845 |
calculator.calculate()
|