Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add sunscreen example script #1751

Merged
merged 8 commits into from Sep 5, 2017
132 changes: 132 additions & 0 deletions scripts/dzVents/examples/sunscreen.lua
@@ -0,0 +1,132 @@
-- 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
}