Seite 1 von 6

Anwesenheitssimulation durch zufälliges Schalten der Lichter

Verfasst: 14. Okt 2017 10:01
von Cyrelian
Hallo zusammen,

da es schon ein paar Wochen her ist, dass ich hier was zum besten gegeben habe, wollte ich Euch meine neue "Rule" zur Anwesenheitssimulation nicht vorenthalten.
Mein Ziel war es, die Lichter im Haus wirklich "zufällig" ein bzw. auszuschalten. Anfangs hatte ich das mit fixen Cronjobs gelöst, die aber ja immer zu gleichen Zeit laufen, also sehr vorhersehbar waren. Ich bin dann auf eine Rule von anordvall aus der community.openhab.org gestoßen und hab mich ein paar Abende damit beschäftigt diese zu erweitern, bzw. sie zu optimieren. Rausgekommen ist das, und sie ist auch schon bei einem Arbeitskollegen und mir produktiv im Einsatz :D

Code: Alles auswählen

val String filename = "dev.rules"
var Timer RandomLightsTimer = null
val java.util.concurrent.ThreadLocalRandom random = (new java.util.concurrent.ThreadLocalRandom)

rule "Urlaubsmodus / Licht zufällig einschalten"
	when
		Time cron "0 */12 7-23 * * ?"
    then
		if ((AutoHoliday_Light.state == ON) && (now.isBefore((Sonnenaufgang_Time.state as DateTimeType).calendar.timeInMillis) || now.isAfter((Sonnenuntergang_Time.state as DateTimeType).calendar.timeInMillis))) {
			// Licht zufällig einschalten 50/50
		 	if ((new java.util.Random()).nextInt(2) == 1) { 	 	
		 		// Timer erstellen mit einem zufälligen Wert in Sekunden
				var int randomTime = random.nextInt(360)
				logInfo(filename,"Neuer Wert Zufallstimer: " + randomTime + " Sekunden.")
				RandomLightsTimer = createTimer(now.plusSeconds(randomTime)) [|
					var randomLights = random.nextInt(gWohnungLicht.allMembers.size)
			 		var randomLightCurrentState = gWohnungLicht.allMembers.get(randomLights).state
			 			// ersetzen der Dimmer-Werte von "0" auf "OFF"
			 			if (randomLightCurrentState == 0) {
			 					(randomLightCurrentState = OFF)
			 			}
			 		// alle Dimmer-Werte von 1-100 werden als ON gewertet
			 		var randomLightNewState = if (randomLightCurrentState != OFF) OFF else ON
			 		logInfo(filename, "Schalte Licht " + gWohnungLicht.allMembers.get(randomLights).name + " von " + randomLightCurrentState + " zu " + randomLightNewState)
			 		//sendCommand(gErdgeschossLicht.allMembers.get(randomLights), randomLightNewState)
                    gWohnungLicht.allMembers.get(randomLights).sendCommand(randomLightNewState)
		        ]
			}
}
end
Ich hoffe wie immer, dass hilft dem einen oder anderen von Euch weiter und freue mich schon auf Vorschläge zur Verbesserung/Optimierung :D

CYA
Cyrelian

Re: Anwesenheitssimulation durch zufälliges Schalten der Lichter

Verfasst: 10. Jan 2018 09:15
von Erhard Pech
Moin Cyrelian,
ich finde deine Idee und auch die Ausführung super, dafür vielen Dank.
Eins kann ich allerdings nicht erkennen wie lange werden die Lichter angeschaltet und kann ich die Dauer auch zufällig eingrenzen?
Als Beispiel jede Lampe mindesten 30 Minuten ?
Beste Grüße

Re: Anwesenheitssimulation durch zufälliges Schalten der Lichter

Verfasst: 10. Jan 2018 14:41
von Cyrelian
Hi Erhard,

dank Dir.

Es gibt zwei Parameter die die Zeit "begrenzen".

Code: Alles auswählen

Time cron "0 */12 7-23 * * ?"
alle 12 Minuten zwischen 7-23 Uhr.

Code: Alles auswählen

var int randomTime = random.nextInt(360) 
alle 6 Minuten

Die Dauer ist also immer min. 12Min und variiert zwischen 12Min. und 18Min. D.h. sie ist immer zufällig eingegrenzt.
Du kannst also diese beiden Parameter verändern, um die gewünschte min. und max. Einschaltzeit zu generieren.

CU
Cyrelian

Re: Anwesenheitssimulation durch zufälliges Schalten der Lichter

Verfasst: 18. Jan 2018 08:47
von alkaline
Danke @ Cyrelian für das Script, welches ich auch für meine Zwecke nun im Einsatz habe.

Re: Anwesenheitssimulation durch zufälliges Schalten der Lichter

Verfasst: 7. Jan 2019 13:54
von maxx92
Hallo alle. Ich bekomme einen Fehler: The constructor ThreadLocalRandom() is not visible
Da ich kein Vollblut-Programmierer bin, sagt mir das nicht viel. Hat sich im letzten Jahr ev. hier etwas bei den Grundlagen verändert?
Gruss. Marc

Re: Anwesenheitssimulation durch zufälliges Schalten der Lichter

Verfasst: 10. Jan 2019 18:02
von maxx92
Noch was: Wie werden die Lichter am Schluss ALLE ausgeschaltet sein? Es scheint, als ob da ein paar weiter brennen, bis zum nächsten Mal schalten (am nächsten Tag)? Oder läuft bei mir was falsch?

Re: Anwesenheitssimulation durch zufälliges Schalten der Lichter

Verfasst: 14. Jan 2019 19:54
von maxx92
Öhm. Ist aber nicht mehr so viel los hier?

Re: Anwesenheitssimulation durch zufälliges Schalten der Lichter

Verfasst: 15. Jan 2019 09:29
von seppy
Hi Marc,
Cyrelian ist nicht mehr besonders aktiv. Wo stehst Du denn? Und der Fehler alleine reicht nicht. Ein paar Logzeilen wären hilfreich.
Grüße,
Seppy

Re: Anwesenheitssimulation durch zufälliges Schalten der Lichter

Verfasst: 16. Jan 2019 12:38
von maxx92
Hi Seppy
Danke für Deine Antwort. Die Fehlermeldung kommt im Visual Code Studio. So wie ich das sehe, läuft das Skript schon normal. Ich verstehe nur gerne, warum der Editor das reklamiert.. Was allerdings merkwürdig ist, ist dass die Lichter am Ende nicht sauber ausgeschaltet werden. Es kann also sein, dass über Nacht (oder tagsüber) das eine oder andere vom Skript eingeschaltene Licht brennt. Ich sehe im Code auch nicht, wo der Ausschaltbefehl (nach einem Einschaltbefehl) ist. Müsste da nicht beim Einschalten ein Timer mitgegeben werden oder zumindest ein passender Ausschaltbefehl. So wie bei einer Linksklammer die rechte folgen muss?
Gruss. Marc

Re: Anwesenheitssimulation durch zufälliges Schalten der Lichter

Verfasst: 16. Jan 2019 17:11
von seppy
Hi,
warum der Editor das anmeckert kann ich Dir nicht sagen. Da bin ich zu wenig drin, aber wenn es läuft ... wahrscheinlich kennt VSC die Klasse nicht?!
Zum Ausschalten muss ich mich mal rantasten. Zwingend muss es keinen Auschaltbefehl geben!

Scheinbar hat Cyrelian keinen abschließenden Ausschaltbefehl in dieser Rule vorgesehen, den müsstest Du noch einbauen. Du könntest einfach in einem Durchlauf prüfen ob now.getHourofDay() == 23 und dann gWohnungLicht auf OFF setzen.
Grüße,
Seppy