Hi,
Got a strange situation going on with the Hue bulbs.
I have a rule to switch them all on when it gets dark, all goes well exept , every now and then one of the lights switches back to a brightness level of ‘1’ seconds after it has been set to e.g. ‘30’. I never set a value ‘1’ anywhere in my rules.
I’am running the latest stable versiob of openhabian:
-
openhab2 is already the newest version (2.4.0-1).
2019-03-16 08:28:45.440 [vent.ItemStateChangedEvent] - Woonkamer_Lamp_Kastje changed from 0 to 30
:
:
40
2019-03-16 08:28:51.610 [vent.ItemStateChangedEvent] - Woonkamer_Lamp_Kastje changed from 30 to 1
I am logging also from the rule and the it really sets only once the ‘Woonkamer_Lamp_Kastje’ to 30, not 1
2019-03-16 08:28:45.366 [WARN ] [se.smarthome.model.script.lightmode2] - devname:Woonkamer_Lamp_Kastje
2019-03-16 08:28:45.369 [WARN ] [se.smarthome.model.script.lightmode2] - devstate:0
2019-03-16 08:28:45.393 [WARN ] [se.smarthome.model.script.lightmode2] - chkdevname:
2019-03-16 08:28:45.400 [WARN ] [se.smarthome.model.script.lightmode2] - level=30
here are the rules:
// constants
val Number threshold_indoor_on = 300
val Number threshold_indoor_off = 400
val Number threshold_outdoor_on = 25
val Number threshold_outdoor_off = 50rule “autolights”
when
Time cron “0/10 * * ? * * *” // every 10 sec
then
//logWarn(“autolights”, “rule started”)//var Number lvl = TestLevel.state as Number //var Number lvl_prev = TestPrevLevel.state as Number var Number lvl = Serre_lightlevel.state as Number var Number lvl_prev = 0 // first start 'Serre_lightlevel_Prev' will have NULL value if (Serre_lightlevel_Prev.state == NULL ){ lvl_prev = lvl } else{ lvl_prev = Serre_lightlevel_Prev.state as Number } //logWarn("autolights", "lvl="+lvl.toString) //logWarn("autolights", "lvl_prev="+lvl_prev.toString) //indoor if (lvl < threshold_indoor_on && lvl_prev >= threshold_indoor_on){ logWarn("autolights", "lvl="+lvl.toString) logWarn("autolights", "lvl_prev="+lvl_prev.toString) logWarn("autolights", "Turn on lights in house") LightMode.sendCommand(1) } if (lvl > threshold_indoor_off && lvl_prev <= threshold_indoor_off){ logWarn("autolights", "lvl="+lvl.toString) logWarn("autolights", "lvl_prev="+lvl_prev.toString) logWarn("autolights", "Turn off lights in house") LightMode.sendCommand(0) } //outdoor if (lvl < threshold_outdoor_on && lvl_prev >= threshold_outdoor_on){ logWarn("autolights", "Turn on lights in garden") GTuinLights.members.forEach [ item | item.sendCommand(ON)] } if (lvl > threshold_outdoor_off && lvl_prev <= threshold_outdoor_off){ logWarn("autolights", "Turn off lights in garden") GTuinLights.members.forEach [ item | item.sendCommand(OFF)] } //keuken val state = Keuken_Beweging_Switch_alarm_motion.state if (state == ON && lvl < threshold_indoor_on && lvl_prev >= threshold_indoor_on){ GKeukenLights.members.forEach [ item | item.sendCommand(ON)] } Serre_lightlevel_Prev.sendCommand(lvl) //TestPrevLevel.sendCommand(lvl) //logWarn("autolights", "rule ended")
end
val cfg = ’
{
“dev”: [
{
“name”: “Woonkamer_Lamp_Muur_Bank”,
“check_dev”:“”,
“check_on”:“”,
“check_off”:“”,
“levels”: [
{“mode”:0, “level”:“OFF”},
{“mode”:1, “level”:“75”},
{“mode”:7, “level”:“60”}
]
},
{
“name”: “Woonkamer_Lamp_Muur_TV”,
“check_dev”:“”,
“check_on”:“”,
“check_off”:“”,
“levels”: [
{“mode”:0, “level”:“OFF”},
{“mode”:1, “level”:“75”},
{“mode”:7, “level”:“60”}
]
},
{
“name”: “Woonkamer_Lamp_IKEA1”,
“check_dev”:“”,
“check_on”:“”,
“check_off”:“”,
“levels”: [
{“mode”:0, “level”:“OFF”},
{“mode”:1, “level”:“77”},
{“mode”:7, “level”:“60”}
]
},
{
“name”: “Woonkamer_Lamp_IKEA2”,
“check_dev”:“”,
“check_on”:“”,
“check_off”:“”,
“levels”: [
{“mode”:0, “level”:“OFF”},
{“mode”:1, “level”:“77”},
{“mode”:7, “level”:“60”}
]
},
{
“name”: “Woonkamer_Lamp_IKEA3”,
“check_dev”:“”,
“check_on”:“”,
“check_off”:“”,
“levels”: [
{“mode”:0, “level”:“OFF”},
{“mode”:1, “level”:“77”},
{“mode”:7, “level”:“60”}
]
},
{
“name”: “Woonkamer_Lamp_Zijraam1”,
“check_dev”:“”,
“check_on”:“”,
“check_off”:“”,
“levels”: [
{“mode”:0, “level”:“OFF”},
{“mode”:1, “level”:“70”},
{“mode”:7, “level”:“70”}
]
},
{
“name”: “Woonkamer_Lamp_Zijraam2”,
“check_dev”:“”,
“check_on”:“”,
“check_off”:“”,
“levels”: [
{“mode”:0, “level”:“OFF”},
{“mode”:1, “level”:“70”},
{“mode”:7, “level”:“70”}
]
},{
“name”: “Woonkamer_Lamp_Zijraam3”,
“check_dev”:“”,
“check_on”:“”,
“check_off”:“”,
“levels”: [
{“mode”:0, “level”:“OFF”},
{“mode”:1, “level”:“70”},
{“mode”:7, “level”:“70”}
]
},
{
“name”: “Woonkamer_Lamp_Kastje”,
“check_dev”:“”,
“check_on”:“”,
“check_off”:“”,
“levels”: [
{“mode”:0, “level”:“0”},
{“mode”:1, “level”:“30”},
{“mode”:7, “level”:“0”}
]
},
{
“name”: “Woonkamer_Lamp_Plant”,
“check_dev”:“”,
“check_on”:“”,
“check_off”:“”,
“levels”: [
{“mode”:0, “level”:“0”},
{“mode”:1, “level”:“50”},
{“mode”:7, “level”:“0”}
]
},
{
“name”: “Livingroom_TVbias_Level”,
“check_dev”:“TV_Woonkamer”,
“check_on”:“”,
“check_off”:“”,
“levels”: [
{“mode”:0, “level”:“0”},
{“mode”:1, “level”:“0”, “check_dev_state”:“OFF”},
{“mode”:1, “level”:“10”, “check_dev_state”:“ON”},
{“mode”:7, “level”:“0”, “check_dev_state”:“OFF”},
{“mode”:7, “level”:“10”, “check_dev_state”:“ON”},
]
},
{
“name”: “Livingroom_Fireplace_Level”,
“check_dev”:“”,
“check_on”:“”,
“check_off”:“”,
“levels”: [
{“mode”:0, “level”:“0”},
{“mode”:1, “level”:“20”},
{“mode”:7, “level”:“0”}
]
}
]
}
’rule “LightMode”
when
Item LightMode received command
then
logWarn(“lightmode”, “start”)var oldmode = LightMode.state as Number var newmode = receivedCommand logWarn("lightmode", "old mode="+oldmode.toString) logWarn("lightmode", "new mode="+newmode.toString) //loop devices in config val len = Integer.parseInt(transform("JSONPATH", "$.dev.length()", cfg)) for (var int i = 0 ; i < len ; i++) { logWarn("lightmode2", "----------") val s = Integer.toString(i) // check if we need to control the device based on 'check_on' / 'check_off' settings var _continue = true if (newmode>0){ val String check_on_dev = transform("JSONPATH", "$.dev["+s+"].check_on", cfg) if (check_on_dev != ""){ logWarn("lightmode2", "check_on_dev:"+check_on_dev) val check_on = GAutoLightSettings.allMembers.filter[d |d.name.equals(check_on_dev)].head val check_on_dev_state = check_on.state logWarn("lightmode2", "check_on_dev_state:"+check_on_dev_state.toString()) _continue = (check_on.state == ON) } } if (newmode==0){ val String check_off_dev = transform("JSONPATH", "$.dev["+s+"].check_off", cfg) if (check_off_dev != ""){ logWarn("lightmode2", "check_off_dev:"+check_off_dev) val check_off = GAutoLightSettings.allMembers.filter[d |d.name.equals(check_off_dev)].head val check_off_dev_state = check_off.state logWarn("lightmode2", "check_off_dev_state:"+check_off_dev_state.toString()) _continue = (check_off.state == ON) } } if ( _continue ){ val String devname = transform("JSONPATH", "$.dev["+s+"].name", cfg) //logWarn("lightmode2", "members: "+GWoonkamer.allMembers.toString()) val dev = GWoonkamer.allMembers.filter[d |d.name.equals(devname)].head val dev_state = dev.state logWarn("lightmode2", "devname:"+devname) logWarn("lightmode2", "devstate:"+dev_state) val String chkdevname = transform("JSONPATH", "$.dev["+s+"].check_dev", cfg) val check_dev = GWoonkamer.allMembers.filter[d |d.name.equals(chkdevname)].head logWarn("lightmode2", "chkdevname:"+chkdevname) var level = "" if (chkdevname == ""){ level = transform("JSONPATH", "$.dev["+s+"].levels[?(@.mode == "+newmode+")].level", cfg) } else{ // we need to take the chk device into account var chkdev_state = check_dev.state logWarn("lightmode2", "check_dev_state:"+chkdev_state) logWarn("lightmode2", "JSONPATH: "+"$.dev["+s+"].levels[?(@.mode == "+newmode+" && @.check_dev_state == '"+chkdev_state.toString()+"')].level") level = transform("JSONPATH", "$.dev["+s+"].levels[?(@.mode == "+newmode+" && @.check_dev_state == '"+chkdev_state.toString()+"')].level", cfg) //if not found we can take the value without the device if (level == "NULL"){ level = transform("JSONPATH", "$.dev["+s+"].levels[?(@.mode == "+newmode+")].level", cfg) } } logWarn("lightmode2", "level="+level) dev.sendCommand(level) } } logWarn("lightmode", "end")
end