Advertisement
Guest User

script_time_isdonkerbuiten.lua

a guest
Oct 9th, 2016
977
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.93 KB | None | 0 0
  1. --[[
  2.  
  3. script_time_isdonker.lua
  4. @author: Nicky Bulthuis
  5. @since: 2015-01-24
  6. @version: 0.1
  7.  
  8. Al enige tijd heb ik de wens om mijn verlichting in de woonkamer te kunnen schakelen middels een schermer sensor. Ik gebruik hiervoor een
  9. Kaku ABST-604 schemer sensor, maar elke schemer sensor zou moeten werken (denk ik). Ik wil het volgende bereiken:
  10.  
  11. * Schakelen zodra het donker wordt en als het weer licht wordt.
  12. * Schakelen bij bewolking.
  13. * Niet schakelen bij wat overwaaiende wolken.
  14.  
  15. Het schakelen op lichtsterkte kan door de ABST-604 instellen op 0 uren. De schemer sensor zal dan aan en uit schakelen op het ingestelde
  16. schemer niveau. Het probleem is vervolgens dat het vaak aan/uit zal schakelen zodra de ingestelde lichtsterkte bereikt wordt. Iets wat ik
  17. een flipstorm noem. Dit script probeert zo goed mogelijk om dat probleem heen te werken.
  18.  
  19. Het resultaat van die script is een Virtuele Switch genaaamd 'State - IsDonker' (of de door jou gekozen naam) welke aan de hand van wat
  20. instellingen de Schemer Sensor status gaat volgen. Je zult echter zien dat de 'State - IsDonker' schakelaar veel rustiger is dan de
  21. schemer sensor waardoor hij goed te gebruiken is voor bijvoorbeeld verlichting in de Woonkamer.
  22.  
  23. Benodigdheden:
  24.  
  25. * Een Schemer Sensor, bijvoorbeeld de Kaku ABST-604. Vul hiervan de naam in bij 'schemersensor'.
  26. * Een 'State - IsDonker' virtuele switch. Vul hiervan de naam in bij 'isdonker'.
  27. * Een 'IsDonker - Flipstorm' User Variabele. Vul hiervan de naam in bij 'flipstorm'.
  28. * Dit script, plaats deze in <DOMOTICZ>/scripts/lua/script_time_isdonker.lua
  29.  
  30. Vervolgens kun je de 'State - IsDonker' switch gebruiken in andere Lua scripts of Blocky Events.
  31.  
  32. De standaard instellingen zijn 3 minuten voor On en 5 minuten voor Off. Deze waarden zijn aan te passen door de variabelen flipstorm_on
  33. en flipstorm_off aan te passen. In andere woorden:
  34.  
  35. * elke minuut wordt het script aangeroepen (de minimale tijd mogelijk in Domoticz)
  36. * bij 3 maal een On gezien te hebben, schakelt de 'State - IsDonker' switch naar on.
  37. * bij 5 maal een Off gezien te hebben, schakelt de 'State - IsDonker' switch naar off.
  38.  
  39. Een overwaaiende wolk heeft dus 3 minuten de tijd om voorbij de schemersensor te waaien.
  40.  
  41. --]]
  42.  
  43. -- **********************************
  44. -- Settings
  45. -- **********************************
  46.  
  47. -- Logging: 0 = Geen, 1 = Beetje, 2 = Alles
  48. local verbose = 0
  49.  
  50. -- De naam van de schemer sensor.
  51. local schemersensor = 'SchemerschakelaarBuiten'
  52.  
  53. -- De naam van de isDonker virtuele switch.
  54. local isdonker = 'LichtBuitenWenselijk'
  55.  
  56. --
  57. -- Flipstorming en het detecteren van wolken.
  58. --
  59. -- Detecteren of het donker is buiten kan een zogenaamd flipstorm veroorzaken. Zo noem ik het snel aan, uit en weer aangaan van een
  60. -- device. Het komt het meest voor wanneer de hoeveelheid licht buiten het niveau bereikt waarop de schemer sensor staat ingesteld.
  61. -- Je zult dan zien dat de schemer sensor meerdere keer aan en uit zal schakelen. Omdat we niet willen dat bijvoorbeeld de verlichting
  62. -- ook aan en uit schakeld zullen we moeten controleren of we in een flipstorm zitten.
  63. --
  64. -- Een andere probleem is de aanwezigheid van wolking. Doordat een work het licht van de zon blokeert zal de schemer sensor aan schakelen.
  65. -- Echter, hoeft de verlichting echt niet aan voor een enkele wolk, deze zal immers na korte tijd weer verdwenen zijn. Het voorbij waaien
  66. -- van een wolk kan ook een flipstorm veroorzaken.
  67. --
  68. -- We kunnen hierom heen werken door bij te houden hoevaak we aan, dan wel uit switchen. We doen dit door een User Variabele bij te houden
  69. -- van het type integer. Elke keer als we On zien tellen we er één bij op, als we na 'x' aantal keren On nog steeds geen Off gezien hebben
  70. -- gaan we er vanuit dat het geen flipstorm betreft. Het zelfde geld uiteraar voor het uitschakelen.
  71. --
  72.  
  73. -- De naam van de User Variable voor het tellen van de flipstorm, type integer, zet hem op 0.
  74. local flipstorm = 'IsDonker - Flipstorm (buiten)'
  75.  
  76. -- Het aantal minuten/keer dat we de schemer sensor op On willen zien voordat we de IsDonker switch op On zetten.
  77. local flipstorm_on = 3
  78.  
  79. -- Het aantal minuten/keer dat we de schemer sensor op Off willen zien voordat we de IsDonker switch op Off zetten.
  80. local flipstorm_off = 5
  81.  
  82. --
  83. -- Een voorbeeld:
  84. -- Laten we van bovenstaande instellingen uitgaan. Het is 14:00, twee wolken komen overwaaien:
  85. -- 14:00 -> IsDonker = Off
  86. -- 14:01 -> IsDonker = Off => De eerste wolk blokkeerd de schemer sensor en springt dus op On. IsDonker - Flipstorm -> 0 - 1.
  87. -- 14:02 -> IsDonker = Off => De eerste wolk is voorbij, maar de tweede blokkeerd nu onze sensor. IsDonker - Flipstorm -> 1 - 2.
  88. -- 14:03 -> IsDonker = Off => De tweede wolk is voorbij en de schemer sensor springt weer op Off. IsDonker - Flipstorm -> reset naar 0.
  89. -- 14:04 -> IsDonker = Off => De wolken zijn dus voorbij, het maakte totaal niet uit hoevaak de schemer sensor op on/off ging. IsDonker is niet veranderd.
  90.  
  91. -- Tweede voorbeeld:
  92. -- Wederom bovenstaande instellingen, maar nu komt er een flink bewolking aan:
  93. -- 14:00 -> IsDonker = Off
  94. -- 14:01 -> IsDonker = Off => Het stormfront blokkeerd onze sensor. IsDonker - Flipstorm -> 0 - 1.
  95. -- 14:02 -> IsDonker = Off => Het stormfront blokkeerd nog steeds onze sensor. IsDonker - Flipstorm -> 1 - 2.
  96. -- 14:03 -> IsDonker = Off => Het stormfront blokkeerd nog steeds onze sensor. IsDonker - Flipstorm -> 2 - 3.
  97. -- 14:04 -> IsDonker = On => Het stormfront blokeerd nog steeds de sensor, dus waarschijnlijk geen flipstorm/wolk. IsDonker - Flipstorm -> blijft op 3.
  98. -- 14:05 -> IsDonker = On => IsDonker is naar On geschakeld en kan nu gebruikt worden om bijvoorbeeld verlichting aan te zetten.
  99. --
  100. -- Andersom werkt het natuurlijk precies hetzelfde.
  101.  
  102. -- **************************************************************************************************************************************************
  103. -- **************************************************************************************************************************************************
  104. --
  105. -- Main script. You (as a user) should not modify anything beyond this point. However if you do, repair a bug, add an enhancement. Please share it so
  106. -- all will benefit from it.
  107. --
  108. -- **************************************************************************************************************************************************
  109. -- **************************************************************************************************************************************************
  110.  
  111. --
  112. -- Debug logging.
  113. --
  114. function debug(msg)
  115.  
  116. if verbose >= 2 then
  117. print('IsDonker[DEBUG] ==> ' .. msg)
  118. end
  119.  
  120. end
  121.  
  122. --
  123. -- Info logging.
  124. --
  125. function info(msg)
  126.  
  127. if verbose >= 1 then
  128. print('IsDonker[INFO] ==> ' .. msg)
  129. end
  130.  
  131. end
  132.  
  133. --
  134. -- Error logging.
  135. --
  136. function error(msg)
  137.  
  138. print('IsDonker[ERROR] ==> ' .. msg)
  139.  
  140. end
  141.  
  142. --
  143. -- Validates the configuration
  144. --
  145. function validate()
  146.  
  147. result = true
  148.  
  149. if not uservariables[flipstorm] then
  150. error('User Variable [' .. flipstorm .. '] bestaat niet.')
  151. result = false
  152. end
  153.  
  154. if not otherdevices[isdonker] then
  155. error('Device [' .. isdonker .. '] bestaat niet.')
  156. result = false
  157. end
  158.  
  159. if not otherdevices[schemersensor] then
  160. error('Device [' .. schemersensor .. '] bestaat niet.')
  161. result = false
  162. end
  163.  
  164.  
  165. return result
  166.  
  167. end
  168.  
  169. --
  170. -- Tests of de IsDonker mag veranderen.
  171. --
  172. function may_update(is_donker)
  173.  
  174. counter = tonumber(uservariables[flipstorm])
  175. current_counter = counter
  176.  
  177. -- set the counter.
  178. if is_donker and counter >= 0 then
  179. counter = math.min(flipstorm_on, counter + 1)
  180. elseif not is_donker and counter <= 0 then
  181. counter = math.max(flipstorm_off * -1, counter - 1)
  182. else
  183. counter = 0
  184. end
  185.  
  186. if counter ~= current_counter then
  187. commandArray['Variable:' .. flipstorm]=tostring(counter)
  188. end
  189.  
  190. result = false
  191.  
  192. if is_donker and counter >= flipstorm_on then
  193. result = true
  194. elseif not is_donker and math.abs(counter) >= flipstorm_off then
  195. result = true
  196. end
  197.  
  198. debug('UserVar=[' .. flipstorm .. '] Counter=[' .. counter .. '] MayUpdate=[' .. tostring(result) .. ']')
  199.  
  200. return result
  201.  
  202. end
  203.  
  204. --
  205. -- Aanpassen status van IsDonker. .
  206. --
  207. function on_off(is_donker)
  208.  
  209. update_allowed = may_update(is_donker)
  210.  
  211. info('OnOff State[' .. otherdevices[isdonker] .. '] UpdateAllowed[' .. tostring(update_allowed) ..'] IsDark[' .. tostring(is_donker) .. ']')
  212.  
  213. if update_allowed then
  214. if otherdevices[isdonker] == 'Off' and is_donker then
  215. commandArray[isdonker]='On'
  216. elseif (otherdevices[isdonker] == 'On' and not is_donker) then
  217. commandArray[isdonker]='Off'
  218. end
  219. end
  220.  
  221. end
  222.  
  223. --
  224. -- Is de Schemer Sensor On.
  225. --
  226. function is_schemersensor_aan()
  227.  
  228. result = false
  229. result = otherdevices[schemersensor] == 'On'
  230. debug('SchemerSensor Current[' .. otherdevices[schemersensor] .. '] = ' .. tostring(result))
  231. return result
  232. end
  233.  
  234. commandArray = {}
  235.  
  236. if validate() then
  237. on_off(is_schemersensor_aan())
  238. end
  239. return commandArray
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement