Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -681,11 +681,13 @@ def view_image():
|
|
681 |
|
682 |
|
683 |
|
684 |
-
|
|
|
|
|
685 |
TOTAL_NITROGEN = 220 # ppm
|
686 |
-
N_RATIO = (10, 5) # Пример:
|
|
|
687 |
|
688 |
-
# Профиль питательного раствора для томатов (ppm)
|
689 |
TOMATO_PROFILE = {
|
690 |
'P': 50,
|
691 |
'K': 350,
|
@@ -694,7 +696,6 @@ TOMATO_PROFILE = {
|
|
694 |
'S': 100
|
695 |
}
|
696 |
|
697 |
-
# База данных удобрений
|
698 |
fertilizers_db = {
|
699 |
"Кальциевая селитра": {
|
700 |
"N (NO3-)": 0.118,
|
@@ -732,24 +733,21 @@ class NutrientCalculator:
|
|
732 |
self.initial_n_profile = {}
|
733 |
|
734 |
def calculate(self, base_profile, total_n, n_ratio):
|
735 |
-
# Расчёт NO3 и NH4 на основе общего азота и соотношения
|
736 |
total_parts = n_ratio[0] + n_ratio[1]
|
737 |
no3 = total_n * (n_ratio[0] / total_parts)
|
738 |
nh4 = total_n * (n_ratio[1] / total_parts)
|
739 |
|
740 |
-
# Сохраняем рассчитанные значения азота
|
741 |
self.initial_n_profile = {
|
742 |
'N (NO3-)': round(no3, 1),
|
743 |
'N (NH4+)': round(nh4, 1)
|
744 |
}
|
745 |
|
746 |
-
# Формирование полного профиля
|
747 |
self.final_profile = base_profile.copy()
|
748 |
self.final_profile['N (NO3-)'] = no3
|
749 |
self.final_profile['N (NH4+)'] = nh4
|
750 |
self.total_ppm = total_n + sum(base_profile.values())
|
751 |
|
752 |
-
#
|
753 |
self._apply_magnesium_sulfate()
|
754 |
self._apply_calcium_nitrate()
|
755 |
self._apply_mkp()
|
@@ -844,36 +842,33 @@ class NutrientCalculator:
|
|
844 |
return round(self.total_ppm / 700, 2)
|
845 |
|
846 |
def print_report(self):
|
847 |
-
print("\n" + "="*
|
848 |
-
print("
|
849 |
-
print("="*
|
850 |
-
|
851 |
-
|
852 |
-
|
853 |
-
print(
|
854 |
-
|
855 |
-
|
856 |
-
|
857 |
-
|
858 |
-
|
859 |
-
ec = self.calculate_ec()
|
860 |
-
print("\n" + "="*50)
|
861 |
print(f"РАСЧЕТ ДЛЯ {self.volume} ЛИТРОВ РАСТВОРА")
|
862 |
-
print("="*
|
863 |
-
print(f"
|
864 |
-
print(f"
|
865 |
|
866 |
print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ:")
|
867 |
-
|
868 |
for fert, data in self.results.items():
|
869 |
-
|
870 |
-
|
871 |
fert,
|
872 |
-
f"{data['граммы']
|
873 |
f"{data['миллиграммы']} мг",
|
874 |
-
"\n".join(
|
875 |
])
|
876 |
-
print(tabulate(
|
877 |
|
878 |
print("\nОСТАТОЧНЫЙ ДЕФИЦИТ:")
|
879 |
deficit = {k: v for k, v in self.final_profile.items() if v > 0.1}
|
@@ -881,13 +876,13 @@ class NutrientCalculator:
|
|
881 |
for el, val in deficit.items():
|
882 |
print(f" {el}: {round(val, 1)} ppm")
|
883 |
else:
|
884 |
-
print(" Все элементы полностью
|
885 |
|
886 |
|
887 |
-
#
|
888 |
if __name__ == "__main__":
|
889 |
-
calc = NutrientCalculator(volume_liters=
|
890 |
-
|
891 |
calc.print_report()
|
892 |
|
893 |
|
@@ -898,5 +893,6 @@ if __name__ == "__main__":
|
|
898 |
|
899 |
|
900 |
|
|
|
901 |
if __name__ == '__main__':
|
902 |
app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860)))
|
|
|
681 |
|
682 |
|
683 |
|
684 |
+
from tabulate import tabulate
|
685 |
+
|
686 |
+
# Заданные значения
|
687 |
TOTAL_NITROGEN = 220 # ppm
|
688 |
+
N_RATIO = (10, 5) # Пример: NO3:NH4 = 10:5
|
689 |
+
VOLUME_LITERS = 10 # Объём раствора
|
690 |
|
|
|
691 |
TOMATO_PROFILE = {
|
692 |
'P': 50,
|
693 |
'K': 350,
|
|
|
696 |
'S': 100
|
697 |
}
|
698 |
|
|
|
699 |
fertilizers_db = {
|
700 |
"Кальциевая селитра": {
|
701 |
"N (NO3-)": 0.118,
|
|
|
733 |
self.initial_n_profile = {}
|
734 |
|
735 |
def calculate(self, base_profile, total_n, n_ratio):
|
|
|
736 |
total_parts = n_ratio[0] + n_ratio[1]
|
737 |
no3 = total_n * (n_ratio[0] / total_parts)
|
738 |
nh4 = total_n * (n_ratio[1] / total_parts)
|
739 |
|
|
|
740 |
self.initial_n_profile = {
|
741 |
'N (NO3-)': round(no3, 1),
|
742 |
'N (NH4+)': round(nh4, 1)
|
743 |
}
|
744 |
|
|
|
745 |
self.final_profile = base_profile.copy()
|
746 |
self.final_profile['N (NO3-)'] = no3
|
747 |
self.final_profile['N (NH4+)'] = nh4
|
748 |
self.total_ppm = total_n + sum(base_profile.values())
|
749 |
|
750 |
+
# Расчёт удобрений
|
751 |
self._apply_magnesium_sulfate()
|
752 |
self._apply_calcium_nitrate()
|
753 |
self._apply_mkp()
|
|
|
842 |
return round(self.total_ppm / 700, 2)
|
843 |
|
844 |
def print_report(self):
|
845 |
+
print("\n" + "="*60)
|
846 |
+
print("ПРОФИЛЬ ПИТАТЕЛЬНОГО РАСТВОРА (ИТОГО):")
|
847 |
+
print("="*60)
|
848 |
+
table = [[el, round(val, 1)] for el, val in self.final_profile.items()]
|
849 |
+
print(tabulate(table, headers=["Элемент", "Остаток ppm"]))
|
850 |
+
|
851 |
+
print("\nИсходный расчёт азота:")
|
852 |
+
for form, value in self.initial_n_profile.items():
|
853 |
+
print(f" {form}: {value} ppm")
|
854 |
+
|
855 |
+
print("\n" + "="*60)
|
|
|
|
|
|
|
856 |
print(f"РАСЧЕТ ДЛЯ {self.volume} ЛИТРОВ РАСТВОРА")
|
857 |
+
print("="*60)
|
858 |
+
print(f"Общая концентрация: {self.total_ppm} ppm")
|
859 |
+
print(f"EC: {self.calculate_ec()} mS/cm")
|
860 |
|
861 |
print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ:")
|
862 |
+
fert_table = []
|
863 |
for fert, data in self.results.items():
|
864 |
+
details = [f"+{k}: {v} ppm" for k, v in data.items() if k.startswith('внесет')]
|
865 |
+
fert_table.append([
|
866 |
fert,
|
867 |
+
f"{data['граммы']} г",
|
868 |
f"{data['миллиграммы']} мг",
|
869 |
+
"\n".join(details)
|
870 |
])
|
871 |
+
print(tabulate(fert_table, headers=["Удобрение", "Граммы", "Миллиграммы", "Добавит"]))
|
872 |
|
873 |
print("\nОСТАТОЧНЫЙ ДЕФИЦИТ:")
|
874 |
deficit = {k: v for k, v in self.final_profile.items() if v > 0.1}
|
|
|
876 |
for el, val in deficit.items():
|
877 |
print(f" {el}: {round(val, 1)} ppm")
|
878 |
else:
|
879 |
+
print(" Все элементы покрыты полностью")
|
880 |
|
881 |
|
882 |
+
# Запуск
|
883 |
if __name__ == "__main__":
|
884 |
+
calc = NutrientCalculator(volume_liters=VOLUME_LITERS)
|
885 |
+
calc.calculate(TOMATO_PROFILE.copy(), TOTAL_NITROGEN, N_RATIO)
|
886 |
calc.print_report()
|
887 |
|
888 |
|
|
|
893 |
|
894 |
|
895 |
|
896 |
+
|
897 |
if __name__ == '__main__':
|
898 |
app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860)))
|