DmitrMakeev commited on
Commit
92a371c
·
verified ·
1 Parent(s): 6e4f731

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +79 -56
app.py CHANGED
@@ -700,43 +700,58 @@ BASE_PROFILE = {
700
  'S': 137.397
701
  }
702
 
703
- # База данных удобрений
704
- FERTILIZERS_DB = {
705
  "Кальциевая селитра": {
706
- "N (NO3-)": 0.118,
707
- "Ca": 0.169
708
  },
709
  "Калий азотнокислый": {
710
- "N (NO3-)": 0.138,
711
- "K": 0.387
712
  },
713
  "Калий сернокислый": {
714
- "K": 0.448,
715
- "S": 0.184
 
 
716
  },
717
  "Аммоний азотнокислый": {
718
- "N (NO3-)": 0.175,
719
- "N (NH4+)": 0.175
720
  },
721
  "Сульфат магния": {
722
- "Mg": 0.098,
723
- "S": 0.13
724
  },
725
  "Монофосфат калия": {
726
- "P": 0.227,
727
- "K": 0.287
728
  }
729
  }
730
 
731
  class NutrientCalculator:
732
- def __init__(self, volume_liters=1.0):
 
 
 
 
 
733
  self.volume = volume_liters
734
  self.results = {}
735
  self.final_profile = {}
736
  self.total_ppm = 0
737
  self.initial_n_profile = {}
 
 
 
 
 
 
 
 
 
 
 
 
 
738
 
739
- def calculate(self, base_profile, total_n, no3_ratio, nh4_ratio):
740
  total_parts = no3_ratio + nh4_ratio
741
  no3 = total_n * (no3_ratio / total_parts)
742
  nh4 = total_n * (nh4_ratio / total_parts)
@@ -746,10 +761,10 @@ class NutrientCalculator:
746
  'N (NH4+)': round(nh4, 1)
747
  }
748
 
749
- self.final_profile = base_profile.copy()
750
  self.final_profile['N (NO3-)'] = no3
751
  self.final_profile['N (NH4+)'] = nh4
752
- self.total_ppm = total_n + sum(base_profile.values())
753
 
754
  # Расчёт удобрений
755
  self._apply_magnesium_sulfate()
@@ -768,9 +783,9 @@ class NutrientCalculator:
768
 
769
  def _apply_magnesium_sulfate(self):
770
  mg_need = self.final_profile['Mg']
771
- mg_content = FERTILIZERS_DB["Сульфат магния"]["Mg"]
772
  grams = (mg_need * self.volume) / (mg_content * 1000)
773
- added_s = grams * FERTILIZERS_DB["Сульфат магния"]["S"] * 1000 / self.volume
774
 
775
  self.final_profile['S'] -= added_s
776
  self._apply_fertilizer("Сульфат магния", grams, {'внесет S': round(added_s, 1)})
@@ -778,9 +793,9 @@ class NutrientCalculator:
778
 
779
  def _apply_calcium_nitrate(self):
780
  ca_need = self.final_profile['Ca']
781
- ca_content = FERTILIZERS_DB["Кальциевая селитра"]["Ca"]
782
  grams = (ca_need * self.volume) / (ca_content * 1000)
783
- added_n = grams * FERTILIZERS_DB["Кальциевая селитра"]["N (NO3-)"] * 1000 / self.volume
784
 
785
  self.final_profile['N (NO3-)'] -= added_n
786
  self._apply_fertilizer("Кальциевая селитра", grams, {'внесет NO3': round(added_n, 1)})
@@ -788,9 +803,9 @@ class NutrientCalculator:
788
 
789
  def _apply_mkp(self):
790
  p_need = self.final_profile['P']
791
- p_content = FERTILIZERS_DB["Монофосфат калия"]["P"]
792
  grams = (p_need * self.volume) / (p_content * 1000)
793
- added_k = grams * FERTILIZERS_DB["Монофосфат калия"]["K"] * 1000 / self.volume
794
 
795
  self.final_profile['K'] -= added_k
796
  self._apply_fertilizer("Монофосфат калия", grams, {'внесет K': round(added_k, 1)})
@@ -801,42 +816,53 @@ class NutrientCalculator:
801
  if k_need <= 0:
802
  return
803
 
804
- s_deficit = max(0, self.final_profile['S'])
805
- if s_deficit > 0:
806
- s_content = FERTILIZERS_DB["Калий сернокислый"]["S"]
807
- k2so4_grams = (s_deficit * self.volume) / (s_content * 1000)
808
- added_k = k2so4_grams * FERTILIZERS_DB["Калий сернокислый"]["K"] * 1000 / self.volume
809
-
810
- if added_k > k_need:
811
- k2so4_grams = (k_need * self.volume) / (FERTILIZERS_DB["Калий сернокислый"]["K"] * 1000)
812
- added_k = k_need
813
- added_s = k2so4_grams * FERTILIZERS_DB["Калий сернокислый"]["S"] * 1000 / self.volume
814
- else:
815
- added_s = s_deficit
816
-
817
- self._apply_fertilizer("Калий сернокислый", k2so4_grams, {
818
- 'внесет K': round(added_k, 1),
819
- 'внесет S': round(added_s, 1)
820
- })
821
- self.final_profile['K'] -= added_k
822
- self.final_profile['S'] -= added_s
823
- k_need = self.final_profile['K']
824
-
825
- if k_need > 0:
826
- kno3_grams = (k_need * self.volume) / (FERTILIZERS_DB["Калий азотнокислый"]["K"] * 1000)
827
- added_n = kno3_grams * FERTILIZERS_DB["Калий азотнокислый"]["N (NO3-)"] * 1000 / self.volume
828
-
829
- self._apply_fertilizer("Калий азотнокислый", kno3_grams, {'внесет NO3': round(added_n, 1)})
 
 
 
 
 
 
 
830
  self.final_profile['K'] = 0
831
  self.final_profile['N (NO3-)'] -= added_n
832
 
 
 
 
 
833
  def _apply_ammonium_nitrate(self):
834
  nh4_need = self.final_profile['N (NH4+)']
835
  if nh4_need <= 0:
836
  return
837
- nh4_content = FERTILIZERS_DB["Аммоний азотнокислый"]["N (NH4+)"]
838
  grams = (nh4_need * self.volume) / (nh4_content * 1000)
839
- added_n = grams * FERTILIZERS_DB["Аммоний азотнокислый"]["N (NO3-)"] * 1000 / self.volume
840
 
841
  self.final_profile['N (NO3-)'] -= added_n
842
  self._apply_fertilizer("Аммони�� азотнокислый", grams, {'внесет NO3': round(added_n, 1)})
@@ -882,11 +908,9 @@ class NutrientCalculator:
882
  else:
883
  print(" Все элементы покрыты полностью")
884
 
885
-
886
-
887
-
888
  # Пример использования
889
  if __name__ == "__main__":
 
890
 
891
  # Вариант 2: С калием азотнокислым
892
  calc_with_kno3 = NutrientCalculator(volume_liters=10, use_k2so4=False, use_kno3=True)
@@ -898,6 +922,5 @@ if __name__ == "__main__":
898
 
899
 
900
 
901
-
902
  if __name__ == '__main__':
903
  app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860)))
 
700
  'S': 137.397
701
  }
702
 
703
+ # Полная база всех возможных удобрений
704
+ ALL_FERTILIZERS = {
705
  "Кальциевая селитра": {
706
+ "N (NO3-)": 0.118, "Ca": 0.169
 
707
  },
708
  "Калий азотнокислый": {
709
+ "N (NO3-)": 0.138, "K": 0.387
 
710
  },
711
  "Калий сернокислый": {
712
+ "K": 0.448, "S": 0.184
713
+ },
714
+ "Сульфат калия": {
715
+ "K": 0.448, "S": 0.184 # Альтернативное название калия сернокислого
716
  },
717
  "Аммоний азотнокислый": {
718
+ "N (NO3-)": 0.175, "N (NH4+)": 0.175
 
719
  },
720
  "Сульфат магния": {
721
+ "Mg": 0.098, "S": 0.13
 
722
  },
723
  "Монофосфат калия": {
724
+ "P": 0.227, "K": 0.287
 
725
  }
726
  }
727
 
728
  class NutrientCalculator:
729
+ def __init__(self, volume_liters=1.0, use_k2so4=True, use_kno3=True):
730
+ """
731
+ :param volume_liters: Объём раствора
732
+ :param use_k2so4: Использовать калий сернокислый (True/False)
733
+ :param use_kno3: Использовать калий азотнокислый (True/False)
734
+ """
735
  self.volume = volume_liters
736
  self.results = {}
737
  self.final_profile = {}
738
  self.total_ppm = 0
739
  self.initial_n_profile = {}
740
+
741
+ # Формируем активные удобрения на основе выбора
742
+ self.fertilizers_db = {
743
+ "Кальциевая селитра": ALL_FERTILIZERS["Кальциевая селитра"],
744
+ "Аммоний азотнокислый": ALL_FERTILIZERS["Аммоний азотнокислый"],
745
+ "Сульфат магния": ALL_FERTILIZERS["Сульфат магния"],
746
+ "Монофосфат калия": ALL_FERTILIZERS["Монофосфат калия"]
747
+ }
748
+
749
+ if use_k2so4:
750
+ self.fertilizers_db["Калий сернокислый"] = ALL_FERTILIZERS["Калий сернокислый"]
751
+ if use_kno3:
752
+ self.fertilizers_db["Калий азотнокислый"] = ALL_FERTILIZERS["Калий азотнокислый"]
753
 
754
+ def calculate(self, total_n, no3_ratio, nh4_ratio):
755
  total_parts = no3_ratio + nh4_ratio
756
  no3 = total_n * (no3_ratio / total_parts)
757
  nh4 = total_n * (nh4_ratio / total_parts)
 
761
  'N (NH4+)': round(nh4, 1)
762
  }
763
 
764
+ self.final_profile = BASE_PROFILE.copy()
765
  self.final_profile['N (NO3-)'] = no3
766
  self.final_profile['N (NH4+)'] = nh4
767
+ self.total_ppm = total_n + sum(BASE_PROFILE.values())
768
 
769
  # Расчёт удобрений
770
  self._apply_magnesium_sulfate()
 
783
 
784
  def _apply_magnesium_sulfate(self):
785
  mg_need = self.final_profile['Mg']
786
+ mg_content = self.fertilizers_db["Сульфат магния"]["Mg"]
787
  grams = (mg_need * self.volume) / (mg_content * 1000)
788
+ added_s = grams * self.fertilizers_db["Сульфат магния"]["S"] * 1000 / self.volume
789
 
790
  self.final_profile['S'] -= added_s
791
  self._apply_fertilizer("Сульфат магния", grams, {'внесет S': round(added_s, 1)})
 
793
 
794
  def _apply_calcium_nitrate(self):
795
  ca_need = self.final_profile['Ca']
796
+ ca_content = self.fertilizers_db["Кальциевая селитра"]["Ca"]
797
  grams = (ca_need * self.volume) / (ca_content * 1000)
798
+ added_n = grams * self.fertilizers_db["Кальциевая селитра"]["N (NO3-)"] * 1000 / self.volume
799
 
800
  self.final_profile['N (NO3-)'] -= added_n
801
  self._apply_fertilizer("Кальциевая селитра", grams, {'внесет NO3': round(added_n, 1)})
 
803
 
804
  def _apply_mkp(self):
805
  p_need = self.final_profile['P']
806
+ p_content = self.fertilizers_db["Монофосфат калия"]["P"]
807
  grams = (p_need * self.volume) / (p_content * 1000)
808
+ added_k = grams * self.fertilizers_db["Монофосфат калия"]["K"] * 1000 / self.volume
809
 
810
  self.final_profile['K'] -= added_k
811
  self._apply_fertilizer("Монофосфат калия", grams, {'внесет K': round(added_k, 1)})
 
816
  if k_need <= 0:
817
  return
818
 
819
+ # Вариант 1: Если есть калий сернокислый
820
+ if "Калий сернокислый" in self.fertilizers_db:
821
+ s_deficit = max(0, self.final_profile['S'])
822
+ if s_deficit > 0:
823
+ s_content = self.fertilizers_db["Калий сернокислый"]["S"]
824
+ k2so4_grams = (s_deficit * self.volume) / (s_content * 1000)
825
+ added_k = k2so4_grams * self.fertilizers_db["Калий сернокислый"]["K"] * 1000 / self.volume
826
+
827
+ if added_k > k_need:
828
+ k2so4_grams = (k_need * self.volume) / (self.fertilizers_db["Калий сернокислый"]["K"] * 1000)
829
+ added_k = k_need
830
+ added_s = k2so4_grams * self.fertilizers_db["Калий сернокислый"]["S"] * 1000 / self.volume
831
+ else:
832
+ added_s = s_deficit
833
+
834
+ self._apply_fertilizer("Калий сернокислый", k2so4_grams, {
835
+ 'внесет K': round(added_k, 2),
836
+ 'внесет S': round(added_s, 2)
837
+ })
838
+ self.final_profile['K'] -= added_k
839
+ self.final_profile['S'] -= added_s
840
+ k_need = self.final_profile['K']
841
+
842
+ # Вариант 2: Если есть только калий азотнокислый
843
+ if k_need > 0 and "Калий азотнокислый" in self.fertilizers_db:
844
+ kno3_grams = (k_need * self.volume) / (self.fertilizers_db["Калий азотнокислый"]["K"] * 1000)
845
+ added_n = kno3_grams * self.fertilizers_db["Калий азотнокислый"]["N (NO3-)"] * 1000 / self.volume
846
+
847
+ self._apply_fertilizer(
848
+ "Калий азотнокислый",
849
+ kno3_grams,
850
+ {'внесет NO3': round(added_n, 2)}
851
+ )
852
  self.final_profile['K'] = 0
853
  self.final_profile['N (NO3-)'] -= added_n
854
 
855
+ # Если остался дефицит и нет подходящих удобрений
856
+ if k_need > 0:
857
+ print(f" Внимание: Не удалось полностью покрыть дефицит K ({k_need:.2f} ppm)")
858
+
859
  def _apply_ammonium_nitrate(self):
860
  nh4_need = self.final_profile['N (NH4+)']
861
  if nh4_need <= 0:
862
  return
863
+ nh4_content = self.fertilizers_db["Аммоний азотнокислый"]["N (NH4+)"]
864
  grams = (nh4_need * self.volume) / (nh4_content * 1000)
865
+ added_n = grams * self.fertilizers_db["Аммоний азотнокислый"]["N (NO3-)"] * 1000 / self.volume
866
 
867
  self.final_profile['N (NO3-)'] -= added_n
868
  self._apply_fertilizer("Аммони�� азотнокислый", grams, {'внесет NO3': round(added_n, 1)})
 
908
  else:
909
  print(" Все элементы покрыты полностью")
910
 
 
 
 
911
  # Пример использования
912
  if __name__ == "__main__":
913
+
914
 
915
  # Вариант 2: С калием азотнокислым
916
  calc_with_kno3 = NutrientCalculator(volume_liters=10, use_k2so4=False, use_kno3=True)
 
922
 
923
 
924
 
 
925
  if __name__ == '__main__':
926
  app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860)))