Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -681,8 +681,6 @@ def view_image():
|
|
681 |
|
682 |
|
683 |
|
684 |
-
|
685 |
-
|
686 |
TOMATO_PROFILE = {
|
687 |
'N (NO3-)': 200,
|
688 |
'N (NH4+)': 20,
|
@@ -697,129 +695,112 @@ fertilizers_db = {
|
|
697 |
"Кальциевая селитра": {
|
698 |
"N (NO3-)": 0.118,
|
699 |
"Ca": 0.169,
|
700 |
-
"EC_factor": 1.2 # мСм/см на 1 г/л
|
701 |
},
|
702 |
"Калий азотнокислый": {
|
703 |
"N (NO3-)": 0.138,
|
704 |
"K": 0.387,
|
705 |
-
"EC_factor": 1.4
|
706 |
},
|
707 |
"Аммоний азотнокислый": {
|
708 |
"N (NO3-)": 0.175,
|
709 |
"N (NH4+)": 0.175,
|
710 |
-
"EC_factor": 1.5
|
711 |
},
|
712 |
"Сульфат магния": {
|
713 |
"Mg": 0.098,
|
714 |
"S": 0.13,
|
715 |
-
"EC_factor": 1.0
|
716 |
},
|
717 |
"Монофосфат калия": {
|
718 |
"P": 0.227,
|
719 |
"K": 0.287,
|
720 |
-
"EC_factor": 0.7
|
721 |
}
|
722 |
}
|
723 |
|
|
|
724 |
class NutrientCalculator:
|
725 |
def __init__(self, volume_liters=1.0):
|
726 |
self.volume = volume_liters
|
727 |
self.results = {}
|
728 |
-
|
729 |
-
|
730 |
def calculate(self, profile):
|
731 |
-
self.
|
732 |
-
self.
|
|
|
|
|
|
|
733 |
return self.results
|
734 |
-
|
735 |
-
def
|
736 |
-
|
737 |
-
|
738 |
-
|
739 |
-
|
740 |
-
|
741 |
-
|
742 |
-
|
743 |
-
|
744 |
-
|
745 |
-
|
746 |
-
|
747 |
-
|
748 |
-
|
749 |
-
|
750 |
-
|
751 |
-
|
752 |
-
|
753 |
-
|
754 |
-
|
755 |
-
|
756 |
-
|
757 |
-
|
758 |
-
|
759 |
-
|
760 |
-
|
761 |
-
|
762 |
-
|
763 |
-
|
764 |
-
|
765 |
-
|
766 |
-
|
767 |
-
|
768 |
-
|
769 |
-
|
770 |
-
|
771 |
-
|
772 |
-
|
773 |
-
|
774 |
-
|
775 |
-
|
776 |
-
|
777 |
-
|
778 |
-
|
779 |
-
|
780 |
-
|
781 |
-
|
782 |
-
|
783 |
-
|
784 |
-
|
785 |
-
|
786 |
-
|
787 |
-
|
788 |
-
|
789 |
-
|
790 |
-
self.results["Аммоний азотнокислый"] = {
|
791 |
-
'граммы': round(nh4_grams, 3),
|
792 |
-
'миллиграммы': int(nh4_grams * 1000),
|
793 |
-
'внесет NO3': round(no3_from_nh4, 1)
|
794 |
-
}
|
795 |
-
profile['N (NO3-)'] -= no3_from_nh4
|
796 |
-
self._add_ec("Аммоний азотнокислый", nh4_grams)
|
797 |
|
798 |
def print_report(self, profile):
|
799 |
-
print("
|
800 |
print(f"РАСЧЕТ ДЛЯ {self.volume} ЛИТРОВ РАСТВОРА")
|
801 |
-
print("="*50)
|
802 |
-
|
803 |
-
print("\nЦЕЛЕВОЙ ПРОФИЛЬ (ppm):")
|
804 |
-
print(tabulate([(k, v) for k, v in profile.items()],
|
805 |
-
headers=["Элемент", "Концентрация"]))
|
806 |
|
807 |
print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ:")
|
808 |
-
table = []
|
809 |
for fert, data in self.results.items():
|
810 |
-
|
811 |
-
|
812 |
-
|
813 |
-
|
814 |
-
f"+{list(data.keys())[2]} {data[list(data.keys())[2]]} ppm"
|
815 |
-
])
|
816 |
-
print(tabulate(table, headers=["Удобрение", "Граммы", "Миллиграммы", "Дополнительно"]))
|
817 |
-
|
818 |
-
print(f"\n🌊 Примерная электропроводимость (EC): {round(self.ec_total, 2)} мСм/см")
|
819 |
|
820 |
print("\nОСТАТОЧНЫЙ ДЕФИЦИТ:")
|
821 |
-
|
822 |
-
|
|
|
|
|
823 |
|
824 |
# Пример использования
|
825 |
calc = NutrientCalculator(volume_liters=10)
|
@@ -844,7 +825,6 @@ calc.print_report(TOMATO_PROFILE.copy())
|
|
844 |
|
845 |
|
846 |
|
847 |
-
|
848 |
|
849 |
|
850 |
if __name__ == '__main__':
|
|
|
681 |
|
682 |
|
683 |
|
|
|
|
|
684 |
TOMATO_PROFILE = {
|
685 |
'N (NO3-)': 200,
|
686 |
'N (NH4+)': 20,
|
|
|
695 |
"Кальциевая селитра": {
|
696 |
"N (NO3-)": 0.118,
|
697 |
"Ca": 0.169,
|
|
|
698 |
},
|
699 |
"Калий азотнокислый": {
|
700 |
"N (NO3-)": 0.138,
|
701 |
"K": 0.387,
|
|
|
702 |
},
|
703 |
"Аммоний азотнокислый": {
|
704 |
"N (NO3-)": 0.175,
|
705 |
"N (NH4+)": 0.175,
|
|
|
706 |
},
|
707 |
"Сульфат магния": {
|
708 |
"Mg": 0.098,
|
709 |
"S": 0.13,
|
|
|
710 |
},
|
711 |
"Монофосфат калия": {
|
712 |
"P": 0.227,
|
713 |
"K": 0.287,
|
|
|
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._apply_magnesium_sulfate(profile)
|
725 |
+
self._apply_calcium_nitrate(profile)
|
726 |
+
self._apply_mkp(profile)
|
727 |
+
self._apply_potassium_nitrate(profile)
|
728 |
+
self._apply_ammonium_nitrate(profile)
|
729 |
return self.results
|
730 |
+
|
731 |
+
def _apply_fertilizer(self, fert_name, grams, additions):
|
732 |
+
self.results[fert_name] = {
|
733 |
+
'граммы': round(grams, 3),
|
734 |
+
'миллиграммы': int(grams * 1000),
|
735 |
+
}
|
736 |
+
self.results[fert_name].update(additions)
|
737 |
+
|
738 |
+
def _apply_magnesium_sulfate(self, profile):
|
739 |
+
mg_need = profile['Mg']
|
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 |
+
profile['S'] -= added_s
|
745 |
+
self._apply_fertilizer("Сульфат магния", grams, {'внесет S': round(added_s, 1)})
|
746 |
+
|
747 |
+
def _apply_calcium_nitrate(self, profile):
|
748 |
+
ca_need = profile['Ca']
|
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 |
+
profile['N (NO3-)'] -= added_n
|
754 |
+
self._apply_fertilizer("Кальциевая селитра", grams, {'внесет NO3': round(added_n, 1)})
|
755 |
+
|
756 |
+
def _apply_mkp(self, profile):
|
757 |
+
p_need = profile['P']
|
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 |
+
profile['K'] -= added_k
|
763 |
+
self._apply_fertilizer("Монофосфат калия", grams, {'внесет K': round(added_k, 1)})
|
764 |
+
|
765 |
+
def _apply_potassium_nitrate(self, profile):
|
766 |
+
k_need = profile['K']
|
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 |
+
profile['N (NO3-)'] -= added_n
|
774 |
+
self._apply_fertilizer("Калий азотнокислый", grams, {'внесет NO3': round(added_n, 1)})
|
775 |
+
|
776 |
+
def _apply_ammonium_nitrate(self, profile):
|
777 |
+
nh4_need = profile['N (NH4+)']
|
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 |
+
profile['N (NO3-)'] -= added_n
|
785 |
+
self._apply_fertilizer("Аммоний азотнокислый", grams, {'внесет NO3': round(added_n, 1)})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
786 |
|
787 |
def print_report(self, profile):
|
788 |
+
print("=" * 50)
|
789 |
print(f"РАСЧЕТ ДЛЯ {self.volume} ЛИТРОВ РАСТВОРА")
|
790 |
+
print("=" * 50)
|
|
|
|
|
|
|
|
|
791 |
|
792 |
print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ:")
|
|
|
793 |
for fert, data in self.results.items():
|
794 |
+
print(f"- {fert}: {data['граммы']} г ({data['миллиграммы']} мг)")
|
795 |
+
for k, v in data.items():
|
796 |
+
if k.startswith("внесет"):
|
797 |
+
print(f" ➕ {k}: {v} ppm")
|
|
|
|
|
|
|
|
|
|
|
798 |
|
799 |
print("\nОСТАТОЧНЫЙ ДЕФИЦИТ:")
|
800 |
+
for el, val in profile.items():
|
801 |
+
if val > 0.1:
|
802 |
+
print(f" 🔸 {el}: {round(val, 1)} ppm")
|
803 |
+
|
804 |
|
805 |
# Пример использования
|
806 |
calc = NutrientCalculator(volume_liters=10)
|
|
|
825 |
|
826 |
|
827 |
|
|
|
828 |
|
829 |
|
830 |
if __name__ == '__main__':
|