Seite 1 von 1

#1 Anwesenheitssimulation

Verfasst: So 24. Apr 2016, 08:07
von BBL
Hallo,

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