Ich hab mich die letzten Tage über mögliche Anwesenheitssimulationen informiert, aber nie das Richtige für mich gefunden. Der Ansatz mit dem Google Kalender hat mir persönlich nicht gefallen, da ich mein Verhalten nicht "öffentlich" aufzeichnen wollte bzw. auch nicht Befehle von Google Kalender empfangen möchte. Zumindest vorerst mal nicht. 
Auch die im Forum und im Wiki gefunden Möglichkeiten haben mich zwar inspiriert aber nicht vollständig überzeugt.
Ich hab mir nun selber eine Rule bzw. Funktion geschrieben die mir verschiedene Szenarien simulieren kann. Ohne Konfig gehts natürlich nicht, aber ich denke mit dem Ansatz bin ich doch flexibler und vor allem ist es schneller konfiguriert als wenn ich nur mit lauter einfachen Cron Jobs arbeiten muss. Da würde ich auf die Zufälligkeit verzichten. Deswegen gibt es bei mir nur grobe Startzeitpunkte.
Ich wollte euch nur bitten mal drüberzu schauen und mir Feedback zu geben. Ev. bin ich ja trotzdem aufm falschen Weg und es gebe eine weit einfachere Möglichkeit.
"triggerSwitch", "light" und "rollerShutter" können z.B. beliebige Items sein.
Ich habs jetzt nur bei mir auf die schnelle mit Hilfe von log outputs getestet. Soweit hat aber alles richtig gestartet bzw. beendet.

Auch die im Forum und im Wiki gefunden Möglichkeiten haben mich zwar inspiriert aber nicht vollständig überzeugt.
Ich hab mir nun selber eine Rule bzw. Funktion geschrieben die mir verschiedene Szenarien simulieren kann. Ohne Konfig gehts natürlich nicht, aber ich denke mit dem Ansatz bin ich doch flexibler und vor allem ist es schneller konfiguriert als wenn ich nur mit lauter einfachen Cron Jobs arbeiten muss. Da würde ich auf die Zufälligkeit verzichten. Deswegen gibt es bei mir nur grobe Startzeitpunkte.
Ich wollte euch nur bitten mal drüberzu schauen und mir Feedback zu geben. Ev. bin ich ja trotzdem aufm falschen Weg und es gebe eine weit einfachere Möglichkeit.
Code:
import org.openhab.model.script.actions.* import org.eclipse.xtext.xbase.lib.* import java.util.ArrayList var ArrayList<Timer> presenceTimers = newArrayList [I]/** * Starts an action to a random time and for a specific duration. * The timers will be stored to e.g. cancel them whenever you want. * * timers: list of all timers started, so they can e.g. be canceled. * Have to be handed over due to limitations of visibility within the function * action: the name of the action which should be triggered * startOffsetRange: is used to generate the random start time * (e.g. 10 means a resulting value between 0 and 10 minutes) * durationRange: is used to generate the random duration range * (e.g. 30 means a resulting value between 0 and 30 minutes) * minimumRange: is used to determine the minimum time (in minutes) for the action * commands: consists of the start and stop commands * due to limitations of the Function (which can only contain up to 6 parameters max) * those commands are combined and uses a delimiter '/' to separate them * */[/I] [B]val Functions$Function6 presenceSimulation[/B] = [ ArrayList<Timer> timers, String action, Integer startOffsetRange, Integer durationRange, Integer minimumDuration, String commands | if(triggerSwitch.state == ON) { var Integer startValue = (Math::random * startOffsetRange).intValue var Integer endValue = startValue + (Math::random * durationRange).intValue + minimumDuration timers.add(createTimer(now.plusMinutes(startValue)) [| sendCommand(action,commands.substringBefore("/")) ]) timers.add(createTimer(now.plusMinutes(endValue)) [| sendCommand(action,commands.substringAfter("/")) ]) } ] [B]rule "Cancel all timers"[/B] when Item triggerSwitch changed then if(triggerSwitch.state == OFF) { presenceTimers.forEach [ timer | timer.cancel ] } end [B]rule "Example 1" [/B] when Time cron "0 0 20 1/1 * ? *" then [I]//light between 20-20:20 for 5-20 minutes[/I] presenceSimulation.apply(presenceTimers, light.name, 20, 15, 5, "ON/OFF") end [B]rule "Example 2" [/B] when Time cron "0 0 22 1/1 * ? *" then [I] //rollershutter between 22-22:30 for 3-25 minutes[/I] presenceSimulation.apply(presenceTimers, rollerShutter.name, 30, 22, 3, "DOWN/UP") end
Ich habs jetzt nur bei mir auf die schnelle mit Hilfe von log outputs getestet. Soweit hat aber alles richtig gestartet bzw. beendet.