ESPHOME "Interval" a może inaczej?

Dzień dobry
Stoję przed dylematem jak rozwiązać kwestię cyklicznego sprawdzania stanu czujników i na tej podstawie sterowania mocą grzałki poprzez “Number”.
Są 3 warunki; jeden nadrzędny i 2 podrzędne.
Podpowiedzcie proszę jak to razem zgrać?
Poniżej fragment kodu:

interval:
# Warunek głowny 
    - interval: 300ms
      - if:
        condition:
          - lambda: |-
               return id(bat_v).state < (id(boost_v).state);
         then:    
           # Warunek 1 #
      - if:
        condition:
          for:
            time: 60min
            condition:
              - lambda: |-
                  return id(bat_v).state > ((id(boost_v).state) - 1);
        then:
          # Warunek 2 #
        
  # Warunek 1
  - interval: 300ms
    then:
      - if:
        condition:
          - lambda: |-
              return id(bat_c).state > ((id(bat_max_c).state) - 4);
        then:
          - number.increment:
              id: moc
              cycle: false
      - if:
        condition:
          - lambda: |-
              return id(bat_c).state < ((id(bat_max_c).state) - 6);
        then:    
          - number.decrement:
              id: moc
              cycle: false

  #  Warunek 2 
  - interval: 300ms
      - if:
        condition:
          - lambda: |-
              return id(bat_v).state > ((id(float_v).state) + 1);
        then:
          - number.increment:
                  id: moc
                  cycle: false
        - if:
            condition:
              - lambda: |-
                  return id(bat_v).state < (id(float_v).state);
            then:    
              - number.decrement:
                  id: moc
                  cycle: false

Po Twojej logice pisania kodu w ESPHome wnioskuję, że kiedyś pisałeś programy w Arduino?

Nigdy nie uczyłem się żadnego programowania. Uczę się Esphome na podstawie różnych przykładów i mam już sporo różnych działających urządzeń…
Moje pytanie jest ściśle z tym powiązane gdyż pewnie można to zrobić inaczej ale nie znalazłem żadnego rozwiązania na którym mógłbym się oprzeć.

OK, czyli zaczynamy od zera i bardzo dobrze :slight_smile: . Proszę opisz jakie masz sensory i jaka ma być logika sterowania na podstawie stanu tych encji.

Sensory

  1. sensor.bat_v - napięcie baterii odczytane z bocznika
  2. sensor.bat_c - prąd baterii odczytany z bocznika
  3. number.boost_v - napięcie boost - template sensor ustawiany ręcznie
  4. number.float_v - napięcie float - template sensor ustawiany ręcznie
  5. number.bat_max_c - max prąd ładowania - template sensor ustawiany ręcznie

Elementem sterującym jest komponent number (id: moc) sterujący triakiem przez LedC

Logika:

  1. bat_v jest mniejsze od boost_v
    • jeśli bat_c zbliża się do bat_max_c (dlatego w kodzie jest -4) to cyklicznie zwiększaj moc
    • jeśli bat_c spadnie poniżej bat_max_c minus 6A to cyklicznie zmniejszaj moc
  2. jeśli w ciągu 60min bat_v jest bliskie boost_v (dlatego boost_v minus 1)
    • jeśli bat_v jest większe od float_v to cyklicznie zwiększaj moc
  • jeśli bat_v jest miejsze od float_v to cyklicznie zmniejszaj moc

Od strony sprzętowej jest to off- grid zawierający falownik i 2 ładowarki których łączna moc ładowania jest wyższa niż dopuszczalny prąd baterii (dlatego ustawiany ręcznie bat_max_c w zależności od tego ile banków pracuje aktualnie razem). Obniżanie tego prądu realizowane jest za pomocą osobnej przetwornicy obciążającej akumulator i ładowarki a zasilającej płynnie (do tego właśnie number i LedC) grzałki.
Powyższe to warunek 1
Warunek 2 realizuje grzanie wody kiedy akumulatory są naładowane w celu maksymalnego wyciśnięcia prądu z falownika i ładowarek bez obciążania baterii.