Re: Präsenzsimulation im Urlaub
Verfasst: 8. Jun 2024 17:18
Ja, da fehlt ein Import... Da es nur einmal verwendet wird...
Code: Alles auswählen
// Globale Variablen vor der ersten Rule definieren!
var Timer tRandomLights = null // Handle für Urlaubslicht
val java.util.Random random = new java.util.Random() // Zufall
var Integer iRandom = null
// ab hier kommen die Rules
rule "Präsenz Simulation"
when
Item Urlaub changed or // Schalter umgelegt
Time is midnight or // oder neuer Tag
Time cron "0 45 23 * * ?" or // täglich um 23:45 Uhr
Channel 'astro:sun:local:nauticDawn#event' triggered END // nautischer Sonnenaufgang
then
tRandomLights?.cancel // bestehenden Timer abbrechen
if(Urlaub.state != ON) // Falls kein Urlaub
return; // Ende
Urlaubslichter.members.filter[i | i.getStateAs(OnOffType) != OFF].forEach[Light | Light.sendCommand(OFF)] // alle nicht ausgeschalteten Lichter ausschalten
val dtDawn = (LokaleSonnendaten_NauticDawn_Start.state as DateTimeType).getZonedDateTime // Sonnenaufgang (nautisch)
val dtDusk = (LokaleSonnendaten_NauticDusk_Start.state as DateTimeType).getZonedDateTime // Sonnenuntergang (nautisch)
var nextStart = now // jetzt
if(nextStart.getHour < 5) nextStart = nextStart.with(LocalTime.MIDNIGHT).plusHours(5) // falls vor 5 Uhr, setze 5 Uhr
if(nextStart.isAfter(dtDawn) && nextStart.isBefore(dtDusk)) nextStart = dtDusk // falls nach dtDawn und vor dtDusk, setze dtDusk
if(nextStart.get(java.time.temporal.ChronoField.MINUTE_OF_DAY) > 1424) // falls nach 23:45
return; // heute kein Timer mehr
iRandom = random.nextInt(240) // generiere Zufallswert
tRandomLights = createTimer(nextStart.plusSeconds(iRandom),[| // Timer für nächsten Timerstart
var randomItem = Urlaubslichter.members.get(random.nextInt(Urlaubslichter.members.size)) // suche ein Item aus
randomItem.sendCommand(if(randomItem.getStateAs(OnOffType) != OFF) OFF else ON) // und schalte es um
iRandom = random.nextInt(240) // generiere Zufallswert
tRandomLights.reschedule(now.plusMinutes(5).plusSeconds(iRandom)) // Plane Timer erneut nach mindestens 5 Minuten
])
end