Gute Morgen liebe Community!
Das Skript oben von Cyrelian geposted läuft zunächst mal eigentlich ganz gut bei mir.
Was mich jetzt ein wenig wundert ist: Ih habe noch Openhab2.2 laufen. Ich lese gerade daß Members erst ab 2.3 eingeführt wurde? Na wie auch immer es läuft trotzdem.
Was mir bei einigen Testläufen auffiel ist: Es werden fast jedesmal alle Lichter angeschalten (Es brennen dann zB. 5 verschiedene Lichter bevor das erste wieder ausgeht) . Kann sein daß ich hier wirklich mehrmal den Jackpot geschossen habe beim Testen. Ich würde aber trotzdem gerne etwas "nachhelfen" und sobald ein Licht an ist, die Wahrscheinlichkeiten etwas verschieben so daß es wahrscheinlicher ist das erste Licht wieder auszuschalten bevor ein weiteres dazugeschalten wird. Ich möchte also nicht ständig alle Lichter gleichzeitig an haben sondern mal hier eins und dann mal dort eins, mal zwei vielleicht.
Ich dachte daran einen Wert zu erhöhen wenn bereits ein licht an ist und den dann zum random wert zu addieren um die Wahrscheinlichkeiten zu Gunsten des Ausschaltens zu erhöhen je mehr Lichter brennen.
if ((new java.util.Random).nextInt(2+Wert) == 1)
um die Wahrscheinlichkeit von 50/50 auf z.B 4:1 zu erhöhen. Dann halt eine Verzweigung if ... in 75% der fälle wird wieder was ausgeschaltet
in 25% der fälle wird ein weiteres Licht angeschaltet
Geht das auch einfacher?
Wie kann ich eigentlich den "members" wert abfragen. Ich bin beim Googlen auf ein paar Beispiele gestossen, die das so in der Art
MyGroup.members.filter[ i | <condition> ]: Return a Set of all the members that meet the provided <condition>
Ich weiß aber nicht so recht wie man damit umgeht.
Hier meine Items zum Testen:
Code: Alles auswählen
Group:Switch:OR(ON, OFF) Hauslichter2 "Alle Hauslichter [(%d)]"
Switch Licht1 (Hauslichter2)
Switch Licht2 (Hauslichter2)
Switch Licht3 (Hauslichter2)
Switch Licht4 (Hauslichter2)
Switch Licht5 (Hauslichter2)
Switch Test_Switch
und hier meine rule:
Code: Alles auswählen
var int Zufallsfaktor = 0 // Wert 0 -5
//===================================
rule "Urlaubsmodus / Licht zufällig einschalten"
//===================================
when
Time cron "*/30 * * * * ?" // alle 30 sek zum Testen
then
if (Test_Switch.state == ON){
var zuf1 = (new java.util.Random).nextInt(2+Zufallsfaktor)
if (zuf1 == 1) { // Only turn a light on/off ocasionally
// Create a timer with a random value
var int randomTime = (new java.util.Random).nextInt(16) // default 16 sek zum Testen
logInfo("RULE","Setting random lights timer to " + randomTime + " seconds.") //Die Dauer ist also immer min. 30sek und variiert zwischen 30 sek und 46 sek
var tRandomLights = createTimer(now.plusSeconds(randomTime)) [|
var randLightIndex = (new java.util.Random).nextInt(Hauslichter2.members.size)
var randLightStateCurrent = Hauslichter2.members.get(randLightIndex).state
var randLightStateNew = if (randLightStateCurrent == ON) OFF else ON
logInfo("RULE","Presence Simulation:Switching light (On Schleife)" + Hauslichter2.members.get(randLightIndex).name + " from " + randLightStateCurrent + " to " + randLightStateNew)
sendCommand(Hauslichter2.members.get(randLightIndex), randLightStateNew)
postUpdate(Hauslichter2.members.get(randLightIndex), randLightStateNew)
Zufallsfaktor = 0
if (Licht1.state == ON)
{ Zufallsfaktor = 1 }
if (Licht2.state == ON)
{ Zufallsfaktor = (Zufallsfaktor + 1) }
if (Licht3.state == ON)
{ Zufallsfaktor = (Zufallsfaktor + 1) }
if (Licht4.state == ON)
{ Zufallsfaktor = (Zufallsfaktor + 1) }
if (Licht5.state == ON)
{ Zufallsfaktor = (Zufallsfaktor + 1) }
logInfo("RULE","On Schleife - Zufallsfaktor = " + Zufallsfaktor)
]
}
else if (zuf1 != 1) { // Only turn a light on/off ocasionally random 0-1, 50-50 chance
// Create a timer with a random value
var int randomTime = (new java.util.Random).nextInt(16) // 360 Sek = 6 Minuten //alle 6 Minuten
logInfo("RULE","Setting random lights timer to " + randomTime + " seconds.") //Die Dauer ist also immer min. 20Min und variiert zwischen 20Min. und 26Min.
var tRandomLights = createTimer(now.plusSeconds(randomTime)) [|
var randLightIndex = (new java.util.Random).nextInt(Hauslichter2.members.size)
var randLightStateCurrent = Hauslichter2.members.get(randLightIndex).state
var randLightStateNew = OFF
if (randLightStateCurrent == ON ) {
logInfo("RULE","Presence Simulation:Switching light (Off Schleife V1)" + Hauslichter2.members.get(randLightIndex).name + " from " + randLightStateCurrent + " to " + randLightStateNew)
sendCommand(Hauslichter2.members.get(randLightIndex), randLightStateNew)
postUpdate(Hauslichter2.members.get(randLightIndex), randLightStateNew)}
else {
var randLightIndex = (new java.util.Random).nextInt(Hauslichter2.members.size)
var randLightStateCurrent = Hauslichter2.members.get(randLightIndex).state
if (randLightStateCurrent == ON ) {
logInfo("RULE","Presence Simulation:Switching light (Off Schleife V2)" + Hauslichter2.members.get(randLightIndex).name + " from " + randLightStateCurrent + " to " + randLightStateNew)
sendCommand(Hauslichter2.members.get(randLightIndex), randLightStateNew)
postUpdate(Hauslichter2.members.get(randLightIndex), randLightStateNew)}
else {
var randLightIndex = (new java.util.Random).nextInt(Hauslichter2.members.size)
var randLightStateCurrent = Hauslichter2.members.get(randLightIndex).state
logInfo("RULE","Presence Simulation:Switching light (Off Schleife V3)" + Hauslichter2.members.get(randLightIndex).name + " from " + randLightStateCurrent + " to " + randLightStateNew)
sendCommand(Hauslichter2.members.get(randLightIndex), randLightStateNew)
postUpdate(Hauslichter2.members.get(randLightIndex), randLightStateNew)}
}
Zufallsfaktor = 0
if (Licht1.state == ON)
{ Zufallsfaktor = 1 }
if (Licht2.state == ON)
{ Zufallsfaktor = (Zufallsfaktor + 1) }
if (Licht3.state == ON)
{ Zufallsfaktor = (Zufallsfaktor + 1) }
if (Licht4.state == ON)
{ Zufallsfaktor = (Zufallsfaktor + 1) }
if (Licht5.state == ON)
{ Zufallsfaktor = (Zufallsfaktor + 1) }
]
}
logInfo("RULE","Off Schleife - Zufallsfaktor = " + Zufallsfaktor)
logInfo("RULE","Random zahl " + (zuf1))
}
end
Ich muß zugeben ich bin nicht sonderlich stolz auf den code. Es funktioniert. ABER es ist sehr umständlich und außerdem passiert manchmal mehrere umläufe einfach gar Nichts. Im zweiten Teil habe ich mehrere if -Schleifen verschachtelt. Die rule hat also 3 versuche ,eins der lichter auszuschalten.
problem war mit dem ursprünglichen code nämlich, es wurde sehr oft ein licht ausgeschalten, das bereits aus war.
Aber auch mitd den drei Versuchen ist es nicht sicher, eins von den angeschalteten Lichtern zu treffen. Sehr dilletantisch ich gebs zu.
Wie kann man es besser machen?