Free electricity forecast, how to automate dess to grab the opportunity?

My question is: How to automate dess to grab obvious opportunities? You made your point you find it easier to operate min soc setpoints manually. But I don’t and want to figure out what can be done not having to pay attention to the system more than at maximum tweaking parameters once a week. Best moment seems to be either Friday afternoon when the Saturday data is in, or Monday evening after tibber published their weekly forecast, and maybe Friday and Monday but not during the other weekdays. Within those constraints I seek first to use a combination of parameters readily available through VRM, such as charge/discharge schedule, min soc and any other that may be suggested. After that I may consider diving into something sort of very basic scripting, be it with node red or home automation. Or alternatively invest some time testing the SaaS GbbOptimizer offer. Bottom line I simply do not want to commit my time to being a system operator, only to research and development.
Tibber announced on Monday that tonight’s storm could bring lower prices, the week before they also forecasted last weekends low price expectations.

I assume I share more nerdy/autistic character trades with quite a few boards members here than not. I just want to make another choice to protect my own agenda by deliberately not tempting myself to spend time on this system instead of on my business. Which involves battery and bms development and manufacturing by the way, closely related and simply much more important to invest my brain space on.

My set-and-forget-method is a HomeAssistant automation that sets Min SoC and Max Charge / Discharge Power based on fixed price thresholds. It’s especially tweaked towards low prices during winter nights which typically have excess wind power.

It works reasonably well so far. Here is the code, but I didn’t use entities so it’s a bit hard to read, see legend below:

alias: MP2 charge control
description: ""
triggers:
  - trigger: state
    entity_id:
      - sensor.electricity_price_unser_zuhause
    enabled: false
  - trigger: time_pattern
    minutes: "1"
  - trigger: state
    entity_id:
      - sensor.mp2_batterie_soc
conditions: []
actions:
  - if:
      - type: is_value
        condition: device
        device_id: ba285cb7511f5f5570f5023cc72c1fe2
        entity_id: aac1ef4f013551d6c6a51d48cb27ada8
        domain: sensor
        below: 0.26
    then:
      - if:
          - type: is_battery_level
            condition: device
            device_id: 37f56a5afbc28ad4765741714bb4d308
            entity_id: 2a32d04878f60ba24786cdf0f26e436a
            domain: sensor
            below: 90
        then:
          - device_id: 37f56a5afbc28ad4765741714bb4d308
            domain: number
            entity_id: c1b84c9b89f10e43235a4333ae74464e
            type: set_value
            value: 0
        else:
          - device_id: 37f56a5afbc28ad4765741714bb4d308
            domain: number
            entity_id: c1b84c9b89f10e43235a4333ae74464e
            type: set_value
            value: -1
      - device_id: 37f56a5afbc28ad4765741714bb4d308
        domain: number
        entity_id: 91076d9f9580d7dd1a3b67f0e7a8efba
        type: set_value
        value: 75
    else:
      - device_id: 37f56a5afbc28ad4765741714bb4d308
        domain: number
        entity_id: c1b84c9b89f10e43235a4333ae74464e
        type: set_value
        value: -1
      - if:
          - type: is_value
            condition: device
            device_id: ba285cb7511f5f5570f5023cc72c1fe2
            entity_id: aac1ef4f013551d6c6a51d48cb27ada8
            domain: sensor
            above: 0.35
        then:
          - device_id: 37f56a5afbc28ad4765741714bb4d308
            domain: number
            entity_id: 91076d9f9580d7dd1a3b67f0e7a8efba
            type: set_value
            value: 10
        else:
          - action: number.set_value
            metadata: {}
            data:
              value: >-
                {{ [[50.0, states('sensor.mp2_batterie_soc') | float(10) ] |
                min, 25.0] | max }}
            target:
              entity_id: number.mp2_min_soc
        enabled: true
      - if:
          - type: is_value
            condition: device
            device_id: ba285cb7511f5f5570f5023cc72c1fe2
            entity_id: aac1ef4f013551d6c6a51d48cb27ada8
            domain: sensor
            above: 0.3
          - type: is_battery_level
            condition: device
            device_id: 37f56a5afbc28ad4765741714bb4d308
            entity_id: 2a32d04878f60ba24786cdf0f26e436a
            domain: sensor
            above: 50
          - condition: sun
            before: sunrise
            after: sunset
        then:
          - device_id: 37f56a5afbc28ad4765741714bb4d308
            domain: number
            entity_id: 6a5c5712a9c0f6085b2ba56b0c0720f5
            type: set_value
            value: 0
        else:
          - device_id: 37f56a5afbc28ad4765741714bb4d308
            domain: number
            entity_id: 6a5c5712a9c0f6085b2ba56b0c0720f5
            type: set_value
            value: -1
mode: single

aac1ef4f013551d6c6a51d48cb27ada8 = Tibber price
2a32d04878f60ba24786cdf0f26e436a = Current SoC
91076d9f9580d7dd1a3b67f0e7a8efba = Min Soc
c1b84c9b89f10e43235a4333ae74464e = Max Discharge Power (-1 = unlimited)
6a5c5712a9c0f6085b2ba56b0c0720f5 = Max Charge Power (-1 = unlimited)