Wake up Light
Moderator: leecollings
- Mavy
- Posts: 16
- Joined: Thursday 13 February 2014 13:29
- Target OS: Raspberry Pi / ODroid
- Domoticz version:
- Location: Breda, The Netherlands
- Contact:
Wake up Light
Hi Everyone,
I was wondering if anyone has managed to create some sort of wake up light using domoticz yet. I tried to create one but all my efforts so far have failed.
At first i tried to use a blocky based event, however I seem to be missing a basic function in the blocky event builder. That function being a delay between set actions.
Then i tried to use lua, however this hangs the entire domoticz process due to it not being forked as a separate thread (for which i will file a bug later because imo thats a major flaw).
After this i attempted to use the bash script, however this would need an extensive script to fetch device status using curl/json (which seems to lack support to fetch a single device?). Unless its the only option i am not yet willing to try this due to the load it will put om my poor raspberry pi
Are there any other ideas/solutions to doing this?
I played with the idea of creating several virtual devices to trigger each new level but that would create a mess of dummy switches and i cannot think of anyway to add the delay between levels.
Regards,
Mavy
I was wondering if anyone has managed to create some sort of wake up light using domoticz yet. I tried to create one but all my efforts so far have failed.
At first i tried to use a blocky based event, however I seem to be missing a basic function in the blocky event builder. That function being a delay between set actions.
Then i tried to use lua, however this hangs the entire domoticz process due to it not being forked as a separate thread (for which i will file a bug later because imo thats a major flaw).
After this i attempted to use the bash script, however this would need an extensive script to fetch device status using curl/json (which seems to lack support to fetch a single device?). Unless its the only option i am not yet willing to try this due to the load it will put om my poor raspberry pi
Are there any other ideas/solutions to doing this?
I played with the idea of creating several virtual devices to trigger each new level but that would create a mess of dummy switches and i cannot think of anyway to add the delay between levels.
Regards,
Mavy
-
- Posts: 110
- Joined: Friday 20 September 2013 18:49
- Target OS: Raspberry Pi / ODroid
- Domoticz version: 2.3530
- Location: Finland
- Contact:
- Mavy
- Posts: 16
- Joined: Thursday 13 February 2014 13:29
- Target OS: Raspberry Pi / ODroid
- Domoticz version:
- Location: Breda, The Netherlands
- Contact:
Re: Wake up Light
I did see that thread but that script kind of defeats the purpose of domoticz. Plus it has a similar issue as the bash script i mentioned earlier. There is no decent way to get a single device status using json.
-
- Posts: 329
- Joined: Tuesday 16 July 2013 22:54
- Target OS: Raspberry Pi / ODroid
- Domoticz version: 3.8807
- Location: North East England
- Contact:
Re: Wake up Light
@Mavy, please could you share the scripts you have tried, this will make it easier to help
Raspberry Pi 2 B - 2A@5V PSU - Raspbian + Domoticz + RFXtrx(89), LightwaveRF House(dimmers, sockets, wireless/mood switches), Owl CM113, 4 LaCross Temp / Humidity Sensors, 4 Siemens PIR, Smappee, Solaredge, ESP8266
- Mavy
- Posts: 16
- Joined: Thursday 13 February 2014 13:29
- Target OS: Raspberry Pi / ODroid
- Domoticz version:
- Location: Breda, The Netherlands
- Contact:
Re: Wake up Light
The original script i tried was:
However domoticz would hang completely during the sleep. My guess is that the lua code gets run inside the main process loop instead of as a fork/thread.
I then tried a bash script but its hard to process all the json code returned by the json scripts.
Currently i am planning to use the following:
I plan on running this from the os lua. Probably using the domoticz_main script. I just need to test if this will hang the rest of the process as well. If it does i am out of ideas.
Code: Select all
commandArray = {}
if (devicechanged['Bedroom Rene Wakeup'] == 'On') then
if (otherdevices['Bedroom Rene Light'] == 'Off') then
print("Wake up light on!")
for i = 1, 16, 1 do
print("Setting Level: "..i)
oss = "curl 'http://127.0.0.1:8080/json.htm?type=command¶m=switchlight&idx=4&switchcmd=Set+Level&level="..i.."'&"
os.execute(oss)
os.execute("sleep 60")
end
end
commandArray['Bedroom Rene Wakeup'] = 'Off'
end
I then tried a bash script but its hard to process all the json code returned by the json scripts.
Currently i am planning to use the following:
Code: Select all
local http = require("socket.http")
JSON = (loadfile "JSON.lua")()
local function get_status(idx)
url = 'http://127.0.0.1:8080/json.htm?type=devices&filter=light&used=true&order=Name'
b, c, h = http.request(url)
local o = JSON:decode(b)
for key,value in pairs(o["result"]) do
if value["idx"] == idx then
return value["Status"]
end
end
end
local function set_device(idx, level)
seturl = 'http://127.0.0.1:8080/json.htm?type=command¶m=switchlight&idx='..idx..'&switchcmd=Set+Level&level='..level
b, c, h = http.request(seturl)
end
local function wait(seconds)
local _start = os.time()
local _end = _start+seconds
while (_end ~= os.time()) do
end
end
status = get_status("4")
if status ~= "Off" then return end
for i = 2, 16, 1 do
print("Setting Level: "..i)
set_device("4", i)
wait(120)
status = get_status("4")
if status == "Off" or status == "On" then print (status) return end
end
-
- Posts: 329
- Joined: Tuesday 16 July 2013 22:54
- Target OS: Raspberry Pi / ODroid
- Domoticz version: 3.8807
- Location: North East England
- Contact:
Re: Wake up Light
Nice, thanks, what does JSON.lua have in it?
I have changed your script from a device to a time script, so every 60 seconds Domoticz will check the state of the wakeup switch, if it is on then, Domoticz will increase the light level by 1 for every 60 seconds since the wakeup switch was turned on, until at 16 minutes it will turn the wakeup switch off. So while Domoticz will check the script every 60 seconds all day nothing will happen unless the wakeup switch is on.
I haven't tested this script, so hope there aren't too many errors.
Thanks for the chance to think about this challenge, it has now inspired me to generalise this code, so if I create a switch called "Wakeup Room Name" then the Lua script will get Domoticz to check all "Wakeup ....." switches, and do the level changing on each "Wakeup...." switch which is on. I have already written similar code for PIRs, so it is just a matter of adding the bits together and then we have the ultimate "Wakeup...." switch . So then any light could have a wakeup sequence just by creating a new "Wakeup Room Name" switch in Domoticz. See http://www.domoticz.com/forum/viewtopic ... 348&p=9003
I have changed your script from a device to a time script, so every 60 seconds Domoticz will check the state of the wakeup switch, if it is on then, Domoticz will increase the light level by 1 for every 60 seconds since the wakeup switch was turned on, until at 16 minutes it will turn the wakeup switch off. So while Domoticz will check the script every 60 seconds all day nothing will happen unless the wakeup switch is on.
I haven't tested this script, so hope there aren't too many errors.
Code: Select all
-- ~/domoticz/scripts/lua/script_time_wakeup.lua
-- If the wakeup switch is on
-- Then increases the lighting by 1 level every 60 seconds
-- After 8 minutes turns the wakeup switch off
function timedifference(s)
year = string.sub(s, 1, 4)
month = string.sub(s, 6, 7)
day = string.sub(s, 9, 10)
hour = string.sub(s, 12, 13)
minutes = string.sub(s, 15, 16)
seconds = string.sub(s, 18, 19)
t1 = os.time()
t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
difference = os.difftime (t1, t2)
return difference
end
commandArray = {}
if (otherdevices['Bedroom Rene Wakeup'] == 'On') then
wake_time = timedifference(otherdevices_lastupdate['Bedroom Rene Wakeup'])
level = 1 + wake_time % 60
if(level <= 16) then
commandArray['Bedroom Rene Light'] = 'Set Level '..level
else
commandArray['Bedroom Rene Wakeup'] == 'Off'
end
end
return commandArray
Raspberry Pi 2 B - 2A@5V PSU - Raspbian + Domoticz + RFXtrx(89), LightwaveRF House(dimmers, sockets, wireless/mood switches), Owl CM113, 4 LaCross Temp / Humidity Sensors, 4 Siemens PIR, Smappee, Solaredge, ESP8266
- Mavy
- Posts: 16
- Joined: Thursday 13 February 2014 13:29
- Target OS: Raspberry Pi / ODroid
- Domoticz version:
- Location: Breda, The Netherlands
- Contact:
Re: Wake up Light
Oh nice idea, i hadn't thought of using the last update. The json code is here http://regex.info/blog/lua/json
-
- Posts: 329
- Joined: Tuesday 16 July 2013 22:54
- Target OS: Raspberry Pi / ODroid
- Domoticz version: 3.8807
- Location: North East England
- Contact:
Re: Wake up Light
Thanks for JSON reference.
I have now written a quick general version - the Ultimate Smart WakeUp (tm) - "WakeUpxroom name" - when switched on will increase the level of "room name" linearly over 800 seconds until the light is fully on, at which point "WakeUpxroom name" will be switched off. x^2 is the number of minutes the wake-up will take, not sure this is ideal, but from 1, 4, 9, 16, 25, 36, 49, 64 and 81 minutes give a number of choices anyway.
Remove all the print statements when you are happy the script is working correctly.
I have now written a quick general version - the Ultimate Smart WakeUp (tm) - "WakeUpxroom name" - when switched on will increase the level of "room name" linearly over 800 seconds until the light is fully on, at which point "WakeUpxroom name" will be switched off. x^2 is the number of minutes the wake-up will take, not sure this is ideal, but from 1, 4, 9, 16, 25, 36, 49, 64 and 81 minutes give a number of choices anyway.
Code: Select all
-- ~/domoticz/scripts/lua/script_time_wakeup.lua
-- There is no error checking, so case of letters, spacing and correct characters in locations are key
-- If it doesn't work check for errors in the log
-- This script needs two switches to exist in Domoticz
-- A switch for the room with any legitimate Domoticz name "Room Name"
-- A dummy switch to start the wake-up sequence - "WakeUpxRoom Name"
-- Where x should be replaced by a single number and determines
-- number of minutes taken to reach full intensity
-- Time = x^2 * 60 seconds, so 4 is 16 minutes, 5 is 25 minutes etc..
-- e.g. Setting the WakeUp4Room Name" switch to on
-- Then the light intensity increases 1/16 every 60 seconds
-- After 16 minutes turns the wakeup switch off
function timedifference(s)
print("s "..s)
year = string.sub(s, 1, 4)
month = string.sub(s, 6, 7)
day = string.sub(s, 9, 10)
hour = string.sub(s, 12, 13)
minutes = string.sub(s, 15, 16)
seconds = string.sub(s, 18, 19)
t1 = os.time()
print("t1 "..t1)
t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
print("t2 "..t2)
difference = os.difftime (t1, t2)
return difference
end
commandArray = {}
for i, v in pairs(otherdevices) do
tc = tostring(i)
v = i:sub(1,6)
if (v == 'WakeUp') then
if (otherdevices[tc] == 'On') then
time_range = 60 * tonumber(i:sub(7,7))^2
print("Time range "..time_range)
wake_time = timedifference(otherdevices_lastupdate[tc])
print("Wake Time "..wake_time)
level = 100 * (wake_time / time_range)
print(level)
if(level <= 100) then
print('Set Level '..string.format("%u",level))
commandArray[tc:sub(8)] = 'Set Level '..string.format("%u",level)
else
commandArray[tc:sub(8)] = 'Set Level 100'
commandArray[tc] = 'Off'
end
end
end
end
return commandArray
Raspberry Pi 2 B - 2A@5V PSU - Raspbian + Domoticz + RFXtrx(89), LightwaveRF House(dimmers, sockets, wireless/mood switches), Owl CM113, 4 LaCross Temp / Humidity Sensors, 4 Siemens PIR, Smappee, Solaredge, ESP8266
- Mavy
- Posts: 16
- Joined: Thursday 13 February 2014 13:29
- Target OS: Raspberry Pi / ODroid
- Domoticz version:
- Location: Breda, The Netherlands
- Contact:
Re: Wake up Light
I would add a check in the loop to check if a light is Off before starting to dim it. This is to prevent the wakeup from starting if the light is already On.
Another thing i would do is add a condition to stop the wake up sequence if the light is turned Full On or Off (So your able to turn the "alarm" off when your awake)
Another thing i would do is add a condition to stop the wake up sequence if the light is turned Full On or Off (So your able to turn the "alarm" off when your awake)
-
- Posts: 329
- Joined: Tuesday 16 July 2013 22:54
- Target OS: Raspberry Pi / ODroid
- Domoticz version: 3.8807
- Location: North East England
- Contact:
Re: Wake up Light
Thanks, good additions, I am using LightwaveRF components, so there is no feedback, hence status in Domoticz is not necessarily the state of the light, so I probably won't add the checks on light condition.
To turn the alarm off, it would be cleanest to set the WakeUp switch to off, so a check in the script for state at 100% which would then set WakeUp off. In the case of LightwaveRF in order to ensure the light was really on I would need to send a 100% on command, so on somedays you would get a rapid wake-up .
To turn the alarm off, it would be cleanest to set the WakeUp switch to off, so a check in the script for state at 100% which would then set WakeUp off. In the case of LightwaveRF in order to ensure the light was really on I would need to send a 100% on command, so on somedays you would get a rapid wake-up .
Raspberry Pi 2 B - 2A@5V PSU - Raspbian + Domoticz + RFXtrx(89), LightwaveRF House(dimmers, sockets, wireless/mood switches), Owl CM113, 4 LaCross Temp / Humidity Sensors, 4 Siemens PIR, Smappee, Solaredge, ESP8266
- havnegata
- Posts: 114
- Joined: Wednesday 10 September 2014 11:05
- Target OS: Raspberry Pi / ODroid
- Domoticz version: V4.10162
- Location: Norway
- Contact:
Re: Wake up Light
I've been looking for this script a long time (all I do is steal and modify ) and so was very glad when I found yours . I change the names of the switches and I get this error:
Error: EventSystem: C:\Domoticz\scripts\lua\script_time_wakeup.lua:27: syntax error near '=='
Any clues?
-- ~/domoticz/scripts/lua/script_time_wakeup.lua
-- If the wakeup switch is on
-- Then increases the lighting by 1 level every 60 seconds
-- After 8 minutes turns the wakeup switch off
function timedifference(s)
year = string.sub(s, 1, 4)
month = string.sub(s, 6, 7)
day = string.sub(s, 9, 10)
hour = string.sub(s, 12, 13)
minutes = string.sub(s, 15, 16)
seconds = string.sub(s, 18, 19)
t1 = os.time()
t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
difference = os.difftime (t1, t2)
return difference
end
commandArray = {}
if (otherdevices['Soverom Wakeup'] == 'On') then
wake_time = timedifference(otherdevices_lastupdate['Soverom Wakeup'])
level = 1 + wake_time % 60
if(level <= 16) then
commandArray['Dimmer soverom'] = 'Set Level '..level
else
commandArray['Soverom Wakeup'] == 'Off'
end
end
return commandArray
Error: EventSystem: C:\Domoticz\scripts\lua\script_time_wakeup.lua:27: syntax error near '=='
Any clues?
-- ~/domoticz/scripts/lua/script_time_wakeup.lua
-- If the wakeup switch is on
-- Then increases the lighting by 1 level every 60 seconds
-- After 8 minutes turns the wakeup switch off
function timedifference(s)
year = string.sub(s, 1, 4)
month = string.sub(s, 6, 7)
day = string.sub(s, 9, 10)
hour = string.sub(s, 12, 13)
minutes = string.sub(s, 15, 16)
seconds = string.sub(s, 18, 19)
t1 = os.time()
t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
difference = os.difftime (t1, t2)
return difference
end
commandArray = {}
if (otherdevices['Soverom Wakeup'] == 'On') then
wake_time = timedifference(otherdevices_lastupdate['Soverom Wakeup'])
level = 1 + wake_time % 60
if(level <= 16) then
commandArray['Dimmer soverom'] = 'Set Level '..level
else
commandArray['Soverom Wakeup'] == 'Off'
end
end
return commandArray
- G3rard
- Posts: 669
- Joined: Wednesday 04 March 2015 22:15
- Target OS: -
- Domoticz version: No
- Location: The Netherlands
- Contact:
Re: Wake up Light
Remove one = from line 27 so it is like below.
The error message gives the line number on which the error occurs, so 27 in this case. That makes finding the error a bit easier.
Code: Select all
commandArray['Soverom Wakeup'] = 'Off'
Not using Domoticz anymore
- havnegata
- Posts: 114
- Joined: Wednesday 10 September 2014 11:05
- Target OS: Raspberry Pi / ODroid
- Domoticz version: V4.10162
- Location: Norway
- Contact:
Re: Wake up Light
Ok, thanks, that makes sense
When I try this, the error is gone, but the only thing that happens with the script is that the dummy switch is turned off.. Any more clues?
When I try this, the error is gone, but the only thing that happens with the script is that the dummy switch is turned off.. Any more clues?
-
- Posts: 38
- Joined: Friday 27 December 2013 3:13
- Target OS: Linux
- Domoticz version: Beta
- Location: Friesland
- Contact:
Re: Wake up Light
I created a wakeuplight also in bash, via dummy switch on action: script:///var/ramdrive/scripts/WakeUpLightStart.sh
WakeUpLightStart.sh (This script calls the other script, so no 10 seconds limit)
WakeUpLight.sh
Same trick i use in lua scripts (the & starts a new console to run that command in, the current console ends in the 10 seconds limit):
WakeUpLightStart.sh (This script calls the other script, so no 10 seconds limit)
Code: Select all
#!/bin/bash
if [ -e "/var/ramdrive/domoticz" ]; then SCRIPTSDIR="/var/ramdrive/scripts"; else SCRIPTSDIR="/opt/scripts-test"; fi;
echo Starting Ambilight script; $SCRIPTSDIR/WakeUpLight.sh >/dev/null &
Code: Select all
#!/bin/bash
if [ -e "/var/ramdrive/domoticz" ]; then TOOLSDIR="/var/ramdrive/tools"; else TOOLSDIR="/home/peter/milight"; fi
# switch ON, WHITE, but to current state, that might be too high... switch to lowest dim
zone2=2; $TOOLSDIR/milight $zone2 W; $TOOLSDIR/milight $zone2 B 1; sleep 0.2s; zone3=3; $TOOLSDIR/milight $zone3 W; $TOOLSDIR/milight $zone3 B 1
# change brightness from 1 to 19 in 20 steps of 5 seconds
for i in `seq 10`; do $TOOLSDIR/milight $zone2 B $i; sleep 0.2s; $TOOLSDIR/milight $zone3 B $i; sleep 30s; done
sleep 300; $TOOLSDIR/milight $zone2 B 1; $TOOLSDIR/milight $zone2 OFF; sleep 0.2s
$TOOLSDIR/milight $zone3 B 1; $TOOLSDIR/milight $zone3 OFF # lowering dim for the next morning and switching off after 300s
echo -e "\nVersturen van statuswijziging naar Domoticz server via json:"; sDomoticzServer="192.168.192.68:8080"
echo curl -s -i -m 5 -H "Accept: application/json" "http://$sDomoticzServer/json.htm?type=command¶m=switchlight&idx=617&switchcmd=Off"
strCurl=`nice -n 10 curl -s -i -m 5 -H "Accept: application/json" "http://$sDomoticzServer/json.htm?type=command¶m=switchlight&idx=617&switchcmd=Off"`
Code: Select all
os.execute('nohup '..sScriptsDir..'/TelegramBot.sh "'..sMsgTo..' '..sMsg..'" 2>/dev/null &')
-
- Posts: 22
- Joined: Sunday 06 December 2015 21:15
- Target OS: Raspberry Pi / ODroid
- Domoticz version:
- Contact:
Re: Wake up Light
Hi, did you get this working? Ive tried my self with no joy.
Fancy using it to cycle each light through 0-100-0% as a test. I currently have a lightwave system but struggling to get it working. Thanks
Sent from my iPhone using Tapatalk - now Free
Fancy using it to cycle each light through 0-100-0% as a test. I currently have a lightwave system but struggling to get it working. Thanks
Sent from my iPhone using Tapatalk - now Free
-
- Posts: 234
- Joined: Thursday 09 July 2015 12:03
- Target OS: Linux
- Domoticz version: 2.4538
- Location: Norway
- Contact:
Re: Wake up Light
It is well possible in principle to make in Blockly.
Extremely many OPEN JSON URL blocks consecutively
With the same or just a little bit more dim every time.
Tested with 10-20 blocks and it works, but it's over in seconds.
One can, however, make it extremely long, but it might get out of the performance in Domoticz or?
I'm running on a real server though, not Pi.
Extremely many OPEN JSON URL blocks consecutively
With the same or just a little bit more dim every time.
Tested with 10-20 blocks and it works, but it's over in seconds.
One can, however, make it extremely long, but it might get out of the performance in Domoticz or?
I'm running on a real server though, not Pi.
-
- Posts: 94
- Joined: Monday 30 November 2015 16:21
- Target OS: Raspberry Pi / ODroid
- Domoticz version:
- Contact:
Re: Wake up Light
I created a wiki several weeks ago how to make a wakeuplight with blockly.
Pretty long, but not an issue for a rpi!
Http://domoticz.com/wiki/wakeuplight
Pretty long, but not an issue for a rpi!
Http://domoticz.com/wiki/wakeuplight
-
- Posts: 234
- Joined: Thursday 09 July 2015 12:03
- Target OS: Linux
- Domoticz version: 2.4538
- Location: Norway
- Contact:
Re: Wake up Light
super.maomanna wrote:I created a wiki several weeks ago how to make a wakeuplight with blockly.
Pretty long, but not an issue for a rpi!
Http://domoticz.com/wiki/wakeuplight
btw. Can't other events run at the same time this is running?
-
- Posts: 94
- Joined: Monday 30 November 2015 16:21
- Target OS: Raspberry Pi / ODroid
- Domoticz version:
- Contact:
Re: Wake up Light
Yes they can, but if you use the same devices, it can overrun each other.
-
- Posts: 1601
- Joined: Friday 18 October 2013 23:33
- Target OS: Raspberry Pi / ODroid
- Domoticz version: BETA
- Location: Arnhem/Nijmegen Nederland
- Contact:
Re: Wake up Light
Dear all...
What is the way/script to use a wake up and a sleep down light?
I see multiple options..
The best and simple way....
What is the way/script to use a wake up and a sleep down light?
I see multiple options..
The best and simple way....
Xu4: Beta Extreme antenna RFXcomE,WU Fi Ping ip P1 Gen5 PVOutput Harmony HUE SolarmanPv OTG Winddelen Alive ESP Buienradar MySensors WOL Winddelen counting RPi: Beta SMAspot RFlinkTest Domoticz ...Different backups
Who is online
Users browsing this forum: Droll and 1 guest