DmitrMakeev commited on
Commit
b99081c
·
verified ·
1 Parent(s): 2c58cbe

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +73 -93
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
- self.ec_total = 0.0
729
-
730
  def calculate(self, profile):
731
- self._calc_single_component(profile)
732
- self._calc_complex(profile)
 
 
 
733
  return self.results
734
-
735
- def _add_ec(self, fert_name, grams):
736
- ec_factor = fertilizers_db[fert_name].get("EC_factor", 0)
737
- ec_contrib = ec_factor * (grams / self.volume)
738
- self.ec_total += ec_contrib
739
-
740
- def _calc_single_component(self, profile):
741
- if 'Mg' in profile and 'S' in profile:
742
- mg_needed = profile['Mg']
743
- mg_grams = (mg_needed * self.volume) / (fertilizers_db["Сульфат магния"]["Mg"] * 1000)
744
- s_from_mg = mg_grams * fertilizers_db["Сульфат магния"]["S"] * 1000 / self.volume
745
- self.results["Сульфат магния"] = {
746
- 'граммы': round(mg_grams, 3),
747
- 'миллиграммы': int(mg_grams * 1000),
748
- 'внесет S': round(s_from_mg, 1)
749
- }
750
- profile['S'] -= s_from_mg
751
- self._add_ec("Сульфат магния", mg_grams)
752
-
753
- def _calc_complex(self, profile):
754
- if 'Ca' in profile and 'N (NO3-)' in profile:
755
- ca_grams = (profile['Ca'] * self.volume) / (fertilizers_db["Кальциевая селитра"]["Ca"] * 1000)
756
- no3_from_ca = ca_grams * fertilizers_db["Кальциевая селитра"]["N (NO3-)"] * 1000 / self.volume
757
- self.results["Кальциевая селитра"] = {
758
- 'граммы': round(ca_grams, 3),
759
- 'миллиграммы': int(ca_grams * 1000),
760
- 'внесет NO3': round(no3_from_ca, 1)
761
- }
762
- profile['N (NO3-)'] -= no3_from_ca
763
- self._add_ec("Кальциевая селитра", ca_grams)
764
-
765
- if 'P' in profile and 'K' in profile:
766
- p_grams = (profile['P'] * self.volume) / (fertilizers_db["Монофосфат калия"]["P"] * 1000)
767
- k_from_p = p_grams * fertilizers_db["Монофосфат калия"]["K"] * 1000 / self.volume
768
- self.results["Монофосфат калия"] = {
769
- 'граммы': round(p_grams, 3),
770
- 'миллиграммы': int(p_grams * 1000),
771
- 'внесет K': round(k_from_p, 1)
772
- }
773
- profile['K'] -= k_from_p
774
- self._add_ec("Монофосфат калия", p_grams)
775
-
776
- if 'K' in profile and profile['K'] > 0 and 'N (NO3-)' in profile:
777
- k_grams = (profile['K'] * self.volume) / (fertilizers_db["Калий азотнокислый"]["K"] * 1000)
778
- no3_from_k = k_grams * fertilizers_db["Калий азотнокислый"]["N (NO3-)"] * 1000 / self.volume
779
- self.results["Калий азотнокислый"] = {
780
- 'граммы': round(k_grams, 3),
781
- 'миллиграммы': int(k_grams * 1000),
782
- 'внесет NO3': round(no3_from_k, 1)
783
- }
784
- profile['N (NO3-)'] -= no3_from_k
785
- self._add_ec("Калий азотнокислый", k_grams)
786
-
787
- if 'N (NH4+)' in profile and profile['N (NH4+)'] > 0:
788
- nh4_grams = (profile['N (NH4+)'] * self.volume) / (fertilizers_db["Аммоний азотнокислый"]["N (NH4+)"] * 1000)
789
- no3_from_nh4 = nh4_grams * fertilizers_db["Аммоний азотнокислый"]["N (NO3-)"] * 1000 / self.volume
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("\n" + "="*50)
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
- table.append([
811
- fert,
812
- f"{data['граммы']:.3f} г",
813
- f"{data['миллиграммы']} мг",
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
- print(tabulate([(k, v) for k, v in profile.items() if v > 0.1],
822
- headers=["Элемент", "Недостача (ppm)"]))
 
 
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__':