Du hast schon mal einen grundsätzlichen Fehler in Deiner Rule.
Wenn Du in einer Schleife (forEach) Timer anlegst, dann brauchst Du für jeden angelegten Timer eine eigene Variable.
Das heißt, Du musst mit einer Hashmap oder einem Array für die Timer arbeiten - Einschränkung siehe unten.
Dann das hier:
new DateTimeType().zonedDateTime.minusDays(7) vier Mal. Warum?
Abgesehen davon, dass es unnötig kompliziert ist, nutzt man in so einem Fall definitiv eine lokale Konstante oder meinetwegen eine Variable.
Das gleiche gilt für den historicState, der auch mehrfach verwendet wird - pro Item, versteht sich.
Was die Timersache betrifft: Wenn wir tatsächlich von einer Varianz von fünf Sekunden sprechen, lässt Du die Variable einfach weg, der Timer ist ja innerhalb fünf Sekunden eh rum, da braucht es normalerweise keine Kontrolle.
Eventuell reicht es schon, die Variablen unbestimmt zu definieren, um etwas mehr Klarheit zu bekommen.
Code: Alles auswählen
rule "Presence Simulator"
when
Time cron "0 * * * * ?"
then
if(Absence.state != ON) // Hauptschalter aus?
return; // dann Abbruch
logInfo("Presence","START RULE")
val past = now.minusDays(7) // jetzt vor sieben Tagen
gLights_auto.members.filter[ f | f.state != f.historicState(past,"jdbc").state ].forEach[ m |
logInfo("presence","Random Time ist: VORHER")
var randomTime = (new java.util.Random).nextInt(5)
logInfo("presence","Random Time ist: {}",randomTime)
createTimer(now.plusSeconds(randomTime), [ |
val actions = getActions("pushover", "pushover:pushover-account:account")
val oldValue = m.historicState(past,"jdbc").state
m.sendCommand(oldValue.toString)
logInfo("presence","Restore {} to historic state: {}",m.name, oldValue)
actions.sendMessageToDevice("J", "Restore " + m.name + " to historic state: " + oldValue.toString, "Presence Simulation")
])
]
end
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet