Growatt Wechselrichter mit ESPHome auslesen

Hast du Esphome einfach so auf den Wemos geflasht und dann dort eingerichtet? Frage, weil ich das lieber mit nem Wemos teste als das ich meinen Shine-Stick zerschieße. :slight_smile:
Ich hatte das Ganze schon mal per RS485 probiert. Da war die Regelung dann aber recht träge. Also ne "flotte" 0-Einspeiseregelung ist das eher nicht.
Die Wirkleistung bezieht sich, wenn ich das richtig interpretiert habe, immer auf die theoretische Gesamtleistung des WR. Sprich bei nem 600er -> 100% = 600Watt. Bei nem 3000er -> 100% = 3000Watt.

Meine Idee war da, mir über nen Dreisatz ne Regelstrecke zu bauen. Da ich eh NodeRed am laufen habe, würde ich das vermutlich da einbauen. Denn das runterregeln, sehe ich als letzten Schritt, vorher schalte ich lieber noch ein paar Verbraucher (Infrarotheizung im Winter..... im Sommer dann ne Split-Klima, etc.).
Das ist jetzt kein finaler Code, sondern vielmehr die Idee wie ich das in nen functions-Block in NodeRed verpacken würde.

var WR_max = 3000 //Maximalleistung des WR
var neue_WL = 100 //100% als Startwert festlegen
var aktueller_Bezug = 3000 // Damit wir im Falle 3000Watt als Bezug defineirt haben
var offest_Bezug = 150 // Ich gebe dem aktuellen Bezug noch 150Watt oben drauf. Einfach damit immer 150Watt mehr Leistung geliefert werden. Kann man natürlich anpassen
aktueller_Bezug = muss man sich per MQTT erst holen und hier in die Variable speichern
aktueller_Bezug = aktueller_Bezug+offset_Bezug;
neue_WL = aktueller_Bezug*100/WL_max;
return = neue_WL;

@dominicbag

Hi ja habe das ganze mir esphome gemacht mit dem CODE

du musst halt noch dein API key und dein OTA Password wie deine Wlan config eintragen und dann draufflashen

und dann habe ich den an meinem growatt angeschlossen und der hat dann mir die daten raus geworfen die ich wollte

# Growatt MIC600 ShineWifi-X to HomeAssistant via EspHome
# based on   Link entfernt
# 14.10.2022 rkr                         V1.0
# 19.02.2023 rkr power factor working    V1.1
substitutions:
orientation:   "Ost"  # change to "Ost" or "West"
l_orientation: "ost"  # lower case name
device_description: "Growatt Solar Inverter ${orientation}seite"
friendly_name:  "Growatt Solar Inverter ${orientation}"
devicename: "Solar ${orientation}"
esphome:
name: growatt-${l_orientation}
#  name: growatt-west
#  name: growatt-ost
comment: "Growatt MIC600 Wechselrichter ${orientation} - Seite"
project:
name: "raka.shinewifi_x_sensor"
version: "23.2.19"
esp8266:
board: esp07s
# Enable logging
logger:
baud_rate: 0
# Enable Home Assistant API
api:
encryption:
key: "DEIN KEY MUSS HIER REIN"
ota:
password: "DEIN OTA PASSWORD"
wifi:
ssid:
password:
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "${devicename} Fallback Hotspot"
password: "Yourpassword"
captive_portal:
time:
- platform: homeassistant
id: homeassistant_time
output:
# Blue Led
- id: light_bl
platform: gpio
pin: 16
# Green Led
- id: light_gr
platform: gpio
pin: 0
# Red Led
- id: light_rd
platform: gpio
pin: 2
uart:
id: mod_bus
tx_pin: 1
rx_pin: 3
baud_rate: 115200
modbus:
id: modbus1
uart_id: mod_bus
modbus_controller:
- id: growatt
# the Modbus device addr
address: 0x1
modbus_id: modbus1
setup_priority: -10
sensor:
#    - platform: modbus_controller
#      name: "${devicename} DcPower"
#      address: 5
#      register_type: "read"
#      unit_of_measurement: W
#      device_class: power
#      icon: mdi:flash
#      value_type: U_DWORD
#      accuracy_decimals: 1
#      filters:
#      - multiply: 0.1
#    - platform: modbus_controller
#      name: "${devicename} DcVoltage"
#      address: 3
#      register_type: "read"
#      unit_of_measurement: V
#      device_class: voltage
#      icon: mdi:flash
#      value_type: U_WORD
#      accuracy_decimals: 1
#      filters:
#      - multiply: 0.1
#    - platform: modbus_controller
#      name: "${devicename} DcInputCurrent"
#      address: 4
#      register_type: "read"
#      unit_of_measurement: A
#      device_class: current
#      icon: mdi:flash
#      value_type: U_WORD
#      accuracy_decimals: 1
#      filters:
#      - multiply: 0.1
#    - platform: modbus_controller
#      name: "${devicename} AcFrequency"
#      address: 37
#      register_type: "read"
#      unit_of_measurement: Hz
#      icon: mdi:flash
#      value_type: U_WORD
#      accuracy_decimals: 1
#      filters:
#      - multiply: 0.01
#    - platform: modbus_controller
#      name: "${devicename} AcVoltage"
#      address: 38
#      register_type: "read"
#      unit_of_measurement: V
#      device_class: voltage
#      icon: mdi:flash
#      value_type: U_WORD
#      accuracy_decimals: 1
#      filters:
#      - multiply: 0.1
#    - platform: modbus_controller
#      name: "${devicename} AcOutputCurrent"
#      address: 39
#      register_type: "read"
#      unit_of_measurement: A
#      device_class: current
#      icon: mdi:flash
#      value_type: U_WORD
#      accuracy_decimals: 1
#      filters:
#      - multiply: 0.1
- platform: modbus_controller
name: "${devicename} AcPower"
address: 40
register_type: "read"
unit_of_measurement: W
device_class: power
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} EnergyToday"
address: 53
register_type: "read"
unit_of_measurement: kWh
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} EnergyTotal"
address: 55
register_type: "read"
unit_of_measurement: kWh
state_class: total_increasing
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} Temperature"
address: 93
register_type: "read"
unit_of_measurement: C
device_class: temperature
icon: mdi:thermometer
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
#neu test power factor 02/2023
number:
platform: modbus_controller
modbus_controller_id: growatt
id: growatt600_pv_powerfactor
name: "${devicename} Power factor"
address: 0x3
value_type: U_WORD
min_value: 0
max_value: 100
step: 1
1 „Gefällt mir“

@dominicbag

danke dir erst mal für den code Node-Red kenne ich mich so garnicht aus aber ich versuche es mal

@rattenfaenger [quote data-userid="9896" data-postid="109179"]
wie kann man das jetzt am besten mit Hassio verwirklichen das man eine null einspeisung automatisiert

mein aufbau zuhause

Hassio

Hichi smartmeter Daten per Mqtt

Growatt WR mit Wemos D1 Mini Daten per Esphome

[/quote]
Du kannst einen Automatisierung erstellen die den Growatt anweist den Überschuss in den Akku zu stecken bzw. raus zu holen.

Ich würde dazu aber ein Venus OS installieren und dort die Daten einbinden via MQTT oder Modbus.

@profantus ich würde das schon gern mit Hassio machen das Hassio am besten den eigendlichen verbrauch abliest und dann den wemos D1 sagt hey du brauchst nicht soviel und den dann automatisch runter regelt

Finde ich auch am Einfachsten...

Ok, dann eine Automation erstellen die z.B. alle 30 Sec. automatisch läuft. Die holt sich den Zählerstand vom Stromzähler. Ich hoffe mal du hast einen 2 Richtungszähler ansonsten geht das nicht.

Also 1.8.1 und 2.8.1 holen. Wenn du Einspeist (2.8.1) dann über MQTT einen Befehl schicken zum Akku laden.

Wenn du Verbrauch hast umgekehrt.

Du brauchst dann auch noch den SOC vom Akku und eine Hysterese z.B 50W damit du nicht ständig hoch und runter regelst.

Im ESPHome musst du dann noch ein MQTT Subscribe Sensor einrichten der auf deine Nachricht aus Home Assistant hört und das auf die korrekten Modbus Register umsetzt.

@profantus wie geht das Ganze den ohne Akku da ich kein habe des Wegen 0 Einspeisung

@rattenfaenger Wenn du keinen Akku hast musst du dem WR sagen was er an PV Einspeisung generieren darf. Wenn der WR das kann dann Regelt der die Leistung passen runter. Das musst du auch machen wenn du einen Akku hast. Darin unterscheiden sich die Anlagen nicht. Ist der Akku voll und du möchtest nicht einspeisen muss du auch dann den WR runter regeln.

Hast du die Modbus-Spezifikation von deinem Wechselrichter? Dann kannst du die ja mal teilen. Dort muss ja beschrieben sein auf welches Register du schreiben musst um die Einspeiseleistung zu regeln.

Ich habe den growatt mic 600tl-x

hab da was gefunden weiß nur nicht ob das mit meinem WSR zusammen passt

Growatt_Manual modbus RTU Protocol.pdf

das ist der Befehl aus der esphome mit dem ich mein WSR regeln kann habe in Hassio auch den slider um ihn runter zu regeln

platform: modbus_controller
modbus_controller_id: growatt
id: growatt600_pv_powerfactor
name: "${devicename} Power factor"
address: 0x3
value_type: U_WORD
min_value: 0
max_value: 100
step: 1

@rattenfaenger

Hallo Rattenfänger, wie schon geschrieben wurde, ist eine Regelung zur Nulleinspeisung per WLAN relativ träge. Ich nutze den Growatt TL-X auch nachts, um Strom aus einer Batterie zu wandeln. Dabei übertrage ich per WLAN die Momentanleistung (Verbrauch per IR-Kopf am digitalen Stromzähler) über Home Assistant zum Shinewifi-X, der dann entsprechend die Leistung begrenzt und somit regelt, wie viel Strom ich aus der Batterie ins Haus einspeise. Dies geschieht recht grobgranular (z. B. 100, 150, 200 oder 250 Watt aus Batterie produzieren), halt nur so viel, dass ich nicht noch nachts kostbaren Batteriestrom ins Netz einspeise. ;) Im Folgenden die Code Snippets für ESPHome des Shinewifi-X, so umgeschrieben, dass es auch für eine Nulleinspeisung gehen sollte.
Zunächst ein paar globale Variablen:
# Use three global variables to store the last three received power values
globals:
- id: power_t0  # curent power value
type: int
restore_value: no
initial_value: '42'
- id: power_t1  # power value one time step before
type: int
restore_value: no
initial_value: '42'
- id: power_t2 # power value two time steps before
type: int
restore_value: no
initial_value: '42'
- id: GrowattPower
type: float
initial_value: '0.0'

Folgende Sensoren anpassen (name: "${devicename} AcPower") bzw. hinzufügen:

sensor:
...
- platform: modbus_controller
name: "${devicename} AcPower"
address: 40
register_type: "read"
unit_of_measurement: W
device_class: power
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
on_value:
then:
- globals.set:
id: GrowattPower
value: !lambda 'return float(x);'
...
- platform: homeassistant
name: "Total Momentanleistung from Home Assistant"
entity_id: sensor.momentanleistung_gefiltert   # <<<<<<<<<<<<<<<<<<< Hier trägst Du den Sensornamen von deinem 'Hichi' Stromzähler ein
on_value:
then:
- logger.log:
level: DEBUG
format: 'Power value changed from %d to %d Deziwatt [dW]'
args: ['id(power_t0)', 'int(x*10.0)']
- globals.set:
id: power_t2
value: !lambda 'return id(power_t1);'
- globals.set:
id: power_t1
value: !lambda 'return id(power_t0);'
- globals.set:
id: power_t0
value: !lambda 'return int(x*10.0);'

Jetzt die eigentliche Regelung (alle 10 Sekunden):

interval:
- interval: 10s
then:
- lambda: !lambda |-
ESP_LOGD("main", "Growatt AC Power: %f ", id(GrowattPower));
int16_t powerOffset = 500;           // Export offset (-50 W)
int16_t powerMax = 6000;             // 6000 dW = 600 W (if Growatt MIC 600TL-X)
static int16_t relOutputPower = 10;  // Max output active power (0 - 100 %) // 10 % => ~60 W (if Growatt MIC 600TL-X)
if ((id(power_t0) == id(power_t1)) && (id(power_t1) ==  id(power_t2))) // no change from power sensor for three samples => set inverter to 100 %, or whatever you want if you don't receive values from your Smartmeter
{ relOutputPower = 100;
}
else
{ relOutputPower = (id(power_t0) + id(GrowattPower)*10 + powerOffset) / powerMax;  // integer divison
if (relOutputPower < 20) relOutputPower = 20; // Minimum should be 20 % => ~120 W
}
ESP_LOGD("main", "Relative Output Power: %d percent", relOutputPower);
esphome::modbus_controller::ModbusController *controller = id(growatt);
uint16_t reg = 3; // Register: Max output active power (in %)
modbus_controller::ModbusCommandItem setOutputPower_command = modbus_controller::ModbusCommandItem::create_write_single_command(controller, reg, relOutputPower);
controller->queue_command(setOutputPower_command);

Moin!
Scheinbar hat Growatt das Design der ShineRFStick-X geändert.
Die Plantine deckt sich nicht mit den hier geposteten Abbildungen.
Gibt es Ansätze, wie dort vorzugehen ist ?

Gruß
P.S.: Sobald ich herausgefunden habe, wie ich Bilder poste, reiche ich sie nach :wink:

Ich nehme alles zurück.

Ich Doofmann habe nicht gewusst, dass es sowohl Wifi-X, als auch RF-Stick-X gibt ?

Hatte mich schon gewundert warum da ein Funkmodul für 433MHz verbaut war .....

Also falscher Alarm...

Ich hab gerade meine Besitztümer um eine 3KW PV Anlage mit Growatt WR erweitet. Wie zum Henker kann ich die IP Adresse vom Shine-X Wifi Stick herausfinden?

Mit Fritzbox oder IPScanner bin ich schon gescheitert.

@frankthetank

Ich möchte die Regelung hier nochmal ansprechen welche aus meiner Sicht in Verbindung mit einem SmartMeter Zähler ( Hichi ) wohl am besten funktioniert. Meine Idee ist jedoch den MIC 2000TL-X (ohne Batterie) immer auf 30% (oder weniger) zu halten bis der SmartMeter einen höheren Verbrauch ermittelt, also mehr als 600W. Bei der Umsetzung bräuchte ich da noch etwas Unterstützung in der Regelung.

Schon soweit erledigt, siehe weiter unten.

Quelle: Link entfernt im Code? Da bin im vom Programmieren dann doch etwas überfragt {green}:crying:

AcPowerOutput dynamisch entsprechend dem tatsächlichen Verbrauch regeln. Sicher noch zu verbessern aber es funktioniert und garantiert NULL Einspeisung auch bei Solaranlagen weit über den beliebten 600W mit dem Growatt MIC xxxxtl-x.

Bei über 100% berechnetem Verbrauch wird ACPowerOutput auf 99,9 % gesetzt ( siehe Bild mit 3000W Verbrauch ). Die Regelung erfolgt entsprechend dem Aktualisierungsinterval des Hichi Stromzähler über HA ( bei mir alle 60s ). Um das Regeln im 60s Takt zu verringern wäre sicher eine vordefinierte Range im Bereich von 100W sinnvoll, so daß nur bei grösseren Sprüngen auch Geregelt wird.

Funktioniert sicher auch ohne HA wenn man einen MQTT Server konfigueriert und den Stromzähler direkt zum Growatt Shine-X senden läßt.

# Use three global variables to store the last three received power values
globals:
- id: power_t0  # curent power value
type: float
restore_value: no
initial_value: '0.0'
- id: GrowattPower
type: float
initial_value: '0.0'
captive_portal:
time:
- platform: homeassistant
id: homeassistant_time
output:
# Blue Led
- id: light_bl
platform: gpio
pin: 16
# Green Led
- id: light_gr
platform: gpio
pin: 0
# Red Led
- id: light_rd
platform: gpio
pin: 2
uart:
id: mod_bus
tx_pin: 1
rx_pin: 3
baud_rate: 115200
modbus:
id: modbus1
uart_id: mod_bus
modbus_controller:
- id: growatt
# the Modbus device addr
address: 0x1
modbus_id: modbus1
setup_priority: -10
sensor:
- platform: modbus_controller
name: "${devicename} DcPower"
address: 5
register_type: "read"
unit_of_measurement: W
device_class: power
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} DcVoltage"
address: 3
register_type: "read"
unit_of_measurement: V
device_class: voltage
icon: mdi:flash
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} DcInputCurrent"
address: 4
register_type: "read"
unit_of_measurement: A
device_class: current
icon: mdi:flash
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} AcFrequency"
address: 37
register_type: "read"
unit_of_measurement: Hz
icon: mdi:flash
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.01
- platform: modbus_controller
name: "${devicename} AcVoltage"
address: 38
register_type: "read"
unit_of_measurement: V
device_class: voltage
icon: mdi:flash
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} AcOutputCurrent"
address: 39
register_type: "read"
unit_of_measurement: A
device_class: current
icon: mdi:flash
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} AcPower"
address: 40
register_type: "read"
unit_of_measurement: W
device_class: power
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
on_value:
then:
- globals.set:
id: GrowattPower
value: !lambda 'return float(x);'
- platform: modbus_controller
name: "${devicename} EnergyToday"
address: 53
register_type: "read"
unit_of_measurement: kWh
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} EnergyTotal"
address: 55
register_type: "read"
unit_of_measurement: kWh
state_class: total_increasing
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} Temperature"
address: 93
register_type: "read"
unit_of_measurement: C
device_class: temperature
icon: mdi:thermometer
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: homeassistant
name: "Total Momentanleistung from Home Assistant"
entity_id: sensor.tasmota_strom_power_curr   # <<<<<<<<<<<<<<<<<<< Hier trägst Du den Sensornamen von deinem 'Hichi' Stromzähler ein, Update alle 60s
on_value:
then:
- logger.log:
level: DEBUG
format: 'Power value changed from %d to %d Deziwatt [dW]'
args: ['id(power_t0)', 'int(x*10.0)']
- globals.set:
id: power_t0
value: !lambda 'return int(x*10.0);'
interval:
- interval: 10s
then:
- lambda: !lambda |-
ESP_LOGD("main", "Growatt AC Power: %f ", id(GrowattPower));
int16_t powerOffset = 500;           // Export offset (-50 W)
int16_t powerMax = 20000;             // 6000 dW = 600 W (if Growatt MIC 600TL-X)
static int16_t relOutputPower = 10;  // Max output active power (0 - 100 %) // 10 % => ~60 W (if Growatt MIC 600TL-X)
static int16_t calOutputPower = 0;
static int16_t consumePower = 0;
static int16_t GroPower = 0;
static int16_t PowerSet = 0;
relOutputPower = id(power_t0) / powerMax * 100.0 + 1.0;
calOutputPower = id(power_t0) / powerMax * 100.0;
consumePower = id(power_t0) / 10.0;
PowerSet = relOutputPower / 1000.0 * powerMax;
if (relOutputPower > 99) relOutputPower = 99.9; // Maximum should be allways 100 %
PowerSet = relOutputPower / 1000.0 * powerMax;
ESP_LOGD("main", "Relative Output Power: %d percent", relOutputPower);
ESP_LOGD("main", "Calculated Output Power: %d percent", calOutputPower);
ESP_LOGD("main", "Set Output Power to: %d Watt", PowerSet);
ESP_LOGD("main", "Real Consumed Power: %d Watt", consumePower);
esphome::modbus_controller::ModbusController *controller = id(growatt);
uint16_t reg = 3; // Register: Max output active power (in %)
modbus_controller::ModbusCommandItem setOutputPower_command = modbus_controller::ModbusCommandItem::create_write_single_command(controller, reg, relOutputPower);
controller->queue_command(setOutputPower_command);

Nächster Schritt wäre die Ansteuerung einer Heizung für Warmwasser um verfügbare DCPower dann zu nutzen wenn aktueller Verbrauch + Heizung die Leistung der Solaranlage nicht um mehr als 10 % übersteigt. Da habe ich noch keine Lösung gefunden um einen Powerswitch direkt mit z.B. curl zu steuern. Es sollte in etwa so funktionieren:

//if ((id(GrowattDCPower)*10 > id(power_t0) and (sec%60==0))
//{
//relOuputPower = 100;
//=> websend [IP of Powerswitch] power ON ODER curl
//}
//if ((id(power_t0) > 22000 and (sec%60==0))
//{
//relOuputPower = (id(power_t0) / powerMax * 100.0);
//=> websend [IP of Powerswitch] power OFF ODER curl
//}
Hat jemand eine Idee dazu?

Hallo zusammen ich habe gestern Abend mal versucht die Version aus dem ersten Post mittels esphome zu Flaschen bekomme aber immer Fehlermeldungen. Zum Beispiel meckert er mir die substitutions an und er meckert über die gr Led in Zeile 42.

Ich habe es versucht auf einen nodemcuv3 zu Flashen (denke hier kommt der Led Fehler her).

Ist es mit dem Skript möglich es auf einem nodemcuv3

Ich habe es nun mit meinem ShineX gemacht und es funktioniert ich kann nun die Werte auslesen.

Ich würde auch gerne die Leistung ändern meine Config sieht so aus

substitutions:
devicename: "esphome-growatt-01"
upper_devicename: "ESPHome Growatt 01"
esphome:
name: $devicename
platform: ESP8266
board: esp07s
# Enable logging
logger:
baud_rate: 0
# Enable Home Assistant API
#api:
mqtt:
broker: xxx.xxx.xxx
port: 1884
username: xxx
password: !secret mqtt_password
ota:
password: "xxxxx"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "GGrowatt"
password: "xxxxxxxxx"
# Enable Web server
web_server:
port: 80
captive_portal:
#time:
#   - platform: homeassistant
#     id: homeassistant_time
output:
# Blue Led
- id: light_bl
platform: gpio
pin: 16
# Green Led
- id: light_gr
platform: gpio
pin: 0
# Red Led
- id: light_rd
platform: gpio
pin: 2
uart:
id: mod_bus
tx_pin: 1
rx_pin: 3
baud_rate: 115200
modbus:
id: modbus1
uart_id: mod_bus
modbus_controller:
- id: growatt
# the Modbus device addr
address: 0x1
modbus_id: modbus1
setup_priority: -10
sensor:
- platform: modbus_controller
name: "${devicename} DcPower"
address: 5
register_type: "read"
unit_of_measurement: W
device_class: power
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} DcVoltage"
address: 3
register_type: "read"
unit_of_measurement: V
device_class: voltage
icon: mdi:flash
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} DcInputCurrent"
address: 4
register_type: "read"
unit_of_measurement: A
device_class: current
icon: mdi:flash
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} AcFrequency"
address: 37
register_type: "read"
unit_of_measurement: Hz
icon: mdi:flash
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.01
- platform: modbus_controller
name: "${devicename} AcVoltage"
address: 38
register_type: "read"
unit_of_measurement: V
device_class: voltage
icon: mdi:flash
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} AcOutputCurrent"
address: 39
register_type: "read"
unit_of_measurement: A
device_class: current
icon: mdi:flash
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} AcPower"
address: 40
register_type: "read"
unit_of_measurement: W
device_class: power
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} EnergyToday"
address: 53
register_type: "read"
unit_of_measurement: kWh
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} EnergyTotal"
address: 55
register_type: "read"
unit_of_measurement: kWh
state_class: total_increasing
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} Temperature"
address: 93
register_type: "read"
unit_of_measurement: C
device_class: temperature
icon: mdi:thermometer
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
#neu test power factor 02/2023
number:
platform: modbus_controller
name: "${devicename} Max Output Active Power"
address: 3
value_type: U_WORD
min_value: 0
max_value: 100

So kann ich den wert leider nicht ändern

wenn ich es so versuche

number:
- platform: modbus_controller
name: "${devicename} Max Output Power"
address: 3
value_type: U_WORD
min_value: 0
max_value: 100
-platform: modbus_controller
modbus_controller_id: growatt
id: growatt600_pv_powerfactor
name: "${devicename} Power factor"
address: 0x3
value_type: U_WORD
min_value: 0
max_value: 100
step: 1

Kommt immer der fehler

mapping values are not allowed here

Fehler hier >>>>>>>

-platform: modbus_controller

Leerzeichen vergessen.

Hier die automatische Variante!!

Nach langem Probieren habe ich folgende automatische Regelung für den MIC 2000tl-x auf dem Shine-x Stick. Manuelle Regelung ist nicht möglich - wozu auch.

Voraussetzung:

SmartMeter (Hichi ) Leistung in W per MQTT im Homeassistant (o.ä.) welcher dann vom Shine-x abgefragt wird.

Da mein Stromzähler keine Einspeisung zählt und die Verbraucher auf 3 Phasen verteilt sind kann man den tatsächlichen Verbrauch auch nicht wirklich erfassen wenn Solarstom auf eine Phase geliefert wird. Man sollte also vorher den Grundverbrauch kennen um die Nulleinspeisung realisieren zu können. Ich habe 250W Grundlast gemessen, also ca. 12% Leistung am Wechselrichter. Dies ist der Ausgangswert für mich. Zum Verständnis:

Wenn mein Stromzähler 50W Verbrauch anzeigt bedeutet dies bei 12% Leistung daß schon 240 Watt verbraucht wurden und real 290 W gebraucht werden, also 15%. In diesem Fall erhöht sich die Leistung automatisch auf 15% und bleibt dort bis es eine Änderung nach oben oder unten gibt im von mir angebenen Bereich ( siehe yaml ). Natürlich kann der Wechselrichter nie mehr Leistung liefern als er selber oder der Sonnenschein/Sonnenstand kann.

Wer die Einspeisung am Stromzähler auslesen kann, kann diesen Wert als Grundlage für die Berechnung der benötigten Leistung nehmen z.B.

Verbrauch - Einspeisung = Bedarf

Dazu muß man dann noch einiges umschreiben. Die meisten Werte im Lambda dienen nur der Kontrolle der Funktion über das Logfile und sind eigentlich unnötig. Der Wert PowerToGrid wäre eine Überschussrechnung bezogen auf den realen Verbrauch aber da kommt bei mir immer 0. ( irgendwo noch ein Denkfehler )

Es gibt also immer noch etwas zu verbessern aber es funktioniert seit Tagen ohne Probleme mit der Änderung der Leistung im Bezug auf den Verbrauch. Die Änderung der Leistung geschieht sofort ohne Verzögerung!! Aus diesem Grund sollten man den Bereich der Leistungsänderung ( ich habe 50 Watt ) nicht zu klein halten um permantens Regel zu vermeiden. Lieber etwas mehr Solarstrom liefern als zu wenig.

Diese Konfiguration bezieht sich nur auf den Verbrauch mit Grundlast bei Verteilung der Last auf drei Phasen bei UNBEKANNTER Einspeiseleistung. LEDs funktionieren bei mir so nicht über verlängertes USB Kabel.

Achtung. Die Konfiguration ist auf 2000W ausgelegt. Diese Werte müssen angepaßt werden auf die Leistung des Wechselrichters.

Viel Spaß beim probieren und ........ korrigieren.

substitutions:
device_description: Growatt Inverter Regulator
friendly_name:  Growatt Inverter Regulator
devicename: "growregulator"
name: "growaregulator"
esphome:
name: $devicename
esp8266:
board: esp07s
# Enable logging
logger:
baud_rate: 0
# Enable Home Assistant API
api:
encryption:
key: " Enter your key "
ota:
password: "????"
wifi:
ssid:
password:
fast_connect: on
use_address: ""
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "${name} Fallback Hotspot"
password: "password"
web_server:
port: 80
auth:
username: growatt
password: "1234"
# Use three global variables to store the last three received power values
globals:
- id: power_t0  # curent power value
type: float
restore_value: no
initial_value: '0.0'
- id: GrowattPower
type: float
initial_value: '0.0'
- id: GrowDCPower
type: float
restore_value: no
initial_value: '0.0'
captive_portal:
time:
- platform: homeassistant
id: homeassistant_time
output:
# Blue Led
- id: light_bl
platform: gpio
pin: 16
# Green Led
- id: light_gr
platform: gpio
pin: 0
# Red Led
- id: light_rd
platform: gpio
pin: 2
uart:
id: mod_bus
tx_pin: 1
rx_pin: 3
baud_rate: 115200
modbus:
id: modbus1
uart_id: mod_bus
modbus_controller:
- id: growatt
# the Modbus device addr
address: 0x1
modbus_id: modbus1
setup_priority: -10
sensor:
- platform: modbus_controller
name: "${devicename} DcPower"
address: 5
register_type: "read"
unit_of_measurement: W
device_class: power
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
on_value:
then:
- globals.set:
id: GrowDCPower
value: !lambda 'return float(x);'
- platform: modbus_controller
name: "${devicename} DcVoltage"
address: 3
register_type: "read"
unit_of_measurement: V
device_class: voltage
icon: mdi:flash
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} DcInputCurrent"
address: 4
register_type: "read"
unit_of_measurement: A
device_class: current
icon: mdi:flash
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} AcFrequency"
address: 37
register_type: "read"
unit_of_measurement: Hz
icon: mdi:flash
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.01
- platform: modbus_controller
name: "${devicename} AcVoltage"
address: 38
register_type: "read"
unit_of_measurement: V
device_class: voltage
icon: mdi:flash
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} AcOutputCurrent"
address: 39
register_type: "read"
unit_of_measurement: A
device_class: current
icon: mdi:flash
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} AcPower"
address: 40
register_type: "read"
unit_of_measurement: W
device_class: power
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
on_value:
then:
- globals.set:
id: GrowattPower
value: !lambda 'return float(x);'
- platform: modbus_controller
name: "${devicename} EnergyToday"
address: 53
register_type: "read"
unit_of_measurement: kWh
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} EnergyTotal"
address: 55
register_type: "read"
unit_of_measurement: kWh
state_class: total_increasing
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "${devicename} Temperature"
address: 93
register_type: "read"
unit_of_measurement: C
device_class: temperature
icon: mdi:thermometer
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: homeassistant
name: "Total Momentanleistung from Home Assistant"
entity_id: sensor.tasmota_strom_power_curr   # <<<<<<<<<<<<<<<<<<< Hier trägst Du den Sensornamen von deinem 'Hichi' Stromzähler ein, Update alle 15s
on_value:
then:
- logger.log:
level: DEBUG
format: 'Power value changed from %d to %d Deziwatt [dW]'
args: ['id(power_t0)', 'int(x*10.0)']
- globals.set:
id: power_t0
value: !lambda 'return int(x*10.0);'
interval:
- interval: 15s
then:
- lambda: !lambda |-
ESP_LOGD("main", "Growatt AC Power: %f ", id(GrowattPower));
static int16_t powerMax = 20000;             // 20000 dW = 2000 W (if Growatt MIC 2000TL-X)
static int16_t relOutputPower = 10;  // Max output active power (0 - 100 %) // 10 % => ~60 W (if Growatt MIC 600TL-X)
static int16_t calOutputPower = 0;
static int16_t consumePower = 0;
static int16_t GridPower = 0;
static int16_t ToGridPower = 0;
static int16_t PowerSet = 0;
relOutputPower = id(power_t0) / powerMax * 100.0 + 1.0;
calOutputPower = id(power_t0) / powerMax * 100.0;
consumePower = id(power_t0) / 10.0;
PowerSet = relOutputPower / 1000.0 * powerMax;
GridPower = (id(power_t0) - id(GrowattPower)) / 10.0;
if ((id(power_t0) / 10.0) > 199 and (id(power_t0) / 10.0) < 259) relOutputPower = 13;
if ((id(power_t0) / 10.0) > 259 and (id(power_t0) / 10.0) < 299) relOutputPower = 15;
if ((id(power_t0) / 10.0) > 299 and (id(power_t0) / 10.0) < 359) relOutputPower = 18;
if ((id(power_t0) / 10.0) > 359 and (id(power_t0) / 10.0) < 399) relOutputPower = 20;
if ((id(power_t0) / 10.0) > 399 and (id(power_t0) / 10.0) < 459) relOutputPower = 23;
if ((id(power_t0) / 10.0) > 459 and (id(power_t0) / 10.0) < 499) relOutputPower = 25;
if ((id(power_t0) / 10.0) > 499 and (id(power_t0) / 10.0) < 559) relOutputPower = 28;
if ((id(power_t0) / 10.0) > 559 and (id(power_t0) / 10.0) < 599) relOutputPower = 30;
if ((id(power_t0) / 10.0) > 599 and (id(power_t0) / 10.0) < 659) relOutputPower = 33;
if ((id(power_t0) / 10.0) > 659 and (id(power_t0) / 10.0) < 699) relOutputPower = 35;
if ((id(power_t0) / 10.0) > 699 and (id(power_t0) / 10.0) < 759) relOutputPower = 38;
if ((id(power_t0) / 10.0) > 759 and (id(power_t0) / 10.0) < 799) relOutputPower = 40;
if ((id(power_t0) / 10.0) > 799 and (id(power_t0) / 10.0) < 859) relOutputPower = 43;
if ((id(power_t0) / 10.0) > 859 and (id(power_t0) / 10.0) < 899) relOutputPower = 45;
if ((id(power_t0) / 10.0) > 899 and (id(power_t0) / 10.0) < 959) relOutputPower = 48;
if ((id(power_t0) / 10.0) > 959 and (id(power_t0) / 10.0) < 999) relOutputPower = 50;
if ((id(power_t0) / 10.0) > 999 and (id(power_t0) / 10.0) < 1059) relOutputPower = 53;
if ((id(power_t0) / 10.0) > 1059 and (id(power_t0) / 10.0) < 1099) relOutputPower = 55;
if ((id(power_t0) / 10.0) > 1099 and (id(power_t0) / 10.0) < 1159) relOutputPower = 58;
if ((id(power_t0) / 10.0) > 1159 and (id(power_t0) / 10.0) < 1199) relOutputPower = 60;
if ((id(power_t0) / 10.0) > 1199 and (id(power_t0) / 10.0) < 1259) relOutputPower = 63;
if ((id(power_t0) / 10.0) > 1259 and (id(power_t0) / 10.0) < 1299) relOutputPower = 65;
if ((id(power_t0) / 10.0) > 1299 and (id(power_t0) / 10.0) < 1359) relOutputPower = 68;
if ((id(power_t0) / 10.0) > 1359 and (id(power_t0) / 10.0) < 1399) relOutputPower = 70;
if ((id(power_t0) / 10.0) > 1399 and (id(power_t0) / 10.0) < 1459) relOutputPower = 73;
if ((id(power_t0) / 10.0) > 1459 and (id(power_t0) / 10.0) < 1499) relOutputPower = 75;
if ((id(power_t0) / 10.0) > 1499 and (id(power_t0) / 10.0) < 1559) relOutputPower = 78;
if ((id(power_t0) / 10.0) > 1559 and (id(power_t0) / 10.0) < 1599) relOutputPower = 80;
if ((id(power_t0) / 10.0) > 1599 and (id(power_t0) / 10.0) < 1659) relOutputPower = 83;
if ((id(power_t0) / 10.0) > 1659 and (id(power_t0) / 10.0) < 1699) relOutputPower = 85;
if ((id(power_t0) / 10.0) > 1699 and (id(power_t0) / 10.0) < 1759) relOutputPower = 88;
if ((id(power_t0) / 10.0) > 1759 and (id(power_t0) / 10.0) < 1799) relOutputPower = 90;
if ((id(power_t0) / 10.0) > 1799 and (id(power_t0) / 10.0) < 1859) relOutputPower = 93;
if ((id(power_t0) / 10.0) > 1859 and (id(power_t0) / 10.0) < 1899) relOutputPower = 95;
if ((id(power_t0) / 10.0) > 1899 and (id(power_t0) / 10.0) < 1959) relOutputPower = 98;
if ((id(power_t0) / 10.0) > 1959 and (id(power_t0) / 10.0) < 2001) relOutputPower = 100;
if ((id(power_t0) / 10.0) > 2000) / 10.0) relOutputPower = 100;
if ((id(power_t0) / 10.0) < 200 and (id(power_t0) / 10.0) < 49) relOutputPower = 10;
if (relOutputPower > 100) relOutputPower = 100; // Maximum should be allways 100 %
PowerSet = relOutputPower / 1000.0 * powerMax;
ToGridPower = (relOutputPower / 1000.0 * powerMax) - (id(power_t0) / 10.0);
if ( id(GrowattPower) < 1 ) ToGridPower = 0;
ESP_LOGD("main", "Relative Output Power: %d percent", relOutputPower);
ESP_LOGD("main", "Calculated Output Power: %d percent", calOutputPower);
ESP_LOGD("main", "Set Output Power to: %d Watt", PowerSet);
ESP_LOGD("main", "Real Consumed Power: %d Watt", consumePower);
ESP_LOGD("main", "Power from Grid: %d Watt", GridPower);
ESP_LOGD("main", "Power to Grid: %d Watt", ToGridPower);
esphome::modbus_controller::ModbusController *controller = id(growatt);
uint16_t reg = 3; // Register: Max output active power (in %)
modbus_controller::ModbusCommandItem setOutputPower_command = modbus_controller::ModbusCommandItem::create_write_single_command(controller, reg, relOutputPower);
controller->queue_command(setOutputPower_command);

Leider habe ich bemerkt das ich noch ein Problem habe ich benutzte den IoBroker mit ESP Home hier funktionieren Numbers nicht. Deshalb benutze ich Mqtt. Die ausgelesenen Werte kommen an aber ich bekomme es nicht hin die Ausgangsleistung zu regulieren.

Ich müsste also den Wert per Mqtt schreiben leider bekomme ich das nicht hin. Einen Wert per Mqtt einlesen klappt aber nicht, auch habe ich versucht den Wert mit einem Schieberegler zu ändern aber hier meckckert er über ein falsches Format

number:
- platform: modbus_controller
name: "${devicename} Max Output Active Power"
id: poweroutput
address: 3
value_type: U_WORD
min_value: 0
max_value: 100
entity_category: config
step: 1
- platform: template
name: "Power Output"
id: "Power_Output"
optimistic: true
min_value: 0
initial_value: 100
max_value: 100
step: 1
set_action:
then:
- lambda: id(poweroutput) = x;
sensor:
- platform: mqtt_subscribe
name: "mqtttest"
id: mqtttest
topic: the/topic

Das ist die Fehlermeldung

Compiling .pioenvs/esphome-growatt-01/src/main.cpp.o
/opt/iobroker/iobroker-data/esphome.0/growatt.yaml: In lambda function:
/opt/iobroker/iobroker-data/esphome.0/growatt.yaml:232:21: error: cannot convert 'float' to 'esphome::modbus_controller::ModbusNumber*' in assignment
232 |         - lambda: id(poweroutput) = x;
|                     ^
|                     |
|                     float
*** [.pioenvs/esphome-growatt-01/src/main.cpp.o] Error 1

Ich hoffe jemand kann mir helfen