133 lines
4.0 KiB
Lua
133 lines
4.0 KiB
Lua
-- Define all the sensors which needs to be considered for the sunscreen to close
|
|
local sensors = {
|
|
temperature = {
|
|
active = true,
|
|
device = 'Temperature',
|
|
closeRule = function(device)
|
|
return device.temperature <= 15
|
|
end
|
|
},
|
|
wind = {
|
|
active = true,
|
|
device = 'Wind',
|
|
closeRule = function(device)
|
|
return device.speed >= 50 or device.gust >= 150
|
|
end
|
|
},
|
|
rain = {
|
|
active = true,
|
|
device = 'Rain',
|
|
closeRule = function(device)
|
|
return device.rainRate > 0
|
|
end
|
|
},
|
|
rainExpected = {
|
|
active = false,
|
|
device = 'Rain expected', -- This needs to be a virtual sensor of type 'percentage'
|
|
closeRule = function(device)
|
|
return device.percentage > 15
|
|
end
|
|
},
|
|
uv = {
|
|
active = true,
|
|
device = 'UV',
|
|
closeRule = function(device)
|
|
return device.uv <= 3
|
|
end
|
|
},
|
|
lux = {
|
|
active = false,
|
|
device = 'Lux',
|
|
closeRule = function(device)
|
|
return device.lux <= 500
|
|
end
|
|
}
|
|
}
|
|
|
|
-- Define the name of your sunscreen device
|
|
local sunscreenDevice = 'Sunscreen'
|
|
|
|
-- Enable dry run mode to test the sunscreen script without actually activating the sunscreen
|
|
local dryRun = false
|
|
|
|
-- Define the name of a virtual switch which you can use to disable the sunscreen automation script
|
|
-- Set to false to disable this feature
|
|
local manualOverrideSwitch = false
|
|
|
|
-- Minutes to wait after a sunscreen close before opening it again.
|
|
local timeBetweenOpens = 10
|
|
|
|
return {
|
|
active = true,
|
|
on = {
|
|
timer = {'every minute'}
|
|
},
|
|
logging = {
|
|
level = domoticz.LOG_DEBUG,
|
|
marker = 'Sunscreen'
|
|
},
|
|
execute = function(domoticz)
|
|
|
|
local function switchOn(sunscreen, message)
|
|
if (sunscreen.state == 'Closed') then
|
|
if (not dryRun) then
|
|
sunscreen.switchOn()
|
|
domoticz.notify('Sunscreen', message)
|
|
end
|
|
domoticz.log(message, domoticz.LOG_INFO)
|
|
end
|
|
end
|
|
|
|
local function switchOff(sunscreen, message)
|
|
if (sunscreen.state == 'Open') then
|
|
if (not dryRun) then
|
|
sunscreen.switchOff()
|
|
domoticz.notify('Sunscreen', message)
|
|
end
|
|
domoticz.log(message, domoticz.LOG_INFO)
|
|
end
|
|
end
|
|
|
|
if (manualOverrideSwitch and domoticz.devices(manualOverrideSwitch).state == 'On') then
|
|
domoticz.log('Automatic sunscreen script is manually disabled', domoticz.LOG_DEBUG)
|
|
return
|
|
end
|
|
|
|
local sunscreen = domoticz.devices(sunscreenDevice)
|
|
|
|
-- Sunscreen must always be up during nighttime
|
|
if (domoticz.time.isNightTime) then
|
|
switchOff(sunscreen, 'Closing sunscreen, It is night')
|
|
return
|
|
end
|
|
|
|
-- Check all sensor tresholds and if any exeeded close sunscreen
|
|
for sensorType, sensor in pairs(sensors) do
|
|
|
|
if (sensor['active'] == true) then
|
|
|
|
local device = domoticz.devices(sensor['device'])
|
|
local closeRule = sensor['closeRule']
|
|
|
|
domoticz.log('Checking sensor: ' .. sensorType, domoticz.LOG_DEBUG)
|
|
|
|
if (closeRule(device)) then
|
|
|
|
switchOff(sunscreen, sensorType .. ' treshold exceeded, Sunscreen up')
|
|
|
|
domoticz.log(sensorType .. ' treshold exceeded', domoticz.LOG_DEBUG)
|
|
-- Return early when we exeed any tresholds
|
|
return
|
|
end
|
|
else
|
|
domoticz.log('Sensor not active skipping: ' .. sensorType, domoticz.LOG_DEBUG)
|
|
end
|
|
end
|
|
|
|
-- All tresholds OK, sunscreen may be lowered
|
|
if (sunscreen.lastUpdate.minutesAgo > timeBetweenOpens) then
|
|
switchOn(sunscreen, 'Sun is shining, all thresholds OK, lowering sunscreen')
|
|
end
|
|
end
|
|
}
|