Benachrichtigungen
Alles löschen

Growatt Wechselrichter mit ESPHome auslesen

81 Beiträge
30 Benutzer
4 Reactions
16.8 K Ansichten
FrankTheTank
(@frankthetank)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 5
 

@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);

   
AntwortZitat
(@flokhome)
Newbie
Beigetreten: Vor 1 Jahr
Beiträge: 1
 

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 😉

 

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...

Diese r Beitrag wurde geändert Vor 1 Jahr von FLOKHOME

   
AntwortZitat
(@nordarne)
Batterielecker
Beigetreten: Vor 2 Jahren
Beiträge: 158
 

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. 


   
AntwortZitat
(@devil26)
Newbie
Beigetreten: Vor 11 Monaten
Beiträge: 4
 

@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 Crying  

 

Diese r Beitrag wurde geändert Vor 11 Monaten 2 mal von Devil26

   
AntwortZitat
(@devil26)
Newbie
Beigetreten: Vor 11 Monaten
Beiträge: 4
 
Diese r Beitrag wurde geändert Vor 11 Monaten 2 mal von Devil26

   
AntwortZitat
(@devil26)
Newbie
Beigetreten: Vor 11 Monaten
Beiträge: 4
 

Veröffentlicht von: @devil26

AcPowerOutput dynamisch entsprechend dem tatsächlichen Verbrauch.

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?

 

 

Diese r Beitrag wurde geändert Vor 11 Monaten von Devil26

   
AntwortZitat
(@jacke)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 76
 

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


   
AntwortZitat
(@jacke)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 76
 

   
AntwortZitat
(@devil26)
Newbie
Beigetreten: Vor 11 Monaten
Beiträge: 4
 
Diese r Beitrag wurde geändert Vor 11 Monaten von Devil26

   
AntwortZitat
(@jacke)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 76
 

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


   
AntwortZitat
(@caberliner)
Vorsichtiger Stromfühler
Beigetreten: Vor 11 Monaten
Beiträge: 8
 

@devil26 Dieses esphome yaml reizt mich sehr zum ausprobieren. Ich habe einen Stromzähler der Einspeise- und Verbrauchsleistung angibt. In Homeassistant habe ich mir einen kombinierten Sensor für die Momentanleistung erstellt. Da ich noch ein BHKW mit Stromproduktion besitze kommen bei mir natürlich auch negative Werte vor. Reicht es dafür einen weiteren edge case zu definieren? Wobei durch die Berechnung hier: relOutputPower=1 einer Momentanleistung von 0 Watt entspricht, oder? (Growatt MIC 1000TL-X)

 if (relOutputPower < 1) relOutputPower = 0; // Minimum should be allways 0 %

   
AntwortZitat
(@caberliner)
Vorsichtiger Stromfühler
Beigetreten: Vor 11 Monaten
Beiträge: 8
 

   
AntwortZitat
(@jacke)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 76
 

So per Mqtt kann ich nun den wert steuern hier mein Code

- platform: mqtt_subscribe
      name: "mqtttest"
      id: mqtttest
      topic: the/topic 
      on_value:
        then:
          - lambda: |-
              esphome::modbus_controller::ModbusController *controller = id(growatt);
              uint16_t reg = 3; // Register: Max output active power (in %)
              float value = id(mqtttest).state;
              uint16_t register_value = static_cast(value);
              modbus_controller::ModbusCommandItem setOutputPower_command = modbus_controller::ModbusCommandItem::create_write_single_command(controller, reg, register_value);
              controller->queue_command(setOutputPower_command);

   
AntwortZitat
(@querys)
Vorsichtiger Stromfühler
Beigetreten: Vor 1 Jahr
Beiträge: 20
 

Mal ne Frage:

ACPower scheint bei mir beim MOD10KTL-X irgendwie nur eine Phase zu sein, gibt es den Wert auch für die anderen drei Phasen bzw. einen Gesamtwert der Abgabe?


   
AntwortZitat
(@querys)
Vorsichtiger Stromfühler
Beigetreten: Vor 1 Jahr
Beiträge: 20
 

Mal ne Frage:

ACPower scheint bei mir beim MOD10KTL-X irgendwie nur eine Phase zu sein, gibt es den Wert auch für die anderen zwei Phasen bzw. einen Gesamtwert der Abgabe?


   
AntwortZitat
Seite 3 / 6
Teilen: