Hey everyone,
it seems to work now like i wanted, hurraay
im giving you all code if somebody is interested. If you have some more suggestions, feel free =)
Motion.rules
import java.util.Hashtable
import org.eclipse.smarthome.model.script.ScriptServiceUtil
val Hashtable<String, Timer> timers = new Hashtable<String, Timer>()
val Hashtable<String, DateTime> last_update_time = new Hashtable<String, DateTime>()
val Hashtable<String, String> last_update_type = new Hashtable<String, String>()
val PAR_DEADTIME_MANUAL_SECONDS = 20
val Log_An = false
rule "Time of Day"
when
System started or
Time cron "0 0 10 * * ? *" or
Time cron "0 0 13 * * ? *" or
Time cron "0 0 16 * * ? *" or
Time cron "0 0 22 * * ? *"
then
val Zeit_morgens = now.withTime(10, 0, 0, 0)
val Zeit_mittags = now.withTime(13, 0, 0, 0)
val Zeit_nachmittags = now.withTime(16, 0, 0, 0)
val Zeit_nachts = now.withTime(22, 0, 0, 0)
var curr_TOD = "UNKNOWN"
switch now {
case now.isAfter(Zeit_morgens) && now.isBefore(Zeit_mittags): curr_TOD = "MORGENS"
case now.isAfter(Zeit_mittags) && now.isBefore(Zeit_nachmittags): curr_TOD = "MITTAGS"
case now.isAfter(Zeit_nachmittags) && now.isBefore(Zeit_nachts): curr_TOD = "NACHMITTAG"
default: curr_TOD = "NACHTS"
}
if(Time_of_Day.state.toString != curr_TOD){
logInfo("TOD", "Transitioning time of day to " + curr_TOD)
Time_of_Day.postUpdate(curr_TOD)
}
end
rule "Motion"
when
Member of gMotion_Sensor_Bewegung changed or
Member of gMotion_Sensor_Lux received update
then
// Raum bestimmen
val raum_name = triggeringItem.name.split("_").get(1)
val light_name = "gMotion_"+raum_name+"_Licht_Helligkeit"
if(Log_An) logWarn("MOTION", raum_name)
val motion_sensor = ScriptServiceUtil.getItemRegistry.getItem("gMotion_"+raum_name+"_Sensor_Bewegung")
//wenn letzter Befehl von Manuell, dann nur wenn letzter Befehl älter als X Sekunden (Da der Sensor bis zu 15 Sekunden lang noch AN senden kann)
//verhindert, dass das Licht nach dem Ausschalten direkt wieder an geht. Wenn Manuell und Sensor ist inaktiv, dann ist auch nichts zu tun.
if(last_update_type.get(raum_name) === null || last_update_type.get(raum_name) == "MANU"){
if(motion_sensor.state ==OFF){
if(Log_An) logWarn("MOTION", "BEDINGUNG Bewegungsmelder aus und letzter Befehl manuell nicht OK")
return;
}
if(last_update_time.get(raum_name) !== null && now.minusSeconds(PAR_DEADTIME_MANUAL_SECONDS).isBefore(last_update_time.get(raum_name))){
if(Log_An) logWarn("MOTION", "BEDINGUNG Totzeit nach manuell aus nicht OK")
return;
}
}
// Parameter
val par_lux_threshold = ScriptServiceUtil.getItemRegistry.getItem("Motion_"+raum_name+"_SP_Lux")
val par_timeout_seconds = ScriptServiceUtil.getItemRegistry.getItem("Motion_"+raum_name+"_SP_Timeout")
val bright_item = ScriptServiceUtil.getItemRegistry.getItem("Motion_"+raum_name+"_"+Time_of_Day.state.toString+"_Helligkeit")
val par_sp_Helligkeit = if(bright_item === null) 0 else bright_item.state as Number
val temp_item = ScriptServiceUtil.getItemRegistry.getItem("Motion_"+raum_name+"_"+Time_of_Day.state.toString+"_Farbtemperatur")
val par_sp_Farbtemperatur = if(temp_item === null) 60 else temp_item.state as Number
val lux_sensor = ScriptServiceUtil.getItemRegistry.getItem("gMotion_"+raum_name+"_Sensor_Lux")
val light_Helligkeit = ScriptServiceUtil.getItemRegistry.getItem(light_name)
// Motion sensor is ON
if(motion_sensor.state == ON){
if(Log_An) logWarn("MOTION", "Sensor Aktiv")
// Cancel the timer if it exists
logWarn("MOTION", raum_name)
if (timers.get(raum_name) !== null){
timers.get(raum_name)?.cancel()
timers.remove(raum_name)
}
// Exit wenn Licht an
if(light_Helligkeit.state as Number >= 1) {
if(Log_An) logWarn("MOTION", "BEDINGUNG Licht an nicht OK")
return;
}
// check for UNDEF first
val cur_lux = if(lux_sensor.state instanceof DecimalType) lux_sensor.state as Number else 1000.0
val SP_lux = if(par_lux_threshold.state instanceof DecimalType) par_lux_threshold.state as Number else 0.0
// Check if the room is already too bright
if(cur_lux > SP_lux) {
if(Log_An) logWarn("MOTION", "BEDINGUNG Helligkeit nicht OK")
return;
}
// Check that the target Helligkeit is high enough
if(par_sp_Helligkeit <= 0.1){
if(Log_An) logWarn("MOTION", "BEDINGUNG Sensor Sollhelligkeit > 0 nicht OK")
return;
}
// Record the update
last_update_time.put(raum_name, now)
last_update_type.put(raum_name, "AUTO")
// Command the light
sendCommand(light_name, par_sp_Helligkeit.toString)
createTimer(now.plusMillis(1000), [ | sendCommand("gMotion_"+raum_name+"_Licht_Farbtemperatur", par_sp_Farbtemperatur.toString)])
//sendCommand("gMotion_"+raum_name+"_Licht_Farbtemperatur", par_sp_Farbtemperatur.toString)
//createTimer(now.plusMillis(1000), [ | sendCommand(light_name, par_sp_Helligkeit.toString)])
//createTimer(now.plusMillis(1500), [ | sendCommand("gMotion_"+raum_name+"_Licht_Farbtemperatur", par_sp_Farbtemperatur.toString)])
//createTimer(now.plusMillis(2000), [ | sendCommand(light_name, par_sp_Helligkeit.toString)])
}
else {
if(Log_An) logWarn("MOTION", "Sensor Inaktiv")
if(timers.get(raum_name) !== null){
if(Log_An) logWarn("MOTION", "BEDINGUNG Timer noch nicht vorhanden nicht OK")
return;
}
var par_timeout = if(par_timeout_seconds.state instanceof DecimalType) (par_timeout_seconds.state as Number).intValue else 30
if(Log_An) logWarn("MOTION", "AKTION AUS TIMER AKTIVIERT")
timers.put(raum_name, createTimer(now.plusSeconds(par_timeout), [ |
last_update_time.put(raum_name, now)
last_update_type.put(raum_name, "AUTO")
sendCommand(light_name, "OFF") // you can send ON/OFF to Dimmer Items
if(Log_An) logWarn("MOTION", "AKTION AUS")
]))
}
end
rule "Motion Cancel" //bei manuellem Eingriff
when
Member of gMotion_Licht_Helligkeit changed
or Member of gMotion_Licht_Farbtemperatur changed
then
//Raum bestimmen
val raum_name = triggeringItem.name.split("_").get(1)
if (Log_An) {logWarn("MOTIONCANCEL", raum_name)}
val new_State = triggeringItem.state as Number
val diff = (new_State) - (previousState as Number)
if(diff < 0.1 && diff>-0.1 && new_State != 0.0) {
if (Log_An) {logWarn("MOTIONCANCEL","BEDINGUNG Mindestaenderung Helligkeit nicht OK")}
return;
}
//nur wenn letzter Befehl von Automatik
if (last_update_type.get(raum_name) === null || last_update_type.get(raum_name).contains("MANU")){
if (Log_An) {logWarn("MOTIONCANCEL","BEDINGUNG letzte Aenderung von Automatik nicht OK")}
return;
}
//nur wenn letzter Befehl älter als 5 Sekunden
if (last_update_time.get(raum_name) !== null && now.minusSeconds(5).isBefore(last_update_time.get(raum_name))) {
if (Log_An) {logWarn("MOTIONCANCEL","BEDINGUNG letzter Befehl alt genug nicht OK")}
return;
}
//Aktion
//Timer stoppen, wenn aktiv
if (timers.get(raum_name) !== null){
timers.get(raum_name)?.cancel()
timers.remove(raum_name)
}
last_update_time.put(raum_name,now)
last_update_type.put(raum_name,"MANU")
if (Log_An) {logWarn("MOTIONCANCEL","MOTION UNTERBROCHEN")}
end
Motion.items
//Global
String Time_of_Day "Tageszeit"
//Overall Groups
Group: Dimmer:AVG gMotion_Licht_Helligkeit
Group: Dimmer:AVG gMotion_Licht_Farbtemperatur
Group: Switch:OR(ON,OFF) gMotion_Sensor_Bewegung
Group: Number:AVG gMotion_Sensor_Lux
//Flur
Group: Dimmer:AVG gMotion_Flur_Licht_Helligkeit (gMotion_Licht_Helligkeit)
Group: Dimmer:AVG gMotion_Flur_Licht_Farbtemperatur (gMotion_Licht_Farbtemperatur)
Group: Switch:OR(ON,OFF) gMotion_Flur_Sensor_Bewegung (gMotion_Sensor_Bewegung)
Group: Number:AVG gMotion_Flur_Sensor_Lux (gMotion_Sensor_Lux)
Number Motion_Flur_SP_Lux "Schwellwert Helligkeit Flur (lx)" (gMotion_SP_Lux)
Number Motion_Flur_SP_Timeout "Timeout Flur (s)" (gMotion_SP_Timeout)
Dimmer Motion_Flur_MORGENS_Helligkeit "Helligkeit morgens"
Dimmer Motion_Flur_MORGENS_Farbtemperatur "Farbtemperatur morgens"
Dimmer Motion_Flur_MITTAGS_Helligkeit "Helligkeit mittags"
Dimmer Motion_Flur_MITTAGS_Farbtemperatur "Farbtemperatur mittags"
Dimmer Motion_Flur_NACHMITTAG_Helligkeit "Helligkeit nachmittags"
Dimmer Motion_Flur_NACHMITTAG_Farbtemperatur "Farbtemperatur nachmittags"
Dimmer Motion_Flur_NACHTS_Helligkeit "Helligkeit nachts"
Dimmer Motion_Flur_NACHTS_Farbtemperatur "Farbtemperatur nachts"
//Küche
Group: Dimmer:AVG gMotion_Kueche_Licht_Helligkeit (gMotion_Licht_Helligkeit)
Group: Dimmer:AVG gMotion_Kueche_Licht_Farbtemperatur (gMotion_Licht_Farbtemperatur)
Group: Switch:OR(ON,OFF) gMotion_Kueche_Sensor_Bewegung (gMotion_Sensor_Bewegung)
Group: Number:AVG gMotion_Kueche_Sensor_Lux (gMotion_Sensor_Lux)
Number Motion_Kueche_SP_Lux "Schwellwert Helligkeit Küche (lx)" (gMotion_SP_Lux)
Number Motion_Kueche_SP_Timeout "Timeout Küche (s)" (gMotion_SP_Timeout)
Dimmer Motion_Kueche_MORGENS_Helligkeit "Helligkeit morgens"
Dimmer Motion_Kueche_MORGENS_Farbtemperatur "Farbtemperatur morgens"
Dimmer Motion_Kueche_MITTAGS_Helligkeit "Helligkeit mittags"
Dimmer Motion_Kueche_MITTAGS_Farbtemperatur "Farbtemperatur mittags"
Dimmer Motion_Kueche_NACHMITTAG_Helligkeit "Helligkeit nachmittags"
Dimmer Motion_Kueche_NACHMITTAG_Farbtemperatur "Farbtemperatur nachmittags"
Dimmer Motion_Kueche_NACHTS_Helligkeit "Helligkeit nachts"
Dimmer Motion_Kueche_NACHTS_Farbtemperatur "Farbtemperatur nachts"
//Bett
Group: Dimmer:AVG gMotion_Bett_Licht_Helligkeit (gMotion_Licht_Helligkeit)
Group: Dimmer:AVG gMotion_Bett_Licht_Farbtemperatur (gMotion_Licht_Farbtemperatur)
Group: Switch:OR(ON,OFF) gMotion_Bett_Sensor_Bewegung (gMotion_Sensor_Bewegung)
Group: Number:AVG gMotion_Bett_Sensor_Lux (gMotion_Sensor_Lux)
Number Motion_Bett_SP_Lux "Schwellwert Helligkeit Bett (lx)" (gMotion_SP_Lux)
Number Motion_Bett_SP_Timeout "Timeout Bett (s)" (gMotion_SP_Timeout)
Dimmer Motion_Bett_MORGENS_Helligkeit "Helligkeit morgens"
Dimmer Motion_Bett_MORGENS_Farbtemperatur "Farbtemperatur morgens"
Dimmer Motion_Bett_MITTAGS_Helligkeit "Helligkeit mittags"
Dimmer Motion_Bett_MITTAGS_Farbtemperatur "Farbtemperatur mittags"
Dimmer Motion_Bett_NACHMITTAG_Helligkeit "Helligkeit nachmittags"
Dimmer Motion_Bett_NACHMITTAG_Farbtemperatur "Farbtemperatur nachmittags"
Dimmer Motion_Bett_NACHTS_Helligkeit "Helligkeit nachts"
Dimmer Motion_Bett_NACHTS_Farbtemperatur "Farbtemperatur nachts"
//Schlafzimmer
Group: Dimmer:AVG gMotion_Schlafzimmer_Licht_Helligkeit (gMotion_Licht_Helligkeit)
Group: Dimmer:AVG gMotion_Schlafzimmer_Licht_Farbtemperatur (gMotion_Licht_Farbtemperatur)
Group: Switch:OR(ON,OFF) gMotion_Schlafzimmer_Sensor_Bewegung (gMotion_Sensor_Bewegung)
Group: Number:AVG gMotion_Schlafzimmer_Sensor_Lux (gMotion_Sensor_Lux)
Group Motion_Schlafzimmer_SP_Helligkeit "Bewegungsmelder Schlafzimmer Helligkeit" (gMotion_SP_Helligkeit)
Group Motion_Schlafzimmer_SP_Farbtemperatur "Bewegungsmelder Schlafzimmer Farbtemperatur" (gMotion_SP_Farbtemperatur)
Number Motion_Schlafzimmer_SP_Lux "Schwellwert Helligkeit Schlafzimmer (lx)" (gMotion_SP_Lux)
Number Motion_Schlafzimmer_SP_Timeout "Timeout Schlafzimmer (s)" (gMotion_SP_Timeout)
Dimmer Motion_Schlafzimmer_MORGENS_Helligkeit "Helligkeit morgens"
Dimmer Motion_Schlafzimmer_MORGENS_Farbtemperatur "Farbtemperatur morgens"
Dimmer Motion_Schlafzimmer_MITTAGS_Helligkeit "Helligkeit mittags"
Dimmer Motion_Schlafzimmer_MITTAGS_Farbtemperatur "Farbtemperatur mittags"
Dimmer Motion_Schlafzimmer_NACHMITTAG_Helligkeit "Helligkeit nachmittags"
Dimmer Motion_Schlafzimmer_NACHMITTAG_Farbtemperatur "Farbtemperatur nachmittags"
Dimmer Motion_Schlafzimmer_NACHTS_Helligkeit "Helligkeit nachts"
Dimmer Motion_Schlafzimmer_NACHTS_Farbtemperatur "Farbtemperatur nachts"
//Dekoration
Group: Dimmer:AVG gMotion_Dekoration_Licht_Helligkeit (gMotion_Licht_Helligkeit)
Group: Dimmer:AVG gMotion_Dekoration_Licht_Farbtemperatur (gMotion_Licht_Farbtemperatur)
Group: Switch:OR(ON,OFF) gMotion_Dekoration_Sensor_Bewegung (gMotion_Sensor_Bewegung)
Group: Number:AVG gMotion_Dekoration_Sensor_Lux (gMotion_Sensor_Lux)
Group Motion_Dekoration_SP_Helligkeit "Bewegungsmelder Dekoration Helligkeit" (gMotion_SP_Helligkeit)
Group Motion_Dekoration_SP_Farbtemperatur "Bewegungsmelder Dekoration Farbtemperatur" (gMotion_SP_Farbtemperatur)
Number Motion_Dekoration_SP_Lux "Schwellwert Helligkeit Dekoration (lx)" (gMotion_SP_Lux)
Number Motion_Dekoration_SP_Timeout "Timeout Dekoration (s)" (gMotion_SP_Timeout)
Dimmer Motion_Dekoration_MORGENS_Helligkeit "Helligkeit morgens"
Dimmer Motion_Dekoration_MORGENS_Farbtemperatur "Farbtemperatur morgens"
Dimmer Motion_Dekoration_MITTAGS_Helligkeit "Helligkeit mittags"
Dimmer Motion_Dekoration_MITTAGS_Farbtemperatur "Farbtemperatur mittags"
Dimmer Motion_Dekoration_NACHMITTAG_Helligkeit "Helligkeit nachmittags"
Dimmer Motion_Dekoration_NACHMITTAG_Farbtemperatur "Farbtemperatur nachmittags"
Dimmer Motion_Dekoration_NACHTS_Helligkeit "Helligkeit nachts"
Dimmer Motion_Dekoration_NACHTS_Farbtemperatur "Farbtemperatur nachts"