Návrh režimu "Slunce do gridu"

Zdravím, chtěl bych ukázat automatizaci v HA, která by mohla být inspirací pro rozvoj Protea. Pokud někdo chce pomoci s testováním, přikládám skript automatizace.

Cílem je produkci FVE použít na spotřebu a zbytek prodat. Pokud není dost, pomoci s baterkou.

  • Zákaz nabíjení (není-li nastaven parametr power_max_charge)
  • Řešení asymetrie: baterka pomáhá tak, aby se pokryla nejsilnější fáze, na slabších fázích se víc prodává (takže může dojít k rychlejšímu vybíjení, pokud jedna fáze významně převyšuje ostatní). Ale furt lepší než na jedné fázi prodávat a na druhé kupovat, což stojí minimálně 3Kč/kWh odhadem
  • Cílové SOC

Očekávané chování

  • Provoz v Mode 4
  • Přechod do Mode 6 (SelfConsume) v určitých případech jako: baterie klesne pod SOC, spotřeba domu převýší FVE, vybíjení baterie přesáhne definovanou mez
variables:
  soc_target: 39 # pokud je baterie pod tímto, je zapnutý Mode 6 (SelfConsume)
  power_offset: 0 # offset pro přepnutí do Mode 6 při vysoké spotřebě
  power_spread: 150 # spread pro přepínání mezi Mode 4 a Mode 6, aby to nelítalo sem tam, při drobné změně výkonu
  power_correction: -10 # drobná korekce vypočtené hodnoty baterie
  power_disch_max: 3000 # maximální vybíjení baterie, při překročení se přejde do Mode 6
  power_max_charge: 0 # dodatečné povolené nabíjení/nucené vybíjení

Je tam asi nějaká parametrizace a kontroly navíc, takže to vypadá složitěji, než to vlastně musí být.

Nevyřešen zatím asi správně Trigger, kdyby někdo pomohl (jsem v HA začátečník):
Automatizace se spouští při každé změně čtyř senzorů, možná 4krát najednou

Testoval jsem na Solax 3X G4 10kW 7,2kWp 11,6kWh, HA Solax Inverter Modbus custom configuration 10s refresh

alias: Modified Feedin
description: ""
triggers:
  - entity_id:
      - sensor.solax_measured_power_l1
      - sensor.solax_measured_power_l2
      - sensor.solax_measured_power_l3
      - sensor.solax_pv_power_total
    trigger: state
conditions:
  - condition: template
    value_template: >-
      {{ states('sensor.solax_modbus_power_control') in ['Disabled', 'Push Power
      - P/N Mode', 'Self Consume - C/D Mode'] }}
    alias: Allowed states before performing automation
actions:
  - variables:
      soc_target: 17
      power_offset: 0
      power_spread: 150
      power_correction: -10
      power_disch_max: 2000
      power_max_charge: 0
    alias: Calculate constants
  - variables:
      power_max: >-
        {{ [states('sensor.solax_measured_power_l1')|float,
        states('sensor.solax_measured_power_l2')|float,
        states('sensor.solax_measured_power_l3')|float] | min * 3 }}
      mode_4_power: >-
        {{ [states('sensor.solax_battery_power_charge')|float + power_max -
        power_correction, -power_max_charge] | min  }}
    alias: Calculate variables
  - alias: Select Self-Consume or Push Mode
    if:
      - alias: Conditions to Self Consume
        condition: or
        conditions:
          - condition: template
            value_template: >-
              {{ states('sensor.solax_house_load')|float + power_offset >
              (states('sensor.solax_pv_power_total')|float + power_spread) }}
            alias: House above PV power
          - condition: template
            value_template: "{{ states('sensor.solax_battery_capacity')|float < soc_target }}"
            alias: Capacity below Target SOC
          - condition: template
            value_template: "{{ -mode_4_power > power_disch_max }}"
            alias: Battery power above max
    then:
      - alias: Self-Consume if not selected
        if:
          - condition: not
            conditions:
              - condition: state
                entity_id: sensor.solax_modbus_power_control
                state: Self Consume - C/D Mode
            alias: If Self Consume not selected
        then:
          - action: select.select_option
            metadata: {}
            data:
              option: Self-Consume - Charge/Discharge Mode
            target:
              entity_id: select.solax_modbus_power_control_direct
            alias: Select Self-Consume
    else:
      - alias: Conditionally Select Push mode
        if:
          - alias: Conditions to Push mode
            condition: or
            conditions:
              - condition: state
                entity_id: sensor.solax_modbus_power_control
                state: Disabled
              - condition: and
                conditions:
                  - condition: template
                    value_template: >-
                      {{ states('sensor.solax_house_load')|float + power_offset
                      < (states('sensor.solax_pv_power_total')|float -
                      power_spread) }}
                    alias: House below PV power
                  - alias: Capacity above Target SOC
                    condition: template
                    value_template: >-
                      {{ states('sensor.solax_battery_capacity')|float >
                      soc_target }}
        then:
          - alias: Is Select Push mode needed
            if:
              - condition: not
                conditions:
                  - condition: state
                    entity_id: sensor.solax_modbus_power_control
                    state: Push Power - P/N Mode
                alias: If Push Power - P/N Mode not selected
            then:
              - action: select.select_option
                metadata: {}
                data:
                  option: Push Power-Positive/Negative Mode
                target:
                  entity_id: select.solax_modbus_power_control_direct
                alias: Select Push Mode
      - alias: Conditionally set Push power
        if:
          - condition: state
            entity_id: sensor.solax_modbus_power_control
            state: Push Power - P/N Mode
        then:
          - target:
              entity_id: number.solax_remotecontrol_push_mode_power_direct
            data:
              value: "{{ -mode_4_power }}"
            action: number.set_value
            alias: Set calculated Push Power
        enabled: true
mode: single

Po dobu testování je dobré vypnout řízení protea a potom zase zapnout.
Testování lze provádět enable/disable automatizace.
Automatizace se nespustí, pokud je aktivovaný nějaký jiný Mode než 4 a 6.
Po disablování automatizace je vhodné dát modbus control do stavu Disabled

Trochu jsem upravil kod 30.7. 8:31

si znovu jen postesknu, kolika práce by nám zmizelo, kdyby výrobci udělali svoji práci pořádně (a remote control fungoval správně po fázích) :slight_smile:

Asi jo, ale tady neni jen reseni asymetrie.
Je tam
target soc
prepinani do selfuse, kdyz je spotreba moc velka
nastavitelne nabijeni a vybijeni zaroven v tomto rezimu (coz muze de facto suplovat dalsi rezimy target SoC.)

Pokusy, co jsem dělal 30.7. (upozorńuji, na jednotlivých grafech jsou režimy různě obarveny, tak aby nedošlo k mýlce.
Většinou na grafech zobrazuji export na třech fázích (cílem je nemít je záporné, tj. nechci nakupovat), FVE, baterku, spotřebu domu.


obr. výše… v noci
Automatizace by normálně s nedostatkem slunce jela SelfConume (žlutě), ale já jsem ji pro testovací účely přechytračil na chvíli do Push mode (červeně). Základní režim je modře.
Je vidět, Push power (mode 4) je nejhorší fáze 0W (ale bere si víc z baterky). Enabled Power Control (světle zeleně) cílí na celkový nulový export/import, ale na nejhorší fázi se nakupuje, na ostatních prodává. Ostatní režimy se plácají kolem nuly dle očekávání.

obr výše…když je dost slunce
Na třetí fázi jsem pokusně zapnul a vypnul čerpadlo několikrát.
Automatizace (zelená) má na baterce nulu jako přibitou, ostatní režimy se tak nějak motají kolem nuly

31.7. testování… je tam asi všechno: mraky, pračka, varná deska, konvice, trouba (se furt zapíná a vypíná), nucené vybíjení, target soc

Celkový přehled:
V noci jsem zapnul automatizaci. Automaticky střídá Mode 4 a 6 (v pruhu nahoře zelená-Push a modrá-SelfConsume). Chvíli je tam “Prodej do sítě místo nabíjení” (žlutá) a nakonec Backup (světle zelená).
Přes noc to jelo v Mode 6 (Self Consume), když začlo svítit, přeplo se to do Mode 4. Po 7h jsem nastavil parametr vybíjení na 1000W a potom na 2500W. Dole je vidět Solax min SoC a ten to ignoruje (podobně se chová flexibilita). V automatizaci mám parametr target soc a ten jsem nastavil na 22%. Tam se vybíjení zastavilo. Po 10h jsem nastavil target soc na 30% a protože zrovna svítilo, vyjelo to tam celkem rychle a tam se to drželo. Tam jsem to chvíli nechal a ve 12h konec pokusu.

Detail:


Přes noc je zapnut Mode 6 a export je kolem 0W na všech fázích. V 5:42 začalo svítit dostatečně a režim se přepnul do Mode 4. Pokud je dost slunce, baterie má přesně 0W a export na všech fázích se zvedne nad 0W. V 5:50 se snížila FVE a baterka pomohla tak, aby nejvytíženější fáze nebrala z gridu, tj export je 0W (v tomto případě L1 hnědá)


V automatizaci jede slunce do gridu, baterka je na 0W. V 7:04 jsem nastavil parametr vybíjení na 1000W a v 7:42 zvýšil na 2500W a v 7:52 vypnul nucené vybíjení. Do toho vybíjení vletěla v 7:08 rychlovarná konvice a protože spotřeba přesáhla produkci, přeplo se to do modu 6.

Zde je celkem vidět vykrývání mraků, jinak je baterie na 0W. V 8:22 spotřeba převýšila výrobu a tak se to přeplo do Mode 6. Když spotřeba klesla, vrátilo se to do Mode 4. V 9:10 jsem navýšil vybíjení, abych se rychle dostal na target 22%. V 9:16 se dosáhlo targetu a přeplo na Mode 6. Do toho se zapla trouba, takže to chvíli zůstalo na 21%, než se to zvedlo.

Plácá se to chvíli kolem targetu 22% a střídá mody 4 a 6. V 10:20 jsem změnil target na 30% a tak to začalo stoupat.

V 10:40 to dosáhlo targetu 30% a tam se to drží. Střídá Mode 4 a 6 podle potřeby. V 11:22 jsem zapnul Proteus prodej do sítě místo nabíjení (žluté). V 11:40 začalo ubývat slunce tak proteus začal nakupovat z gridu na 1. fázi (hnědá), tak jsem to přepnul zpět na mou Automatizaci.

Tolik zatím moje testy, tak mi kdyžtak někdo něco pěkného napište, ať si tu nepíšu sám…