Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -680,9 +680,9 @@ from tabulate import tabulate
|
|
680 |
|
681 |
# Константы
|
682 |
TOTAL_NITROGEN = 125.000
|
683 |
-
NO3_RATIO =
|
684 |
NH4_RATIO = 1.00
|
685 |
-
VOLUME_LITERS =
|
686 |
|
687 |
# Коэффициенты электропроводности
|
688 |
EC_COEFFICIENTS = {
|
@@ -703,9 +703,10 @@ NUTRIENT_CONTENT_IN_FERTILIZERS = {
|
|
703 |
"Калий азотнокислый": {"N (NO3-)": 0.136, "K": 0.382},
|
704 |
"Калий сернокислый": {"K": 0.44874, "S": 0.18401},
|
705 |
"Аммоний азотнокислый": {"N (NO3-)": 0.17499, "N (NH4+)": 0.17499},
|
706 |
-
"Сульфат магния": {"Mg": 0.09861, "S": 0.13010}, #
|
707 |
"Монофосфат калия": {"P": 0.218, "K": 0.275}
|
708 |
}
|
|
|
709 |
class NutrientCalculator:
|
710 |
def __init__(self, volume_liters=1.0):
|
711 |
self.volume = volume_liters
|
@@ -734,19 +735,23 @@ class NutrientCalculator:
|
|
734 |
|
735 |
def calculate(self):
|
736 |
try:
|
|
|
737 |
self._apply("Сульфат магния", "Mg", self.target_profile['Mg'])
|
738 |
self._apply("Кальциевая селитра", "Ca", self.target_profile['Ca'])
|
739 |
self._apply("Монофосфат калия", "P", self.target_profile['P'])
|
740 |
self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
|
741 |
|
|
|
742 |
current_no3 = self.actual_profile['N (NO3-)']
|
743 |
no3_needed = self.target_profile['N (NO3-)'] - current_no3
|
744 |
|
745 |
if no3_needed > 0.1:
|
746 |
self._apply("Калий азотнокислый", "N (NO3-)", no3_needed)
|
747 |
|
|
|
748 |
self._apply_k_sulfate()
|
749 |
|
|
|
750 |
k_deficit = self.target_profile['K'] - self.actual_profile['K']
|
751 |
if k_deficit > 0.1:
|
752 |
self._apply("Калий азотнокислый", "K", k_deficit)
|
@@ -762,7 +767,7 @@ class NutrientCalculator:
|
|
762 |
|
763 |
try:
|
764 |
content = self.fertilizers[fert_name][main_element]
|
765 |
-
grams = required_ppm * self.volume / (content * 1000)
|
766 |
|
767 |
if fert_name not in self.results:
|
768 |
result = {
|
@@ -779,10 +784,10 @@ class NutrientCalculator:
|
|
779 |
|
780 |
fert_ec = 0.0
|
781 |
for element, percent in self.fertilizers[fert_name].items():
|
782 |
-
added_ppm = grams * percent * 1000 / self.volume
|
783 |
self.results[fert_name][f'внесет {self._label(element)}'] += added_ppm
|
784 |
self.actual_profile[element] += added_ppm
|
785 |
-
fert_ec += added_ppm * EC_COEFFICIENTS.get(element, 0.0015)
|
786 |
|
787 |
self.results[fert_name]['вклад в EC'] += fert_ec
|
788 |
self.total_ec += fert_ec
|
@@ -799,19 +804,20 @@ class NutrientCalculator:
|
|
799 |
return
|
800 |
|
801 |
try:
|
|
|
802 |
if s_def > 0.1:
|
803 |
s_content = self.fertilizers[fert]["S"]
|
804 |
-
|
805 |
|
|
|
806 |
k_content = self.fertilizers[fert]["K"]
|
807 |
-
|
|
|
|
|
|
|
|
|
808 |
|
809 |
-
|
810 |
-
grams = k_def * self.volume / (k_content * 1000)
|
811 |
-
else:
|
812 |
-
grams = grams_s
|
813 |
-
|
814 |
-
self._apply(fert, "S", s_def)
|
815 |
except Exception as e:
|
816 |
print(f"Ошибка при расчёте сульфата калия: {str(e)}")
|
817 |
raise
|
@@ -834,7 +840,7 @@ class NutrientCalculator:
|
|
834 |
print("\n" + "="*60)
|
835 |
print(f"РАСЧЕТ ДЛЯ {self.volume} ЛИТРОВ РАСТВОРА")
|
836 |
print("="*60)
|
837 |
-
print(f"Общая концентрация: {round(sum(self.actual_profile.values()), 1
|
838 |
print(f"EC: {self.calculate_ec()} mS/cm")
|
839 |
|
840 |
print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ:")
|
|
|
680 |
|
681 |
# Константы
|
682 |
TOTAL_NITROGEN = 125.000
|
683 |
+
NO3_RATIO = 8.84
|
684 |
NH4_RATIO = 1.00
|
685 |
+
VOLUME_LITERS = 100
|
686 |
|
687 |
# Коэффициенты электропроводности
|
688 |
EC_COEFFICIENTS = {
|
|
|
703 |
"Калий азотнокислый": {"N (NO3-)": 0.136, "K": 0.382},
|
704 |
"Калий сернокислый": {"K": 0.44874, "S": 0.18401},
|
705 |
"Аммоний азотнокислый": {"N (NO3-)": 0.17499, "N (NH4+)": 0.17499},
|
706 |
+
"Сульфат магния": {"Mg": 0.09861, "S": 0.13010}, # Исправлено содержание Mg
|
707 |
"Монофосфат калия": {"P": 0.218, "K": 0.275}
|
708 |
}
|
709 |
+
|
710 |
class NutrientCalculator:
|
711 |
def __init__(self, volume_liters=1.0):
|
712 |
self.volume = volume_liters
|
|
|
735 |
|
736 |
def calculate(self):
|
737 |
try:
|
738 |
+
# Применяем удобрения в правильном порядке
|
739 |
self._apply("Сульфат магния", "Mg", self.target_profile['Mg'])
|
740 |
self._apply("Кальциевая селитра", "Ca", self.target_profile['Ca'])
|
741 |
self._apply("Монофосфат калия", "P", self.target_profile['P'])
|
742 |
self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
|
743 |
|
744 |
+
# Восполняем дефицит NO3-
|
745 |
current_no3 = self.actual_profile['N (NO3-)']
|
746 |
no3_needed = self.target_profile['N (NO3-)'] - current_no3
|
747 |
|
748 |
if no3_needed > 0.1:
|
749 |
self._apply("Калий азотнокислый", "N (NO3-)", no3_needed)
|
750 |
|
751 |
+
# Восполняем дефицит S и K
|
752 |
self._apply_k_sulfate()
|
753 |
|
754 |
+
# Восполняем оставшийся дефицит K
|
755 |
k_deficit = self.target_profile['K'] - self.actual_profile['K']
|
756 |
if k_deficit > 0.1:
|
757 |
self._apply("Калий азотнокислый", "K", k_deficit)
|
|
|
767 |
|
768 |
try:
|
769 |
content = self.fertilizers[fert_name][main_element]
|
770 |
+
grams = (required_ppm * self.volume) / (content * 1000)
|
771 |
|
772 |
if fert_name not in self.results:
|
773 |
result = {
|
|
|
784 |
|
785 |
fert_ec = 0.0
|
786 |
for element, percent in self.fertilizers[fert_name].items():
|
787 |
+
added_ppm = (grams * percent * 1000) / self.volume
|
788 |
self.results[fert_name][f'внесет {self._label(element)}'] += added_ppm
|
789 |
self.actual_profile[element] += added_ppm
|
790 |
+
fert_ec += added_ppm * EC_COEFFICIENTS.get(element, 0.0015)
|
791 |
|
792 |
self.results[fert_name]['вклад в EC'] += fert_ec
|
793 |
self.total_ec += fert_ec
|
|
|
804 |
return
|
805 |
|
806 |
try:
|
807 |
+
# Рассчитываем сколько нужно внести для покрытия дефицита S
|
808 |
if s_def > 0.1:
|
809 |
s_content = self.fertilizers[fert]["S"]
|
810 |
+
grams_needed = (s_def * self.volume) / (s_content * 1000)
|
811 |
|
812 |
+
# Проверяем, не приведет ли это к избытку K
|
813 |
k_content = self.fertilizers[fert]["K"]
|
814 |
+
k_added = (grams_needed * k_content * 1000) / self.volume
|
815 |
+
|
816 |
+
if k_added > k_def and k_def > 0:
|
817 |
+
# Если добавляем слишком много K, уменьшаем количество
|
818 |
+
grams_needed = (k_def * self.volume) / (k_content * 1000)
|
819 |
|
820 |
+
self._apply(fert, "S", (grams_needed * s_content * 1000) / self.volume)
|
|
|
|
|
|
|
|
|
|
|
821 |
except Exception as e:
|
822 |
print(f"Ошибка при расчёте сульфата калия: {str(e)}")
|
823 |
raise
|
|
|
840 |
print("\n" + "="*60)
|
841 |
print(f"РАСЧЕТ ДЛЯ {self.volume} ЛИТРОВ РАСТВОРА")
|
842 |
print("="*60)
|
843 |
+
print(f"Общая концентрация: {round(sum(self.actual_profile.values()), 1} ppm")
|
844 |
print(f"EC: {self.calculate_ec()} mS/cm")
|
845 |
|
846 |
print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ:")
|