Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -692,41 +692,41 @@ class NutrientCalculator:
|
|
692 |
self.results = {}
|
693 |
self.target_profile = {
|
694 |
'P': 0, 'K': 0, 'Mg': 0, 'Ca': 0, 'S': 0,
|
695 |
-
'
|
696 |
}
|
697 |
self.actual_profile = {
|
698 |
'P': 0.0, 'K': 0.0, 'Mg': 0.0, 'Ca': 0.0, 'S': 0.0,
|
699 |
-
'
|
700 |
}
|
701 |
self.fertilizers = {}
|
702 |
self.total_ec = 0.0
|
703 |
|
704 |
def set_target_profile(self, profile_data):
|
705 |
-
"""Устанавливаем целевые значения
|
706 |
self.target_profile.update({
|
707 |
'P': float(profile_data.get('P', 0)),
|
708 |
'K': float(profile_data.get('K', 0)),
|
709 |
'Mg': float(profile_data.get('Mg', 0)),
|
710 |
'Ca': float(profile_data.get('Ca', 0)),
|
711 |
'S': float(profile_data.get('S', 0)),
|
712 |
-
'
|
713 |
-
'
|
714 |
})
|
715 |
|
716 |
def set_fertilizers(self, fertilizers_data):
|
717 |
-
"""Устанавливаем состав удобрений
|
718 |
self.fertilizers = {
|
719 |
"Кальциевая селитра": {
|
720 |
-
"
|
721 |
"Ca": float(fertilizers_data["Кальциевая селитра"]["Ca"])
|
722 |
},
|
723 |
"Калий азотнокислый": {
|
724 |
-
"
|
725 |
"K": float(fertilizers_data["Калий азотнокислый"]["K"])
|
726 |
},
|
727 |
"Аммоний азотнокислый": {
|
728 |
-
"
|
729 |
-
"
|
730 |
},
|
731 |
"Сульфат магния": {
|
732 |
"Mg": float(fertilizers_data["Сульфат магния"]["Mg"]),
|
@@ -743,31 +743,32 @@ class NutrientCalculator:
|
|
743 |
}
|
744 |
|
745 |
def calculate(self):
|
746 |
-
"""
|
747 |
try:
|
748 |
# 1. Вносим сульфат магния (Mg + S)
|
749 |
self._apply_fertilizer("Сульфат магния", "Mg")
|
750 |
|
751 |
-
# 2. Вносим
|
752 |
-
self._apply_fertilizer("Кальциевая селитра", "Ca")
|
753 |
-
|
754 |
-
# 3. Вносим монофосфат калия (P + K)
|
755 |
self._apply_fertilizer("Монофосфат калия", "P")
|
756 |
|
757 |
-
#
|
758 |
-
self._apply_fertilizer("Аммоний азотнокислый", "
|
759 |
|
760 |
-
#
|
761 |
-
|
762 |
-
if
|
763 |
-
self._apply_fertilizer("
|
764 |
|
765 |
-
#
|
766 |
k_deficit = self.target_profile['K'] - self.actual_profile['K']
|
767 |
if k_deficit > 0.1:
|
768 |
-
|
|
|
|
|
|
|
|
|
769 |
|
770 |
-
#
|
771 |
s_deficit = self.target_profile['S'] - self.actual_profile['S']
|
772 |
if s_deficit > 0.1:
|
773 |
self._apply_fertilizer("Калий сернокислый", "S", s_deficit)
|
@@ -778,7 +779,7 @@ class NutrientCalculator:
|
|
778 |
return False
|
779 |
|
780 |
def _apply_fertilizer(self, name, main_element, required_ppm=None):
|
781 |
-
"""Метод внесения удобрений
|
782 |
if required_ppm is None:
|
783 |
required_ppm = self.target_profile[main_element] - self.actual_profile[main_element]
|
784 |
|
@@ -789,6 +790,12 @@ class NutrientCalculator:
|
|
789 |
if content <= 0:
|
790 |
return
|
791 |
|
|
|
|
|
|
|
|
|
|
|
|
|
792 |
grams = (required_ppm * self.volume) / (content * 1000)
|
793 |
|
794 |
# Запись результатов
|
@@ -807,7 +814,7 @@ class NutrientCalculator:
|
|
807 |
ec_coefficients = {
|
808 |
'P': 0.0012, 'K': 0.0018, 'Mg': 0.0015,
|
809 |
'Ca': 0.0016, 'S': 0.0014,
|
810 |
-
'
|
811 |
}
|
812 |
self.total_ec += sum(
|
813 |
added_ppm * ec_coefficients.get(element, 0.0015)
|
@@ -815,7 +822,7 @@ class NutrientCalculator:
|
|
815 |
)
|
816 |
|
817 |
def get_results(self):
|
818 |
-
"""Форматирование результатов
|
819 |
return {
|
820 |
'fertilizers': [
|
821 |
{
|
@@ -826,13 +833,14 @@ class NutrientCalculator:
|
|
826 |
],
|
827 |
'profile': [
|
828 |
{
|
829 |
-
'element':
|
830 |
'ppm': round(v, 3)
|
831 |
} for k, v in self.actual_profile.items()
|
832 |
],
|
833 |
'ec': round(self.total_ec, 2),
|
834 |
'deficits': {
|
835 |
-
|
|
|
836 |
for k in self.target_profile
|
837 |
}
|
838 |
}
|
@@ -894,6 +902,5 @@ def handle_calculation():
|
|
894 |
|
895 |
|
896 |
|
897 |
-
|
898 |
if __name__ == '__main__':
|
899 |
app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860)))
|
|
|
692 |
self.results = {}
|
693 |
self.target_profile = {
|
694 |
'P': 0, 'K': 0, 'Mg': 0, 'Ca': 0, 'S': 0,
|
695 |
+
'NO3': 0, 'NH4': 0 # Изменил ключи на NO3/NH4 без скобок
|
696 |
}
|
697 |
self.actual_profile = {
|
698 |
'P': 0.0, 'K': 0.0, 'Mg': 0.0, 'Ca': 0.0, 'S': 0.0,
|
699 |
+
'NO3': 0.0, 'NH4': 0.0
|
700 |
}
|
701 |
self.fertilizers = {}
|
702 |
self.total_ec = 0.0
|
703 |
|
704 |
def set_target_profile(self, profile_data):
|
705 |
+
"""Устанавливаем целевые значения с преобразованием ключей"""
|
706 |
self.target_profile.update({
|
707 |
'P': float(profile_data.get('P', 0)),
|
708 |
'K': float(profile_data.get('K', 0)),
|
709 |
'Mg': float(profile_data.get('Mg', 0)),
|
710 |
'Ca': float(profile_data.get('Ca', 0)),
|
711 |
'S': float(profile_data.get('S', 0)),
|
712 |
+
'NO3': float(profile_data.get('N (NO3-)', 0)), # Преобразуем ключ
|
713 |
+
'NH4': float(profile_data.get('N (NH4+)', 0)) # Преобразуем ключ
|
714 |
})
|
715 |
|
716 |
def set_fertilizers(self, fertilizers_data):
|
717 |
+
"""Устанавливаем состав удобрений с преобразованием ключей"""
|
718 |
self.fertilizers = {
|
719 |
"Кальциевая селитра": {
|
720 |
+
"NO3": float(fertilizers_data["Кальциевая селитра"]["N (NO3-)"]),
|
721 |
"Ca": float(fertilizers_data["Кальциевая селитра"]["Ca"])
|
722 |
},
|
723 |
"Калий азотнокислый": {
|
724 |
+
"NO3": float(fertilizers_data["Калий азотнокислый"]["N (NO3-)"]),
|
725 |
"K": float(fertilizers_data["Калий азотнокислый"]["K"])
|
726 |
},
|
727 |
"Аммоний азотнокислый": {
|
728 |
+
"NO3": float(fertilizers_data["Аммоний азотнокислый"]["N (NO3-)"]),
|
729 |
+
"NH4": float(fertilizers_data["Аммоний азотнокислый"]["N (NH4+)"])
|
730 |
},
|
731 |
"Сульфат магния": {
|
732 |
"Mg": float(fertilizers_data["Сульфат магния"]["Mg"]),
|
|
|
743 |
}
|
744 |
|
745 |
def calculate(self):
|
746 |
+
"""Логика расчёта с приоритетом по нитратам"""
|
747 |
try:
|
748 |
# 1. Вносим сульфат магния (Mg + S)
|
749 |
self._apply_fertilizer("Сульфат магния", "Mg")
|
750 |
|
751 |
+
# 2. Вносим монофосфат калия (P + K)
|
|
|
|
|
|
|
752 |
self._apply_fertilizer("Монофосфат калия", "P")
|
753 |
|
754 |
+
# 3. Вносим аммоний азотнокислый (NH4 + NO3)
|
755 |
+
self._apply_fertilizer("Аммоний азотнокислый", "NH4")
|
756 |
|
757 |
+
# 4. Жёстко контролируем NO3:
|
758 |
+
# - Если нужно меньше, чем уже внесено, пропускаем кальциевую селитру
|
759 |
+
if self.target_profile['NO3'] > self.actual_profile['NO3']:
|
760 |
+
self._apply_fertilizer("Кальциевая селитра", "Ca")
|
761 |
|
762 |
+
# 5. Довносим K через калийную селитру или сульфат калия
|
763 |
k_deficit = self.target_profile['K'] - self.actual_profile['K']
|
764 |
if k_deficit > 0.1:
|
765 |
+
# Выбираем удобрение с минимальным NO3
|
766 |
+
if self.actual_profile['NO3'] < self.target_profile['NO3']:
|
767 |
+
self._apply_fertilizer("Калий азотнокислый", "K", k_deficit)
|
768 |
+
else:
|
769 |
+
self._apply_fertilizer("Калий сернокислый", "K", k_deficit)
|
770 |
|
771 |
+
# 6. Довносим серу при необходимости
|
772 |
s_deficit = self.target_profile['S'] - self.actual_profile['S']
|
773 |
if s_deficit > 0.1:
|
774 |
self._apply_fertilizer("Калий сернокислый", "S", s_deficit)
|
|
|
779 |
return False
|
780 |
|
781 |
def _apply_fertilizer(self, name, main_element, required_ppm=None):
|
782 |
+
"""Метод внесения удобрений с контролем NO3"""
|
783 |
if required_ppm is None:
|
784 |
required_ppm = self.target_profile[main_element] - self.actual_profile[main_element]
|
785 |
|
|
|
790 |
if content <= 0:
|
791 |
return
|
792 |
|
793 |
+
# Корректируем граммы, если NO3 превышает целевое значение
|
794 |
+
if 'NO3' in self.fertilizers[name]:
|
795 |
+
no3_added = (required_ppm / content) * self.fertilizers[name]['NO3']
|
796 |
+
if self.actual_profile['NO3'] + no3_added > self.target_profile['NO3']:
|
797 |
+
required_ppm = max(0, (self.target_profile['NO3'] - self.actual_profile['NO3']) * content / self.fertilizers[name]['NO3'])
|
798 |
+
|
799 |
grams = (required_ppm * self.volume) / (content * 1000)
|
800 |
|
801 |
# Запись результатов
|
|
|
814 |
ec_coefficients = {
|
815 |
'P': 0.0012, 'K': 0.0018, 'Mg': 0.0015,
|
816 |
'Ca': 0.0016, 'S': 0.0014,
|
817 |
+
'NO3': 0.0017, 'NH4': 0.0019
|
818 |
}
|
819 |
self.total_ec += sum(
|
820 |
added_ppm * ec_coefficients.get(element, 0.0015)
|
|
|
822 |
)
|
823 |
|
824 |
def get_results(self):
|
825 |
+
"""Форматирование результатов с обратным преобразованием ключей"""
|
826 |
return {
|
827 |
'fertilizers': [
|
828 |
{
|
|
|
833 |
],
|
834 |
'profile': [
|
835 |
{
|
836 |
+
'element': 'N-NO3' if k == 'NO3' else 'N-NH4' if k == 'NH4' else k,
|
837 |
'ppm': round(v, 3)
|
838 |
} for k, v in self.actual_profile.items()
|
839 |
],
|
840 |
'ec': round(self.total_ec, 2),
|
841 |
'deficits': {
|
842 |
+
'N (NO3-)' if k == 'NO3' else 'N (NH4+)' if k == 'NH4' else k:
|
843 |
+
max(self.target_profile[k] - self.actual_profile.get(k, 0), 0)
|
844 |
for k in self.target_profile
|
845 |
}
|
846 |
}
|
|
|
902 |
|
903 |
|
904 |
|
|
|
905 |
if __name__ == '__main__':
|
906 |
app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860)))
|