ich habe eine Rule für eine Präsenzsimulation übernommen, die in OH2.5 noch funktioniert hat. Leider bringt sie in OH5 einen Fehler und wird nicht gestartet.
Vielleicht hat jemand eine Idee was genau geändert werden muss, da meine Kenntnisse hier nicht ausreichen.
Ich habe in deen .items folgende Gruppen angelegt, und auch entsprechende Lampen damit verbunden.
Code: Alles auswählen
Group pSimH // Präsenzsimulation H
Group pSimV // Präsenzsimulation V
Code: Alles auswählen
import java.util.TimeZone
val java.util.Random rand = new java.util.Random
rule "Praesenzsimulation durchführen"
when
Time cron "0 0/20 17-22 * * ?" // Rule soll alle 20 Minuten aktiv werden im Zeitraum von 17:00 - 22:00 Uhr
or
Channel "astro:sun:minus:set#event" triggered START
then
var Integer schaltintervall = 20 // Sollte mit Cron-Aufruf-Intervall übereinstimmen
var Integer schaltueberlappung = 9 // Zufällige Überlappung, damit nicht alle Lampen gleichzeitig ausgehen (plus zus. 1 Minute)
var DateTime datumSonnenaufgang = new DateTime((Sunrise_Time_15.state as DateTimeType).calendar.timeInMillis)
var DateTime datumSonnenuntergang = new DateTime((Sunset_Time_15.state as DateTimeType).calendar.timeInMillis)
val boolean istDunkel = datumSonnenaufgang.afterNow || datumSonnenuntergang.beforeNow
val Boolean log = true
if (log) logInfo('rules','Präsenzsimulation: Rule gestartet. istDunkel=' + istDunkel.toString() + ' praesenzSimulation=' + praesenzSimulation.state.toString())
if (praesenzSimulation.state == OFF) {
if (log) logInfo('rules','Präsenzsimulation: Präsenzsimulation ausgesetzt - nicht aktiv!')
} else if ((praesenzSimulation.state == ON) && (!istDunkel)) {
if (log) logInfo('rules','Präsenzsimulation: Präsenzsimulation ausgesetzt - aktiv, aber es ist noch nicht dunkel!')
} else { // es ist dunkel und die Simulation wurde aktiviert
if (log) logInfo('rules','Präsenzsimulation: Präsenzsimulation wird ausgeführt')
// Je Präsenzsimulations-Lichtergruppe soll mindestens ein Licht geschalten sein. (pSimH und pSimV)
var pSimHAnzahl = (pSimH.members.size)
var pSimVAnzahl = (pSimV.members.size)
// je Gruppe eine zufallsgenerierte Lampen schalten für Zufallszeit zwischen schaltintervall + schaltüberlappung in Minuten
var Integer schaltzeitH = rand.nextInt(schaltueberlappung) + schaltintervall + 1
var Integer schaltzeitV = rand.nextInt(schaltueberlappung) + schaltintervall + 1
var Integer counterH = 0
var lampeHON = true
var lampeH = 0
var boolean exitFlag = false
// LampeH suchen, welche noch nicht AN ist, maximal 30 Versuche, sonst endlosschleife, wenn alle Lampen an wären
while (lampeHON && !exitFlag) {
lampeH = rand.nextInt(pSimHAnzahl)
lampeHON = (pSimH.members.get(lampeH).state == ON) || (pSimH.members.get(lampeH).state > 0)
if (log) logInfo('rules', 'Präsenzsimulation: Versuch Nr. ' + counterH + ' Ermittelte LampeH (Index) ' + lampeH + '/' + pSimH.members.get(lampeH).name + ' Status lampeHON ' + lampeHON.toString())
counterH = counterH + 1
if (counterH > 30) exitFlag = true
}
if (!exitFlag) {
// LampeH schalten und Timer für Ausschalten setzen
if (log) logInfo('rules', 'Präsenzsimulation: Schalte LampeH an: ' + pSimH.members.get(lampeH).name + ' für ' + schaltzeitH + ' Minuten')
pSimH.members.get(lampeH).sendCommand(ON)
createTimer(now.plusSeconds(schaltzeitH * 60)) [|
pSimH.members.get(lampeH).sendCommand(OFF)
if (log) logInfo('rules', 'Präsenzsimulation: Schalte LampeH aus: ' + pSimH.members.get(lampeH).name + ' nach ' + schaltzeitH + ' Minuten')
]
} else {
logInfo('rules','Präsenzsimulation: Keine freie LampeH gefunden!')
}
// LampeV suchen, welche noch nicht AN ist, maximal 30 Versuche, sonst ergibt sich evtl eine Endlosschleife, wenn alle Lampen an wären
var Integer counterV = 0
var lampeVON = true
var lampeV = 0
exitFlag = false
while (lampeVON && !exitFlag) {
lampeV = rand.nextInt(pSimVAnzahl)
lampeVON = (pSimV.members.get(lampeV).state == ON) || (pSimV.members.get(lampeV).state > 0)
if (log) logInfo('rules', 'Präsenzsimulation: Versuch Nr. ' + counterH + ' Ermittelte LampeV (Index) ' + lampeV + '/' + pSimV.members.get(lampeV).name + ' Status lampeVON ' + lampeVON.toString())
counterV = counterV + 1
if (counterV > 30) exitFlag = true
}
if (!exitFlag) {
// LampeV schalten und Timer für Ausschalten setzen
if (log) logInfo('rules', 'Präsenzsimulation: Schalte LampeV an: ' + pSimV.members.get(lampeV).name + ' für ' + schaltzeitV + ' Minuten')
pSimV.members.get(lampeV).sendCommand(ON)
createTimer(now.plusSeconds(schaltzeitV * 60)) [|
pSimV.members.get(lampeV).sendCommand(OFF)
if (log) logInfo('rules', 'Präsenzsimulation: Schalte LampeV aus: ' + pSimV.members.get(lampeV).name + ' nach ' + schaltzeitV + ' Minuten')
]
} else {
if (log) logInfo('rules','Präsenzsimulation: Keine freie LampeV gefunden!')
}
}
end