DmitrMakeev commited on
Commit
93fb46e
·
verified ·
1 Parent(s): 9cd1434

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +23 -46
app.py CHANGED
@@ -684,6 +684,17 @@ NO3_RATIO = 9.000
684
  NH4_RATIO = 1.00
685
  VOLUME_LITERS = 100
686
 
 
 
 
 
 
 
 
 
 
 
 
687
  # Целевые значения
688
  BASE_PROFILE = {
689
  'P': 31.000,
@@ -696,22 +707,11 @@ BASE_PROFILE = {
696
  }
697
 
698
  FERTILIZERS = {
699
- # Кальциевая селитра (Ca(NO3)2) - стандарт: 15.5% N (NO3-), 19% Ca
700
  "Кальциевая селитра": {"N (NO3-)": 0.155, "Ca": 0.19},
701
-
702
- # Калий азотнокислый (KNO3) - стандарт: 13.7% N (NO3-), 38.3% K
703
  "Калий азотнокислый": {"N (NO3-)": 0.137, "K": 0.383},
704
-
705
- # Калий сернокислый (K2SO4) - стандарт: 44.8% K, 18.4% S
706
  "Калий сернокислый": {"K": 0.448, "S": 0.184},
707
-
708
- # Аммоний азотнокислый (NH4NO3) - стандарт: 17.5% N (NO3-), 17.5% N (NH4+)
709
  "Аммоний азотнокислый": {"N (NO3-)": 0.175, "N (NH4+)": 0.175},
710
-
711
- # Сульфат магния (MgSO4·7H2O) - стандарт: 9.8% Mg, 13% S
712
  "Сульфат магния": {"Mg": 0.098, "S": 0.13},
713
-
714
- # Монофосфат калия (KH2PO4) - скорректировано под 49.9% P2O5 и 33.1% K2O
715
  "Монофосфат калия": {"P": 0.218, "K": 0.275}
716
  }
717
 
@@ -722,6 +722,7 @@ class NutrientCalculator:
722
  self.target_profile = BASE_PROFILE.copy()
723
  self.actual_profile = {k: 0.0 for k in BASE_PROFILE}
724
  self.fertilizers = FERTILIZERS
 
725
 
726
  # Расчёт азота
727
  total_parts = NO3_RATIO + NH4_RATIO
@@ -733,24 +734,19 @@ class NutrientCalculator:
733
  }
734
 
735
  def calculate(self):
736
- # Используем значения из базового профиля
737
  self._apply("Сульфат магния", "Mg", self.target_profile['Mg'])
738
  self._apply("Кальциевая селитра", "Ca", self.target_profile['Ca'])
739
  self._apply("Монофосфат калия", "P", self.target_profile['P'])
740
  self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
741
 
742
- # Сначала покрываем NO3- из кальциевой селитры и аммонийной
743
  current_no3 = self.actual_profile['N (NO3-)']
744
  no3_needed = self.target_profile['N (NO3-)'] - current_no3
745
 
746
- # Добавляем калий азотнокислый для покрытия оставшегося NO3-
747
  if no3_needed > 0.1:
748
  self._apply("Калий азотнокислый", "N (NO3-)", no3_needed)
749
 
750
- # Затем покрываем калий и серу
751
  self._apply_k_sulfate()
752
 
753
- # Проверяем и покрываем оставшийся калий калий азотнокислым
754
  k_deficit = self.target_profile['K'] - self.actual_profile['K']
755
  if k_deficit > 0.1:
756
  self._apply("Калий азотнокислый", "K", k_deficit)
@@ -767,7 +763,8 @@ class NutrientCalculator:
767
  if fert_name not in self.results:
768
  result = {
769
  'граммы': 0.0,
770
- 'миллиграммы': 0
 
771
  }
772
  for element in self.fertilizers[fert_name]:
773
  result[f'внесет {self._label(element)}'] = 0.0
@@ -776,41 +773,20 @@ class NutrientCalculator:
776
  self.results[fert_name]['граммы'] += grams
777
  self.results[fert_name]['миллиграммы'] += int(grams * 1000)
778
 
 
779
  for element, percent in self.fertilizers[fert_name].items():
780
  added_ppm = grams * percent * 1000 / self.volume
781
  self.results[fert_name][f'внесет {self._label(element)}'] += added_ppm
782
  self.actual_profile[element] += added_ppm
783
-
784
- def _apply_k_sulfate(self):
785
- fert = "Калий сернокислый"
786
- k_def = self.target_profile['K'] - self.actual_profile['K']
787
- s_def = self.target_profile['S'] - self.actual_profile['S']
788
 
789
- if k_def <= 0 and s_def <= 0:
790
- return
791
-
792
- # Рассчитываем необходимое количество для покрытия дефицита серы
793
- if s_def > 0.1:
794
- s_content = self.fertilizers[fert]["S"]
795
- grams_s = s_def * self.volume / (s_content * 1000)
796
-
797
- k_content = self.fertilizers[fert]["K"]
798
- k_from_s = grams_s * k_content * 1000 / self.volume
799
-
800
- if k_from_s > k_def and k_def > 0.1:
801
- # Если серы нужно больше, чем нужно для калия, ограничиваем
802
- grams = k_def * self.volume / (k_content * 1000)
803
- else:
804
- grams = grams_s
805
-
806
- self._apply(fert, "S", s_def)
807
 
808
- def _label(self, el):
809
- return "NO3" if el == "N (NO3-)" else "NH4" if el == "N (NH4+)" else el
810
 
811
  def calculate_ec(self):
812
- total_ppm = sum(self.actual_profile.values())
813
- return round(total_ppm / 700, 2)
814
 
815
  def print_report(self):
816
  print("\n" + "="*60)
@@ -837,9 +813,11 @@ class NutrientCalculator:
837
  fert,
838
  round(data['граммы'], 3),
839
  data['миллиграммы'],
 
840
  "\n".join(adds)
841
  ])
842
- print(tabulate(fert_table, headers=["Удобрение", "Граммы", "Миллиграммы", "Добавит"]))
 
843
 
844
  print("\nОСТАТОЧНЫЙ ДЕФИЦИТ:")
845
  deficit = {
@@ -860,6 +838,5 @@ if __name__ == "__main__":
860
 
861
 
862
 
863
-
864
  if __name__ == '__main__':
865
  app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860)))
 
684
  NH4_RATIO = 1.00
685
  VOLUME_LITERS = 100
686
 
687
+ # Коэффициенты электропроводности для каждого элемента (мСм/см на ppm)
688
+ EC_COEFFICIENTS = {
689
+ 'P': 0.0012,
690
+ 'K': 0.0018,
691
+ 'Mg': 0.0015,
692
+ 'Ca': 0.0016,
693
+ 'S': 0.0014,
694
+ 'N (NO3-)': 0.0017,
695
+ 'N (NH4+)': 0.0019
696
+ }
697
+
698
  # Целевые значения
699
  BASE_PROFILE = {
700
  'P': 31.000,
 
707
  }
708
 
709
  FERTILIZERS = {
 
710
  "Кальциевая селитра": {"N (NO3-)": 0.155, "Ca": 0.19},
 
 
711
  "Калий азотнокислый": {"N (NO3-)": 0.137, "K": 0.383},
 
 
712
  "Калий сернокислый": {"K": 0.448, "S": 0.184},
 
 
713
  "Аммоний азотнокислый": {"N (NO3-)": 0.175, "N (NH4+)": 0.175},
 
 
714
  "Сульфат магния": {"Mg": 0.098, "S": 0.13},
 
 
715
  "Монофосфат калия": {"P": 0.218, "K": 0.275}
716
  }
717
 
 
722
  self.target_profile = BASE_PROFILE.copy()
723
  self.actual_profile = {k: 0.0 for k in BASE_PROFILE}
724
  self.fertilizers = FERTILIZERS
725
+ self.total_ec = 0.0 # Накопленное значение EC
726
 
727
  # Расчёт азота
728
  total_parts = NO3_RATIO + NH4_RATIO
 
734
  }
735
 
736
  def calculate(self):
 
737
  self._apply("Сульфат магния", "Mg", self.target_profile['Mg'])
738
  self._apply("Кальциевая селитра", "Ca", self.target_profile['Ca'])
739
  self._apply("Монофосфат калия", "P", self.target_profile['P'])
740
  self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
741
 
 
742
  current_no3 = self.actual_profile['N (NO3-)']
743
  no3_needed = self.target_profile['N (NO3-)'] - current_no3
744
 
 
745
  if no3_needed > 0.1:
746
  self._apply("Калий азотнокислый", "N (NO3-)", no3_needed)
747
 
 
748
  self._apply_k_sulfate()
749
 
 
750
  k_deficit = self.target_profile['K'] - self.actual_profile['K']
751
  if k_deficit > 0.1:
752
  self._apply("Калий азотнокислый", "K", k_deficit)
 
763
  if fert_name not in self.results:
764
  result = {
765
  'граммы': 0.0,
766
+ 'миллиграммы': 0,
767
+ 'вклад в EC': 0.0
768
  }
769
  for element in self.fertilizers[fert_name]:
770
  result[f'внесет {self._label(element)}'] = 0.0
 
773
  self.results[fert_name]['граммы'] += grams
774
  self.results[fert_name]['миллиграммы'] += int(grams * 1000)
775
 
776
+ fert_ec = 0.0
777
  for element, percent in self.fertilizers[fert_name].items():
778
  added_ppm = grams * percent * 1000 / self.volume
779
  self.results[fert_name][f'внесет {self._label(element)}'] += added_ppm
780
  self.actual_profile[element] += added_ppm
781
+ fert_ec += added_ppm * EC_COEFFICIENTS[element]
 
 
 
 
782
 
783
+ self.results[fert_name]['вклад в EC'] += fert_ec
784
+ self.total_ec += fert_ec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
785
 
786
+ # ... остальные методы остаются без изменений ...
 
787
 
788
  def calculate_ec(self):
789
+ return round(self.total_ec, 2)
 
790
 
791
  def print_report(self):
792
  print("\n" + "="*60)
 
813
  fert,
814
  round(data['граммы'], 3),
815
  data['миллиграммы'],
816
+ round(data['вклад в EC'], 3),
817
  "\n".join(adds)
818
  ])
819
+ print(tabulate(fert_table,
820
+ headers=["Удобрение", "Граммы", "Миллиграммы", "EC (мСм/см)", "Добавит"]))
821
 
822
  print("\nОСТАТОЧНЫЙ ДЕФИЦИТ:")
823
  deficit = {
 
838
 
839
 
840
 
 
841
  if __name__ == '__main__':
842
  app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860)))