Inhaltsverzeichnis

Growatt Wechselrichter

Einleitung

Viele Growatt Wechselrichter werden mit einen WLAN, 4G oder Ethernet Stick verkauft bzw diese kann dazu erworben werden „Shine-Stick“.
Diese Sticks werden an einen RS-232 bzw an einem USB Anschluss betrieben, alternativ besitzen viele dieser WR eine RS-485 Schnittstelle .

Grundsätzlich läuft auf allen diesen Schnittstellen ModBus.

Leider stellt der orginal Wlan Stick keine direkten Daten zum auslesen bereit. Viele Projekte haben sich der Growatt API Datenbank bedient um die Daten wieder aus der Cloud auszulesen.

Mitlerweile gibt es ein Projekt das auch den Stick selber erkundet hat und eine Lösung präsentiert.

In diesem Abschnitt beschreiben wir die Möglichkeit den WR ohne Cloud und Internet abzufragen.

Vorraussetzung

Growatt WR mit modifizierten ShineWifi-X oder ShineWifi-S alternativ einen D1-mini (ch340) oder ESP32 (ch340)

Bitte dazu auf den einschlägigen Seiten Informieren wie man einen D1-mini programmiert
(der Orginal ShineWifi besitzt ebenfalls einen ESP8622 (ESP07s) Controller)
zusätzlich finden auf der Projektseite weitere information .
ShineWifi Mod

Beim D1-mini benötigt man keine Zusätzliche Beschaltung das Programmier USB-Kabel kann direkt am WR ebenfalls genutzt werden

Möglichkeit 1 CRON

Bitte über <IP/status> einmal die JSON Datenblock abfragen und schauen welche Daten der WR bereitstellt

der Nachfolgende Script ist für Modbus v1.24 und einem Growatt 600TL-x Einphasig ausgelegt
  1. Manuelle erstellen
    sudo nano Growatt_JSON_read.sh
  2. alternativ git clone
    sudo git clone https://github.com/RaptorSDS/VZ_Growatt_JSON_read.git
sudo nano Growatt_JSON_read.sh
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#set -e bricht script ab wenn etwas nicht stimmt
set -e

#login daten
host_pv="192.168.x.xx"

UUID1="e4f6a700-xxx"
UUID2="35edd970-xxx"
host_db="192.168.x.xxx"
TOTAL=""
TODAY=""
ACTUAL=""
STATUS=""


#read inverter

JSON=$(curl -s $host_pv/status)

#extract status

STATUS=$(echo "$JSON" | grep -o '"InverterStatus":[0-9.]*' | cut -d ":" -f 2)

#when status 1  inverter ready use than the other value
if [ $STATUS != 0 ]; then

#extract other
TOTAL=$(echo "$JSON" | grep -o '"TotalGenerateEnergy":[0-9.]*' | cut -d ":" -f 2)
#TODAY=$echo "$JSON" | grep -o '"TodayGenerateEnergy":[0-9.]*' | cut -d ":" -f 2)
ACTUAL=$(echo "$JSON" | grep -o '"OutputPower":[0-9.]*' | cut -d ":" -f 2)


#an DB senden
#echo "SEND"
wget -O - -q "http://"$host_db"/middleware/data/"$UUID1".json?operation=add&value="$TOTAL""
wget -O - -q "http://"$host_db"/middleware/data/"$UUID2".json?operation=add&value="$ACTUAL""

fi

#print for  Debug
#echo "Today:"$DAY
#echo "ACTUAL:"$ACTUAL
#echo "Total:"$TOTAL
Bitte IP , UUID und die Namen der Json Objekte an deine Gegebenheiten anpassen.

Dieses Script sendet nur die aktuellen Zählerstand und zusätzlich die Leistung an die Middleware.
Zeilen mit „#“ sind auskommentiert und können bei Bedarf genutzt werden für Debug oder um einen weitere Kanäle hinzuzufügen.

aufgrund der langsamen auslesung vom Cron Job wie unten angegeben mit 1min Intervall ist die Darstellung des Zählerstandes nicht allzu gut
 chmod +x Growatt_JSON_read.sh
*/1 * * * * /bin/bash /home/pi/Growatt_JSON_read.sh

Grundsätzlich aktuallisiert der Wifi-Stick alle 5 sek die JSON-Daten

Möglichkeit 2 vzlogger exec

Nachteile Vzlogger darf nicht als root laufen –> umstellung vzlogger siehe vzlogger „vzlogger als anderer Benutzer ausführen“

Bitte über <IP/status> einmal die JSON Datenblock abfragen und schauen welche Daten der WR bereitstellt

der Nachfolgende Script ist für Modbus v1.24 und einem Growatt 600TL-x Einphasig ausgelegt
  1. Manuelle erstellen
    sudo nano Growatt_JSON_exec.sh
  2. alternativ git clone
    sudo git clone https://github.com/RaptorSDS/VZ_Growatt_JSON_read.git
In der Datei sind keine Anpassungen notwendig alle Notigen Optionen werden von extern zu angegeben .
Folgende Optionen sind vorhanden … exec.sh IP Reading1 Reading2 …. dabei werden alle Reading angenommen solange sie im JSON Datenblock vorhanden sind , der script beinhaltet eine Schutz nur wen der WR Status 1 = Betriebsbereit gesetzt hat werden daten ausgegebnen

der Inhalt sieht wie folgt aus

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#!/bin/bash
set -u
set -e

# Script: Growatt_JSON_exec.sh
# Author: Tobias Baumann aka RaptorSDS
# License: MIT
# with help of OpenAI GPT-3.5 and VZlogger Group
# idee by script for KOSTAL_Pico JSON VZlogger exec 

# Function to display script usage
usage() {
  echo "Usage: $0 <hostname> <reading1> <reading2> ..."
  exit 1
}

# Validate required arguments
if [ "$#" -lt 2 ]; then
  usage
fi

# Extract hostname
HOSTNAME="$1"
shift

# Extract readings
READINGS="$*"

#build URL
URL="http://${HOSTNAME}/status"
#echo $URL

#get json
JSON=$(curl --connect-timeout 5 -s "$URL")

#first check status
STATUS=$(echo "$JSON" | jq '. | to_entries[0].value')

if [ "$STATUS" != 0 ]; then
  # process json
  for READING in $READINGS; do
    OUTPUT=$(echo "$JSON" | jq -r --arg readings "$READING" '.[$readings]')
    printf "%s = %s\n" "$READING" "$OUTPUT"
  done
#else
  #echo "Inverter status is not 1"
fi
 chmod +x Growatt_JSON_exec.sh
 
* Die Datei kan jetzt an einen Bekannt Ort kopiert werden bsp /etc/growatt/
{
      "enabled": true,
      "allowskip": true,
      "interval": 60,
      "aggtime": -1,
      "aggfixedinterval": false,
      "channels": [
        {
          "api": "volkszaehler",
          "uuid": "e4f6a700-xxxxx",
          "identifier": "TotalGenerateEnergy",
          "middleware": "http://localhost/middleware.php",
          "aggmode": "none",
          "duplicates": 43200
        },
        {
          "api": "volkszaehler",
          "uuid": "35edd970-xxxxx",
          "identifier": "OutputPower",
          "middleware": "http://localhost/middleware.php",
          "aggmode": "avg",
          "duplicates": 0
        }
      ],
      "protocol": "exec",
      "command": "/etc/growatt/growatt_json_exec.sh 192.xxxx TotalGenerateEnergy OutputPower",
      "format": "$i = $v"
    },
 
Die Config ist so eingestellt das sie alle 60s den WR abfragt und an die DB Übergibt , Der Gesmt Zählerstand wir auf Duplikate kontrolliert und spätesten falls kein neuer Wert vorliegt nach 43200s (12h) erneut in die DB geschrieben