Seite 4 von 4

Re: SPH 4600 Growatt Modbus 485 -> openHAB

Verfasst: 24. Feb 2024 12:43
von mad-mike
Moin,

Bin einfach blind und finde den Fehler nicht, entweder Schaltet der Growatt bei jedem changed oder Garnicht....

Code: Alles auswählen

rule "Growatt OFF"

when
    Item SOC changed  
then
//    if(!(newState instanceof Number)) 
//        logWarn("SOC","Ungültige Wert ({})! Abbruch.",newState)
//        return;
        if(day.state  == ON)                                                    // Item daylight  
        return;
        if(Standby_PVnr.state  == 0)                                            // Abfrage Growatt Standby  
        return;
        if(SOC_set.state <= SOC.state)
        return;
        
    Standby_PVnr.sendCommand(0)                                                 // Standby ON
    Status_Akku.postUpdate("Standby")                                           // TAB meldung
    sendBroadcastNotification("Growatt OFF")                                    // Nachricht

end

Also ziel ist:

Wenn der Akku leer ist, den Growatt in den Standby zu schicken. Das soll nur Passieren wenn daylight End ist. Hier habe ich ein Item erstellt, ON und OFF ist...


kann jemand Helfen??

Danke und schönes Wochenende

Re: SPH 4600 Growatt Modbus 485 -> openHAB

Verfasst: 24. Feb 2024 13:13
von udo1toni
Ich denke mal, Du musst hier explizit nach Number casten, deshalb sauber so:

Code: Alles auswählen

rule "Growatt OFF"
when
    Item SOC changed  
then
    if(!(newState instanceof Number)) {
        logWarn("growatt","SOC liefert keine Zahl ({})! Abbruch.", newState)
        return;
    }
    if(!(SOC_set.state instanceof Number)) {
        logWarn("growatt","SOC liefert keine Zahl ({})! Abbruch.", SOC_set.state)
        return;
    }
    val nMin = SOC_set.state as Number

    if(day.state == ON)                                                           // Item daylight  
        return;

    if(Standby_PVnr.state == 0)                                                   // Abfrage Growatt Standby
        return;

    if(nMin <= (newState as Number))
        return;

    Standby_PVnr.sendCommand(0)                                                   // Standby ON
    Status_Akku.postUpdate("Standby")                                             // TAB meldung
    sendBroadcastNotification("Growatt OFF")                                      // Nachricht
end
Die Überprüfung auf Number ist schon wichtig, aber wenn Du dann eine Meldung ausgeben willst, musst Du natürlich den bedingten Block in {} setzen, sonst wird das return; immer ausgeführt...

Re: SPH 4600 Growatt Modbus 485 -> openHAB

Verfasst: 26. Feb 2024 20:32
von mad-mike
Danke dir, Also ich komme einfach nicht dahinter, was ich falsch mache... :cry:

Ich habe dem Vergleich noch ein -1 ergänzt.

So hat der Growatt heute das erste mal abeschalten:

Code: Alles auswählen

rule "Growatt OFF"
when
    Item SOC changed  
then
    if(!(newState instanceof Number)) {
        logWarn("growatt","SOC liefert keine Zahl ({})! Abbruch.", newState)
        return;
    }
    if(!(SOC_set.state instanceof Number)) {
        logWarn("growatt","SOC liefert keine Zahl ({})! Abbruch.", SOC_set.state)
        return;
    }
    val nSOC_set = (SOC_set.state as Number).intValue
    val nSOC = (SOC.state as Number).intValue

    if(day.state == ON)                                                           // Item daylight  
        return;

    if(Standby_PVnr.state == 0)                                                   // Abfrage Growatt Standby
        return;

    if((nSOC - 1) >= nSOC_set)
        return;

    Standby_PVnr.sendCommand(0)                                                   // Standby ON
    Status_Akku.postUpdate("Standby")                                             // TAB meldung
    sendBroadcastNotification("Growatt OFF")                                      // Nachricht
end

Re: SPH 4600 Growatt Modbus 485 -> openHAB

Verfasst: 27. Feb 2024 05:14
von udo1toni
Wir hatten es ja in einem anderen Thread davon.... Du könntest spaßeshalber die Variablen explizit als Number oder Integer definieren.
Standby_PVnr.state könnte man (da es sich ja um einen einzelnen fixen Wert handelt) vielleicht auch als String überprüfen:

Code: Alles auswählen

if(Standby_PVnr.state.toString == "0")
Und natürlich könnte man zur besseren Abgrenzung, welche der Abbruchbedingungen nun dazu geführt hat, dass nicht abgeschaltet wurde, diese ebenfalls mit logs versehen, vielleicht in der Form

Code: Alles auswählen

logDebug("growatt","<Grund für Abbruch>. Abbruch.")
Dann kannst Du, wenn mal alles exakt so läuft wie vorgesehen, einfach das Log Level auf WARN oder INFO erhöhen und die Meldungen kommen nicht mehr, zum Testen setzt Du das Log Level aber auf DEBUG und siehst jedes Detail.