Um meinen Smartmeter Typ DWSB10.2H auszulesen, braucht es einen IR-Lesekopf. Hier fand ich bitshake.de ganz ansprechend. Zunächst muss gemäß Anleitung die WLAN-Verbindung fürs Tasmota hergestellt werden, dann kann im nächsten Schritt das Skript für den Zähler konfiguriert werden. Die Liste der verfügbaren Skripte findet sich unter https://docs.bitshake.de/script/ - In meinem Fall war mein Zähler nicht gelistet, aber ähnliche Modelle, so dass es sich leicht anpassen ließ. Siehe hierzu auch https://tasmota.github.io/docs/Smart-Meter-Interface/#dzg-dwsb122-sml
>D
>B
=>sensor53 r
>M 1
+1,5,s,0,9600,DWSB10,4
1,77070100010800ff@1000,Verbrauch,kWh,E_in,3
1,77070100020800ff@1000,Einspeisung,kWh,E_out,3
1,77070100100700ff@1,akt. Leistung,W,Power,0
1,77070100600100ff@#,Zählernummer,,meter_number,0
#
Anschließend muss das Skript noch aktiviert werden.
Damit die Daten im Homeassistant ankommen, muss man noch MQTT konfigurieren. Hierzu braucht es einen mosquitto-Server. Mittels MQTT-Explorer lassen sich die übermittelten Daten einsehen, um unter "tele" die erforderlichen Parameter für die configuration.yaml zu finden.
In der configuration.yaml dann für diesen spezifischen Smartmeter die folgenden Parameter verwenden
mqtt:
sensor:
- name: "Einspeisung"
state_topic: "tele/tasmota_48FDB8/SENSOR"
json_attributes_topic: "tele/tasmota_48FDB8/SENSOR"
value_template: "{{ value_json.DWSB10.E_out }}"
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
- name: "Netzbezug"
state_topic: "tele/tasmota_48FDB8/SENSOR"
json_attributes_topic: "tele/tasmota_48FDB8/SENSOR"
value_template: "{{ value_json.DWSB10.E_in }}"
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
- name: "Momentanverbrauch"
state_topic: "tele/tasmota_48FDB8/SENSOR"
json_attributes_topic: "tele/tasmota_48FDB8/SENSOR"
value_template: "{{ value_json.DWSB10.Power }}"
unit_of_measurement: "W"
device_class: power
state_class: measurement
Damit lassen sich die Werte im Energiedashboard von Homeassistant nutzen und im nächsten Schritt eine Nulleinspeisung realisieren. Dazu erstellen wir uns eine neue Automatisierung wie folgt:
alias: Nulleinspeisung
description: ""
triggers:
- seconds: /15
trigger: time_pattern
conditions:
- condition: not
conditions:
- condition: state
entity_id: sensor.solar_summe
state: unavailable
actions:
- target:
entity_id: aed5ee0d9d5d74b4c78de4412eabc9b8
data:
value: >
{% set consumption = states('sensor.momentanverbrauch') | float %}
{% set current_output = states('sensor.powerstream_cloud_inverter_output_watts') | float %}
{% set min_output = 0 %}
{% set max_output = 800 %}
{% set bat_level = states('sensor.delta_2_max_cloud_battery_level') | float %}
{% if -15 < consumption < 0 %}
{% set desired_output = current_output + 1 %}
{% else %}
{% set desired_output = current_output + consumption + 10 %}
{% endif %}
{% if bat_level > 97 %}
{% set desired_output = max_output %}
{% endif %}
{% set desired_output = [desired_output | round(0,'floor'),max_output] | min %}
{% set desired_output = [desired_output, min_output] | max %}
{{ desired_output }}
action: number.set_value
mode: single
Alle 15 Sekunden prüfen wir hier den aktuellen Momentanverbrauch (am Smartmeter gemessene Wattzahl) und die aktuelle Einspeisung wie den aktuellen Ladestand der Batterie. Liegt der momentane Verbrauch zwischen -6W und +6W, dann steuern wir nicht weiter nach, sondern setzen die neue Zieleinspeisung gleich der alten, ansonsten werden aktueller Verbrauch plus Einspeisung zum neuen Zielverbrauch verrechnet und noch ein Puffer von 10W (Ausgleichen von Messfehlern der div. unterschiedlichen Geräte) draufgeschlagen. Damit wird auf 15 Sekunden genau das eingespeist was verbraucht wird. Ist die Batterie über 97% geladen wird schlicht der maximale Wert eingespeist, unabhängig vom Verbrauch - wir "verschenken" also dadurch Strom, aber das macht ja dann nichts, wir haben ja erstmal genug.
Das Setup agiert unabhängig vom aktuellen Solarertrag und bedient sich damit auch automatisch aus der Batterie, wenn zu wenig Solarleistung da ist.
Ich habe die Regel inzwischen dahingehend angepasst, dass ich eine zweite Automation erstellt habe, die einen ersten Entwurf einer Überschusseinspeisung vorsieht. Bedeutet, dass sobald der Akku voll genug ist, der Wechselrichter mit dem maximal verfügbaren Solarertrag (oder dem aktuell benötigten Verbrauch, falls mal vorübergehend eine Wolke da ist) ins Netz einspeist. Damit "verschenke" ich dann etwas Strom ins Netz, wenn genügend Sonne da ist. Das ist erstmal eine noch etwas krude Lösung, die gerade bei bewölktem Himmel zu schnell herunter- und dann nicht mehr heraufregelt, aber fürs erste reicht mir das.
alias: PV Power Zero mit Überschusseinspeisung
description: ""
triggers:
- seconds: /15
trigger: time_pattern
conditions:
- condition: not
conditions:
- condition: state
entity_id: sensor.solar_summe
state: unavailable
actions:
- target:
entity_id: aed5ee0d9d5d74b4c78704412eab09b8
data:
value: >
{% set ertrag = states('sensor.solar_summe') | float %}
{% set consumption = states('sensor.momentanverbrauch') | float %}
{% set current_output = states('sensor.powerstream_cloud_inverter_output_watts') | float %}
{% set min_output = 00 %}
{% set max_output = 800 %}
{% set bat_level = states('sensor.delta_2_max_cloud_battery_level') | float %}
{% if -10 < consumption < 0 %}
{% set desired_output = current_output + 1 %}
{% else %}
{% set desired_output = current_output + consumption + 2 %}
{% endif %}
{% if bat_level > 95 %}
{% if consumption < 0 %}
{% set desired_output = ertrag %}
{% else %}
{% set desired_output = current_output + consumption + 2 %}
{% endif %}
{% endif %}
{% set desired_output = [desired_output | round(0,'floor'),max_output] | min %}
{% set desired_output = [desired_output, min_output] | max %}
{{ desired_output }}
action: number.set_value
mode: single