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

Benutzeravatar
udo1toni
Beiträge: 13986
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: SPH 4600 Growatt Modbus 485 -> openHAB

Beitrag von udo1toni »

Was soll denn das genaue Verhalten sein?

Aktuell sieht es so aus, nach Variante 1: Die Rule wird getriggert, sobald sich die gemessene Einspeisung ändert.
Ist die Einspeisung unter 700 so wird ein Timer tbwwp gestoppt und entfernt, falls vorhanden.
Ist die Einspeisung über oder gleich 700, so wird ein Timer tdry gestoppt und entfernt.
ist anschließend die Leistung kleiner als 700 und das Item dry_contact nicht OFF und Timer tdry ist null, so wird der Timer tdry erzeugt, der nach 30 Minuten dry_contakt auf OFF setzt.
Ist anschließend die Leistung über 1200 und dry_contact nicht ON und der Timer tbwwp ist null, so wird der Timer angelegt, der nach fünf Minuten dry_contact auf ON schaltet.
Zusammenfassend: ist die Einspeisung ohne Unterbrechung mindestens 30 Minuten unter 700, so wird dry_contact auf OFF gesetzt.
Ist die Einspeisung kurzzeitig über 1200 und fällt dann mindestens fünf Minuten nicht unter 700, so wird dry_contact auf ON gesetzt.

Variante 2 knallt, weil da Klammerungen nicht korrekt sind.

Ich nehme an, Du möchtest, dass die Brauchwasser Wärmepumpe nach dem Einschalten mindestens 30 Minuten durch läuft, nach diesen 30 Minuten aber nach zwei Minuten abschaltet, wenn die Leistung unter 700 fällt und in den zwei Minuten auch nicht mehr über die 700 geht.

Mein Gegenangebot :) :

Code: Alles auswählen

// Globale Variablen zu Beginn der Datei definieren!
var Timer   tBwwp = null
var Integer iBwwp = 0                                                                             // 0 = neutral, 1 = stoppen, 2 = starten

rule "bwwp laden"
when
    Item PV_Einspeisung changed                                                                   // Freigabe BWWP
then
    if(!(newState instanceof Number))                                                             // aktuell keine Zahl?
        return;
    val nCur = (newState as Number).intValue                                                      // aktueller Wert, Integer soll reichen

    if(nCur < 700 && iBwwp != 1) {                                                                // Stoppbedingung und Timer nicht in Stopp Modus
        logInfo("bwwp","Stoppbedingung erkannt! Leistung = {}",nCur)
        iBwwp = 1                                                                                 // Modus auf Stopp
        tBwwp?.cancel                                                                             // falls Timer vorhanden, cancel
        tBwwp = createTimer(now.plusMinutes(1), [|                                                // Timer neu anlegen und nach einer Sekunde starten
            if(dry_contact.state != OFF) {                                                        // falls dry_contact nicht OFF
                if(!dry_contact.changedSince(now.minusMinutes(30))) {                             // ist letzte Änderung mehr als 309 Minuten her?
                    logInfo("bwwp","Stopp erkannt, Pumpe läuft mindestens 30 Minuten! Stoppe")
                    dry_contact.sendCommand(OFF)                                                  // dann OFF-Command senden
                } else {                                                                           // ansonsten
                    logInfo("bwwp","Stopp erkannt, Pumpe läuft weniger als 30 Minuten! Warte...")
                    tBwwp.reschedule(now.plusMinutes(1))                                          // timer in einer Minute wieder ausführen
                }
            }
        ])
    }
    if(nCur > 1200 && iBwwp != 2) {                                                               // Startbedingung und Timer nicht in Start Modus
        logInfo("bwwp","Startbedingung erkannt! Leistung = {}",nCur)
        iBwwp = 2                                                                                 // Modus auf Start
        tBwwp?.cancel                                                                             // falls Timer vorhanden, cancel
        tBwwp = createTimer(now.plusMinutes(5), [|                                                // in 5 Minuten
            if(dry_contact.state != ON) {                                                         // falls nicht ON
                logInfo("bwwp","Starte Pumpe")
                dry_contact.sendCommand(ON)                                                       // einschalten
            }
        ])
    }
    if(nCur >= 700 && iBwwp == 1) {                                                               // falls Stopp Modus aktiv und über 700
        logInfo("bwwp","Abbruch Stoppbedingung erkannt! Leistung = {}",nCur)
        iBwwp = 0                                                                                 // Modus auf nix
        tBwwp?.cancel                                                                             // falls Timer vorhanden, cancel
    }
end
Die Rule kommt mit einem Timer aus. Wann immer möglich, versuche ich verschachtelte Timer oder komplexe Abhängigkeiten zwischen Timern zu verhindern. Die Kehrseite: ich muss mir merken, zu was der Timer gerade dient, das ist aber mit einer Integer Variable erledigt.
Nach Prüfung auf Korrektheit des Wertes und Überführung in eine lokale Konstante laufen die Prüfungen ab:
  • Liegt der Wert unter 700 aber der Timer Modus ist nicht 1, so wird der Timer Modus auf 1 gesetzt und ein eventuell laufender Timer gecancelt. Anschließend wird der Stopp Timer angelegt und nach einer Minute ausgeführt.
    Innerhalb des Timers wird nun geprüft, ob dry_contact ungleich OFF ist. Ist das der Fall, wird geprüft, ob der Schaltzustand sich in den letzten 30 Minuten geändert hat. Ist das nicht der Fall, so wird dry_contact auf OFF gesetzt. Ansonsten wird der Timer erneut in einer Minute ausgeführt.
  • Liegt der Wert hingegen über 1200 und der Modus ist nicht 2, so wird der Modus auf 2 geändert und ein eventuell laufender Timer gestoppt. Danach wird ein Timer in 5 Minuten angelegt, der schließlich bei Bedarf dry_contact auf ON bringt.
  • Liegt der Wert über 700 und der Modus ist 1, so wird der Timer gestoppt und der Modus auf neutral gesetzt.
Die Parameter habe ich leicht anders gewählt, aber die Idee sollte klar sein. Ein Problem sehe ich noch, das ist die fehlende Hysterese beim Abschalten. wenn also die Leistung ständig um die 700 schwankt, mal kurz drunter und mal kurz auf 700 ist, dann wird der Abschalttimer niemals greifen. Letztlich können die Schwankungen der PV binnen Sekundenbruchteilen von 0 % auf 100 % und genauso wieder zurück wechseln, das ist ja einer der Gründe für die Grabenkämpfe bei den EE. Ich würde also die Schwelle für das Stoppen des Abschalttimers etwas höher setzen, meinetwegen auf 800, einfach um dort etwas Ruhe rein zu bringen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

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,
Ich habe diese Rule aus mehreren zusammengesetzt. Das man die Timer mehrfach benutzen kann, habe ich so noch nicht gelesen im Forum. Werde ich aber für die Zukunft bestimmt an anderer Stelle verwenden.

Zum testen der Rule benutze ich einen Slider um die Leistung zu simulieren, und der Schaltausgang, ist noch nicht mit der BWWP verbunden.
Im 2ten test habe ich ich dann den Slider gegen das korrete item gewechselt, und feedback per :

Code: Alles auswählen

         sendBroadcastNotification("dry_contact OFF ")                          // Gib Meldung aus
abzeigen lassen....
Weil das heisst es ja auch einfach mal die Zeit der Timer abwarten...

Variante 2 knallt, weil da Klammerungen nicht korrekt sind.
Das habe ich beim Testen bemerkt. Habe es geändert. Grundsätzlich ist das Verhalten schon nicht so verkehrt, wobei eine Taktrate zum ""Restart"" existiert.

Da ich weiterhin Das Taktverhalten vom Wechselrichter beobachtet habe, finde ich meine Rule Schon besser als die Vom Wechselrichter.

Aber ich möchte natürlich deine Rule versuchen
Was soll denn das genaue Verhalten sein?
Ich nehme an, Du möchtest, dass die Brauchwasser Wärmepumpe nach dem Einschalten mindestens 30 Minuten durch läuft, nach diesen 30 Minuten aber nach zwei Minuten abschaltet, wenn die Leistung unter 700 fällt und in den zwei Minuten auch nicht mehr über die 700 geht.
Das hast du Exakt auf den Punkt getroffen. Natürlich muss ich die Timer noch etwas optimieren, da ich noch keine großen Erfahrungen habe mit meiner PV anlage.

Ich habe deine Rule mal eingefügt, jedoch meckert OH wegen klammern.

Code: Alles auswählen

2023-07-15 15:02:52.989 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'bwwp.rules'

2023-07-15 15:02:53.073 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'bwwp.rules' has errors, therefore ignoring it: [13,5]: missing ')' at 'if'

[22,17]: missing '}' at 'else'

[25,13]: extraneous input '}' expecting ']'

Kannst du Helfen? Hatte schon mal klammern bei den Infos falsch gesetzt, und dann verkehrtes Verhalten erzeugt.


Danke und Gruss mad-mike
Gruss mad-mike

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

Benutzeravatar
udo1toni
Beiträge: 13986
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: SPH 4600 Growatt Modbus 485 -> openHAB

Beitrag von udo1toni »

Ja, das kommt davon, wenn man noch log-Befehlen nachrüstet...

Ich hab's oben geändert...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

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,

Danke dir.

Er OH jammerte noch wegen einer Fehlenden klammer in zeile 13 -5

Habe dort nun ein "" ) "" in die Zeile 12 eingefügt.

Nun heißt es abwarten, Log zeigt jedenfalls an, das die Rule arbeitet.

Danke dafür. ;)
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 »

Kurz Feedback:

Die beiden Rules (deine mit einem Timer und meine mit 3 Timern) laufen fast synchron. Zumindest in der aktuellen Test Phase.

Ich werde mich jetzt aber an deiner Rule Weiter versuchen:

Eventuell macht es ja Sinn, noch die Leistung vom Dach mit einzubeziehen. -> um ein voreiliges abschalten zu unterbinden.
Gruss mad-mike

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

Benutzeravatar
udo1toni
Beiträge: 13986
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: SPH 4600 Growatt Modbus 485 -> openHAB

Beitrag von udo1toni »

mad-mike hat geschrieben: 16. Jul 2023 10:50 Moin,

Danke dir.

Er OH jammerte noch wegen einer Fehlenden klammer in zeile 13 -5

Habe dort nun ein "" ) "" in die Zeile 12 eingefügt.

Nun heißt es abwarten, Log zeigt jedenfalls an, das die Rule arbeitet.

Danke dafür. ;)
Heidernei...

Code: Alles auswählen

val nCur = ((newState as Number).intValue 
           ^ zu viel
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

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

So ganz zufrieden bin ich noch nicht mit der Auswertung . Ich glaube, das ich dort ein anderen Wert zu Hilfe nehmen muss.

Ich habe mich mal versucht Item´s zu erstellen. Ob das alles so korrekt und sinnvoll umgesetzt ist, Keine Ahnung :mrgreen:. werde es weiter anpassen... ;)

Edit:
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 habe mich mal etwas weiter versucht. ;)

Things:

Code: Alles auswählen

Bridge modbus:tcp:tcpBridge "PV Gateway"  [ host="192.168.178.198", port=502, id=1,   reconnectAfterMillis=1500 ] {
    Bridge poller inputPoller2 "PV Poller2" [ start=0, length=100, refresh=1500, type="input", cacheMillis=100] {

        Thing data PV_total "PV_total"       [ readStart="2", readValueType="uint16", readTransform="JS(komma.js)"]      
        Thing data PV1_Volt "PV1_Volt"       [ readStart="3", readValueType="uint16", readTransform="JS(komma.js)"]
        Thing data PV_String1 "PV_String1"   [ readStart="6", readValueType="uint16", readTransform="JS(komma.js)"]
        Thing data PV2_Volt "PV2_Volt"       [ readStart="7", readValueType="uint16", readTransform="JS(komma.js)"]
        Thing data PV_String2 "PV_String2"   [ readStart="10", readValueType="uint16", readTransform="JS(komma.js)"]
        Thing data WR_out_AC "WR_out_AC"     [ readStart="36", readValueType="uint16", readTransform="JS(komma.js)"]
        Thing data Akku_Volt "Akku_Volt"     [ readStart="97", readValueType="uint16", readTransform="JS(komma.js)"]
       
    }
    Bridge poller inputPoller "PV Poller"                 [ start=1000, length=100, refresh=1500, type="input", cacheMillis=100] {
        Thing data Akku_watt "Akku"                       [ readStart="1010", readValueType="uint16", readTransform="JS(komma.js)"]
        Thing data Akku_load "Akku_load"                  [ readStart="1012", readValueType="uint16", readTransform="JS(komma.js)"]
        Thing data PV_SOC    "SOC"                        [ readStart="1014", readValueType="uint16"]
        Thing data von_netz  "von Netz"                   [ readStart="1022", readValueType="uint16", readTransform="JS(komma.js)"]
        Thing data ins_netz  "ins Netz"                   [ readStart="1030", readValueType="uint16", readTransform="JS(komma.js)"]
        Thing data E_to_user "E_to_user_tot"              [ readStart="1045", readValueType="uint16", readTransform="JS(komma.js)"]
        Thing data E_to_user_tot "E_to_user_tot"          [ readStart="1047", readValueType="uint16", readTransform="JS(komma.js)"]
        Thing data E_to_grid "E_to_grid"                  [ readStart="1049", readValueType="uint16", readTransform="JS(komma.js)"]
        Thing data E_to_grid_tot "E_to_grid_tot"          [ readStart="1051", readValueType="uint16", readTransform="JS(komma.js)"]
        Thing data E_discharge "E_discharge"              [ readStart="1053", readValueType="uint16", readTransform="JS(komma.js)"]
        Thing data E_discharge_tot " E_discharge_tot"     [ readStart="1055", readValueType="uint16", readTransform="JS(komma.js)"]
        Thing data E_charge "E_charge"                    [ readStart="1057", readValueType="uint16", readTransform="JS(komma.js)"]
        Thing data E_charge_tot " E_charge_tot"           [ readStart="1059", readValueType="uint16", readTransform="JS(komma.js)"]
        Thing data E_local_load "E_local_load"            [ readStart="1061", readValueType="uint16", readTransform="JS(komma.js)"]
        Thing data E_local_load_tot " E_loacl_load_tot"   [ readStart="1063", readValueType="uint16", readTransform="JS(komma.js)"]  
    }
}

ITEM:

Code: Alles auswählen

// Growatt SPH

// Poller 1
Number Akku_watt "Akku Watt [%.1f W]" <flow> (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller:Akku_watt:number"}
Number SOC "Akku SOC [%d %%]" <batterylevel> (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller:PV_SOC:number"}
Number Netz_Bezug "Netz Bezug [%.1f W]" <returnpipe> (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller:von_netz:number"}
Number Netz_Einspeisung "Netz Einspeisung [%.1f W]" <flowpipe> (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller:ins_netz:number"}
Number Akku_laden "Akku_laden [%.1f W]" <energy> (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller:Akku_load:number"}

Number E_to_user "Ohne PV [%.1f kWh]" (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller:E_to_user:number"}
Number E_to_user_tot "Ohne PV ges. [%.1f kWh]" (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller:E_to_user_tot:number"}
Number E_to_grid "Einspeisen [%.1f kWh]" (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller:E_to_grid:number"}
Number E_to_grid_tot "Einspeisen ges. [%.1f kWh]" (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller:E_to_grid_tot:number"}
Number E_discharge "Aus dem Akku [%.1f kWh]" (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller:E_discharge:number"}
Number E_discharge_tot "Aus dem Akku ges. [%.1f kWh]" (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller:E_discharge_tot:number"}
Number E_charge "In den Akku [%.1f kWh]" (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller:E_charge:number"}
Number E_charge_tot "In den Akku ges. [%.1f kWh]" (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller:E_charge_tot:number"}
Number E_local_load "Stromverbrauch [%.1f kWh]" (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller:E_local_load:number"}
Number E_local_load_tot "Stromverbrauch ges. [%.1f kWh]" (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller:E_local_load_tot:number"}

// Poller 2
Number Akku_Volt "Akku Volt [%.1f V]" <energy> (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller2:Akku_Volt:number"}
Number PV_total "PV total [%.1f W]" <solarplant> (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller2:PV_total:number"}
Number PV_String1 "String 1 [%.1f W]" <solarplant> (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller2:PV_String1:number"}
Number PV_String2 "String 2 [%.1f W]" <solarplant> (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller2:PV_String2:number"}
Number PV1_Volt "PV1 Volt [%.1f V]" <energy> (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller2:PV1_Volt:number"}
Number PV2_Volt "PV2 Volt [%.1f V]" <energy> (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller2:PV2_Volt:number"}
Number WR_out_AC "WR_out_AC [%.1f W]" <energy> (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller2:WR_out_AC:number"}
und meine erste Sitemap: :D

Code: Alles auswählen

sitemap growatt label="Growatt SPH 4600"
{
	Frame label="PV Anlage" {
		Text  item=PV_total label="vom Dach" { 
        Chart label="String 1" item=PV_String1 period=12h
        Text label="String1" item=PV_String1
        Text label="Volt String1" item=PV1_Volt
        Chart label="String 2" item=PV_String2 period=12h
        Text label="String 2" item=PV_String2
        Text label="Volt String 2" item=PV2_Volt
	}
	Text  item=SOC label="Akku Kapazität" {
        Text  item=Akku_Volt
        
        Chart item=SOC label="Akku" period=4h
        Text  item=SOC label="Akku ladezustand"
        Chart item=Akku_watt label="Akku Watt" period=4h
        Text item=Akku_watt label="Akkuwatt"
	}
        Text  item=Netz_Einspeisung {
                Chart item=Netz_Einspeisung label="Einspeisung" period=12h
                Text item=Netz_Einspeisung label="Einspeisung "
    }
        Text  item=Akku_watt label="Akku Entladeleistung" {
		        Chart item=Akku_watt period=12h
                Text item=Akku_watt
    }
		Text  item=Netz_Bezug {
		        Chart item=Netz_Bezug label="Haus" period=12h
                Text item=Netz_Bezug label="Bezug"
    }
		Text item=WR_out_AC label="Wechselrichter Ausgang" {
		        Chart item=WR_out_AC period=12h
                Text item=WR_out_AC
    }
    	Text item=Akku_laden label="Akku ladeleistung" {
		        Chart item=Akku_laden period=12h
                Text item=Akku_laden

    }
}
Frame label="Energiewerte" {
		Text  item=E_to_user
		Text  item=E_to_user_tot

        Text  item=E_to_grid
		Text  item=E_to_grid_tot
		
		Text  item=E_discharge
		Text  item=E_discharge_tot

        Text  item=E_charge
		Text  item=E_charge_tot
		
		Text  item=E_local_load
		Text  item=E_local_load_tot
		}
}


Mir fehlen noch einige werte und zustände, welche ich nur mühselig rausbekomme, weil die Modbuslisten sind irgendwie nicht 1zu1 übertragbar.
Weiter, ich bin mir auch nicht sicher ob ich alle Namen korrekt vergeben habe.... :!:


Was mir auffällt:
Die Liste in der UI THINGS wird länger und länger, kann man die Poller 1 und Poller 2 eventuell in eine art Ordner packen?? :?:
Gruss mad-mike

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

Benutzeravatar
udo1toni
Beiträge: 13986
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: SPH 4600 Growatt Modbus 485 -> openHAB

Beitrag von udo1toni »

mad-mike hat geschrieben: 22. Jul 2023 21:20 Die Liste in der UI THINGS wird länger und länger, kann man die Poller 1 und Poller 2 eventuell in eine art Ordner packen?
Kurze Antwort: Nein.

Um die Übersicht zu behalten, kannst Du allenfalls im Suchfeld die ID der Bridge eingeben.

Das Problem ist, das Design des Modbus Bindings ist kaputt.
Was als Thing definiert wird, ist eigentlich ein Channel, was als Poller Bridge definiert wird, ist eigentlich ein Teil eines Things, man könnte es aber meinetwegen als Thing betrachten.
Und in der übergeordneten Bridge ist die ID definiert, aber innerhalb eines ModBusses können zeitgleich mehrere IDs existieren und auch konkurrierend angesprochen werden - nur halt nicht über openHAB, weil man dort nicht mehrere übergeordnete Bridges auf die selbe IP schauen lassen kann.

Es wäre in dem Zusammenhang interessant, was passiert, wenn man im LAN Router verschiedene Aliase auf die selbe IP einrichtet und so dem Modbus Binding vorgaukelt, es handele sich um unterschiedliche IPs... Ich habe hier nur ein einziges Gerät mit Modbus (und das spreche ich nicht mal über Modbus an), ich kann das also nicht testen...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

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.

ICh habe versucht auf openHAB auf 4.0 zu insallieren.
Dazu openhabian auf eine Karte gespeichert und den Pi gestartet.

das letzte Backup eingespielt.

und kommt in zusammenhang mit dem Modbus Thing:

Code: Alles auswählen

2023-07-26 16:53:08.693 [WARN ] [s.internal.SingleValueTransformation] - couldn't transform response because transformationService of type 'JS' is unavailable
Hast du eine Idee??
Gruss mad-mike

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

Antworten