Of course the script must be configured for your settings and device names (begin of script). But maybe you can use some parts.
Variable / Thresholds declaration.
Reading weather underground devices.
Split values from these devices.
Calculate results with thresholds
Log results to Domoticz log
Check if manual Override is active:
- Less than x minutes
- Only during Daytime or Always
When screen is Up/Open:
- Don't close it within x minutes after open
- Close screen
- Optional Log to log file (conditions and results)
- Optional Send Telegram notification
When screen is Down/Closed:
- Open screen
- Optional Log to log file (conditions and results)
- Optional Send Telegram notification
This is a first release. If interesting I will post new versions.
Suggestions are Welcome.
Code: Select all
-- Time_Sunscreen
--
-- Check the weather conditions with Weather Underground for controlling the suncreen.
--
-- Release note
--
-- 14-06-2014 Redesigned for generic use
-- 17-06-2014 Include a Temperature condition
-- Manual override setting for daytime only
-- 26-06-2014 Optional waiting time after open
-- Option for logging to log file
--
--------------------------------------------------------------------------------
--
-- Variable
--
Version = 0.021
Version_Type = 'Beta'
TH_Wind = 30 -- Treshold wind
TH_Gust = 50 -- Treshold windstoten
TH_Rain = 0 -- Treshold regen/neerslag
TH_Uv_Close = 2.5 -- treshold voor Uv close
TH_Uv_Open = 1.2 -- treshold voor Uv open
TH_Tp_Close = 20 -- treshold voor Temperature close
TH_Tp_Open = 15 -- treshold voor Temperature close
ActionClose = 'On'
ActionOpen = 'Off'
ManualTime = 'D' -- D=Daytime / A=All
Debugging = 'Y'
Man_to_Auto = 240 -- Minutes manual override
SwitchTime = 10
LogAction = 'Y' -- A=All, Y=Only on change
LogFile = '/home/pi/domoticz/Log/Sunscreen.log'
DeviceName = 'Sunscreen'
DeviceManual = 'Sunscreen - Manual'
TelegramName = 'Leon_Mol'
--
-- Retrieve values from devices
--
Wu_Dev_Temp = otherdevices_svalues['WU Temperature']
Wu_Dev_Rain = otherdevices_svalues['WU Rain']
Wu_Dev_UvMe = otherdevices_svalues['WU UV']
--
--------------------------------------------------------------------------------
commandArray = {}
print ("______________________________________________________________________")
print (">> Sunscreen LUA Contitions.....v" .. Version .. "....." .. Version_Type)
--
-- Split values from devices
--
Part=1
for match in (Wu_Dev_Temp..';'):gmatch("(.-)"..';') do
if Part==3 then Wu_Wind = tonumber(match) end
if Part==4 then Wu_Gust = tonumber(match) end
if Part==5 then Wu_Temp = tonumber(match) end
Part=Part+1
end
Part=1
for match in (Wu_Dev_Rain..';'):gmatch("(.-)"..';') do
if Part==2 then Wu_Rain = tonumber(match) end
Part=Part+1
end
Part=1
for match in (Wu_Dev_UvMe ..';'):gmatch("(.-)"..';') do
if Part==1 then Wu_Uv = tonumber(match) end
Part=Part+1
end
if LogAction=='Y' or LogAction=='A' then
f=io.open(LogFile,"a")
end
--
-- Calculate pre results
--
if (timeofday['Daytime']) then Res_Dayl=1 else Res_Dayl=0 end
if Wu_Wind <= TH_Wind then Res_Wind=1 else Res_Wind=0 end
if Wu_Gust <= TH_Gust then Res_Gust=1 else Res_Gust=0 end
if Wu_Rain <= TH_Rain then Res_Rain=1 else Res_Rain=0 end
if Wu_Uv >= TH_Uv_Close then Res_UvCl=1 else Res_UvCl=0 end
if Wu_Temp >= TH_Tp_Close then Res_TpCl=1 else Res_TpCl=0 end
if Wu_Uv <= TH_Uv_Open then Res_UvOp=1 else Res_UvOp=0 end
if Wu_Temp <= TH_Tp_Open then Res_TpOp=1 else Res_TpOp=0 end
--
-- Print decision info in the log
--
print ( "These conditions are valid when sunscreen is up: " )
if (timeofday['Daytime']) then
print ( Res_Dayl .. " - Daytime : True" )
else
print ( Res_Dayl .. " - Daytime : False" )
end
print ( Res_Wind .. " - Wind : " .. Wu_Wind .. " <= Th : " .. TH_Wind )
print ( Res_Gust .. " - Gust : " .. Wu_Gust .. " <= Th : " .. TH_Gust )
print ( Res_Rain .. " - Rain : " .. Wu_Rain .. " <= Th : " .. TH_Rain )
print ( Res_UvCl .. " - UV Close : " .. Wu_Uv .. " >= Th : " .. TH_Uv_Close )
print ( Res_TpCl .. " - Temp Close : " .. Wu_Temp .. " >= Th : " .. TH_Tp_Close )
print ( "These conditions are valid when sunscreen is down: " )
print ( Res_UvOp .. " - UV Open : " .. Wu_Uv .. " <= Th : " .. TH_Uv_Open )
print ( Res_TpOp .. " - Temp Open : " .. Wu_Temp .. " <= Th : " .. TH_Tp_Open )
--
-- Manual override for x minutes
--
if (otherdevices[DeviceManual]) == 'On' then
now = os.date("*t")
T1 = os.time(now)
Man_to_Auto = Man_to_Auto * 60
s = otherdevices_lastupdate[DeviceManual]
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)
T2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
if os.difftime (T1,T2) > Man_to_Auto then
commandArray[DeviceManual] = 'Off'
end
if ManualTime~="D" and Res_Dayl==0 then
--
-- Outside daytime period, turn manual override off
--
commandArray[DeviceManual] = 'Off'
end
end
if (otherdevices[DeviceName]) == 'Open' then
print ("Current state: Up / Open")
if Res_Dayl + Res_Wind + Res_Gust + Res_Rain + Res_UvCl + Res_TpCl == 6 then
if (otherdevices[DeviceManual]) == 'On' then
print ("Sunscreen Manual")
else
t1 = os.time()
s = otherdevices_lastupdate[DeviceName]
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)
t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
difference = (os.difftime (t1, t2))
if difference <= SwitchTime then
print ("Recent open, wait for switchtime")
else
--
-- Close
--
print ("Action: Down / Close")
commandArray[DeviceName] = ActionClose
if LogAction=='Y' or LogAction=='A' then
f:write(os.date("%Y-%m-%d;%H:%M:%S") .. ";DOWN;" .. Version .. ";" .. Res_Dayl .. ";" .. Res_Wind .. ";" .. Res_Gust .. ";" .. Res_Rain .. ";" .. Res_UvCl .. ";" .. Res_TpCl .. ";" .. Res_UvOp .. ";" .. Res_TpOp .. ";" .. Wu_Wind .. ";" .. Wu_Gust .. ";" .. Wu_Rain .. ";" .. Wu_Uv .. ";" .. Wu_Temp)
f:write("\n")
end
if TelegramName == nil then else
--
-- Telegram notification for close
--
os.execute('su pi ./home/pi/domoticz/scripts/lua/Telegram.sh ' .. TelegramName .. ' "Sunscreen closed."')
end
end
end
else
print ("Action: None")
end
end
if (otherdevices[DeviceName]) == 'Closed' then
print ("Current state: Down / Closed")
if Res_Dayl + Res_Wind + Res_Gust + Res_Rain < 4 or Res_UvOp==1 or Res_TpOp==1 then
if (otherdevices[DeviceManual]) == 'On' then
print ("Sunscreen Manual")
else
--
-- Open
--
print ("Action: Up / Open")
commandArray[DeviceName] = ActionOpen
if LogAction=='Y' or LogAction=='A' then
f:write(os.date("%Y-%m-%d;%H:%M:%S") .. ";OPEN;" .. Version .. ";" .. Res_Dayl .. ";" .. Res_Wind .. ";" .. Res_Gust .. ";" .. Res_Rain .. ";" .. Res_UvCl .. ";" .. Res_TpCl .. ";" .. Res_UvOp .. ";" .. Res_TpOp .. ";" .. Wu_Wind .. ";" .. Wu_Gust .. ";" .. Wu_Rain .. ";" .. Wu_Uv .. ";" .. Wu_Temp)
f:write("\n")
end
if TelegramName == nil then else
--
-- Telegram notification for open
--
os.execute('su pi ./home/pi/domoticz/scripts/lua/Telegram.sh ' .. TelegramName .. ' "Sunscreen open."')
end
end
else
print (" Action: None")
end
end
if LogAction=='A' then
f:write(os.date("%Y-%m-%d;%H:%M:%S") .. ";IDLE;" .. Version .. ";" .. Res_Dayl .. ";" .. Res_Wind .. ";" .. Res_Gust .. ";" .. Res_Rain .. ";" .. Res_UvCl .. ";" .. Res_TpCl .. ";" .. Res_UvOp .. ";" .. Res_TpOp .. ";" .. Wu_Wind .. ";" .. Wu_Gust .. ";" .. Wu_Rain .. ";" .. Wu_Uv .. ";" .. Wu_Temp)
f:write("\n")
f:close()
end
print ("______________________________________________________________________")
return commandArray