Das ist kein Wunder.

Du hast keine Klammern gesetzt.
Eine bedingte Verzweigung wirkt exakt auf den nächsten Befehl. Das wäre bei Deinen Rules jeweils der Befehl Thread::sleep(1000) (warum ist der überhaupt eingebaut?)
Außerdem hast Du einen Logikfehler bei der Betrachtung der Grenzwerte. Aber ich fange vielleicht noch weiter vorne an...
Erst mal solltest Du keine zwei Rules verwenden, die identische Trigger nutzen. Stattdessen erledigst Du alles in einer Rule.
.getHour liefert die Stunde einer Digitalanzeige. Schau Dir eine Digitaluhr an, Du wirst feststellen, dass die Stunde die Zahlen 0 bis 23 anzeigt, aber niemals die 24. Eine Abfrage auf getHour < 24 ist also immer wahr und kann somit entfallen. In der zweiten Rule prüfst Du auf getHour > 1. Wir erinnern uns, .getHour liefert die Stunde der Digitalanzeige, > 1 bedeutet also ab 2 Uhr.
Dann die Prüfung von BatV. Zunächst prüfst Du auf >=23, danach auf <=24 & >=23.2 (das ist für alle Werte über 23.2 schon mit der 1. Bedingung erfüllt) und zum Schluss auf <=23.1 (das beinhaltet Werte, die ebenfalls schon mit der 1. Bedingung abgedeckt sind.
Ich vermute, Du wolltest eigentlich auf >=24 testen. Aber Immer darauf achten, dass bei solchen Betrachtungen abgeschlossene und eindeutige Zahlenräume entstehen, also nicht in einer Bedingung auf >=24 und in der nächsten auf <=24 testen, denn dann sind für den Wert 24 beide Bedingungen gültig.
Wenn man die Logik in der Berechnung etwas ändert, kann man die Rule effizienter bauen:
Code: Alles auswählen
rule "Steuerung Einspeisung"
when
Item epvoltBatterie received update
then
val BatV = if(epvoltBatterie.state instanceof Number) (epvoltBatterie.state as Number).floatValue else 0
if(BatV == 0) {
logWarn("epvolt","keine gültige Spannung gemessen: {} Abbruch!",epvoltBatterie.state)
return;
}
var soll = 0
if (BatV >= 23.2) soll = 40
if (BatV >= 24) {
if(now.getHour > 18)
soll = 61
else if(now.getHour < 9 && now.getHour > 0)
soll = 59
}
if((now.getHour > 0 && now.getHour < 9) || (now.getHour>18))
if(SMI260_MaxPowerset.state as Number != soll)
SMI260_MaxPowerset.sendCommand(soll)
end
Die erste Zeile in der Rule sorgt dafür, dass es keine Fehlermeldung gibt, falls das Item keinen gültigen Wert liefert. Die darauffolgenden Zeilen erzeugen dann im Falle eines Falles selbst eine Meldung und beenden die Rule.
Erst danach wird der gesuchte Wert bestimmt. Dabei ist 0 der Default Wert. Ist die Batteriespannung über der ersten Grenze, wird ein Soll von 40 gesetzt. Ist die Batteriespannung über 24, so wird das Soll abhängig von der Uhrzeit auf 61 oder auf 59 gesetzt.
Zum Schluss wird, falls einer der beiden Zeiträume zutrifft der Zustand des Items abgefragt, und falls dieser vom Soll abweicht, wird das Soll gesetzt.
Die Rule verhält sich ähnlich (aber nicht exakt) wie Deine Rules. Sie ändert das Item nur innerhalb der vorgegeben Zeiträume, allerdings tut sie das nur, falls es auch notwendig ist (das ist die Abweichung).
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet