PV Speicher Steuerung via Modbus (SMA SUNNY TRIPOWER 8.0 SE | BYD HVS)

Moin ich beziehe mich auf diesen sensor

- name: Electricity price tibber
    unit_of_measurement: "EUR/kWh"
    icon: mdi:currency-eur
    state: >-
      {{state_attr('sensor.tibber_preisabruf', 'current')['total']}}
    attributes:
      jetzt: >-
        {{state_attr('sensor.tibber_preisabruf', 'current')['total']}}
      current: >-
        {% if state_attr('sensor.tibber_preisabruf', 'current') %}
          {{ state_attr('sensor.tibber_preisabruf', 'current') }}
        {% else %}
          [ ]
        {% endif %}
      today: >-
        {% if state_attr('sensor.tibber_preisabruf', 'today') %}
          {{ state_attr('sensor.tibber_preisabruf', 'today') }}
        {% else %}
          [ ]
        {% endif %}
      tomorrow: >-
        {% if state_attr('sensor.tibber_preisabruf', 'tomorrow') %}
          {{ state_attr('sensor.tibber_preisabruf', 'tomorrow') }}
        {% else %}
          [ ]
        {% endif %}
      all_prices: " {{ this.attributes.today | default(0) + this.attributes.tomorrow | default([]) }} "
      min_price: >-
        {% if this.attributes.today | default('unknown') in ['unknown','unavailable','none'] or (this.attributes.today | default([]) | map(attribute='total') | list | count) < 1 %}
          unknown
        {% else %}
          {{ this.attributes.today | default([0]) | map(attribute='total') | list  | min | float(0) | round(4) }}
        {% endif %}
      max_price: >-
        {% if this.attributes.today | default('unknown') in ['unknown','unavailable','none'] or (this.attributes.today | default([]) | map(attribute='total') | list | count) < 1 %}
          unknown
        {% else %}
          {{ this.attributes.today | default([0]) | map(attribute='total') | list | max | float(0) | round(4) }}
        {% endif %}
      avg_price: >-
        {% if this.attributes.today | default('unknown') in ['unknown','unavailable','none'] or (this.attributes.today | default([]) | map(attribute='total') | list | count) < 1 %}
          unknown
        {% elif (this.attributes.today | default([]) | map(attribute='total') | list | count) < 2 %}
          {{ this.attributes.today | default([0]) | map(attribute='total') | list | max | float(0) | round(4) }}
        {% else %}
          {{ this.attributes.today | default([0]) | map(attribute='total') | list | average(0) | float(0) | round(4) }}
        {% endif %}
      price_level: >-
        {% if (this.attributes.current | default('unknown')) in ['unknown','unavailable','none'] %}
          unknown
        {% else %}
          {{ this.attributes.current.level | default('unknown') | replace('_', ' ') | capitalize }}
        {% endif %}
      price_level_1d: >-
        {% set price_cur = this.state | default(0) | float(0) %}
        {% set price_avg = this.attributes.avg_price | default(0) | float(0) %}
        {% if price_cur == 0 or price_avg == 0 %}
          unknown
        {% else %}
          {% set price_ratio = (price_cur / price_avg) %}
          {% if price_ratio >= 1.4 %}
            sehr teuer
          {% elif price_ratio >= 1.15 %}
            teuer
          {% elif price_ratio <= 0.6 %}
            sehr günstig
          {% elif price_ratio <= 0.9 %}
            günstig
          {% else %}
            Normal
          {% endif %}
        {% endif %}
      price_level_combined: >-
        {% set level1 = this.attributes.price_level_1d | default('unknown') %}
        {% set level3 = this.attributes.price_level | default('unknown') %}
        {% if level1 == level3 %}
          {{ level1 }}
        {% elif level1 in ['unknown','unavailable','none'] or level3 in ['unknown','unavailable','none'] %}
          unknown
        {% elif level1 == "Very cheap" %}
          {{ level3 }}
        {% elif level3 == "Very cheap" %}
          {{ level1 }}
        {% elif level1 == "Cheap" %}
          {{ level3 }}
        {% elif level3 == "Cheap" %}
          {{ level1 }}
        {% elif level1 == "Normal" %}
          {{ level3 }}
        {% elif level3 == "Normal" %}
          {{ level1 }}
        {% elif level1 == "Expensive" %}
          {{ level3 }}
        {% else %}
          {{ level1 }}
        {% endif %}
      is_below_average: >-
        {% if is_number(this.state) and is_number(this.attributes.avg_price) %}
          {{ (this.state | float(0) < this.attributes.avg_price | float(0)) | lower }}
        {% else %}
          unknown
        {% endif %}
      is_above_average: >-
        {% if is_number(this.state) and is_number(this.attributes.avg_price) %}
          {{ (this.state | float(0) > this.attributes.avg_price | float(0)) | lower}}
        {% else %}
          unknown
        {% endif %}
      is_at_min: >-
        {% if is_number(this.state) and is_number(this.attributes.min_price) %}
          {{ (this.state | float(0) <= this.attributes.min_price | float(0)) | lower }}
        {% else %}
          unknown
        {% endif %}
      is_at_max: >-
        {% if is_number(this.state) and is_number(this.attributes.max_price) %}
          {{ (this.state | float(0) >= this.attributes.max_price | float(0)) | lower }}
        {% else %}
          unknown
        {% endif %}
      is_close_to_min: >-
        {% if is_number(this.state) and is_number(this.attributes.min_price) %}
          {{ (this.state | float(0) <= (1.15 * this.attributes.min_price | float(0))) | lower }}
        {% else %}
          unknown
        {% endif %}
      future_prices: >-
        {% if (this.attributes.all_prices | default('unknown')) in ['unknown','unavailable','none'] %}
          unknown
        {% else %}
          {{ (this.attributes.all_prices | default([])) | selectattr('startsAt', 'gt', (now() - timedelta(hours=1)) | string | replace(' ','T')) | list }}
        {% endif %}
      future_prices_totals: >-
        {% if (this.attributes.future_prices | default('unknown')) in ['unknown','unavailable','none'] %}
          unknown
        {% else %}
          {{ (this.attributes.future_prices | default([])) | map(attribute='total') | list }}
        {% endif %}
      future_prices_min: |-
        {% if this.attributes.future_prices_totals | default([0]) | count > 0 %}
          {{  this.attributes.future_prices_totals | default([0]) | min | float(0) | round(4)}} 
        {% else %}
          unknown
        {% endif %}
      future_prices_max: |-
        {% if this.attributes.future_prices_totals | default([0]) | count > 0 %}
          {{ (this.attributes.future_prices_totals | default([0])) | max | float(0) | round(4) }}
        {% else %}
          unknown
        {% endif %}
      future_prices_avg: >-
        {% if this.attributes.future_prices_totals | default([0]) | count > 0 %}
          {{ (this.attributes.future_prices_totals | default([0])) | average(0) | float(0) | round(4) }}
        {% else %}
          unknown
        {% endif %}
      future_prices_curr_price_level: >-
        {% set price_cur = this.state | default(0) | float(0) %}
        {% set price_avg = this.attributes.future_prices_avg | default(0) | float(0) %}
        {% if price_cur == 0 or price_avg == 0 %}
          unknown
        {% else %}
          {% set price_ratio = (price_cur / price_avg) %}
          {% if price_ratio >= 1.4 %}
            Sehr teuer
          {% elif price_ratio >= 1.15 %}
            teuer
          {% elif price_ratio <= 0.6 %}
            sehr billig
          {% elif price_ratio <= 0.9 %}
            billig
          {% else %}
            Normal
          {% endif %}
        {% endif %}
      future_prices_16h: >-
        {% if (this.attributes.future_prices | default('unknown')) in ['unknown','unavailable','none'] %}
          unknown
        {% else %}
          {{ (this.attributes.future_prices | default([]) | list)[1:17]}}
        {% endif %}
      future_prices_16h_totals: >-
        {% if (this.attributes.future_prices_16h | default('unknown')) in ['unknown','unavailable','none'] %}
          unknown
        {% else %}
          {{ (this.attributes.future_prices_16h | default([])) | map(attribute='total') | list }}
        {% endif %}
      future_prices_16h_min: |-
        {% if this.attributes.future_prices_16h_totals | default([0]) | count > 0 %}
          {{ (this.attributes.future_prices_16h_totals | default([0])) | min | float(0) | round(4) }}
        {% else %}
          unknown
        {% endif %}
      future_prices_16h_min_time: |-
        {% if this.attributes.future_prices_16h_totals | default([0]) | count > 0 %}
          {% set l=this.attributes.future_prices_16h|sort(attribute='total') %}
          {{as_datetime(l[0].startsAt)}}
        {% else %}
          unknown
        {% endif %}
      future_prices_16h_max: |-
        {% if this.attributes.future_prices_16h_totals | default([0]) | count > 0 %}
          {{ (this.attributes.future_prices_16h_totals | default([0])) | max | float(0) | round(4) }}
        {% else %}
          unknown
        {% endif %}
      future_prices_16h_avg: >-
        {% if this.attributes.future_prices_16h_totals | default([0]) | count > 0 %}
          {{ (this.attributes.future_prices_16h_totals | default([0])) | average(0) | float(0) | round(4) }}
        {% else %}
          unknown
        {% endif %}
      future_prices_16h_current_price_level: >-
        {% set price_cur = this.state | default(0) | float(0) %}
        {% set price_avg = this.attributes.future_prices_16h_avg | default(0) | float(0) %}
        {% if price_cur == 0 or price_avg == 0 %}
          unknown
        {% else %}
          {% set price_ratio = (price_cur / price_avg) %}
          {% if price_ratio >= 1.4 %}
            sehr teuer
          {% elif price_ratio >= 1.15 %}
            teuer
          {% elif price_ratio <= 0.6 %}
            sehr billig
          {% elif price_ratio <= 0.9 %}
            billig
          {% else %}
            Normal
          {% endif %}
        {% endif %}
      future_prices_16h_current_price_is_close_to_min: >-
        {% if is_number(this.state) and is_number(this.attributes.future_prices_16h_min) %}
          {{ (this.state | float(0) <= (1.15 * this.attributes.future_prices_16h_min | default(0) | float(0))) | lower }}
        {% else %}
          unknown
        {% endif %}
      future_prices_16h_current_price_is_at_min: >-
        {% if this.state | default(0) | float(0) > 0 and this.attributes.future_prices_16h_min | default(0) | float(0) > 0 %}
          {{ (this.state | default(0) | float(0) <= this.attributes.future_prices_16h_min | default(0) | float(0)) | lower }}
        {% else %}
          unknown
        {% endif %}
      billig1: >-
        {% set l=this.attributes.future_prices_16h |sort(attribute='total') %}
        {{as_datetime(l[0].startsAt).strftime("%d.%m. %H:%M")}} / {{l[0].total}} €
      billig2: >-
        {% set l=this.attributes.future_prices_16h|sort(attribute='total') %}
        {{as_datetime(l[1].startsAt).strftime("%d.%m. %H:%M")}} / {{l[1].total}} €
      billig3: >-
        {% set l=this.attributes.future_prices_16h|sort(attribute='total') %}
        {{as_datetime(l[2].startsAt).strftime("%d.%m. %H:%M")}} / {{l[2].total}} €
      billig4: >-
        {% set l=this.attributes.future_prices_16h|sort(attribute='total') %}
        {{as_datetime(l[3].startsAt).strftime("%d.%m. %H:%M")}} / {{l[3].total}} €
      billigpreis1: >-
        {% set l=this.attributes.future_prices_16h |sort(attribute='total') %}
        {{l[0].total}}
      billigpreis2: >-
        {% set l=this.attributes.future_prices_16h |sort(attribute='total') %}
        {{l[1].total}}
      billigpreis3: >-
        {% set l=this.attributes.future_prices_16h |sort(attribute='total') %}
        {{l[2].total}}
      billigpreis4: >-
        {% set l=this.attributes.future_prices_16h |sort(attribute='total') %}
        {{l[3].total}}
      billigpreis5: >-
        {% set l=this.attributes.future_prices_16h |sort(attribute='total') %}
        {{l[4].total}}
      teuer1: >-
        {% set l=this.attributes.future_prices_16h|sort(attribute='total', reverse=true) %}
        {{as_datetime(l[0].startsAt).strftime("%d.%m. %H:%M")}} / {{l[0].total}} €
      teuer2: >-
        {% set l=this.attributes.future_prices_16h|sort(attribute='total', reverse=true) %}
        {{as_datetime(l[1].startsAt).strftime("%d.%m. %H:%M")}} / {{l[1].total}} €
      teuer3: >-
        {% set l=this.attributes.future_prices_16h|sort(attribute='total', reverse=true) %}
        {{as_datetime(l[2].startsAt).strftime("%d.%m. %H:%M")}} / {{l[2].total}} €
      teuer4: >-
        {% set l=this.attributes.future_prices_16h|sort(attribute='total', reverse=true) %}
        {{as_datetime(l[3].startsAt).strftime("%d.%m. %H:%M")}} / {{l[3].total}} €
      next1: >-
        {% set v=this.attributes.future_prices_16h %}
        {{as_datetime(v[0].startsAt).strftime("%d.%m. %H:%M")}} / {{v[0].total}} €
      next2: >-
        {% set v=this.attributes.future_prices_16h %}
        {{as_datetime(v[1].startsAt).strftime("%d.%m. %H:%M")}} / {{v[1].total}} €
      next3: >-
        {% set v=this.attributes.future_prices_16h %}
        {{as_datetime(v[2].startsAt).strftime("%d.%m. %H:%M")}} / {{v[2].total}} €
      next4: >-
        {% set v=this.attributes.future_prices_16h %}
        {{as_datetime(v[3].startsAt).strftime("%d.%m. %H:%M")}} / {{v[3].total}} €
      next5: >-
        {% set v=this.attributes.future_prices_16h %}
        {{as_datetime(v[4].startsAt).strftime("%d.%m. %H:%M")}} / {{v[4].total}} €
      next6: >-
        {% set v=this.attributes.future_prices_16h %}
        {{as_datetime(v[5].startsAt).strftime("%d.%m. %H:%M")}} / {{v[5].total}} €
      next7: >-
        {% set v=this.attributes.future_prices_16h %}
        {{as_datetime(v[6].startsAt).strftime("%d.%m. %H:%M")}} / {{v[6].total}} €
      next8: >-
        {% set v=this.attributes.future_prices_16h %}
        {{as_datetime(v[7].startsAt).strftime("%d.%m. %H:%M")}} / {{v[7].total}} €
      next9: >-
        {% set v=this.attributes.future_prices_16h %}
        {{as_datetime(v[8].startsAt).strftime("%d.%m. %H:%M")}} / {{v[8].total}} €
      next10: >-
        {% set v=this.attributes.future_prices_16h %}
        {{as_datetime(v[9].startsAt).strftime("%d.%m. %H:%M")}} / {{v[9].total}} €
      next11: >-
        {% set v=this.attributes.future_prices_16h %}
        {{as_datetime(v[10].startsAt).strftime("%d.%m. %H:%M")}} / {{v[10].total}} €
      next12: >-
        {% set v=this.attributes.future_prices_16h %}
        {{as_datetime(v[11].startsAt).strftime("%d.%m. %H:%M")}} / {{v[11].total}} €```

Die Fehlermeldung ist einfach ‚This‘ in undefiend

Sensor….preisabruf ist erstellt und funktioniert.
Attribute sind vorhanden.

Neueste Release von HA.

Und so funktioniert er:

template:
  - sensor:
      - name: "Electricity Price Tibber"
        unique_id: electricity_price_tibber
        unit_of_measurement: "EUR/kWh"
        icon: mdi:currency-eur
        state: >-
          {{ state_attr('sensor.tibber_preisabruf', 'current') | float(0) }}
        attributes:
          current: >-
            {{ state_attr('sensor.tibber_preisabruf', 'current') | float(0) }}
          today: >-
            {{ state_attr('sensor.tibber_preisabruf', 'today') | default([]) }}
          tomorrow: >-
            {{ state_attr('sensor.tibber_preisabruf', 'tomorrow') | default([]) }}
          all_prices: >-
            {% set today = state_attr('sensor.tibber_preisabruf', 'today') | default([]) %}
            {% set tomorrow = state_attr('sensor.tibber_preisabruf', 'tomorrow') | default([]) %}
            {{ today + tomorrow }}
          min_price: >-
            {% set prices = state_attr('sensor.tibber_preisabruf', 'today') | default([]) %}
            {% if prices | count > 0 %}
              {{ prices | map(attribute='total') | list | min | round(4) }}
            {% else %}
              unknown
            {% endif %}
          max_price: >-
            {% set prices = state_attr('sensor.tibber_preisabruf', 'today') | default([]) %}
            {% if prices | count > 0 %}
              {{ prices | map(attribute='total') | list | max | round(4) }}
            {% else %}
              unknown
            {% endif %}
          avg_price: >-
            {% set prices = state_attr('sensor.tibber_preisabruf', 'today') | default([]) %}
            {% if prices | count > 0 %}
              {{ prices | map(attribute='total') | list | average | round(4) }}
            {% else %}
              unknown
            {% endif %}
          future_prices: >-
            {% set all_prices = state_attr('sensor.tibber_preisabruf', 'today') + state_attr('sensor.tibber_preisabruf', 'tomorrow') %}
            {{ all_prices | selectattr('startsAt', 'defined') | list }}
          future_prices_16h: >-
            {% set all_prices = state_attr('sensor.tibber_preisabruf', 'today') + state_attr('sensor.tibber_preisabruf', 'tomorrow') %}
            {{ all_prices[:16] if all_prices | count > 0 else [] }}
          future_prices_min: >-
            {% set all_prices = state_attr('sensor.tibber_preisabruf', 'today') + state_attr('sensor.tibber_preisabruf', 'tomorrow') %}
            {% if all_prices | count > 0 %}
              {{ all_prices | map(attribute='total') | list | min | round(4) }}
            {% else %}
              unknown
            {% endif %}
          future_prices_max: >-
            {% set all_prices = state_attr('sensor.tibber_preisabruf', 'today') + state_attr('sensor.tibber_preisabruf', 'tomorrow') %}
            {% if all_prices | count > 0 %}
              {{ all_prices | map(attribute='total') | list | max | round(4) }}
            {% else %}
              unknown
            {% endif %}
          price_level: >-
            {% set current = state_attr('sensor.tibber_preisabruf', 'current') | float(0) %}
            {% set avg = state_attr('sensor.tibber_preisabruf', 'average') | float(0) %}
            {% if avg > 0 %}
              {% set ratio = current / avg %}
              {% if ratio >= 1.4 %}
                Sehr teuer
              {% elif ratio >= 1.15 %}
                Teuer
              {% elif ratio <= 0.6 %}
                Sehr günstig
              {% elif ratio <= 0.9 %}
                Günstig
              {% else %}
                Normal
              {% endif %}
            {% else %}
              unknown
            {% endif %}
          next_cheapest: >-
            {% set all_prices = state_attr('sensor.tibber_preisabruf', 'today') %}
            {% if all_prices | count > 0 %}
              {% set sorted = all_prices | sort(attribute='total') %}
              {{ sorted[0]['total'] }} EUR um {{ as_datetime(sorted[0]['startsAt']).strftime('%H:%M') }}
            {% else %}
              unknown
            {% endif %}

Moin @Hamudulu,

hilf mir doch mal eben bitte auf die Sprünge. Woher kommt

sensor.tibber_preisabruf

Ich nehme an ein template, aber worauf bezieht sich der?

Danke für eine Info oder einen Code-Schnipsel

Hallo,
das ist der eigentliche Abrufsensor:

  - platform: rest
    name: Tibber Preisabruf
    resource: https://api.tibber.com/v1-beta/gql
    method: POST
    payload: '{ "query": "{ viewer { homes { currentSubscription { status priceInfo { current { total currency level energy tax } today { total startsAt level } tomorrow { total startsAt level } } } } } }" }'
    json_attributes_path: "$.data.viewer.homes[0].currentSubscription.priceInfo"
    json_attributes:
      - current
      - today
      - tomorrow
    value_template: '{{ value_json["data"]["viewer"]["homes"][0]["currentSubscription"]["priceInfo"]["current"]["total"] }}'
    scan_interval: 30
    headers:
      Authorization: !secret tibber_token
      Content-Type: application/json
      User-Agent: REST
    unit_of_measurement: EUR/kWh

Die Zugangsdaten natürlich in der Secrets drin.

2 „Gefällt mir“

Die Antwort die mir auch hilft hat mein Vorschreiber gegeben. Vielen Dank
Bei mir ist das noch etwas durcheinander, aber so will ich das dann auch machen.

Wie hast du eigentlich HA überredet mit dem this.attribut oder this.state zu arbeiten? Das will HA bei mir ums verrecken nicht machen.

Das macht er bei mir einfach so.

Jetzt bei mir auch :wink: im Template zeigt er aber Fehler, man kann es also so nicht überprüfen. Vielen Dank fürs Verfügung stellen von dem Code :muscle:

Könntest du mich bitte auch hinzufügen? Username: chtugha

Das Repository ist offen.

Hi Optihome
Danke für den Github eintrag!

Sehr geiles Thema! Ich betreibe eine ähnliche Konfiguration (STP 6.0 SE & BYD HVS 7.7 kWh) und bin mit dem “prognosebasierten” Laden von SMA eher unzufrieden. Leider habe ich mit Programmierung eigentlich nix am Hut, was die Sache für mich etwas schwierig macht. Aber immerhin habe ich sowieso schon Home Assistant am Laufen und Wechselrichter, Wallbox, Smart Meter etc. sind dort integriert. Gute Voraussetzungen :slight_smile:
Gestern wurde ich vom Sunny Portal darüber informiert, dass ein neues Update installiert wurde. Die Release Notes enthielten u.a. folgendes:

  • Optimierung des Sunny Home Manager Modbus-Server: Verwendung ohne notwendigen Grid Guard Code (GGC) möglich

Grund genug für mich, die Steuerung von Optihome (vielen Dank für deine Arbeit) zu implementieren. Jedenfalls will ich es versuchen ^^
Was ich mich frage: Der Sunny Home Manager regelt doch normalerweise den Speicher, richtig? Wenn ich nun die Optihome-Steuerung benutze: Kommen die beiden sich dann nicht in die Quere??

Hi zusammen,
ich habe auf Basis dieses Repos auch eine Steuerung in Home Assistant implementiert. (SMA STP 8.0SE mit 10.2 kWh BYD HVS)
Wobei ich lediglich den Modbus Eintrag in der configuration.yaml gemacht habe und eine Automation, die abhängig von einem Auswahlfeld die Modbusregister 40151 und 40149 beschreibt.

Hier das Beispiel für “Akku Pause”

data:
  hub: sma-sr_wr
  address: 40151
  slave: 3
  value:
    - 0
    - 802
action: modbus.write_register

data:
  hub: sma-sr_wr
  address: 40149
  slave: 3
  value:
    - 0
    - 0
action: modbus.write_register

Es funktioniert grundsätzlich auch. Nur immer nach einer halben Stunde, wird versucht im exakten Minutentakt den Akku wieder zu laden.
Siehe nachfolgendes Bild:

Hat einer von euch eine Idee, woran das liegen könnte?

Ja, war bei mir so weshalb ich die quelle zur referenzmessung netz (oder so ahnlich hieß das) auf wechselrichter anstelle shm2 stellen musste. Seit dem läuft bei mir alles wie ich mir das vorstelle. Viel erfolg

Wie ist dein fallback für externe vorgabe definiert? Habe den verdacht, dass setzt das zurück. Meine modbussteuerung und auch die von opti ist an einen timer gekoppelt, der egal was gesetzt wurde das dann erneit sendet. Viel erfolg

Ach so, cool. Ich vermute, du meinst die Einstellung “Zählerkonfiguration → Bezug und Einspeisung” - und dort dann anstatt “Internes Energy Meter” → “kein Zähler” auswählen :upside_down_face:

Bisher habe ich nur versucht, die manuelle Akkusteuerung (sma-se-akku-steuerung.yaml) zu implementieren; mit mäßigem Erfolg:
Lediglich die Auswahl “Akku Pause” funktioniert. Ich vermute, dass es an meinen Input Numbers liegt, denn das ist das einzige, was bei “Akku Pause” nicht vorkommt ^^
Na ja, langsam nährt sich das Eichhörnchen, gell? :chipmunk:

Danke dir für die schnelle Antwort.
Ich hab den Timer eingebaut, der den eingestellten Status alle 30min neu setzt.
Das scheint auch ganz gut zu klappen.
Aber mir ist noch nicht ganz klar, warum man das überhaupt machen muss.
Was meinst du denn genau mit “fallback für externe Vorgabe”?
Wo würde ich denn den einstellen? Ich bin bis jetzt immer davon ausgegangen, dass wenn ich den Wechselrichter auf externe Vorgabe setze, dass dieser auch in dem Status bleibt, bis ich ihn wieder zurücksetze (also, aktuelle Software des SHM2 vorausgesetzt, aber die hab ich)

Nein, die meine ich nicht. Ich meine das hier:

Wenn das auf shm2 steht, haben sich modbus und shm2 bei mir “addiert” und zu unvorhersehbaren ergebnissen geführt.
Wenn nur pause funktioniert, überprüfe mal die vorzeichen. Bzw nimm die modbus-anweisungen die opti erstellt hat.

Das fallback, bzw den timeout dazu findest du hier:

Nach 30mins geht der wechselrichter in eine art fail-safe mode wenn keine neuen instruktionen kommen. Wir geben das per modbus neu vor. Passiert das nicht, bzw wenn externe vorgabe aus ist macht das der shm2 u d stellt neue werte zum laden/entladen oder eben pause ein. Viel erfolg

1 „Gefällt mir“

Und das für euch beide :slight_smile:
Ich habe die akku-steuerung per modbus komplett von opti übernommenen. Die funktioniert einwandfrei. Wenn nicht, ist am WR irgendein Parameter nicht korrekt eingestellt. Die Rahmenbedingungen habe ich komplett neu geschrieben, da setup und gewohnheiten bei mir anders sind. An dieser stelle noch mal ein grosses danke an @Optihome fur den modbus Teil.

Die idee hibter dem ganzen ist, den shm2 quasi soweit zu kastrieren, dass sich der WR manuell steuern lässt. Man kann wohl selbst im online portal von sma den wr als master setzen und den shm2 nur noch als als messstelle nutzen. Klappt bei mir leider (noch) nicht. Aber so wie es jetzt konfiguriert ist, macht die anlage was ich möchte. Also ist der teil auf die lange bank geschoben :smiley:

Sorry für die ganzen typos. Bin unterwegs und schreibe vom telefon aus ^^

1 „Gefällt mir“