The script i'm currently trying is this:
Code: Select all
-- Define all the sensors which needs to be considered for the sunscreen to close
local sensors = {
temperature = {
active = true,
device = 'Gevoelstemperatuur',
closeRule = function(device)
return device.temperature <= 15
end
},
wind = {
active = false,
device = 'S Windmeter',
closeRule = function(device)
return device.speed >= 50 or device.gust >= 150
end
},
rain = {
active = false,
device = 'Regen intensiteit',
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 = 'Zonkracht',
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 = 'Zonnescherm_dummy'
-- 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
}
Some devices i intentionally set to 'false' because i like to test first with some simple tresholds and then build up.
I created a dummy sunscreen so i can play with this script without touching my actual sunscreen.
(i'll wait with publishing this script to my "live" situation until the dummy sunscreen acts close to the state of the real device. Important for the WAF)
I hope someone can help me determine why this script doesn't work in my situation