Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -702,7 +702,7 @@ BASE_PROFILE = {
|
|
702 |
'N (NH4+)': 0
|
703 |
}
|
704 |
|
705 |
-
# Полная база всех
|
706 |
ALL_FERTILIZERS = {
|
707 |
"Кальциевая селитра": {
|
708 |
"N (NO3-)": 0.118, "Ca": 0.169
|
@@ -728,28 +728,16 @@ ALL_FERTILIZERS = {
|
|
728 |
}
|
729 |
|
730 |
class NutrientCalculator:
|
731 |
-
def __init__(self, volume_liters=1.0
|
732 |
self.volume = volume_liters
|
733 |
self.results = {}
|
734 |
self.final_profile = BASE_PROFILE.copy()
|
735 |
self.total_ppm = sum(BASE_PROFILE.values()) + TOTAL_NITROGEN
|
736 |
self.initial_n_profile = {}
|
737 |
-
|
738 |
-
# Формируем активные удобрения
|
739 |
-
self.fertilizers_db = {
|
740 |
-
"Кальциевая селитра": ALL_FERTILIZERS["Кальциевая селитра"],
|
741 |
-
"Аммоний азотнокислый": ALL_FERTILIZERS["Аммоний азотнокислый"],
|
742 |
-
"Сульфат магния": ALL_FERTILIZERS["Сульфат магния"],
|
743 |
-
"Калий фосфорнокислый": ALL_FERTILIZERS["Калий фосфорнокислый"]
|
744 |
-
}
|
745 |
-
|
746 |
-
if use_k2so4:
|
747 |
-
self.fertilizers_db["Калий сернокислый"] = ALL_FERTILIZERS["Калий сернокислый"]
|
748 |
-
if use_kno3:
|
749 |
-
self.fertilizers_db["Калий азотнокислый"] = ALL_FERTILIZERS["Калий азотнокислый"]
|
750 |
|
751 |
def calculate(self, total_n, no3_ratio, nh4_ratio):
|
752 |
-
#
|
753 |
total_parts = no3_ratio + nh4_ratio
|
754 |
no3 = total_n * (no3_ratio / total_parts)
|
755 |
nh4 = total_n * (nh4_ratio / total_parts)
|
@@ -759,16 +747,17 @@ class NutrientCalculator:
|
|
759 |
'N (NH4+)': round(nh4, 1)
|
760 |
}
|
761 |
|
762 |
-
#
|
763 |
self.final_profile['N (NO3-)'] = no3
|
764 |
self.final_profile['N (NH4+)'] = nh4
|
765 |
|
766 |
-
#
|
767 |
self._apply_magnesium_sulfate()
|
768 |
self._apply_calcium_nitrate()
|
769 |
self._apply_potassium_phosphate()
|
770 |
self._apply_ammonium_nitrate()
|
771 |
-
self.
|
|
|
772 |
|
773 |
# Корректируем отрицательные значения
|
774 |
self._adjust_negative_values()
|
@@ -783,7 +772,6 @@ class NutrientCalculator:
|
|
783 |
self.results[fert_name].update(additions)
|
784 |
|
785 |
def _adjust_negative_values(self):
|
786 |
-
# Корректируем отрицательные значения до 0
|
787 |
for element in self.final_profile:
|
788 |
if self.final_profile[element] < 0:
|
789 |
self.final_profile[element] = 0
|
@@ -827,39 +815,6 @@ class NutrientCalculator:
|
|
827 |
self._apply_fertilizer("Калий фосфорнокислый", grams, {'внесет K': round(added_k, 1)})
|
828 |
self.final_profile['P'] = 0
|
829 |
|
830 |
-
def _apply_potassium_fertilizers(self):
|
831 |
-
k_need = self.final_profile['K']
|
832 |
-
if k_need <= 0:
|
833 |
-
return
|
834 |
-
|
835 |
-
# Сначала используем калий сернокислый (если доступен)
|
836 |
-
if "Калий сернокислый" in self.fertilizers_db:
|
837 |
-
s_deficit = self.final_profile['S']
|
838 |
-
k2so4_grams = (k_need * self.volume) / (self.fertilizers_db["Калий сернокислый"]["K"] * 1000)
|
839 |
-
added_s = k2so4_grams * self.fertilizers_db["Калий сернокислый"]["S"] * 1000 / self.volume
|
840 |
-
|
841 |
-
if s_deficit > 0 and added_s <= s_deficit:
|
842 |
-
self._apply_fertilizer("Калий сернокислый", k2so4_grams, {
|
843 |
-
'внесет K': round(k_need, 2),
|
844 |
-
'внесет S': round(added_s, 2)
|
845 |
-
})
|
846 |
-
self.final_profile['K'] = 0
|
847 |
-
self.final_profile['S'] -= added_s
|
848 |
-
return
|
849 |
-
|
850 |
-
# Если остался калий, используем калий азотнокислый
|
851 |
-
if k_need > 0 and "Калий азотнокислый" in self.fertilizers_db:
|
852 |
-
kno3_grams = (k_need * self.volume) / (self.fertilizers_db["Калий азотнокислый"]["K"] * 1000)
|
853 |
-
added_n = kno3_grams * self.fertilizers_db["Калий азотнокислый"]["N (NO3-)"] * 1000 / self.volume
|
854 |
-
|
855 |
-
self._apply_fertilizer(
|
856 |
-
"Калий азотнокислый",
|
857 |
-
kno3_grams,
|
858 |
-
{'внесет NO3': round(added_n, 2)}
|
859 |
-
)
|
860 |
-
self.final_profile['K'] = 0
|
861 |
-
self.final_profile['N (NO3-)'] -= added_n
|
862 |
-
|
863 |
def _apply_ammonium_nitrate(self):
|
864 |
nh4_need = self.final_profile['N (NH4+)']
|
865 |
if nh4_need <= 0:
|
@@ -873,6 +828,44 @@ class NutrientCalculator:
|
|
873 |
self._apply_fertilizer("Аммоний азотнокислый", grams, {'внесет NO3': round(added_n, 1)})
|
874 |
self.final_profile['N (NH4+)'] = 0
|
875 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
876 |
def calculate_ec(self):
|
877 |
return round(self.total_ppm / 700, 2)
|
878 |
|
@@ -915,11 +908,9 @@ class NutrientCalculator:
|
|
915 |
|
916 |
# Пример использования
|
917 |
if __name__ == "__main__":
|
918 |
-
|
919 |
-
|
920 |
-
|
921 |
-
calc_with_kno3.print_report()
|
922 |
-
|
923 |
|
924 |
|
925 |
|
|
|
702 |
'N (NH4+)': 0
|
703 |
}
|
704 |
|
705 |
+
# Полная база всех удобрений (7 удобрений)
|
706 |
ALL_FERTILIZERS = {
|
707 |
"Кальциевая селитра": {
|
708 |
"N (NO3-)": 0.118, "Ca": 0.169
|
|
|
728 |
}
|
729 |
|
730 |
class NutrientCalculator:
|
731 |
+
def __init__(self, volume_liters=1.0):
|
732 |
self.volume = volume_liters
|
733 |
self.results = {}
|
734 |
self.final_profile = BASE_PROFILE.copy()
|
735 |
self.total_ppm = sum(BASE_PROFILE.values()) + TOTAL_NITROGEN
|
736 |
self.initial_n_profile = {}
|
737 |
+
self.fertilizers_db = ALL_FERTILIZERS
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
738 |
|
739 |
def calculate(self, total_n, no3_ratio, nh4_ratio):
|
740 |
+
# 1. Сначала рассчитываем баланс азота
|
741 |
total_parts = no3_ratio + nh4_ratio
|
742 |
no3 = total_n * (no3_ratio / total_parts)
|
743 |
nh4 = total_n * (nh4_ratio / total_parts)
|
|
|
747 |
'N (NH4+)': round(nh4, 1)
|
748 |
}
|
749 |
|
750 |
+
# Записываем азот в профиль
|
751 |
self.final_profile['N (NO3-)'] = no3
|
752 |
self.final_profile['N (NH4+)'] = nh4
|
753 |
|
754 |
+
# 2. Вносим удобрения в правильном порядке
|
755 |
self._apply_magnesium_sulfate()
|
756 |
self._apply_calcium_nitrate()
|
757 |
self._apply_potassium_phosphate()
|
758 |
self._apply_ammonium_nitrate()
|
759 |
+
self._apply_potassium_sulfate()
|
760 |
+
self._apply_potassium_nitrate()
|
761 |
|
762 |
# Корректируем отрицательные значения
|
763 |
self._adjust_negative_values()
|
|
|
772 |
self.results[fert_name].update(additions)
|
773 |
|
774 |
def _adjust_negative_values(self):
|
|
|
775 |
for element in self.final_profile:
|
776 |
if self.final_profile[element] < 0:
|
777 |
self.final_profile[element] = 0
|
|
|
815 |
self._apply_fertilizer("Калий фосфорнокислый", grams, {'внесет K': round(added_k, 1)})
|
816 |
self.final_profile['P'] = 0
|
817 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
818 |
def _apply_ammonium_nitrate(self):
|
819 |
nh4_need = self.final_profile['N (NH4+)']
|
820 |
if nh4_need <= 0:
|
|
|
828 |
self._apply_fertilizer("Аммоний азотнокислый", grams, {'внесет NO3': round(added_n, 1)})
|
829 |
self.final_profile['N (NH4+)'] = 0
|
830 |
|
831 |
+
def _apply_potassium_sulfate(self):
|
832 |
+
k_need = self.final_profile['K']
|
833 |
+
s_need = self.final_profile['S']
|
834 |
+
|
835 |
+
if k_need <= 0 or s_need <= 0:
|
836 |
+
return
|
837 |
+
|
838 |
+
k_content = self.fertilizers_db["Калий сернокислый"]["K"]
|
839 |
+
s_content = self.fertilizers_db["Калий сернокислый"]["S"]
|
840 |
+
|
841 |
+
# Рассчитываем сколько можем внести по калию и сере
|
842 |
+
grams_by_k = (k_need * self.volume) / (k_content * 1000)
|
843 |
+
grams_by_s = (s_need * self.volume) / (s_content * 1000)
|
844 |
+
grams = min(grams_by_k, grams_by_s)
|
845 |
+
|
846 |
+
added_k = grams * k_content * 1000 / self.volume
|
847 |
+
added_s = grams * s_content * 1000 / self.volume
|
848 |
+
|
849 |
+
self.final_profile['K'] -= added_k
|
850 |
+
self.final_profile['S'] -= added_s
|
851 |
+
self._apply_fertilizer("Калий сернокислый", grams, {
|
852 |
+
'внесет K': round(added_k, 2),
|
853 |
+
'внесет S': round(added_s, 2)
|
854 |
+
})
|
855 |
+
|
856 |
+
def _apply_potassium_nitrate(self):
|
857 |
+
k_need = self.final_profile['K']
|
858 |
+
if k_need <= 0:
|
859 |
+
return
|
860 |
+
|
861 |
+
k_content = self.fertilizers_db["Калий азотнокислый"]["K"]
|
862 |
+
grams = (k_need * self.volume) / (k_content * 1000)
|
863 |
+
added_n = grams * self.fertilizers_db["Калий азотнокислый"]["N (NO3-)"] * 1000 / self.volume
|
864 |
+
|
865 |
+
self.final_profile['K'] = 0
|
866 |
+
self.final_profile['N (NO3-)'] -= added_n
|
867 |
+
self._apply_fertilizer("Калий азотнокислый", grams, {'внесет NO3': round(added_n, 2)})
|
868 |
+
|
869 |
def calculate_ec(self):
|
870 |
return round(self.total_ppm / 700, 2)
|
871 |
|
|
|
908 |
|
909 |
# Пример использования
|
910 |
if __name__ == "__main__":
|
911 |
+
calculator = NutrientCalculator(volume_liters=10)
|
912 |
+
calculator.calculate(TOTAL_NITROGEN, NO3_RATIO, NH4_RATIO)
|
913 |
+
calculator.print_report()
|
|
|
|
|
914 |
|
915 |
|
916 |
|