Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -680,6 +680,7 @@ def view_image():
|
|
680 |
|
681 |
|
682 |
|
|
|
683 |
|
684 |
TOMATO_PROFILE = {
|
685 |
'N (NO3-)': 200,
|
@@ -691,6 +692,17 @@ TOMATO_PROFILE = {
|
|
691 |
'S': 100
|
692 |
}
|
693 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
694 |
fertilizers_db = {
|
695 |
"Кальциевая селитра": {
|
696 |
"N (NO3-)": 0.118,
|
@@ -714,18 +726,19 @@ fertilizers_db = {
|
|
714 |
}
|
715 |
}
|
716 |
|
717 |
-
|
718 |
class NutrientCalculator:
|
719 |
def __init__(self, volume_liters=1.0):
|
720 |
self.volume = volume_liters
|
721 |
self.results = {}
|
|
|
722 |
|
723 |
def calculate(self, profile):
|
724 |
-
self.
|
725 |
-
self.
|
726 |
-
self.
|
727 |
-
self.
|
728 |
-
self.
|
|
|
729 |
return self.results
|
730 |
|
731 |
def _apply_fertilizer(self, fert_name, grams, additions):
|
@@ -735,59 +748,76 @@ class NutrientCalculator:
|
|
735 |
}
|
736 |
self.results[fert_name].update(additions)
|
737 |
|
738 |
-
def _apply_magnesium_sulfate(self
|
739 |
-
mg_need =
|
740 |
mg_content = fertilizers_db["Сульфат магния"]["Mg"]
|
741 |
grams = (mg_need * self.volume) / (mg_content * 1000)
|
742 |
added_s = grams * fertilizers_db["Сульфат магния"]["S"] * 1000 / self.volume
|
743 |
|
744 |
-
|
745 |
self._apply_fertilizer("Сульфат магния", grams, {'внесет S': round(added_s, 1)})
|
|
|
746 |
|
747 |
-
def _apply_calcium_nitrate(self
|
748 |
-
ca_need =
|
749 |
ca_content = fertilizers_db["Кальциевая селитра"]["Ca"]
|
750 |
grams = (ca_need * self.volume) / (ca_content * 1000)
|
751 |
added_n = grams * fertilizers_db["Кальциевая селитра"]["N (NO3-)"] * 1000 / self.volume
|
752 |
|
753 |
-
|
754 |
self._apply_fertilizer("Кальциевая селитра", grams, {'внесет NO3': round(added_n, 1)})
|
|
|
755 |
|
756 |
-
def _apply_mkp(self
|
757 |
-
p_need =
|
758 |
p_content = fertilizers_db["Монофосфат калия"]["P"]
|
759 |
grams = (p_need * self.volume) / (p_content * 1000)
|
760 |
added_k = grams * fertilizers_db["Монофосфат калия"]["K"] * 1000 / self.volume
|
761 |
|
762 |
-
|
763 |
self._apply_fertilizer("Монофосфат калия", grams, {'внесет K': round(added_k, 1)})
|
|
|
764 |
|
765 |
-
def _apply_potassium_nitrate(self
|
766 |
-
k_need =
|
767 |
if k_need <= 0:
|
768 |
return
|
769 |
k_content = fertilizers_db["Калий азотнокислый"]["K"]
|
770 |
grams = (k_need * self.volume) / (k_content * 1000)
|
771 |
added_n = grams * fertilizers_db["Калий азотнокислый"]["N (NO3-)"] * 1000 / self.volume
|
772 |
|
773 |
-
|
774 |
self._apply_fertilizer("Калий азотнокислый", grams, {'внесет NO3': round(added_n, 1)})
|
|
|
775 |
|
776 |
-
def _apply_ammonium_nitrate(self
|
777 |
-
nh4_need =
|
778 |
if nh4_need <= 0:
|
779 |
return
|
780 |
nh4_content = fertilizers_db["Аммоний азотнокислый"]["N (NH4+)"]
|
781 |
grams = (nh4_need * self.volume) / (nh4_content * 1000)
|
782 |
added_n = grams * fertilizers_db["Аммоний азотнокислый"]["N (NO3-)"] * 1000 / self.volume
|
783 |
|
784 |
-
|
785 |
self._apply_fertilizer("Аммоний азотнокислый", grams, {'внесет NO3': round(added_n, 1)})
|
786 |
-
|
787 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
788 |
print("=" * 50)
|
789 |
print(f"РАСЧЕТ ДЛЯ {self.volume} ЛИТРОВ РАСТВОРА")
|
790 |
print("=" * 50)
|
|
|
|
|
791 |
|
792 |
print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ:")
|
793 |
for fert, data in self.results.items():
|
@@ -797,15 +827,19 @@ class NutrientCalculator:
|
|
797 |
print(f" ➕ {k}: {v} ppm")
|
798 |
|
799 |
print("\nОСТАТОЧНЫЙ ДЕФИЦИТ:")
|
800 |
-
|
|
|
801 |
if val > 0.1:
|
802 |
print(f" 🔸 {el}: {round(val, 1)} ppm")
|
|
|
|
|
|
|
803 |
|
804 |
|
805 |
# Пример использования
|
806 |
calc = NutrientCalculator(volume_liters=10)
|
807 |
results = calc.calculate(TOMATO_PROFILE.copy())
|
808 |
-
calc.print_report(
|
809 |
|
810 |
|
811 |
|
|
|
680 |
|
681 |
|
682 |
|
683 |
+
from tabulate import tabulate
|
684 |
|
685 |
TOMATO_PROFILE = {
|
686 |
'N (NO3-)': 200,
|
|
|
692 |
'S': 100
|
693 |
}
|
694 |
|
695 |
+
# Коэффициенты для перевода ppm в mS/cm (примерные)
|
696 |
+
EC_FACTORS = {
|
697 |
+
'N (NO3-)': 0.71,
|
698 |
+
'N (NH4+)': 0.71,
|
699 |
+
'P': 0.51,
|
700 |
+
'K': 0.50,
|
701 |
+
'Mg': 0.39,
|
702 |
+
'Ca': 0.40,
|
703 |
+
'S': 0.43
|
704 |
+
}
|
705 |
+
|
706 |
fertilizers_db = {
|
707 |
"Кальциевая селитра": {
|
708 |
"N (NO3-)": 0.118,
|
|
|
726 |
}
|
727 |
}
|
728 |
|
|
|
729 |
class NutrientCalculator:
|
730 |
def __init__(self, volume_liters=1.0):
|
731 |
self.volume = volume_liters
|
732 |
self.results = {}
|
733 |
+
self.final_profile = {}
|
734 |
|
735 |
def calculate(self, profile):
|
736 |
+
self.final_profile = profile.copy()
|
737 |
+
self._apply_magnesium_sulfate()
|
738 |
+
self._apply_calcium_nitrate()
|
739 |
+
self._apply_mkp()
|
740 |
+
self._apply_potassium_nitrate()
|
741 |
+
self._apply_ammonium_nitrate()
|
742 |
return self.results
|
743 |
|
744 |
def _apply_fertilizer(self, fert_name, grams, additions):
|
|
|
748 |
}
|
749 |
self.results[fert_name].update(additions)
|
750 |
|
751 |
+
def _apply_magnesium_sulfate(self):
|
752 |
+
mg_need = self.final_profile['Mg']
|
753 |
mg_content = fertilizers_db["Сульфат магния"]["Mg"]
|
754 |
grams = (mg_need * self.volume) / (mg_content * 1000)
|
755 |
added_s = grams * fertilizers_db["Сульфат магния"]["S"] * 1000 / self.volume
|
756 |
|
757 |
+
self.final_profile['S'] -= added_s
|
758 |
self._apply_fertilizer("Сульфат магния", grams, {'внесет S': round(added_s, 1)})
|
759 |
+
self.final_profile['Mg'] = 0
|
760 |
|
761 |
+
def _apply_calcium_nitrate(self):
|
762 |
+
ca_need = self.final_profile['Ca']
|
763 |
ca_content = fertilizers_db["Кальциевая селитра"]["Ca"]
|
764 |
grams = (ca_need * self.volume) / (ca_content * 1000)
|
765 |
added_n = grams * fertilizers_db["Кальциевая селитра"]["N (NO3-)"] * 1000 / self.volume
|
766 |
|
767 |
+
self.final_profile['N (NO3-)'] -= added_n
|
768 |
self._apply_fertilizer("Кальциевая селитра", grams, {'внесет NO3': round(added_n, 1)})
|
769 |
+
self.final_profile['Ca'] = 0
|
770 |
|
771 |
+
def _apply_mkp(self):
|
772 |
+
p_need = self.final_profile['P']
|
773 |
p_content = fertilizers_db["Монофосфат калия"]["P"]
|
774 |
grams = (p_need * self.volume) / (p_content * 1000)
|
775 |
added_k = grams * fertilizers_db["Монофосфат калия"]["K"] * 1000 / self.volume
|
776 |
|
777 |
+
self.final_profile['K'] -= added_k
|
778 |
self._apply_fertilizer("Монофосфат калия", grams, {'внесет K': round(added_k, 1)})
|
779 |
+
self.final_profile['P'] = 0
|
780 |
|
781 |
+
def _apply_potassium_nitrate(self):
|
782 |
+
k_need = self.final_profile['K']
|
783 |
if k_need <= 0:
|
784 |
return
|
785 |
k_content = fertilizers_db["Калий азотнокислый"]["K"]
|
786 |
grams = (k_need * self.volume) / (k_content * 1000)
|
787 |
added_n = grams * fertilizers_db["Калий азотнокислый"]["N (NO3-)"] * 1000 / self.volume
|
788 |
|
789 |
+
self.final_profile['N (NO3-)'] -= added_n
|
790 |
self._apply_fertilizer("Калий азотнокислый", grams, {'внесет NO3': round(added_n, 1)})
|
791 |
+
self.final_profile['K'] = 0
|
792 |
|
793 |
+
def _apply_ammonium_nitrate(self):
|
794 |
+
nh4_need = self.final_profile['N (NH4+)']
|
795 |
if nh4_need <= 0:
|
796 |
return
|
797 |
nh4_content = fertilizers_db["Аммоний азотнокислый"]["N (NH4+)"]
|
798 |
grams = (nh4_need * self.volume) / (nh4_content * 1000)
|
799 |
added_n = grams * fertilizers_db["Аммоний азотнокислый"]["N (NO3-)"] * 1000 / self.volume
|
800 |
|
801 |
+
self.final_profile['N (NO3-)'] -= added_n
|
802 |
self._apply_fertilizer("Аммоний азотнокислый", grams, {'внесет NO3': round(added_n, 1)})
|
803 |
+
self.final_profile['N (NH4+)'] = 0
|
804 |
+
|
805 |
+
def calculate_ec(self):
|
806 |
+
"""Расчет электропроводимости (EC) в mS/cm"""
|
807 |
+
total_ec = 0.0
|
808 |
+
for element, concentration in TOMATO_PROFILE.items():
|
809 |
+
if element in EC_FACTORS:
|
810 |
+
total_ec += concentration * EC_FACTORS[element] / 1000
|
811 |
+
return round(total_ec, 2)
|
812 |
+
|
813 |
+
def print_report(self):
|
814 |
+
ec_value = self.calculate_ec()
|
815 |
+
|
816 |
print("=" * 50)
|
817 |
print(f"РАСЧЕТ ДЛЯ {self.volume} ЛИТРОВ РАСТВОРА")
|
818 |
print("=" * 50)
|
819 |
+
|
820 |
+
print(f"\nРАСЧЕТНАЯ ЭЛЕКТРОПРОВОДИМОСТЬ (EC): {ec_value} mS/cm")
|
821 |
|
822 |
print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ:")
|
823 |
for fert, data in self.results.items():
|
|
|
827 |
print(f" ➕ {k}: {v} ppm")
|
828 |
|
829 |
print("\nОСТАТОЧНЫЙ ДЕФИЦИТ:")
|
830 |
+
deficit_found = False
|
831 |
+
for el, val in self.final_profile.items():
|
832 |
if val > 0.1:
|
833 |
print(f" 🔸 {el}: {round(val, 1)} ppm")
|
834 |
+
deficit_found = True
|
835 |
+
if not deficit_found:
|
836 |
+
print(" Все элементы полностью покрыты удобрениями")
|
837 |
|
838 |
|
839 |
# Пример использования
|
840 |
calc = NutrientCalculator(volume_liters=10)
|
841 |
results = calc.calculate(TOMATO_PROFILE.copy())
|
842 |
+
calc.print_report()
|
843 |
|
844 |
|
845 |
|