Re: Lua script for controlling humidity in the bathroom
Posted: Saturday 11 April 2015 3:50
Did you create all the necessary user variables correctly as stated in the wiki? Without that it will not work.
Open source Home Automation System
https://forum.domoticz.com/
However in the #/Temperature page i can get all the readings of my temp/humidity sensors...2015-07-18 10:17:00.388 LUA: Fan control
2015-07-18 10:17:00.388 LUA: current is 0 or nil. Skipping this reading
It works fine with combined sensors. It's possible the script needs a small adjustment, at least in my case. I can add it to the wiki when I'm sure it doesn't break anything.ThinkPad wrote:Does this script need a sensor that only contains humidity? Or will it also work with a sensor that has both temperature and humidity (which most of the sensors have)
When your bathroom starts looking like this: http://www.diydoctor.org.uk/project_ima ... -walls.jpg i think you will be sorry that you don't have a script like thisJustintime wrote:Also thought about it to make the ventilation smart.
But since my goal is to reduce energy. I think this will only crank the energy bill up.
OK, good to know. Scraping only the temperature from a combined sensor isn't that hard either. Something like this: http://domoticz.com/forum/viewtopic.php ... 869#p25878 will do fine (with the addition to write it to a virtual temperature sensor). I am not going to use the script from dannybloe myself, but was interested in how it works.bizziebis wrote:It works fine with combined sensors. It's possible the script needs a small adjustment, at least in my case. I can add it to the wiki when I'm sure it doesn't break anything.ThinkPad wrote:Does this script need a sensor that only contains humidity? Or will it also work with a sensor that has both temperature and humidity (which most of the sensors have)
LOL that's extreme mold... Good environment for mushrooms.ThinkPad wrote:When your bathroom starts looking like this: http://www.diydoctor.org.uk/project_ima ... -walls.jpg i think you will be sorry that you don't have a script like thisJustintime wrote:Also thought about it to make the ventilation smart.
But since my goal is to reduce energy. I think this will only crank the energy bill up.![]()
OK, good to know. Scraping only the temperature from a combined sensor isn't that hard either. Something like this: http://domoticz.com/forum/viewtopic.php ... 869#p25878 will do fine (with the addition to write it to a virtual temperature sensor). I am not going to use the script from dannybloe myself, but was interested in how it works.bizziebis wrote:It works fine with combined sensors. It's possible the script needs a small adjustment, at least in my case. I can add it to the wiki when I'm sure it doesn't break anything.ThinkPad wrote:Does this script need a sensor that only contains humidity? Or will it also work with a sensor that has both temperature and humidity (which most of the sensors have)
Well, I have a combined sensor myself and it works like a charm. Afaikbizziebis wrote:It works fine with combined sensors. It's possible the script needs a small adjustment, at least in my case. I can add it to the wiki when I'm sure it doesn't break anything.ThinkPad wrote:Does this script need a sensor that only contains humidity? Or will it also work with a sensor that has both temperature and humidity (which most of the sensors have)
Code: Select all
otherdevices_humidity[SENSOR_NAME]
Code: Select all
commandArray = {}
-- declare some constants
-- adjust to your specific situation
SAMPLE_INTERVAL = 5 -- time in minutes when a the script logic will happen
FAN_DELTA_TRIGGER = 3 -- rise in humidity needed for a bath that will trigger the fan
FAN_DELTA_TRIGGER2 = 6 -- rise in humidity needed for a shower that will trigger the fan
FAN_MAX_TIME = 20 -- maximum amount of sample cycles the fan can be on,
-- in case we never reach the target humidity
TARGET_OFFSET = 2 -- ventilator goes off if target+offset is reached
FAN_NAME = 'Ventilator 2' -- exact device name of the switch turning on/off the ventilator 2 (itho fan box stand 2)
FAN_NAME2 = 'Ventilator 3' -- exact device name of the switch turning on/off the ventilator 3 (itho fan box stand 3)
FAN_NAME3 = 'Ventilator 4' -- exact device name of the switch turning on/off the ventilator 4 (additional bathroom fan)
SENSOR_NAME = 'Badkamer' -- exact device name of the humidity sensor
TEST_MODE = false -- when true TEST_MODE_HUMVAR is used instead of the real sensor
TEST_MODE_HUMVAR = 'testHumidity' -- fake humidity value, give it a test value in domoticz/uservars
PRINT_MODE = false -- when true wil print output to log and send notifications
if PRINT_MODE == true then
print('Fan control')
end
-- get the global variables:
-- this script runs every minute, humCounter is used to create SAMPLE_INTERVAL periods
humCounter = tonumber(uservariables['humCounter'])
humidityTmin5 = tonumber(uservariables['humidityTmin5']) -- youngest reading
humidityTmin10 = tonumber(uservariables['humidityTmin10']) -- oldest reading
targetFanOffHumidity = tonumber(uservariables['targetFanOffHumidity']) -- target humidity
fanMaxTimer = tonumber(uservariables['fanMaxTimer'])
fanFollowsProgram = tonumber(uservariables['fanFollowsProgram']) -- marker indicating that the programm is runing for a bath
fan3FollowsProgram = tonumber(uservariables['fan3FollowsProgram']) -- marker indicating that the programm is runing for a shower
target = 0 -- will hold the target humidity when the program starts
-- get the current humidity value
if (TEST_MODE) then
current = tonumber(uservariables[TEST_MODE_HUMVAR])
else
current = otherdevices_humidity[SENSOR_NAME]
end
-- check if the sensor is on or has some weird reading
if (current == 0 or current == nil) then
print('current is 0 or nil. Skipping this reading')
return commandArray
end
if PRINT_MODE == true then
print('Current humidity:' .. current)
print('targetFanOffHumidity:' .. targetFanOffHumidity)
print('humidityTmin5: ' .. humidityTmin5)
print('humidityTmin10: ' .. humidityTmin10)
print('fanMaxTimer: ' .. fanMaxTimer)
print('humCounter:' .. humCounter)
print('fanFollowsProgram:' .. fanFollowsProgram)
print('fan3FollowsProgram:' .. fan3FollowsProgram)
end
-- increase cycle counter
humCounter = humCounter + 1
if (humCounter >= SAMPLE_INTERVAL) then
if (humidityTmin5 == 0) then
-- initialization, assume this is the first time
humidityTmin5 = current
humidityTmin10 = current
end
humCounter = 0 -- reset the cycle counter
-- pick the lowest history value to calculate the delta
-- this also makes sure that two relative small deltas in the past 2*interval minutes are treated as one larger rise
-- and therefore will still trigger the ventilator
-- I don't want to use a longer interval instead because I want the ventilator to start as soon as possible
-- (so rather after 5 minutes instead of after 15 minutes because the mirrors in the bathroom become kinda useless ;-)
delta = current - math.min(humidityTmin10, humidityTmin5)
if PRINT_MODE == true then
print('Delta: ' .. delta)
end
-- pick the lowest history value
target = math.min(humidityTmin10, humidityTmin5) + TARGET_OFFSET
-- shift the previous measurements
humidityTmin10 = humidityTmin5
-- and store the current
humidityTmin5 = current
if (otherdevices[FAN_NAME]=='Off' or (otherdevices[FAN_NAME]=='On' and fanFollowsProgram==0)) then
-- either the fan is off or it is on but the decrease program has not started
-- in that latter case we start the program anyway. This could happen if someone turns on the ventilator
-- manually because he/she is about to take a shower and doesn't like damp mirrors.
-- I don't do this because the ventilator removes heat from the bathroom and I want this to happen
-- as late as possible ;-)
if (fanFollowsProgram == 1 and otherdevices[FAN_NAME]=='Off') then
-- likely someone turned off the ventilator while the program was running
fanFollowsProgram = 0
end
-- see if we have to turn it on for the shower
if (delta >= FAN_DELTA_TRIGGER2) then
-- time to start the extra fan
commandArray[FAN_NAME] = 'On'
commandArray[FAN_NAME2] = 'On'
commandArray[FAN_NAME3] = 'On'
targetFanOffHumidity = target
fanFollowsProgram = 1
fan3FollowsProgram = 1
-- set the safety stop
fanMaxTimer = FAN_MAX_TIME
if PRINT_MODE == true then
print('Large rise in humidity. Turning on the exra vent. Delta: ' .. delta)
print('Target humidity for turning the ventilator: ' ..targetFanOffHumidity)
commandArray['SendNotification'] = 'Ventilator is on#The extra ventilator was activated at humidity level ' .. current .. '#0'
end
end
-- see if we have to turn it on for the bath
if (delta >= FAN_DELTA_TRIGGER) then
-- time to start the fan
commandArray[FAN_NAME] = 'On'
commandArray[FAN_NAME2] = 'On'
targetFanOffHumidity = target
fanFollowsProgram = 1
-- set the safety stop
fanMaxTimer = FAN_MAX_TIME
if PRINT_MODE == true then
print('Rise in humidity. Turning on the vents. Delta: ' .. delta)
print('Target humidity for turning the ventilator: ' ..targetFanOffHumidity)
commandArray['SendNotification'] = 'Ventilator is on#The ventilator was activated at humidity level ' .. current .. '#0'
end
end
else
if (fanMaxTimer > 0) then
-- possible that someone started the ventialator manually
fanMaxTimer = fanMaxTimer - 1
end
if (fanFollowsProgram == 1) then -- not manually started
if (delta >= FAN_DELTA_TRIGGER) then
-- ok, there is another FAN_DELTA_TRIGGER rise in humidity
-- when this happen we reset the fanMaxTimer to a new count down
-- because we have to ventilate a bit longer due to the extra humidity
if PRINT_MODE == true then
print('Another large increase detected, resetting max timer. Delta: ' .. delta)
end
fanMaxTimer = FAN_MAX_TIME
end
-- first see if it can be turned off
if (current <= targetFanOffHumidity or fanMaxTimer==0) then
commandArray[FAN_NAME] = 'Off'
commandArray[FAN_NAME2] = 'Off'
commandArray[FAN_NAME3] = 'Off'
msg = ''
if (fanMaxTimer == 0 and current > targetFanOffHumidity) then
msg = 'Target not reached but safety time-out is triggered.'
if PRINT_MODE == true then
print(msg)
end
else
msg = 'Target humidity reached'
if PRINT_MODE == true then
print(msg)
end
end
if PRINT_MODE == true then
print('Turning off the ventilator')
msg = msg .. '\nTurning off the ventilator'
end
targetFanOffHumidity = 0
fanMaxTimer = 0
fanFollowsProgram = 0
fan3FollowsProgram = 0
-- reset history in this case.. we start all over
-- Tmin10 is still in the 'ventilator=On'-zone
humidityTmin10 = humidityTmin5
if PRINT_MODE == true then
commandArray['SendNotification'] = 'Ventilator is off#' .. msg .. '#0'
end
else
-- we haven't reached the target yet
if PRINT_MODE == true then
print('Humidity delta: ' .. delta)
end
end
end
end
if PRINT_MODE == true then
print('New values >>>>>>>>>>>')
print('humidityTmin5: ' .. humidityTmin5)
print('humidityTmin10: ' .. humidityTmin10)
print('fanMaxTimer: ' .. fanMaxTimer)
print('humCounter:' .. humCounter)
print('fanFollowsProgram:' .. fanFollowsProgram)
print('fan3FollowsProgram:' .. fan3FollowsProgram)
print('------ target: ' .. targetFanOffHumidity)
end
end
-- save the globals
commandArray['Variable:humCounter'] = tostring(humCounter)
commandArray['Variable:humidityTmin10'] = tostring(humidityTmin10)
commandArray['Variable:humidityTmin5'] = tostring(humidityTmin5)
commandArray['Variable:targetFanOffHumidity'] = tostring(targetFanOffHumidity)
commandArray['Variable:fanMaxTimer'] = tostring(fanMaxTimer)
commandArray['Variable:fanFollowsProgram'] = tostring(fanFollowsProgram)
commandArray['Variable:fan3FollowsProgram'] = tostring(fan3FollowsProgram)
return commandArray
Well, for me it worked also.. Until I changed to a slave domoticz for retrieving this temp+humidity sensor. After that I couldn't use that piece of code anymore. Looks like not all sensor types in Domoticz are behaving the same.dannybloe wrote:
Well, I have a combined sensor myself and it works like a charm. Afaiktakes care of this.Code: Select all
otherdevices_humidity[SENSOR_NAME]
Code: Select all
if (otherdevices[FAN_NAME]=='Off' or (otherdevices[FAN_NAME]=='On' and fanFollowsProgram==0)) then
-- either the fan is off or it is on but the decrease program has not started
-- in that latter case we start the program anyway. This could happen if someone turns on the ventilator
-- manually because he/she is about to take a shower and doesn't like damp mirrors.
-- I don't do this because the ventilator removes heat from the bathroom and I want this to happen
-- as late as possible ;-)
if (fanFollowsProgram == 1 and otherdevices[FAN_NAME]=='Off') then
-- likely someone turned off the ventilator while the program was running
fanFollowsProgram = 0
end
I believe you doCybertom wrote:Hi,
I have a question about these 2 if statementsI'm not getting how the second if statement is working.Code: Select all
if (otherdevices[FAN_NAME]=='Off' or (otherdevices[FAN_NAME]=='On' and fanFollowsProgram==0)) then -- either the fan is off or it is on but the decrease program has not started -- in that latter case we start the program anyway. This could happen if someone turns on the ventilator -- manually because he/she is about to take a shower and doesn't like damp mirrors. -- I don't do this because the ventilator removes heat from the bathroom and I want this to happen -- as late as possible ;-) if (fanFollowsProgram == 1 and otherdevices[FAN_NAME]=='Off') then -- likely someone turned off the ventilator while the program was running fanFollowsProgram = 0 end
in my opinion when fanfollowsprogram = 1 and otherdevices[FAN_NAME]=='Off'
the first if statement is not true, so the second if statement never going to be executed.
But it does ?
Did i miss something?