====== Dynamische Einspeisung ====== Für meine Anker Solix Solarbank E1600 versuche ich soviel Energie wie möglich direkt zu verbrauchen. Dazu passe ich über [[smarthome:Home Assistant]] mit der [[https://github.com/thomluther/hacs-anker-solix|Anker Solix Erweiterung]] den Einspeisewert dynamisch an. Zuerst habe ich mir ein Template angelegt, das den gewünschten Wert ermittelt. input_number: einspeisehelfer_min: name: Minimale Einspeisung min: 100 max: 800 step: 10 mode: slider einspeisehelfer_max: name: Maximale Einspeisung min: 100 max: 800 step: 10 mode: slider einspeisehelfer_start: name: Schwellwert Regelung min: 10 max: 800 step: 10 mode: slider einspeisehelfer_tresh: name: Grenzwert Regelung min: 10 max: 100 step: 10 mode: slider einspeisehelfer_step: name: Aufschlag min: -50 max: 50 step: 10 mode: slider einspeisehelfer_delay: name: Verzögerung min: 0 max: 60 step: 10 mode: slider template: - sensor: - name: "Dynamische Einspeisung" unique_id: "dynamische_einspeisung" unit_of_measurement: "W" state: > {% set einspeisehelfer_min = states.input_number.einspeisehelfer_min.state | float(0) %} {% set einspeisehelfer_max = states.input_number.einspeisehelfer_max.state | float(0) %} {% set einspeisehelfer_start = states.input_number.einspeisehelfer_start.state | float(0) %} {% set einspeisehelfer_tresh = states.input_number.einspeisehelfer_tresh.state | float(0) %} {% set einspeisehelfer_step = states.input_number.einspeisehelfer_step.state | float(0) %} {% set einspeisehelfer_delay = states.input_number.einspeisehelfer_delay.state | float(0) %} {% set einspeisehelfer_cursol = states.sensor.solar_power.state %} {% set einspeisehelfer_curin = states.sensor.system_ankerprime_system_einspeisevorgabe.state %} {% set einspeisehelfer_destin = states.sensor.tasmota_sml_power_curr.state | float(0) + (einspeisehelfer_cursol | float(0)) | abs %} {% if (einspeisehelfer_cursol | float(0) > 0 and einspeisehelfer_cursol | float(0) < einspeisehelfer_start | float(0))%} {{ einspeisehelfer_min | float(0) }} {% elif (einspeisehelfer_destin | float(0) - einspeisehelfer_curin | float(0)) | abs > einspeisehelfer_tresh %} {% if states.sensor.system_ankerprime_sb_solarleistung.state | float(0) | abs > 0 %} {% if states.sensor.system_ankerprime_sb_solarleistung.state | float(0) < einspeisehelfer_destin | float(0) %} {% set einspeisehelfer_destin = states.sensor.system_ankerprime_sb_solarleistung.state | float(0) %} {% endif %} {% elif states.sensor.system_ankerprime_sb_akkuleistung.state | float(0) < 0 %} {% set einspeisehelfer_destin = states.sensor.tasmota_sml_power_curr.state | float(0) + (einspeisehelfer_cursol | float(0)) | abs + einspeisehelfer_step | float(0) %} {% endif %} {% if einspeisehelfer_destin | float(0) < einspeisehelfer_min | float(0) %} {% set einspeisehelfer_destin = einspeisehelfer_min - einspeisehelfer_step %} {% elif einspeisehelfer_destin | float(0) > einspeisehelfer_max | float(0) %} {% set einspeisehelfer_destin = einspeisehelfer_max - einspeisehelfer_step %} {% endif %} {% set einspeisehelfer_destin = (einspeisehelfer_destin / 100) | round(1) %} {% set einspeisehelfer_destin = (einspeisehelfer_destin * 100) | int(0) %} {% if (einspeisehelfer_destin | float(0) - einspeisehelfer_curin | float(0)) | abs > einspeisehelfer_tresh %} {% if as_timestamp(now()) - as_timestamp(states.sensor.dynamische_einspeisung.last_changed) > einspeisehelfer_delay %} {{ einspeisehelfer_destin | float(0) + einspeisehelfer_step }} {% else %} {{ states.sensor.dynamische_einspeisung.state }} {% endif %} {% else %} {{ states.sensor.dynamische_einspeisung.state }} {% endif %} {% else %} {% if states.sensor.dynamische_einspeisung.state | float(0) < einspeisehelfer_cursol | float(0) | abs %} {{ states.sensor.dynamische_einspeisung.state }} {% elif states.sensor.system_ankerprime_sb_akkuleistung.state | float(0) < 0 %} {{ states.sensor.dynamische_einspeisung.state }} {% else %} {% set einspeisehelfer_destin = einspeisehelfer_cursol | float(0) | abs %} {% set einspeisehelfer_destin = (einspeisehelfer_destin / 100) | round(1) %} {% set einspeisehelfer_destin = (einspeisehelfer_destin * 100) | int(0) %} {{ einspeisehelfer_destin | int(0) + einspeisehelfer_step }} {% endif %} {% endif %} ====== Beschreibung Konfiguration ====== ===== einspeisehelfer_min ===== Minimale Einspeisung - Das ist der Wert, der mindestens eingespeist werden soll. Kleinere Werte werden darauf korrigiert. Je nach Wechselrichter sollten das 100 oder 150 Watt sein. ===== einspeisehelfer_max ===== Maximale Einspeisung - Das ist der maximale Wert mit dem eingespeist werden soll. Größere Werte werden darauf korrigiert. 600 Watt, 800 Watt oder mehr? 800 Watt sind aktuell erlaubt (für Steckersolargeräte). Ein kleinerer Wert kann dennoch sinnvoll sein um durch die Nacht zu kommen. ===== einspeisehelfer_start ===== Schwellwert Regelung - Erst wenn dieser Wert überschritten wird beginnt die Regelung. Da bei kleinen Solarleistungen oft zwischen Einspeisung und Ladung gewechselt wird kann man so Ruhe in die Regelung bringen. 80 Watt sind ein guter Wert. ===== einspeisehelfer_tresh ===== Grenzwert Regelung - Dieser Wert bestimmt die Regelung. Eine Abweichung zwischen Solareingang und Verbrauch, die größer ist lässt die Regelung anspringen. Für meine Anlage machen 20-30 Watt Sinn. ===== einspeisehelfer_step ===== Aufschlag - Dieser Wert wird pauschal auf-/abgeschlagen um zu steuern ob man eher ins Netz einspeisen möchte oder aus dem Netz beziehen. Bei mir verschiebe ich es mit +10 und tendiere damit leicht zu mehr Einspeisung. ===== einspeisehelfer_delay ===== Verzögerung - Zwischen den Veränderungen soll mindestens diese Verzögerung in Sekunden vergehen. Da die Werte der Solix nur etwa jede Minute geupdated werden machen hier kleine Werte kaum Sinn. 30 Sekunden reichen imo aus. ====== Beschreibung Quellen ====== ===== states.sensor.solar_power.state ===== Diese Entität kommt von einer Shelly EM1. Sie liefert die aktuelle Solarleistung, die im Haus ankommt. Dieser Wert ist wesentlich aktueller und genauer als die Werte der Ankercloud. ===== states.sensor.system_ankerprime_* ===== Diese Entitäten stammen von der [[https://github.com/thomluther/hacs-anker-solix|Anker Solix Erweiterung]]. AnkerPrime ist dabei der Name meines Systems. ===== states.sensor.tasmota_sml_power_curr.state ===== Wie der Name vermuten lässt handelt es sich um einen Lesekopf für meinen Stromzähler. Diese Entität liefert den aktuellen "Stromverbrauch" (Leistung, saldiert) meines Anschlusses. [[https://www.amazon.de/bitShake-SmartMeterReader-TASMOTA-vorinstalliert-Lesekopf/dp/B0CCMXSPVX?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=2BVFJKIUEFL3U&dib=eyJ2IjoiMSJ9.qFD6CIMYqwrYi3mFIO2AA4I4P7dVFEOfPwwzeaotgk9ju9-RZxgcq7xBOlEQp1Lg0VBPNPHEkSWtIZXpG39Bp0fa0ZdtdLBDq5ktze0Nch85mPuAdAeUC8zbrIVQThxMGfd4Ka6ipAF1p6ifeBT93-HBIkai5Sanwy3aBXKnGlFobiCisHpvqlAB3VmBVrC23lC3ppDhqvzKRA8HzB4FmTSd_rqOHWuzg9OmBgdFBys.jwg5JBs-JOMv1Tgtj8QjPJYblTYpaU6y9mrHOxUcyb4&dib_tag=se&keywords=tasmota+z%C3%A4hler&qid=1715951636&s=diy&sprefix=tasmota+z%C3%A4hler%2Cdiy%2C103&sr=1-4&linkCode=ll1&tag=grml-21&linkId=0e995f4816bd41bb24e0d584b42dae4e&language=de_DE&ref_=as_li_ss_tl|Affiliatelink: Tasmota Lesekopf]] ====== Beschreibung Automation ====== Jedes mal wenn sich der Wert ändert wird dann über eine Automation versucht diesen zu schreiben. service: number.set_value target: entity_id: dacdd0526f45e92a79461cbb582b0654 data: value: "{{ states.sensor.dynamische_einspeisung.state | float(0) }}" {{:smarthome:ha_automation2024-05-01_20-18.png?400|}} Das kann scheitern weswegen ich eine weitere Automation alle paar Minuten laufen lasse, die kontrolliert ob der gewünschte Wert geschrieben ist und gegebenenfalls setzt. service: number.set_value target: entity_id: dacdd0526f45e92a79461cbb582b0654 data: value: "{{ states.sensor.dynamische_einspeisung.state | float(0) }}" {{:smarthome:ha_automation2_2024-05-01_20-20.png?400|}}