Ach, richtig, falsch, das sind doch bürgerliche Kategorien...
Richtig falsch ist erst mal nur die Zuweisung zu PV_Watt, die nur einmal ausgeführt wird, und zwar, wenn die Datei eingelesen wird. (also bei Änderungen an der Datei und beim Systemstart)
Rest: Grundsätzlich kannst Du das auf jeden Fall so machen. Allerdings:
1. Warum nutzt Du ein Item zum Rechnen?
2. Wenn das Item nicht mit einem Channel verknüpft ist, ist es sinnlos, .sendCommand zu nutzen (es sei denn, Du möchtest damit gezielt eine andere Rule triggern, aber auch da gäbe es ja andere Möglichkeiten)
3. Wenn Du innerhalb einer Rule ein Item mit einem Wert beschreibst (hier auch noch indirekt) und direkt anschließend wieder ausliest, ist die Wahrscheinlichkeit relativ hoch, dass Du den alten Wert zu Gesicht bekommst. Besser also so:
Code: Alles auswählen
rule "pv wallbox automatik"
when
Item SolaredgeSE5KDcGeneralDcPower changed // gelieferte Leistung geändert
then
if (goecharger_lademodus.state != ON) // Automatik aus?
return; // dann Abbruch!
var PV_Power = 0 // Variable definieren und vorbelegen
if(newState instanceof Number) // falls gültige Zahl
PV_Power = ((newState as Number)/230).intValue // Strom berechnen
if (PV_Power < 6) { // Falls weniger als 6 Ampere
if(GoEChargerAllowCharging.state != OFF) // Falls Laden aktiv
GoEChargerAllowCharging.sendCommand(OFF) // Laden beenden
} else { // sonst
if(GoEChargerAllowCharging.state != ON) // Falls Laden inaktiv
GoEChargerAllowCharging.sendCommand(ON) // Laden starten
if((GoEChargerMaxCurrent.state as Number) != PV_Power) // Falls Maximalstrom abweicht
GoEChargerMaxCurrent.sendCommand(PV_Power) // und Maximalstrom setzen
}
end
rule "pv wallbox manuell"
when
Item goecharger_lademodus changed to OFF
then
if(GoEChargerAllowCharging.state != ON)
GoEChargerAllowCharging.sendCommand(ON)
if((GoEChargerMaxCurrent.state as Number) != 16)
GoEChargerMaxCurrent.sendCommand(16)
end
Der Trigger alle 10 Sekunden lohnt sich eigentlich nicht, denn die Rule kann ja nur dann etwas anderes herausbekommen, wenn sich der Eingangswert geändert hat.
Der erste Schritt ist, zu prüfen, ob die Rule überhaupt etwas tun sollte. Ist das nicht der Fall, wird die Rule direkt abgebrochen. Das spart Schachtelungstiefe.
Nun wird die aktuelle Leistung geholt. Die implizite Variable steht zur Verfügung, weil die Rule über changed getriggert wurde. Der Name ist kürzer als der Originalname

Nachdem der Wert berechnet wurde, folgt wie gehabt die Entscheidung, was zu tun ist. Allerdings sendet die Rule nur solche Befehle, die auch tatsächlich gebraucht werden. Du möchtest nicht alle paar Sekunden zwei Befehle auf dem Bus haben, die etwas einschalten, was eh schon eingeschaltet ist. Gleiches gilt sinngemäß für die zweite Rule
GoEChargerMaxCurrent sollte am besten über mapDB persistiert werden, mit der Strategy everyChange,restoreOnStartup
So wird sichergestellt, dass GoEChargerMaxCurrent.state immer eine gültige Zahl liefert (wichtig, um NullPointerExceptions zu verhindern).
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet