SPH 4600 Growatt Modbus 485 -> openHAB

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

mad-mike
Beiträge: 403
Registriert: 6. Jan 2021 18:05
Answers: 2

SPH 4600 Growatt Modbus 485 -> openHAB

Beitrag von mad-mike »

Hallo zusammen.

Ich habe Stunde, gar Tage damit verbracht meinen Wechselrichter auszulesen und Wert in openHAB zu bekommen. Einige User hier haben Tipps und Tricks zum Erfolg gegeben.

Angefangen an der Einstellung am Wechselrichter. Hier gibt es den Menüpunkt 485 Setting. Der Wert muss von Batterie auf VPP umgestellt werden.
(Meine Batterie wird über den CAN Anschluss am Wechselrichter angeschlossen, und so ist der 485 Port frei.)

Der Port ist ein RJ45 Anschluss, hier wird der PIN 4-5 benötigt. (hier gibt es unzählige aussagen im WWW zu finden, aber bei mir ist es definitiv 4+5)

Als Gateway habe ich ein RS232/485/422 TO POE ETH (B) waveshare genommen. Ich denke, das es auch ein günstiges Modell genommen werden kann.

Man muss sich erstmal mit dem Gateway verbinden, und die IP Adresse anpassen.

"""
screenshot.png
"""

Danach konnte ich mit dem Befehl: (linux)

Code: Alles auswählen

mbpoll -a 1 -t 3 -c 125 -1  192.168.178.198
Die ersten Werte aus dem Growatt ansehen. Eventuell muss man mbpoll noch nachinstallieren.

Dann gings weiter mit dem MODBUS Binding. -> Erstmal installieren.

Es wird so aufgebaut das man ein Thing erstellt:

Modbus zu tcp.
Das war relativ leicht, IP und Port vom Gateway, Id1. Rest habe ich so gelassen wie vorgegeben.

Dann ein zweites Thing, ein Poller der die Daten zieht.
Da kam ich schon im Grübel, musste lange suchen, gucken und fragen.

erstmal die Bridge einstellen, zu dem zuvor erstellten Modbus zu tcp Thing.
Pollintervall ist die Abfrage. In den Dokumenten vom Growatt habe ich etwas von Minimum 800 ms gelesen. Ich habe bei mir erstmal 3000 ms eingestellt. So ist die Abfrage alle 3 Sekunden. Ich denke das kann man je nach bedarf noch etwas optimieren. Ich Brauch den wert der Einspeisung relativ genau, damit ich damit meine E-Patrone Steuern kann....

Die ""Start"" Adresse ist für meine benötigten werte 1016.
Die "Length" habe ich erstmal mit 20 angegeben.

Das bedeutet: ich frage die Werte der addr 1016 -> 1035 ab.
( Für mich ist erstmal nur der die Addr 1022 und 1030 interessant. )

den Typ habe ich auch "input register" eingestellt.


Da die Anlage noch nicht Fertig ist, und auch einige Hardware aktuell nicht vorhanden ist, kann ich leider nur bedingt Punkte auslesen da vieles eine 0 enthält.

Nun muss man noch ein Modbus:Data thing erstellen.

Angefangen mit der Bridge, da wählt man das eben erstellte Polling Thing aus.
die Read Adresse, bei mir 1022 für den Aktuellen Bezug -> Energie zähler im Zählerschrank.

(Die Read Adresse muss in dem Bereich des Poll Things liegen also 1016 <->1035)

bei ""Read Value Type"" habe ich den Wert uint16 ausgewählt.
Den Rest habe ich so belassen.

Nach dem wir dies erstellt haben, können wir ein Channel auswählen: Value as Number

Dort dann noch in Number item erstellt. Schon kommen die ersten Werte.

Der dort angezeigte wert, muss noch durch 10 geteilt werden.

Hier habe ich dies so gelöst, das man unter Profile JS anwählt, ein Script auswählt wo folgendes enthalten ist:

Code: Alles auswählen

(function(i) {
    return parseFloat(i) / 10
})(input)
Weiter musste man noch unter ""Metadaten" den wert "Pattern" um den wert:
ergänzen.


Und dort sieht man dann im 3 sekunden takt eine änderung des aktuellen Stromverbrauchs. Zur Info: der wert kann nicht negativ werden, das bedeutet, das für die Einspeisung ein Thing:Data mit der Adresse 1030 erstellt werden muss...

Ich habe erstmal alles über die UI erstellt, aber hier werde ich es wohl mit den text datein lösen. Das ist glaube übersichtlicher.
Sicherlich sind hier viele fehler Enthalten, aber ich bin auch kein IT ler, versuche dennoch mein Weg zum Ziel zu erklären.


Eventuell kann man in den JS Script gleich ein "%.1f" mit einbauen...
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von mad-mike am 14. Apr 2023 19:26, insgesamt 1-mal geändert.
Gruss mad-mike

openHABian 4.1.1 auf Raspberry Pi 4 Mod. b (8GB) ;)

kmbach
Beiträge: 1
Registriert: 14. Apr 2023 18:00
Answers: 0

Re: SPH 4600 Growatt Modbus 485 -> openHAB

Beitrag von kmbach »

Hallo,
sehr interessant! Kannst Du mir bitte noch sagen wie die Zuordnung der Pins 4/5 zu A+ und B- ist? Ich habe schon Stunden im WWW damit verbracht eine Steckerbelegung der RS485/RJ45 zu finden. Nichts ...

Vielen Dank!

Gruß Klaus

mad-mike
Beiträge: 403
Registriert: 6. Jan 2021 18:05
Answers: 2

Re: SPH 4600 Growatt Modbus 485 -> openHAB

Beitrag von mad-mike »

Natürlich.
Ich habe von einem alten Fritzbox DSL < zu > TAE Kabel den Tae Stecker genommen, der RJ45 hat dort nur PIN 4 + 5 belegt. (TAE Stecker entfernt)

Pin 5 = A+ (DSL Kabel = grün)
Pin 4 = B- (DSL Kabel = Grün - Weiss)


Ich sehe gerade, das oben noch der screenshot fehlt :oops:

Werde das gleich nachholen.
Gruss mad-mike

openHABian 4.1.1 auf Raspberry Pi 4 Mod. b (8GB) ;)

SKLD
Beiträge: 6
Registriert: 8. Jun 2021 17:10
Answers: 0

Re: SPH 4600 Growatt Modbus 485 -> openHAB

Beitrag von SKLD »

Hallo Mike,
ich habe seit 11/22 einen MOD 4000TL3-X im Betrieb.
Meine anfänglichen Versuche hatten sich auf den WLAN Sniffer "Grott" beschränkt. Hier habe ich leider keinen Erfolg gehabt, da entweder die 3 phasige WR nicht implementiert sind oder GroWatt in der Zwischenzeit an den Protokollen gebastelt hat. Nach 2 Monaten und etlichen Versuchen habe ich das Projekt dann beerdigt.
Durch Zufall kam mir dann bei der Suche zu meiner Wallbox irgendwie eine Erweiterung zum Nod-Red für Growatt in die Hände.
Nach Eingabe der Daten für die Growatt Cloud hatte ich auch direkt Verbindung und konnte meine Werte auslesen.
Hab hierzu dann einen Flow erstellt und die Daten per MQTT in OH3 eingebunden. Meine 2 DB zeichnen die Daten fleißig auf, was dann in Grafana visualisiert wird.
Als Nachteil dieser Methode konnte ich feststellen, dass der Server nac x Anfragen in 24h seinen Dienst einfach einstellt.
--Der WLAN Adapter ist auf Werteübermittlung alle 60sec eingestellt.--
Bei einer Abfrage je 1min habe ich vom Start des WR kurz nach 7 Uhr nur bis gegen Mittag Werte erhalten.
Erst nachdem ich das Abfrageintervall auf 5min einegstellt habe, bekomme ich alle Werte vom Start bis Aus des WR.
An einigen Tagen hatte der Server auch zeitweise am Tag Starschwierigkeiten. Da bekam ich keine Verbindung zum Server per Nod-Red und auch vom PC nicht, wobei die App im Smartphone alle Werte angezeigt hat. Hatte vor 2 Wochen dazu Kontakt mit dem Service und seit ein paar tagen ist alles wieder stabil.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

mad-mike
Beiträge: 403
Registriert: 6. Jan 2021 18:05
Answers: 2

Re: SPH 4600 Growatt Modbus 485 -> openHAB

Beitrag von mad-mike »

Danke für dein Feedback.

Habe über deine Vorgehensweise auch Beiträge gelesen.

Für Monitorwerte Okay, aber wenn man mit zahlen noch arbeiten will, sollten diese ja relativ aktuell sein. Kommt die Wolke, und merke erst 5 Minuten später das der heizstab aus kann, ist das ärgerlich.

Gestern kam endlich der Akku. So werde ich also versuchen sich Werte auszulesen über den modbus.

Der modbus Scanner spukt jedenfalls ein Haufen neuer zahlen aus.

Bis die Platten auf dem Dach liegen, dauert es leider noch ein paar Wochen.
Gruss mad-mike

openHABian 4.1.1 auf Raspberry Pi 4 Mod. b (8GB) ;)

mad-mike
Beiträge: 403
Registriert: 6. Jan 2021 18:05
Answers: 2

Re: SPH 4600 Growatt Modbus 485 -> openHAB

Beitrag von mad-mike »

Modbus Gateway:

Code: Alles auswählen

Bridge modbus:tcp:tcpBridge "PV Gateway"  [ host="192.168.178.198", port=502, id=1,   reconnectAfterMillis=1500 ] {

    Bridge poller inputPoller "PV Poller" [ start=1000, length=100, refresh=1500, type="input", cacheMillis=100] {
        Thing data Akku_watt "Akku"       [ readStart="1010", readValueType="uint16"]
        Thing data PV_SOC    "SOC"        [ readStart="1014", readValueType="uint16"]
        Thing data von_netz  "von Netz"   [ readStart="1022", readValueType="uint16"]
        Thing data ins_Netz  "ins Netz"   [ readStart="1030", readValueType="uint16"]
    }
    Bridge poller inputPoller2 "PV Poller2" [ start=1, length=100, refresh=1500, type="input", cacheMillis=100] {
        Thing data PV_String1 "PV_String1"       [ readStart="6", readValueType="uint16"]
        Thing data PV_Volt "PV1_Volt"       [ readStart="3", readValueType="uint16"]
    }
}
Gruss mad-mike

openHABian 4.1.1 auf Raspberry Pi 4 Mod. b (8GB) ;)

mad-mike
Beiträge: 403
Registriert: 6. Jan 2021 18:05
Answers: 2

Re: SPH 4600 Growatt Modbus 485 -> openHAB

Beitrag von mad-mike »

Noch mal Ergänzung:

nun mit String 2:

Code: Alles auswählen

Bridge modbus:tcp:tcpBridge "PV Gateway"  [ host="192.168.178.198", port=502, id=1,   reconnectAfterMillis=1500 ] {

    Bridge poller inputPoller "PV Poller" [ start=1000, length=100, refresh=1500, type="input", cacheMillis=100] {
        Thing data Akku_watt "Akku"       [ readStart="1010", readValueType="uint16"]
        Thing data PV_SOC    "SOC"        [ readStart="1014", readValueType="uint16"]
        Thing data von_netz  "von Netz"   [ readStart="1022", readValueType="uint16"]
        Thing data ins_Netz  "ins Netz"   [ readStart="1030", readValueType="uint16"]
    }
    Bridge poller inputPoller2 "PV Poller2" [ start=1, length=100, refresh=1500, type="input", cacheMillis=100] {
        Thing data PV_total "PV_total"      [ readStart="2", readValueType="uint16"]        
        Thing data PV_Volt "PV1_Volt"       [ readStart="3", readValueType="uint16"]
        Thing data PV_String1 "PV_String1"  [ readStart="6", readValueType="uint16"]
        Thing data PV_Volt2 "PV1_Volt2"     [ readStart="7", readValueType="uint16"]
        Thing data PV_String2 "PV_String2"  [ readStart="10", readValueType="uint16"]
        Thing data Akku_Volt "Akku_Volt"    [ readStart="97", readValueType="uint16"]
    }
}
Gruss mad-mike

openHABian 4.1.1 auf Raspberry Pi 4 Mod. b (8GB) ;)

mad-mike
Beiträge: 403
Registriert: 6. Jan 2021 18:05
Answers: 2

Re: SPH 4600 Growatt Modbus 485 -> openHAB

Beitrag von mad-mike »

Fall jemand die Read adresse für den Dry Kontakt kennt, kann ja mal gerne schreiben.
Gruss mad-mike

openHABian 4.1.1 auf Raspberry Pi 4 Mod. b (8GB) ;)

mad-mike
Beiträge: 403
Registriert: 6. Jan 2021 18:05
Answers: 2

Re: SPH 4600 Growatt Modbus 485 -> openHAB

Beitrag von mad-mike »

Moin.

Der dry_contact gibt grundsätzlich die Freigabe zu BWWP (Brauchwasser Wärmepumpe) hat aber die Eigenschaft, sobald einspeisung bei 0 geht der Befehl auf "OFF". Das ist ärgerlich bei Spannungsspitzen, (Wasserkocher oder so)

Drum habe ich versucht das ganze für die BWWP zu optmieren. Meine Bosch BWWP hat leider nur die PV funktion, den Kompressor zu nutzen für überschuss. Und dieser sollte ja nicht wegen einer Spannungsspitze zu takten...

Hier mal ein versuche eine "Smart Grid" Rule zu bauen...

Code: Alles auswählen

// Globale Timer zu Beginn der Datei definieren!
var Timer tbwwp = null
var Timer tdry = null

rule "bwwp laden"
when
    Item PV_Einspeisung changed                                                 // Freigabe BWWP
then

    if(!(PV_Einspeisung.state instanceof Number))                               // gültige Zahl? Falls nicht
        return;                                                                 // Rule abbrechen
    val Number Power = (PV_Einspeisung.state as Number).floatValue              // Messwert als Zahl ohne Einheit
    if(Power < 700) {                                                           // Leistung unter 700
        tbwwp?.cancel                                                           // stoppe Timer, falls vorhanden
        tbwwp = null                                                            // entferne Timer
    }
    else if(Power >= 700)   {                                                   // Leistung über 700
        tdry?.cancel                                                            // stoppe Timer, falls vorhanden
        tdry = null                                                             // entferne Timer
    }
    if(Power < 700 && dry_contact.state != OFF && tdry === null)                // Leistung unter 700 und bwwp an
         tdry = createTimer(now.plusMinutes(30), [|                             // Erstelle Timer (Laufzeit min 30 Minuten)
         dry_contact.sendCommand(OFF)                                           // Beende Heizen
    ])
    if(Power > 1200 && dry_contact.state != ON && tbwwp === null)               // Leistung über 1200 Watt, bwwp aus und Timer läuft nicht
        tbwwp = createTimer(now.plusMinutes(5), [|                              // Erstelle Timer (Ausfühung in 5 Minuten)
            dry_contact.sendCommand(ON)                                         // Schalte Heizung ein
            tbwwp = null
        ])
    logInfo("dry","Leistung = {} BWWP = {}",Power,dry_contact.state)
end
mal schauen ob das so funktioniert...
Gruss mad-mike

openHABian 4.1.1 auf Raspberry Pi 4 Mod. b (8GB) ;)

mad-mike
Beiträge: 403
Registriert: 6. Jan 2021 18:05
Answers: 2

Re: SPH 4600 Growatt Modbus 485 -> openHAB

Beitrag von mad-mike »

Ich merke gerade, das nicht die Minimum Laufzeit 30 Minuten beträgt, sondern die Kontrolle ob Wert zu niedrig...

Die Kontrolle könnte ich ja auf 5 Minuten setzen oder so. Aber wie kann ich ein Timer machen, wenn der dry-contact in, Minimum 30 Minuten Laufzeit erstmal ist...?

Code: Alles auswählen

// Globale Timer zu Beginn der Datei definieren!
var Timer tbwwp = null
var Timer tdry = null
var Timer tmin = null

rule "bwwp laden"
when
    Item PV_Einspeisung changed                                                 // Freigabe BWWP
then

    if(!(PV_Einspeisung.state instanceof Number))                               // gültige Zahl? Falls nicht
        return;                                                                 // Rule abbrechen
    val Number Power = (PV_Einspeisung.state as Number).floatValue              // Messwert als Zahl ohne Einheit
    if(Power < 700) {                                                           // Leistung unter 700
        tbwwp?.cancel                                                           // stoppe Timer, falls vorhanden
        tbwwp = null                                                            // entferne Timer
    }
    else if(Power >= 700)   {                                                   // Leistung über 700
        tdry?.cancel                                                            // stoppe Timer, falls vorhanden
        tdry = null                                                             // entferne Timer
    }
    if(Power < 700 && dry_contact.state != OFF && tdry === null && tmin === null) // Leistung unter 700 und bwwp an
         tdry = createTimer(now.plusMinutes(2), [|                              // Erstelle Timer (kontrolle min 2 Minuten)
         dry_contact.sendCommand(OFF)                                           // Beende Heizen
         sendBroadcastNotification("dry_contact OFF ")                          // Gib Meldung aus
    ])
    if(Power > 1500 && dry_contact.state != ON && tbwwp === null)               // Leistung über 1200 Watt, bwwp aus und Timer läuft nicht
        tbwwp = createTimer(now.plusMinutes(5), [|                              // Erstelle Timer (Ausfühung in 5 Minuten)
            dry_contact.sendCommand(ON)                                         // Schalte Heizung ein
            sendBroadcastNotification("dry_contact ON ")                        // Gib Meldung aus
            tmin?.cancel                                                        // stoppe Timer, falls vorhanden
            tmin = createTimer(now.plusMinutes(30), [|                          // Erstelle Timer (Minimum 30 Minuten)
                tmin = null
            ])
            tbwwp = null
            ])
        
    logInfo("dry","Leistung = {} BWWP = {}",Power,dry_contact.state)
end
so vielleicht??
Gruss mad-mike

openHABian 4.1.1 auf Raspberry Pi 4 Mod. b (8GB) ;)

Antworten