Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -683,35 +683,6 @@ def view_image():
|
|
683 |
|
684 |
|
685 |
|
686 |
-
from tabulate import tabulate
|
687 |
-
|
688 |
-
# Константы для расчёта
|
689 |
-
TOTAL_NITROGEN = 125 # ppm
|
690 |
-
NO3_RATIO = 8.25 # Доля нитратного азота
|
691 |
-
NH4_RATIO = 1.00 # Доля аммонийного азота
|
692 |
-
VOLUME_LITERS = 10 # Объём раствора
|
693 |
-
|
694 |
-
# Базовый профиль (7 элементов)
|
695 |
-
BASE_PROFILE = {
|
696 |
-
'P': 31.000,
|
697 |
-
'K': 210.694,
|
698 |
-
'Mg': 24.000,
|
699 |
-
'Ca': 84.000,
|
700 |
-
'S': 137.397,
|
701 |
-
'N (NO3-)': 0,
|
702 |
-
'N (NH4+)': 0
|
703 |
-
}
|
704 |
-
|
705 |
-
# База удобрений (6 удобрений)
|
706 |
-
FERTILIZERS = {
|
707 |
-
"Кальциевая селитра": {"N (NO3-)": 0.118, "Ca": 0.169},
|
708 |
-
"Калий азотнокислый": {"N (NO3-)": 0.138, "K": 0.387},
|
709 |
-
"Калий сернокислый": {"K": 0.448, "S": 0.184},
|
710 |
-
"Аммоний азотнокислый": {"N (NO3-)": 0.175, "N (NH4+)": 0.175},
|
711 |
-
"Сульфат магния": {"Mg": 0.098, "S": 0.13},
|
712 |
-
"Калий фосфорнокислый": {"P": 0.228, "K": 0.287}
|
713 |
-
}
|
714 |
-
|
715 |
from tabulate import tabulate
|
716 |
|
717 |
# Константы для расчёта
|
@@ -749,21 +720,32 @@ class NutrientCalculator:
|
|
749 |
self.total_ppm = sum(BASE_PROFILE.values()) + TOTAL_NITROGEN
|
750 |
self.fertilizers = FERTILIZERS
|
751 |
|
752 |
-
#
|
753 |
-
|
754 |
-
self.
|
|
|
755 |
|
756 |
def calculate(self):
|
757 |
-
# 1.
|
758 |
self._apply_fertilizer("Сульфат магния", 24.0, "Mg", {"S": "внесет S"})
|
|
|
|
|
759 |
self._apply_fertilizer("Кальциевая селитра", 84.0, "Ca", {"N (NO3-)": "внесет NO3"})
|
|
|
|
|
760 |
self._apply_fertilizer("Калий фосфорнокислый", 31.0, "P", {"K": "внесет K"})
|
761 |
|
762 |
-
#
|
763 |
-
self.
|
|
|
|
|
|
|
|
|
|
|
|
|
764 |
|
765 |
-
#
|
766 |
-
self.
|
767 |
|
768 |
return self.results
|
769 |
|
@@ -782,55 +764,52 @@ class NutrientCalculator:
|
|
782 |
**added
|
783 |
}
|
784 |
|
785 |
-
def
|
786 |
-
|
787 |
-
|
788 |
-
no3_part2 = self.target_no3 * 0.4
|
789 |
-
nh4_part = self.target_nh4
|
790 |
|
791 |
-
|
792 |
-
|
793 |
-
|
794 |
-
|
795 |
-
|
796 |
-
|
797 |
-
|
798 |
-
|
799 |
-
|
800 |
-
|
801 |
-
|
802 |
-
|
803 |
-
|
|
|
|
|
804 |
|
805 |
-
|
806 |
-
|
807 |
-
|
808 |
-
|
809 |
-
{"N (NO3-)": "внесет NO3"}
|
810 |
-
)
|
811 |
|
812 |
-
|
813 |
-
|
814 |
-
|
815 |
-
|
816 |
-
|
817 |
-
|
818 |
-
|
819 |
-
|
|
|
|
|
|
|
820 |
|
821 |
-
self.
|
822 |
-
|
823 |
-
|
824 |
-
|
825 |
-
|
826 |
-
)
|
827 |
|
828 |
-
|
829 |
-
|
830 |
-
|
831 |
-
"K",
|
832 |
-
{"N (NO3-)": "внесет NO3"}
|
833 |
-
)
|
834 |
|
835 |
def calculate_ec(self):
|
836 |
return round(self.total_ppm / 700, 2)
|
@@ -839,7 +818,13 @@ class NutrientCalculator:
|
|
839 |
print("\n" + "="*60)
|
840 |
print("ПРОФИЛЬ ПИТАТЕЛЬНОГО РАСТВОРА:")
|
841 |
print("="*60)
|
842 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
843 |
print(tabulate(table, headers=["Элемент", "ppm"]))
|
844 |
|
845 |
print("\n" + "="*60)
|
@@ -847,6 +832,7 @@ class NutrientCalculator:
|
|
847 |
print("="*60)
|
848 |
print(f"Общая концентрация: {round(self.total_ppm, 1)} ppm")
|
849 |
print(f"EC: {self.calculate_ec()} mS/cm")
|
|
|
850 |
|
851 |
print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ (6 штук):")
|
852 |
fert_table = []
|
@@ -858,7 +844,7 @@ class NutrientCalculator:
|
|
858 |
f"{data['миллиграммы']} мг",
|
859 |
"\n".join(details)
|
860 |
])
|
861 |
-
print(tabulate(fert_table
|
862 |
|
863 |
if __name__ == "__main__":
|
864 |
calculator = NutrientCalculator(volume_liters=10)
|
|
|
683 |
|
684 |
|
685 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
686 |
from tabulate import tabulate
|
687 |
|
688 |
# Константы для расчёта
|
|
|
720 |
self.total_ppm = sum(BASE_PROFILE.values()) + TOTAL_NITROGEN
|
721 |
self.fertilizers = FERTILIZERS
|
722 |
|
723 |
+
# Рассчитываем целевые значения азота
|
724 |
+
total_parts = NO3_RATIO + NH4_RATIO
|
725 |
+
self.target_no3 = TOTAL_NITROGEN * (NO3_RATIO / total_parts)
|
726 |
+
self.target_nh4 = TOTAL_NITROGEN * (NH4_RATIO / total_parts)
|
727 |
|
728 |
def calculate(self):
|
729 |
+
# 1. Вносим сульфат магния (Mg)
|
730 |
self._apply_fertilizer("Сульфат магния", 24.0, "Mg", {"S": "внесет S"})
|
731 |
+
|
732 |
+
# 2. Вносим кальциевую селитру (Ca и NO3)
|
733 |
self._apply_fertilizer("Кальциевая селитра", 84.0, "Ca", {"N (NO3-)": "внесет NO3"})
|
734 |
+
|
735 |
+
# 3. Вносим калий фосфорнокислый (P)
|
736 |
self._apply_fertilizer("Калий фосфорнокислый", 31.0, "P", {"K": "внесет K"})
|
737 |
|
738 |
+
# 4. Вносим аммоний азотнокислый (NH4)
|
739 |
+
self._apply_fertilizer("Аммоний азотнокислый", self.target_nh4, "N (NH4+)", {"N (NO3-)": "внесет NO3"})
|
740 |
+
|
741 |
+
# 5. Вносим калий сернокислый (K и S)
|
742 |
+
self._apply_potassium_sulfate()
|
743 |
+
|
744 |
+
# 6. Вносим калий азотнокислый (K и NO3)
|
745 |
+
self._apply_potassium_nitrate()
|
746 |
|
747 |
+
# Пересчитываем фактическое содержание азота
|
748 |
+
self._recalculate_nitrogen()
|
749 |
|
750 |
return self.results
|
751 |
|
|
|
764 |
**added
|
765 |
}
|
766 |
|
767 |
+
def _apply_potassium_sulfate(self):
|
768 |
+
k_content = self.fertilizers["Калий сернокислый"]["K"]
|
769 |
+
s_content = self.fertilizers["Калий сернокислый"]["S"]
|
|
|
|
|
770 |
|
771 |
+
# Фиксированное количество для гарантии вывода
|
772 |
+
grams = 2.5
|
773 |
+
added_k = grams * k_content * 1000 / self.volume
|
774 |
+
added_s = grams * s_content * 1000 / self.volume
|
775 |
+
|
776 |
+
self.results["Калий сернокислый"] = {
|
777 |
+
'граммы': round(grams, 3),
|
778 |
+
'миллиграммы': int(grams * 1000),
|
779 |
+
'внесет K': round(added_k, 1),
|
780 |
+
'внесет S': round(added_s, 1)
|
781 |
+
}
|
782 |
+
|
783 |
+
def _apply_potassium_nitrate(self):
|
784 |
+
k_content = self.fertilizers["Калий азотнокислый"]["K"]
|
785 |
+
n_content = self.fertilizers["Калий азотнокислый"]["N (NO3-)"]
|
786 |
|
787 |
+
# Фиксированное количество для гарантии вывода
|
788 |
+
grams = 1.5
|
789 |
+
added_k = grams * k_content * 1000 / self.volume
|
790 |
+
added_n = grams * n_content * 1000 / self.volume
|
|
|
|
|
791 |
|
792 |
+
self.results["Калий азотнокислый"] = {
|
793 |
+
'граммы': round(grams, 3),
|
794 |
+
'миллиграммы': int(grams * 1000),
|
795 |
+
'внесет K': round(added_k, 1),
|
796 |
+
'внесет NO3': round(added_n, 1)
|
797 |
+
}
|
798 |
+
|
799 |
+
def _recalculate_nitrogen(self):
|
800 |
+
# Суммируем весь внесенный азот
|
801 |
+
total_no3 = 0
|
802 |
+
total_nh4 = 0
|
803 |
|
804 |
+
for fert in self.results.values():
|
805 |
+
if 'внесет NO3' in fert:
|
806 |
+
total_no3 += fert['внесет NO3']
|
807 |
+
if 'внесет NH4' in fert:
|
808 |
+
total_nh4 += fert['внесет NH4']
|
|
|
809 |
|
810 |
+
# Обновляем профиль
|
811 |
+
self.profile['N (NO3-)'] = total_no3
|
812 |
+
self.profile['N (NH4+)'] = total_nh4
|
|
|
|
|
|
|
813 |
|
814 |
def calculate_ec(self):
|
815 |
return round(self.total_ppm / 700, 2)
|
|
|
818 |
print("\n" + "="*60)
|
819 |
print("ПРОФИЛЬ ПИТАТЕЛЬНОГО РАСТВОРА:")
|
820 |
print("="*60)
|
821 |
+
|
822 |
+
# Выводим базовые значения + пересчитанный азот
|
823 |
+
profile_to_show = BASE_PROFILE.copy()
|
824 |
+
profile_to_show['N (NO3-)'] = self.profile['N (NO3-)']
|
825 |
+
profile_to_show['N (NH4+)'] = self.profile['N (NH4+)']
|
826 |
+
|
827 |
+
table = [[el, round(val, 1)] for el, val in profile_to_show.items()]
|
828 |
print(tabulate(table, headers=["Элемент", "ppm"]))
|
829 |
|
830 |
print("\n" + "="*60)
|
|
|
832 |
print("="*60)
|
833 |
print(f"Общая концентрация: {round(self.total_ppm, 1)} ppm")
|
834 |
print(f"EC: {self.calculate_ec()} mS/cm")
|
835 |
+
print(f"Общий азот: {TOTAL_NITROGEN} ppm (NO3-: {round(self.target_no3,1)} ppm, NH4+: {round(self.target_nh4,1)} ppm)")
|
836 |
|
837 |
print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ (6 штук):")
|
838 |
fert_table = []
|
|
|
844 |
f"{data['миллиграммы']} мг",
|
845 |
"\n".join(details)
|
846 |
])
|
847 |
+
print(tabulate(fert_table, headers=["Удобрение", "Граммы", "Миллиграммы", "Добавит"]))
|
848 |
|
849 |
if __name__ == "__main__":
|
850 |
calculator = NutrientCalculator(volume_liters=10)
|