DmitrMakeev commited on
Commit
2a28ab4
·
verified ·
1 Parent(s): cee8242

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +35 -105
app.py CHANGED
@@ -700,58 +700,35 @@ BASE_PROFILE = {
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
- "N (NO3-)": 0.175, "N (NH4+)": 0.175
 
716
  },
717
  "Сульфат магния": {
718
- "Mg": 0.098, "S": 0.13
 
719
  },
720
  "Монофосфат калия": {
721
- "P": 0.227, "K": 0.287
722
- },
723
- "Сульфат калия": {
724
- "K": 0.448, "S": 0.184 # Альтернатива калию сернокислому
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.calculated_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
- # ... (остальные методы класса остаются без изменений)
755
  def __init__(self, volume_liters=1.0):
756
  self.volume = volume_liters
757
  self.results = {}
@@ -759,10 +736,10 @@ class NutrientCalculator:
759
  self.total_ppm = 0
760
  self.initial_n_profile = {}
761
 
762
- def calculate(self, base_profile, total_n, n_ratio):
763
- total_parts = n_ratio[0] + n_ratio[1]
764
- no3 = total_n * (n_ratio[0] / total_parts)
765
- nh4 = total_n * (n_ratio[1] / total_parts)
766
 
767
  self.initial_n_profile = {
768
  'N (NO3-)': round(no3, 1),
@@ -791,9 +768,9 @@ class NutrientCalculator:
791
 
792
  def _apply_magnesium_sulfate(self):
793
  mg_need = self.final_profile['Mg']
794
- mg_content = fertilizers_db["Сульфат магния"]["Mg"]
795
  grams = (mg_need * self.volume) / (mg_content * 1000)
796
- added_s = grams * fertilizers_db["Сульфат магния"]["S"] * 1000 / self.volume
797
 
798
  self.final_profile['S'] -= added_s
799
  self._apply_fertilizer("Сульфат магния", grams, {'внесет S': round(added_s, 1)})
@@ -801,9 +778,9 @@ class NutrientCalculator:
801
 
802
  def _apply_calcium_nitrate(self):
803
  ca_need = self.final_profile['Ca']
804
- ca_content = fertilizers_db["Кальциевая селитра"]["Ca"]
805
  grams = (ca_need * self.volume) / (ca_content * 1000)
806
- added_n = grams * fertilizers_db["Кальциевая селитра"]["N (NO3-)"] * 1000 / self.volume
807
 
808
  self.final_profile['N (NO3-)'] -= added_n
809
  self._apply_fertilizer("Кальциевая селитра", grams, {'внесет NO3': round(added_n, 1)})
@@ -811,9 +788,9 @@ class NutrientCalculator:
811
 
812
  def _apply_mkp(self):
813
  p_need = self.final_profile['P']
814
- p_content = fertilizers_db["Монофосфат калия"]["P"]
815
  grams = (p_need * self.volume) / (p_content * 1000)
816
- added_k = grams * fertilizers_db["Монофосфат калия"]["K"] * 1000 / self.volume
817
 
818
  self.final_profile['K'] -= added_k
819
  self._apply_fertilizer("Монофосфат калия", grams, {'внесет K': round(added_k, 1)})
@@ -826,14 +803,14 @@ class NutrientCalculator:
826
 
827
  s_deficit = max(0, self.final_profile['S'])
828
  if s_deficit > 0:
829
- s_content = fertilizers_db["Калий сернокислый"]["S"]
830
  k2so4_grams = (s_deficit * self.volume) / (s_content * 1000)
831
- added_k = k2so4_grams * fertilizers_db["Калий сернокислый"]["K"] * 1000 / self.volume
832
 
833
  if added_k > k_need:
834
- k2so4_grams = (k_need * self.volume) / (fertilizers_db["Калий сернокислый"]["K"] * 1000)
835
  added_k = k_need
836
- added_s = k2so4_grams * fertilizers_db["Калий сернокислый"]["S"] * 1000 / self.volume
837
  else:
838
  added_s = s_deficit
839
 
@@ -846,8 +823,8 @@ class NutrientCalculator:
846
  k_need = self.final_profile['K']
847
 
848
  if k_need > 0:
849
- kno3_grams = (k_need * self.volume) / (fertilizers_db["Калий азотнокислый"]["K"] * 1000)
850
- added_n = kno3_grams * fertilizers_db["Калий азотнокислый"]["N (NO3-)"] * 1000 / self.volume
851
 
852
  self._apply_fertilizer("Калий азотнокислый", kno3_grams, {'внесет NO3': round(added_n, 1)})
853
  self.final_profile['K'] = 0
@@ -857,9 +834,9 @@ class NutrientCalculator:
857
  nh4_need = self.final_profile['N (NH4+)']
858
  if nh4_need <= 0:
859
  return
860
- nh4_content = fertilizers_db["Аммоний азотнокислый"]["N (NH4+)"]
861
  grams = (nh4_need * self.volume) / (nh4_content * 1000)
862
- added_n = grams * fertilizers_db["Аммоний азотнокислый"]["N (NO3-)"] * 1000 / self.volume
863
 
864
  self.final_profile['N (NO3-)'] -= added_n
865
  self._apply_fertilizer("Аммоний азотнокислый", grams, {'внесет NO3': round(added_n, 1)})
@@ -905,58 +882,11 @@ class NutrientCalculator:
905
  else:
906
  print(" Все элементы покрыты полностью")
907
 
908
- def _apply_potassium_fertilizers(self):
909
- k_need = self.final_profile['K']
910
- if k_need <= 0:
911
- return
912
-
913
- # Вариант 1: Если есть калий сернокислый
914
- if "Калий сернокислый" in self.fertilizers_db:
915
- s_deficit = max(0, self.final_profile['S'])
916
- if s_deficit > 0:
917
- s_content = self.fertilizers_db["Калий сернокислый"]["S"]
918
- k2so4_grams = (s_deficit * self.volume) / (s_content * 1000)
919
- added_k = k2so4_grams * self.fertilizers_db["Калий сернокислый"]["K"] * 1000 / self.volume
920
-
921
- if added_k > k_need:
922
- k2so4_grams = (k_need * self.volume) / (self.fertilizers_db["Калий сернокислый"]["K"] * 1000)
923
- added_k = k_need
924
- added_s = k2so4_grams * self.fertilizers_db["Калий сернокислый"]["S"] * 1000 / self.volume
925
- else:
926
- added_s = s_deficit
927
-
928
- self._apply_fertilizer("Калий сернокислый", k2so4_grams, {
929
- 'внесет K': round(added_k, 2),
930
- 'внесет S': round(added_s, 2)
931
- })
932
- self.final_profile['K'] -= added_k
933
- self.final_profile['S'] -= added_s
934
- k_need = self.final_profile['K']
935
-
936
- # Вариант 2: Если есть только калий азотнокислый
937
- if k_need > 0 and "Калий азотнокислый" in self.fertilizers_db:
938
- kno3_grams = (k_need * self.volume) / (self.fertilizers_db["Кали�� азотнокислый"]["K"] * 1000)
939
- added_n = kno3_grams * self.fertilizers_db["Калий азотнокислый"]["N (NO3-)"] * 1000 / self.volume
940
-
941
- self._apply_fertilizer(
942
- "Калий азотнокислый",
943
- kno3_grams,
944
- {'внесет NO3': round(added_n, 2)}
945
- )
946
- self.final_profile['K'] = 0
947
- self.final_profile['N (NO3-)'] -= added_n
948
-
949
- # Если остался дефицит и нет подходящих удобрений
950
- if k_need > 0:
951
- print(f" Внимание: Не удалось полностью покрыть дефицит K ({k_need:.2f} ppm)")
952
-
953
  # Пример использования
954
  if __name__ == "__main__":
955
- # Вариант 1: С калием сернокислым
956
- calc_with_k2so4 = NutrientCalculator(volume_liters=10, use_k2so4=True, use_kno3=False)
957
- calc_with_k2so4.calculate(TOTAL_NITROGEN, NO3_RATIO, NH4_RATIO)
958
- calc_with_k2so4.print_report()
959
-
960
 
961
 
962
 
 
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 = {}
 
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)
743
 
744
  self.initial_n_profile = {
745
  'N (NO3-)': round(no3, 1),
 
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
 
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
 
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)})
 
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
 
 
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
 
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
  else:
883
  print(" Все элементы покрыты полностью")
884
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
885
  # Пример использования
886
  if __name__ == "__main__":
887
+ calculator = NutrientCalculator(volume_liters=VOLUME_LITERS)
888
+ calculator.calculate(BASE_PROFILE, TOTAL_NITROGEN, NO3_RATIO, NH4_RATIO)
889
+ calculator.print_report()
 
 
890
 
891
 
892