DmitrMakeev commited on
Commit
9b1fe52
·
verified ·
1 Parent(s): b99081c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +59 -25
app.py CHANGED
@@ -680,6 +680,7 @@ def view_image():
680
 
681
 
682
 
 
683
 
684
  TOMATO_PROFILE = {
685
  'N (NO3-)': 200,
@@ -691,6 +692,17 @@ TOMATO_PROFILE = {
691
  'S': 100
692
  }
693
 
 
 
 
 
 
 
 
 
 
 
 
694
  fertilizers_db = {
695
  "Кальциевая селитра": {
696
  "N (NO3-)": 0.118,
@@ -714,18 +726,19 @@ fertilizers_db = {
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):
@@ -735,59 +748,76 @@ class NutrientCalculator:
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():
@@ -797,15 +827,19 @@ class NutrientCalculator:
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)
807
  results = calc.calculate(TOMATO_PROFILE.copy())
808
- calc.print_report(TOMATO_PROFILE.copy())
809
 
810
 
811
 
 
680
 
681
 
682
 
683
+ from tabulate import tabulate
684
 
685
  TOMATO_PROFILE = {
686
  'N (NO3-)': 200,
 
692
  'S': 100
693
  }
694
 
695
+ # Коэффициенты для перевода ppm в mS/cm (примерные)
696
+ EC_FACTORS = {
697
+ 'N (NO3-)': 0.71,
698
+ 'N (NH4+)': 0.71,
699
+ 'P': 0.51,
700
+ 'K': 0.50,
701
+ 'Mg': 0.39,
702
+ 'Ca': 0.40,
703
+ 'S': 0.43
704
+ }
705
+
706
  fertilizers_db = {
707
  "Кальциевая селитра": {
708
  "N (NO3-)": 0.118,
 
726
  }
727
  }
728
 
 
729
  class NutrientCalculator:
730
  def __init__(self, volume_liters=1.0):
731
  self.volume = volume_liters
732
  self.results = {}
733
+ self.final_profile = {}
734
 
735
  def calculate(self, profile):
736
+ self.final_profile = profile.copy()
737
+ self._apply_magnesium_sulfate()
738
+ self._apply_calcium_nitrate()
739
+ self._apply_mkp()
740
+ self._apply_potassium_nitrate()
741
+ self._apply_ammonium_nitrate()
742
  return self.results
743
 
744
  def _apply_fertilizer(self, fert_name, grams, additions):
 
748
  }
749
  self.results[fert_name].update(additions)
750
 
751
+ def _apply_magnesium_sulfate(self):
752
+ mg_need = self.final_profile['Mg']
753
  mg_content = fertilizers_db["Сульфат магния"]["Mg"]
754
  grams = (mg_need * self.volume) / (mg_content * 1000)
755
  added_s = grams * fertilizers_db["Сульфат магния"]["S"] * 1000 / self.volume
756
 
757
+ self.final_profile['S'] -= added_s
758
  self._apply_fertilizer("Сульфат магния", grams, {'внесет S': round(added_s, 1)})
759
+ self.final_profile['Mg'] = 0
760
 
761
+ def _apply_calcium_nitrate(self):
762
+ ca_need = self.final_profile['Ca']
763
  ca_content = fertilizers_db["Кальциевая селитра"]["Ca"]
764
  grams = (ca_need * self.volume) / (ca_content * 1000)
765
  added_n = grams * fertilizers_db["Кальциевая селитра"]["N (NO3-)"] * 1000 / self.volume
766
 
767
+ self.final_profile['N (NO3-)'] -= added_n
768
  self._apply_fertilizer("Кальциевая селитра", grams, {'внесет NO3': round(added_n, 1)})
769
+ self.final_profile['Ca'] = 0
770
 
771
+ def _apply_mkp(self):
772
+ p_need = self.final_profile['P']
773
  p_content = fertilizers_db["Монофосфат калия"]["P"]
774
  grams = (p_need * self.volume) / (p_content * 1000)
775
  added_k = grams * fertilizers_db["Монофосфат калия"]["K"] * 1000 / self.volume
776
 
777
+ self.final_profile['K'] -= added_k
778
  self._apply_fertilizer("Монофосфат калия", grams, {'внесет K': round(added_k, 1)})
779
+ self.final_profile['P'] = 0
780
 
781
+ def _apply_potassium_nitrate(self):
782
+ k_need = self.final_profile['K']
783
  if k_need <= 0:
784
  return
785
  k_content = fertilizers_db["Калий азотнокислый"]["K"]
786
  grams = (k_need * self.volume) / (k_content * 1000)
787
  added_n = grams * fertilizers_db["Калий азотнокислый"]["N (NO3-)"] * 1000 / self.volume
788
 
789
+ self.final_profile['N (NO3-)'] -= added_n
790
  self._apply_fertilizer("Калий азотнокислый", grams, {'внесет NO3': round(added_n, 1)})
791
+ self.final_profile['K'] = 0
792
 
793
+ def _apply_ammonium_nitrate(self):
794
+ nh4_need = self.final_profile['N (NH4+)']
795
  if nh4_need <= 0:
796
  return
797
  nh4_content = fertilizers_db["Аммоний азотнокислый"]["N (NH4+)"]
798
  grams = (nh4_need * self.volume) / (nh4_content * 1000)
799
  added_n = grams * fertilizers_db["Аммоний азотнокислый"]["N (NO3-)"] * 1000 / self.volume
800
 
801
+ self.final_profile['N (NO3-)'] -= added_n
802
  self._apply_fertilizer("Аммоний азотнокислый", grams, {'внесет NO3': round(added_n, 1)})
803
+ self.final_profile['N (NH4+)'] = 0
804
+
805
+ def calculate_ec(self):
806
+ """Расчет электропроводимости (EC) в mS/cm"""
807
+ total_ec = 0.0
808
+ for element, concentration in TOMATO_PROFILE.items():
809
+ if element in EC_FACTORS:
810
+ total_ec += concentration * EC_FACTORS[element] / 1000
811
+ return round(total_ec, 2)
812
+
813
+ def print_report(self):
814
+ ec_value = self.calculate_ec()
815
+
816
  print("=" * 50)
817
  print(f"РАСЧЕТ ДЛЯ {self.volume} ЛИТРОВ РАСТВОРА")
818
  print("=" * 50)
819
+
820
+ print(f"\nРАСЧЕТНАЯ ЭЛЕКТРОПРОВОДИМОСТЬ (EC): {ec_value} mS/cm")
821
 
822
  print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ:")
823
  for fert, data in self.results.items():
 
827
  print(f" ➕ {k}: {v} ppm")
828
 
829
  print("\nОСТАТОЧНЫЙ ДЕФИЦИТ:")
830
+ deficit_found = False
831
+ for el, val in self.final_profile.items():
832
  if val > 0.1:
833
  print(f" 🔸 {el}: {round(val, 1)} ppm")
834
+ deficit_found = True
835
+ if not deficit_found:
836
+ print(" Все элементы полностью покрыты удобрениями")
837
 
838
 
839
  # Пример использования
840
  calc = NutrientCalculator(volume_liters=10)
841
  results = calc.calculate(TOMATO_PROFILE.copy())
842
+ calc.print_report()
843
 
844
 
845