Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -677,7 +677,6 @@ def view_image():
|
|
677 |
|
678 |
|
679 |
|
680 |
-
|
681 |
from tabulate import tabulate
|
682 |
|
683 |
# Константы
|
@@ -728,71 +727,78 @@ class NutrientCalculator:
|
|
728 |
self._apply("Кальциевая селитра", "Ca", 84.0)
|
729 |
self._apply("Калий фосфорнокислый", "P", 31.0)
|
730 |
self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
731 |
self._apply_k_sulfate()
|
732 |
-
|
|
|
|
|
|
|
|
|
|
|
733 |
return self.results
|
734 |
|
735 |
def _apply(self, fert_name, main_element, required_ppm):
|
|
|
|
|
|
|
736 |
content = self.fertilizers[fert_name][main_element]
|
737 |
grams = required_ppm * self.volume / (content * 1000)
|
738 |
-
|
739 |
-
|
740 |
-
|
741 |
-
|
742 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
743 |
for element, percent in self.fertilizers[fert_name].items():
|
744 |
added_ppm = grams * percent * 1000 / self.volume
|
745 |
-
|
746 |
self.actual_profile[element] += added_ppm
|
747 |
|
748 |
-
self.results[fert_name] = result
|
749 |
-
|
750 |
def _apply_k_sulfate(self):
|
751 |
fert = "Калий сернокислый"
|
752 |
k_def = self.target_profile['K'] - self.actual_profile['K']
|
753 |
s_def = self.target_profile['S'] - self.actual_profile['S']
|
754 |
-
|
755 |
-
|
756 |
-
|
757 |
-
|
758 |
-
|
759 |
-
|
760 |
-
|
761 |
-
|
762 |
-
|
763 |
-
|
764 |
-
|
765 |
-
|
766 |
-
|
767 |
-
|
768 |
-
|
769 |
-
|
770 |
-
|
771 |
-
|
772 |
-
|
773 |
-
def _apply_k_nitrate(self):
|
774 |
-
fert = "Калий азотнокислый"
|
775 |
-
k_def = self.target_profile['K'] - self.actual_profile['K']
|
776 |
-
k_content = self.fertilizers[fert]["K"]
|
777 |
-
grams = k_def * self.volume / (k_content * 1000)
|
778 |
-
|
779 |
-
result = {
|
780 |
-
'граммы': round(grams, 3),
|
781 |
-
'миллиграммы': int(grams * 1000)
|
782 |
-
}
|
783 |
-
|
784 |
-
for el in ["K", "N (NO3-)"]:
|
785 |
-
ppm = grams * self.fertilizers[fert][el] * 1000 / self.volume
|
786 |
-
result[f"внесет {self._label(el)}"] = round(ppm, 1)
|
787 |
-
self.actual_profile[el] += ppm
|
788 |
-
|
789 |
-
self.results[fert] = result
|
790 |
|
791 |
def _label(self, el):
|
792 |
return "NO3" if el == "N (NO3-)" else "NH4" if el == "N (NH4+)" else el
|
793 |
|
794 |
def calculate_ec(self):
|
795 |
-
total_ppm = sum(self.
|
796 |
return round(total_ppm / 700, 2)
|
797 |
|
798 |
def print_report(self):
|
@@ -809,16 +815,16 @@ class NutrientCalculator:
|
|
809 |
print("\n" + "="*60)
|
810 |
print(f"РАСЧЕТ ДЛЯ {self.volume} ЛИТРОВ РАСТВОРА")
|
811 |
print("="*60)
|
812 |
-
print(f"Общая концентрация: {round(sum(self.
|
813 |
print(f"EC: {self.calculate_ec()} mS/cm")
|
814 |
|
815 |
print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ:")
|
816 |
fert_table = []
|
817 |
for fert, data in self.results.items():
|
818 |
-
adds = [f"+{k}: {v} ppm" for k, v in data.items() if k.startswith('внесет')]
|
819 |
fert_table.append([
|
820 |
fert,
|
821 |
-
data['граммы'],
|
822 |
data['миллиграммы'],
|
823 |
"\n".join(adds)
|
824 |
])
|
|
|
677 |
|
678 |
|
679 |
|
|
|
680 |
from tabulate import tabulate
|
681 |
|
682 |
# Константы
|
|
|
727 |
self._apply("Кальциевая селитра", "Ca", 84.0)
|
728 |
self._apply("Калий фосфорнокислый", "P", 31.0)
|
729 |
self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
|
730 |
+
|
731 |
+
# Сначала покрываем NO3- из кальциевой селитры и аммонийной
|
732 |
+
current_no3 = self.actual_profile['N (NO3-)']
|
733 |
+
no3_needed = self.target_profile['N (NO3-)'] - current_no3
|
734 |
+
|
735 |
+
# Добавляем калий азотнокислый для покрытия оставшегося NO3-
|
736 |
+
if no3_needed > 0.1:
|
737 |
+
self._apply("Калий азотнокислый", "N (NO3-)", no3_needed)
|
738 |
+
|
739 |
+
# Затем покрываем калий и серу
|
740 |
self._apply_k_sulfate()
|
741 |
+
|
742 |
+
# Проверяем и покрываем оставшийся калий калий азотнокислым
|
743 |
+
k_deficit = self.target_profile['K'] - self.actual_profile['K']
|
744 |
+
if k_deficit > 0.1:
|
745 |
+
self._apply("Калий азотнокислый", "K", k_deficit)
|
746 |
+
|
747 |
return self.results
|
748 |
|
749 |
def _apply(self, fert_name, main_element, required_ppm):
|
750 |
+
if required_ppm <= 0:
|
751 |
+
return
|
752 |
+
|
753 |
content = self.fertilizers[fert_name][main_element]
|
754 |
grams = required_ppm * self.volume / (content * 1000)
|
755 |
+
|
756 |
+
if fert_name not in self.results:
|
757 |
+
result = {
|
758 |
+
'граммы': 0.0,
|
759 |
+
'миллиграммы': 0
|
760 |
+
}
|
761 |
+
for element in self.fertilizers[fert_name]:
|
762 |
+
result[f'внесет {self._label(element)}'] = 0.0
|
763 |
+
self.results[fert_name] = result
|
764 |
+
|
765 |
+
self.results[fert_name]['граммы'] += grams
|
766 |
+
self.results[fert_name]['миллиграммы'] += int(grams * 1000)
|
767 |
+
|
768 |
for element, percent in self.fertilizers[fert_name].items():
|
769 |
added_ppm = grams * percent * 1000 / self.volume
|
770 |
+
self.results[fert_name][f'внесет {self._label(element)}'] += added_ppm
|
771 |
self.actual_profile[element] += added_ppm
|
772 |
|
|
|
|
|
773 |
def _apply_k_sulfate(self):
|
774 |
fert = "Калий сернокислый"
|
775 |
k_def = self.target_profile['K'] - self.actual_profile['K']
|
776 |
s_def = self.target_profile['S'] - self.actual_profile['S']
|
777 |
+
|
778 |
+
if k_def <= 0 and s_def <= 0:
|
779 |
+
return
|
780 |
+
|
781 |
+
# Рассчитываем необходимое количество для покрытия дефицита серы
|
782 |
+
if s_def > 0.1:
|
783 |
+
s_content = self.fertilizers[fert]["S"]
|
784 |
+
grams_s = s_def * self.volume / (s_content * 1000)
|
785 |
+
|
786 |
+
k_content = self.fertilizers[fert]["K"]
|
787 |
+
k_from_s = grams_s * k_content * 1000 / self.volume
|
788 |
+
|
789 |
+
if k_from_s > k_def and k_def > 0.1:
|
790 |
+
# Если серы нужно больше, чем нужно для калия, ограничиваем
|
791 |
+
grams = k_def * self.volume / (k_content * 1000)
|
792 |
+
else:
|
793 |
+
grams = grams_s
|
794 |
+
|
795 |
+
self._apply(fert, "S", s_def)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
796 |
|
797 |
def _label(self, el):
|
798 |
return "NO3" if el == "N (NO3-)" else "NH4" if el == "N (NH4+)" else el
|
799 |
|
800 |
def calculate_ec(self):
|
801 |
+
total_ppm = sum(self.actual_profile.values())
|
802 |
return round(total_ppm / 700, 2)
|
803 |
|
804 |
def print_report(self):
|
|
|
815 |
print("\n" + "="*60)
|
816 |
print(f"РАСЧЕТ ДЛЯ {self.volume} ЛИТРОВ РАСТВОРА")
|
817 |
print("="*60)
|
818 |
+
print(f"Общая концентрация: {round(sum(self.actual_profile.values()), 1)} ppm")
|
819 |
print(f"EC: {self.calculate_ec()} mS/cm")
|
820 |
|
821 |
print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ:")
|
822 |
fert_table = []
|
823 |
for fert, data in self.results.items():
|
824 |
+
adds = [f"+{k}: {v:.1f} ppm" for k, v in data.items() if k.startswith('внесет')]
|
825 |
fert_table.append([
|
826 |
fert,
|
827 |
+
round(data['граммы'], 3),
|
828 |
data['миллиграммы'],
|
829 |
"\n".join(adds)
|
830 |
])
|