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 that will trigger the fan
FAN_MAX_TIME = 24 -- 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
-- (maybe it takes too long to reach the true target due to wet towels etc)
FAN_NAME = 'FAN3' -- exact device name of the switch turning on/off the ventilator
SENSOR_NAME = 'Luchtv. 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
-- decrease program is started
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)
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 do not 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 <img draggable="false" class="emoji" alt="
" src="https://s.w.org/images/core/emoji/11/svg/1f609.svg"> 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 <img draggable="false" class="emoji" alt="
" src="https://s.w.org/images/core/emoji/11/svg/1f609.svg">
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
if (delta >= FAN_DELTA_TRIGGER) then
-- time to start the fan
commandArray[FAN_NAME] = 'On'
targetFanOffHumidity = target
if (fanFollowsProgram == 1) then
print('Ventilator was already on but we start the de-humidifying program')
end
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'
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
-- 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('------ 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)
return commandArray
Ik ben een noob met Lua en bovenstaande kreeg ik met blocky niet voor elkaar. Ik zat nogal te stoeien met tijden en vaste vochtigheidpercentages.
Dit script (samen met de script van gecombineerde sensor) is precies wat ik nodig had. Nu gaat de MV veel sneller aan en weer uit en ben daarom zeer blij dat jij jouw project wilde delen.
Ik gebruik de Everspring ST814 Temperature and Humidity Sensor.
Heel erg bedankt.
Ik houd je website en projecten in de gaten.
Hallo Joost,
Ben al een paar dagen aan het pielen met dit script en het wil maar niet lukken.
Als ik de douche aanzet springt hij netjes aan en zie je ook in de variabelen het vochtgehalte netjes oplopen. Maar het duurt echter geen 5 minuten om T5 of T10 te vullen met waarden. Deze komen er meteen in. Wat ik dan wel zie terwijl de afzuiging aan is is targetFanOffHumidity bijvoorbeeld 35, maar als de douche uit gezet wordt dan springt deze na minder dan 1 minuut op 0.
Hij springt dus tijdens het douchen al meerdere malen uit en weer aan en dat terwijl het vochtgehalte steeds oploopt of gelijk blijft.
Ik heb al door het hele script gelopen en heb dit 1 op 1 overgenomen en alleen mijn FAN en SENSOR erin gezet. Ben wel al met de waarden 5 en 24 aan het spelen geweest, maar ook daarmee blijft het gelijk.
Heb jij een oplossing hiervoor?
Het is al in orde. Has dit LUA script in Domoticz gebruikt op mijn Synology en moest dus bij de dropdown Time selecteren i.p.v. All.
Weet niet of je dit op de Pi ook moet instellen om te laten werken, maar heb er even geen liggen waar Domoticz op staat dus dat heb ik niet kunnen testen.
Probleem is dus hiermee opgelost. Stom dat ik het over het hoofd gezien heb. Misschien wel handig om dit in je artikel te vermelden zodat anderen hier ook wat aan hebben.
Script werkt dus perfect en een bedankje hiervoor lijkt me wel op zijn plaats.
Bedankt Joost.
Hi Joost,
Probeer dit met Domoticz op de Synology met een Sonoff.
Uit voorzorg eerst “droog” getest.
Schakelt bij RV+3% binnen vijf minuten.
Nu op zoek naar een goede buisventilator en bedenken waar ik de sensor ga plaatsen.
Ik ga testen met een bypass (een Y-stuk op zijn kop) in de buis boven het plafond, dan kan ik de sensor, de Sonoff en de fan makkelijk bereiken en onderhouden op de verdieping erboven.
Ik krijg de volgende foutmelding:
Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_humidity.lua: /home/pi/domoticz/scripts/lua/script_time_humidity.lua:75: bad argument #1 to ‘min’ (number expected, got nil)
Controleer of de user variable humidityTmin5 en humidityTmin10 goed zijn aangemaakt.
Ik heb het allemaal gekopieerd dus ziet er normaal uit.
2019-10-03 09:00:00.271 Status: LUA: Current humidity:62
2019-10-03 09:00:00.271 Status: LUA: targetFanOffHumidity:0
2019-10-03 09:00:00.271 Status: LUA: humidityTmin5: 0
2019-10-03 09:00:00.271 Error: EventSystem: in script_time_humidity.lua: [string “commandArray = {} …”]:51: attempt to concatenate global ‘humidityTmin10’ (a nil value)
Als hij bij mij op humcounter 4 is, krijg ik in het log een melding en ook al is de juiste vochtigheidsgraad bereikt gaat hij niet meer uit en loopt het script ook niet meer elke minuut.
/home/pi/domoticz/scripts/lua/script_time_humidity.lua: /home/pi/domoticz/scripts/lua/script_time_humidity.lua:153: attempt to compare number with nil
soms ook op regel 119
correctie : regel 119 is het .
if (fanMaxTimer > 0) then
— possible that someone started the ventialator manually
fanMaxTimer = fanMaxTimer – 1
end
Ik heb nu hetzelfde probleem . Hoe heb jij dat opgelost?
Vandaag domoticz geupdate naar (stable) versie 2020.1. Na de update krijg ik een foutmelding in mijn log van domoticz:
2020-03-23 19:49:00.573 Error: EventSystem: Error updating variable humidityTmin5: Not a valid integer
Enig idee wat hier het probleem zou kunnen zijn?
gr
same here, i follow
Hier hetzelfde probleem na update 2020.1
Ik krijg een foutmelding in regel 60 [string “commandArray = {}…”]:60: ‘)’ expected near ‘;’
Regel 60: if (humCounter >= SAMPLE_INTERVAL) then
Waar gaat het niet goed?
Het blijkt dat met knippen/plakken de code niet goed is meegenomen ipv het > teken komt er >: in de code te staan. Nu wel het probleem dat de humidityTmin5 en 10 “not a valid integer” zijn. Ik heb domoticz ook geupdate naar 2020.1
Ik heb dit ook met Blockly geprobeerd maar hij schakelde gewoon niet in.
Nu met dit script schakelt hij wel in als je even onder de douche staat maar hij schakelt veel te snel weer uit. Net was hij al uit en ging de luchtvochtigheid nog van 91% naar 92%.
Wat is er mis?
Vanuit het “Domoticz version 2020.1 released (Stable)” forum is er antwoord gegeven op het “not a valid integer probleem”.
Looking at this source and the error message it looks like the domoticz uservariable is defined as integer and the script expects it to be string.
Can you check how the uservariables are set in domoticz ?
Met deze aanpassing geen fouten meer gezien.
Hallo,
Ik heb het dezelfde probleem,
2020-04-03 10:58:37.375 Error: EventSystem: Error updating variable humidityTmin5: Not a valid integer
2020-04-03 10:58:37.376 Error: EventSystem: Error updating variable humidityTmin10: Not a valid integer
wat ik kan vinden is..
Try changing humidityTmin5 to math.floor(humidityTmin5) in the line where you get this error.
ik krijg geen line nr. door dus weet niet wat ze bedoelen.
van welke site heb jij dit probleem opgelost?
mvg Erwin
Hi,
De gebruiksvariabelen Tmin5 en Tmin10 zijn gemaakt als type “integer”. Als je deze verander naar “string” dan werkt alles weer.
Hi Remelco,
Zou je een deel van het script (of desnoods het hele script) kunnen plaatsen want ik heb geen idee hoe ik dit moet aanpakken?
Bij voorbaat dank!
Diederik,
Het is het script als zoals beschreven aan het begin van dit Topic.
Hier staat ook beschreven hoe je een user variabele aanmaakt.
User Variables
Allereerst dienen we een aantal gebruikersvariabelen aan te maken: SETPU > MORE OPTIONS > USER VARIABLES. Maak onderstaande variabelen aan (wijzig de naam niet en zet de waarde op “0” !).
humCounter (type=integer, value=0)
humidityTmin5 (type=integer, value=0)
humidityTmin10 (type=integer, value=0)
targetFanOffHumidity (type=integer, value=0)
fanMaxTimer (type=integer, value=0)
fanFollowsProgram (type=integer, value=0)
Echter moet humidityTmin5 en humidityTmin10 het type= string zijn (en niet meer integer zoals hierboven beschreven)
Werkt perfect, dank je wel!
Ik had hetzelfde probleem. Het script heb ik gelaten voor wat het was maar ik heb in Domoticz onder Setup –> More options –> User variables de humidityTmin5 en humidityTmin10 veranderd naar “string” Deze stonden op “integer”.
Hiermee werkt het weer.
Ik heb een nieuwe NAS. Programma opnieuw in Domoticz gezet. Echter komt nu foutmelding “attempt to compare number with nil” in beeld.
Iemand een idee hoe ik dit kan oplossen?
Hallo, hier ook een Domoticz fan zonder al teveel skills vwb LUA
Een vraagje:
Ik had ruim voordat ik aan Domoticz begin zelf al een KAKU gemaakt op miujn centrale afzuiging, dus ik heb momenteel een switch binnen Domoticz die gewoon AAN of UIT kan. (Bij AAN gaat de afzuiging op stand 3, bij UIT gaat de afzuiging op stand 1).
Voor de de duidelijkheid:
Ik heb een sensor besteld (de TFA Dostmann 30.3139) en wil deze koppelen en gebruiken met een script. Wat ik dus wil: Automatisch AAn en UIT als de luchtvochtigheid hoog is (grens bij 55%, want als ik een paar dagen niet douche is het altijd zo rond de 50% a 52%, bij douchen loopt het op tot 99% (verder kan de sensor niet die ik nu even gebruik om die waardes te bekijken).
Kan ik het script van hier daarvoor gebruiken?
Omdat mijn switch de naam ‘Afzuiging’ heeft zal ik waarschijnlijk de naam bijvoorbeeld al moeten aanpassen? En wss ook wel een wijziging in de standen (fan1, fan2 en fan3 want dat heb ik niet).
Hopelijk heeft iemand advies, thanks!
JP
Beste JP
Ook ik maak gebruik van Kaku om de afzuiging te schakelen. En idd ook geen echt “Lua”scripter. Hetgeen ik hier schrijf staat kan dan ook niet tippen aan het script maar werkt redelijk.
Het geeft je in elk geval wat tijd om met het script te experimenteren.
Even vooraf
Vocht varieert in mijn huis tussen de 50-60% met af en toe een uitschieter
Badkamer bij douchen of badderen komt makkelijk boven 75%.
Via blockly een routine aangemaakt die in het kort op het volgende neer komt.
Afzuiging gaat aan bij “licht aan”
Afzuiging gaat aan bij “vocht >70%”
Afzuiging gaat automatisch “uit na 60min” (en dus weer aan als vocht te hoog is)
Nadeel van dit “blockly”
Ook als je het licht 2 seconden aan hebt blijft je afzuiger 60min draaien.
Als je huis boven 70% komt blijft het draaien.
Houdt geen rekening met vochtigheid in huis.
Er is geen echt commando “Afzuiging Uit”
Neem in elk geval de trigger “vocht” ruim, met 2-3% verschil met normaal staat het ding de hele dag te “klapperen”.
Succes
Hallo Henk, dank voor je reactie!
Ik zal even kijken wat ik er precies van ga bakken, zal een combi worden van meerdere scripts.
Liefst gewoon een Blockly die zegt: “als de luchtvochtigheid hoger is dan 55% ga dan aan, totdat de luchtvochtigheid weer 55% is”.
Wacht nog even op de sensor en ga dan testen.
Hoop dat ik gewoon met blockly dat >55% kan gebruiken, de rest is niet nodig.
Kan binnen Domoticz sowieso iedere switch eenvoudig timen, dus gaat uit na bv 2 uur etc, dat zit wel goed.
Vraag me af wat in de praktijk gebeurt als ie de waardes vergelijkt en hoe vaak hij aangaat (en hoe lang).
Ik monitor de percentages al een tijdje en na ca 1,5 tot max 2 uur is het altijd weer
Gr J.P
Hallo, kan iemand mij een lucjtvochtigheidsensor adviseren die 100% werkt binnen Domoticz?
Ik heb nu al de 2e TFA geprobeerd, maar beide worden niet gevonden binnen de apparaten.
Probeer het nu met het model: TFA Dostmann 30.3221.02 Combisensor Draadloos 433 MHz
(zie: > https://www.conrad.nl/p/tfa-dostmann-30322102-combisensor-draadloos-433-mhz-1642587 )
Of doe ik iets fout?
Heb binnen Domoticz het ‘toelaten gedurende 5 minuten’ aangevinkt.
Alles tips zijn welkom!
EDIT:
Volgens de online verkoper (winkel) zou dit model moeten werken…we gaan het zien komende dagen > “BR-7009993 Thermo Hygro sensor” (Zal de uitkomst nog even posten tzt)
zo, een update:
Heb uiteindelijk deze sensor gekocht:
https://weerhuisje.nl/nl/accessoires/bresser/br-7009993-thermo-hygro-sensor/a-14808-10000095
Met dit LUA-script de luchtvochtigheid gesplitst van de temperatuur
https://ehoco.nl/gecombineerde-sensor-in-domoticz-splitsen/
Een een Blockly gemaakt met:
Als luchtvochtigheid = >55% > afzuiging AAN
Als luchtvochtigheid = afzuiging UIT
Heb een maand de luchtvochtigheid bijgehouden, is op zn laagste 45%, loopt zeer snel op bij douchen tot einde bereik vd sensor (99%). Prima als ie rond de 55% weer stopt.
Nu testen met waardes, maar veel makkelijker dan de LUA’s die ik zag en foutmeldingen gaven
super mooi dat dit kan maar helaas ben ik al een paar dagen aan het rommelen met deze foutmelding: Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_humidity.lua: attempt to compare number with nil
Script gekopieerd en zoals in eerdere reacties humidityTmin5 en humidityTmin10 het type= string zijn (en niet meer integer zoals hierboven beschreven) aangepast. Toch veranderd de waarde humCounter elke keer naar 4.
Huidige setup die ik gebruik:
Raspberry met Domoticz 2020.2 (build 13058)
Sonoff TH16 6.6.0(release-sonoff)
De Sonoff zou moeten schakelen tussen uit/aan geen stand 1,2 of 3
Iemand een idee hoe ik dit aan de gang krijg
Script werk perfect. Was alleen benieuwd of het ook aangepast kan worden met 2.standen op de ventilator.
Mogguh, toch nog een vraagje;
Als ik wil dat de afzuiging wat gevoeliger wordt, dus eerder aangaat.
Wat kan ik het beste wijzigen?
SAMPLE_INTERVAL = 5 > deze tijd verkorten naar bv 3 minuten?!
FAN_DELTA_TRIGGER = 3 > deze waarde verlagen naar bv 2 zodat het verschil in waarde X – Y kleiner hoeft te zijn voordat eea getriggerd wordt?
Of een combi van beide waardes?
Ik ga er nu even mee testen, maar hoor graag wat wijsheid is.
Greetz
Bij mij is fan delta niet zo belangrijk want bij douchen gaat hij toch ineens >10/20 of zo. Zou dan inderdaad de tijd verkorten.
De fan_delta geeft bepaald het verschil tussen aan en uit.
Als je dit verschil te klein maakt (bv 1) dan zou de fan bijvoorbeeld op 51% aan gaan om op 50% weer uit te gaan.
Met een delta=3 zou dit 54 aan en 50 uit zijn.
Je wilt (denk ik niet dat de ventilatie al aan gaat als je heet water pakt waardoor de vochtigheid slechts 1 of 2 % stijgt.
Wil je het systeem sneller laten reageren dan kun je het beter vaker laten testen.
Dit doe je door de interval kleiner te maken.
Ps.
Delta 3 is overigens geen 3% maar dat heb ik even als voorbeeld gebruikt
Thanks! Heb de SAMPLE-INTERVAL verlaagd naar 3 en merkte tot twee keer toe dat ie an na 2 minuten douchen aansprong. Helemaal top!
PS Zie wel dat ik altijd bij het aangaan (alleen bij AAN) van de fan een foutmelding krijg; is dit omdat hij dan nog geen referentiegetal heeft of iets dergelijks?
Dit is de melding:
“EventSystem: Error updating variable targetFanOffHumidity: Not a valid integer”
een korte vraag:
Soms duurt het best lang voordat de afzuiging aangaat, nu is het wel binnen 5 minuten, maar ik merk dat ik het fijner vind als hij al aanstaat bij de start van het douchen.
Als ik nu handmatig de fan aanzet, wat doet het script dan?
Er staat het volgende in het script:
else
if (fanMaxTimer > 0) then
— possible that someone started the ventialator manually
fanMaxTimer = fanMaxTimer – 1
end
Hoe moet ik dit lezen?
Kan ik dit doen en gaat het script dan vervolgens gewoon netjes meten, ondanks het feit dat de fan al aan is? Niet dat ik hem overrule en dat het script stopt zeg maar.
“