ich habe für mein Haus eine Anwesenheitssimulation geschrieben, die ich gerne teilen möchte. Vielleicht hilft dem einen oder anderen dieses Beispiel bei einer ähnlichen Aufgabenstellung.
Im Vorfeld habe ich alle Items von Lampen, die ich simulieren möchte, zu einer Gruppe zusammengefasst.
Mit Rolläden kann man das genauso machen, in meinem Fall ging es aber nur um 3 Stück, die steuere ich einzeln an.
Hier ist das Regelwerk dazu, inline kommentiert:
Code: Alles auswählen
import org.openhab.core.library.types.*
import org.openhab.model.script.actions.Timer
// Regeln fuer die Anwesenheitssimulation
var int Presence_MinTime = 120 // Mindestleuchtdauer in Sek.
var int Presence_MaxTime = 1200 // Maximalleuchtdauer in Sek.
// Schalte die Lichter der Gruppe gPS zwischen 6 und 23 Uhr zufaellig
rule LightsPresenceSimulation
when
Time cron "0 */10 6-22 * * ?"
then
// nur, wenn es draussen dunkel ist
var int lux = Integer::parseInt(Lux_Outside.state.toString)
if ((Presence.state == ON) && (lux < 20)) {
// nur in 50% der Faelle
if ((new java.util.Random).nextInt(2) == 1) {
// waehle eine Dauer
var int randomTime = (new java.util.Random).nextInt(Presence_MaxTime - Presence_MinTime) + Presence_MinTime
// suche eine Lampe aus der Gruppe aus
var int randLightIndex = (new java.util.Random).nextInt(gPS.members.size)
logInfo("org.openhab","Switching light ON for " + randomTime + "s: " + gPS.members.get(randLightIndex).name
sendCommand(gPS.members.get(randLightIndex), ON)
// Timer zum wieder ausschalten
createTimer(now.plusSeconds(randomTime)) [|
logInfo("org.openhab","Switching light OFF: " + gPS.members.get(randLightIndex).name)
sendCommand(gPS.members.get(randLightIndex), OFF)
]
}
}
end
// Fahre die Rolladen im OG abends zu unterschiedlichen Zeiten nach 20 Uhr runter
rule Presence_RS_OG_Down
when
Time cron "0 0 20 * * ?"
then
if (Presence.state == ON) {
// KiZi: in den naechsten 30min runter
createTimer(now.plusMinutes( (new java.util.Random).nextInt(30) )) [|
sendCommand(RS_OG_KZ, DOWN)
]
// SchlaZi: in den naechsten 90..120min runter
createTimer(now.plusMinutes(90 + (new java.util.Random).nextInt(30) )) [|
sendCommand(RS_OG_SZL, DOWN)
sendCommand(RS_OG_SZR, DOWN)
]
}
end
// Fahre die Rolladen im OG morgens zu unterschiedlichen Zeiten ab 7 Uhr hoch
rule Presence_RS_OG_UP
when
Time cron "0 0 7 * * ?"
then
if (Presence.state == ON) {
// KiZi: in den naechsten 30min hoch
createTimer(now.plusMinutes( (new java.util.Random).nextInt(30) )) [|
sendCommand(RS_OG_KZ, UP)
]
// SchlaZi: in den naechsten 60min hoch
createTimer(now.plusMinutes( (new java.util.Random).nextInt(60) )) [|
sendCommand(RS_OG_SZL, UP)
sendCommand(RS_OG_SZR, UP)
]
}
end