Guest User

Untitled

a guest
Jan 23rd, 2018
326
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.92 KB | None | 0 0
  1. -- Huisstatus Normaal
  2. function alarmShorter(old, new)
  3. if (old ~= new) then
  4. grp.write('1/3/34', new)
  5. end
  6. end
  7.  
  8. -- De status van het pand mag zijn: Thuis/Korte afwezigheid/Lang afwezig/Bewaken/Nacht/Gast/Niet Storen/Handbediening.
  9. value = grp.getvalue('1/3/32')
  10. alarm = grp.getvalue('1/3/34')
  11.  
  12. if value == 0 then
  13. grp.write('32/1/3', "Thuis")
  14. alarmShorter(alarm, 0)
  15. elseif value == 1 then
  16. grp.write('32/1/3', "Kort afwezig")
  17. alarmShorter(alarm, 1)
  18. elseif value == 2 then
  19. grp.write('32/1/3', "Lang afwezig")
  20. alarmShorter(alarm, 1)
  21. elseif value == 3 then
  22. grp.write('32/1/3', "Bewaken")
  23. alarmShorter(alarm, 1)
  24. elseif value == 4 then
  25. grp.write('32/1/3', "Nacht")
  26. alarmShorter(alarm, 0)
  27. elseif value == 5 then
  28. grp.write('32/1/3', "Gast")
  29. alarmShorter(alarm, 0)
  30. elseif value == 6 then
  31. grp.write('32/1/3', "Niet storen")
  32. alarmShorter(alarm, 0)
  33. elseif value == 7 then
  34. grp.write('32/1/3', "Hanbediening")
  35. alarmShorter(alarm, 0)
  36.  
  37. script.disable('Camerabeweging')
  38. script.disable('Lichtsensor')
  39. script.disable('Bewegingssensor')
  40. script.disable('Verlichting')
  41. script.disable('Audiodetectie')
  42. end
  43.  
  44. if (value ~= 7) then
  45. script.enable('Camerabeweging')
  46. script.enable('Lichtsensor')
  47. script.enable('Bewegingssensor')
  48. script.enable('Verlichting')
  49. script.enable('Audiodetectie')
  50. end
  51.  
  52. -- Indien het pand op "afwezig" gezet wordt moet alle binnenverlichting worden uitgeschakeld.
  53. if (value == 1 or value == 2) then
  54. grp.write('1/0/5', 0)
  55. log('Indien het pand op "afwezig" gezet wordt moet alle binnenverlichting worden uitgeschakeld.')
  56. end
  57.  
  58. -- Huisstatus Panic
  59. -- Middels een drukknop wordt het huis PANIC gezet
  60. if (grp.getvalue('1/3/34') ~= 2) then
  61. setPanic(true)
  62. log('Middels een drukknop wordt het huis PANIC gezet.')
  63. end
  64.  
  65. -- Huisstatus Alarm
  66. value = grp.getvalue('1/3/34')
  67.  
  68. to = 'yanickvanbarneveld@gmail.com'
  69. alias_to = 'Yanick van Barneveld'
  70.  
  71. if value == 0 then -- Inactief
  72. subject = 'Alarm uitgeschakeld!'
  73. messagetxt = 'Het alarm in huis Alfa is zojuist uitgeschakeld!'
  74. mail(to, subject, messagetxt)
  75.  
  76. log('Indien het alarm uitgezet wordt moet er een mail gestuurd worden naar de eigenaar.')
  77.  
  78. setAlarm(false)
  79. elseif value == 1 then -- Actief
  80. subject = 'Alarm ingeschakeld!'
  81. messagetxt = 'Het alarm in huis Alfa is zojuist ingeschakeld!'
  82. mail(to, subject, messagetxt)
  83.  
  84. log('Indien het alarm aangezet wordt moet er een mail gestuurd worden naar de eigenaar.')
  85.  
  86. setAlarm(false)
  87. elseif value == 2 then -- Gaat af
  88. subject = 'Alarm gaat af!'
  89. messagetxt = "Het alarm in huis Alfa heeft een beweging gedetecteert, het alarm gaat af en de andere bewoners worden op de hoogte gebracht. Zie in de bijlage een afbeelding van de voordeur, indien noodzakelijk schakel de hulpdiensten in!"
  90. cameraurl = 'http://student:Studentdomo@10.0.0.202/jpg/1/image.jpg'
  91. filetype = 'jpg'
  92. bijlagenaam = 'Snapshot'
  93. mail_camera(to, alias_to, subject, messagetxt, cameraurl, filetype, bijlagenaam)
  94.  
  95. log('Indien een alarm optreedt dient er direct een mail naar de eigenaar gestuurd te worden.')
  96.  
  97. setPanic(false)
  98. setAlarm(true)
  99. elseif value == 3 then -- Storing
  100. subject = 'Alarm storing!'
  101. messagetxt = 'Het alarm in huis Alfa heeft een storing. Er wordt een mail verstuurd naar de beheerder van het Domoticasysteem zodat deze storing zo spoedig mogelijk kan worden opgelost.'
  102. mail(to, subject, messagetxt)
  103.  
  104. log('Indien het alarm een storing heeft moet er een mail gestuurd worden naar de eigenaar.')
  105. end
  106.  
  107. -- Lichtsensor
  108. -- Indien de lichtsterkte buiten onder de 300 LUX komt moet de buitenverlichting op 30% worden ingeschakeld.
  109. if (grp.getvalue('1/6/0') < 300) then
  110. grp.write('1/1/28', 30)
  111. log('Indien de lichtsterkte buiten onder de 300 LUX komt moet de buitenverlichting op 30% worden ingeschakeld.')
  112. end
  113.  
  114. -- Indien de lichtsterkte buiten boven de 600 LUX komt moet de buitenverlichting worden uitgeschakeld.
  115. if (grp.getvalue('1/6/0') > 600) then
  116. grp.write('1/1/28', 0)
  117. log('Indien de lichtsterkte buiten boven de 600 LUX komt moet de buitenverlichting worden uitgeschakeld.')
  118. end
  119.  
  120. -- Bewegingssensor
  121. -- De buitenverlichting moet op 100% ingeschakeld worden in geval van inbraakalarm.
  122. if (getHuisstatus() == 3 or getHuisstatus() == 2 or getHuisstatus() == 1) then
  123. if (grp.getvalue('1/6/1') == true and grp.getvalue('1/3/34') == 1) then
  124. grp.write('1/1/28', 100)
  125. grp.write('1/3/34', 2)
  126.  
  127. log('De buitenverlichting moet op 100% ingeschakeld worden in geval van inbraakalarm.')
  128. end
  129. end
  130.  
  131. -- Camerabeweging
  132. -- Indien camera een beweging detecteerd moet de buitenverlichting op 75% gezet worden gedurende 1 minuut.
  133. if (grp.getvalue('1/6/2') == true) then
  134. grp.write('1/1/28', 75)
  135.  
  136. log('Indien camera een beweging detecteerd moet de buitenverlichting op 75% gezet worden gedurende 1 minuut.')
  137. else
  138. grp.write('1/1/28', 0)
  139. end
  140.  
  141. -- Audiodetectie
  142. -- Indien camera een geluid detecteerd moet de buitenverlichting op 75% gezet worden gedurende 10 seconden.3
  143. if (grp.getvalue('1/6/3') == true and grp.getvalue('1/6/2') == false) then
  144. grp.write('1/1/28', 75)
  145.  
  146. log('Indien camera een geluid detecteerd moet de buitenverlichting op 75% gezet worden gedurende 10 seconden.')
  147. elseif (grp.getvalue('1/6/2') == false) then
  148. grp.write('1/1/28', 0)
  149. end
  150.  
  151. -- Disco
  152. value = grp.getvalue('32/1/11')
  153.  
  154. if (value == true) then
  155. log('Er moet een scene ontwikkeld worden waarmee alle aspecten van de bollamp tot zijn recht komen. De projectgroep moet hiervoor een goed voorstel doen aan de opdrachtgever.')
  156.  
  157. grp.write('1/1/12', 0)
  158. grp.write('1/1/13', 0)
  159. grp.write('1/1/14', 0)
  160.  
  161. grp.write('1/1/20', 0)
  162. grp.write('1/1/21', 0)
  163. grp.write('1/1/22', 0)
  164.  
  165. grp.write('1/0/13', 1)
  166. sleep(1)
  167. grp.write('1/0/13', 0)
  168.  
  169. grp.write('1/1/20', 255)
  170.  
  171. sleep(1)
  172.  
  173. grp.write('1/1/20', 0)
  174. grp.write('1/1/12', 255)
  175.  
  176. sleep(1)
  177.  
  178. grp.write('1/1/12', 0)
  179. grp.write('1/1/21', 255)
  180.  
  181. sleep(1)
  182.  
  183. grp.write('1/1/21', 0)
  184. grp.write('1/1/13', 255)
  185.  
  186. sleep(1)
  187.  
  188. grp.write('1/1/22', 255)
  189. grp.write('1/1/13', 0)
  190.  
  191. sleep(1)
  192.  
  193. grp.write('1/1/22', 0)
  194. grp.write('1/1/14', 255)
  195.  
  196. sleep(1)
  197.  
  198. grp.write('1/1/14', 0)
  199.  
  200. grp.write('1/0/13', 1)
  201. sleep(1)
  202. grp.write('1/0/13', 0)
  203.  
  204. grp.write('32/1/11', 0)
  205. end
  206.  
  207. -- Algemeen
  208. -- Datum
  209. grp.write('32/1/2', os.date('%B %d, %Y'))
  210.  
  211. -- Tijd
  212. grp.write('32/1/1', os.date('%H:%M'))
  213.  
  214. -- Buitentempratuur
  215. require('ssl.https')
  216. require('json')
  217.  
  218. data = ssl.https.request('http://weerlive.nl/api/json-10min.php?locatie=Utrecht')
  219. datatable = json.pdecode(data)
  220. datatable = datatable['liveweer'][1]
  221.  
  222. grp.write('32/1/4', datatable['temp'] .. '℃');
  223.  
  224. -- Huisstatuts
  225. -- Op de grafische front-end moet op een pagina de status (aanwezig/afwezig/alarm) te zien zijn van elk huis.
  226. function getHuisstatusExtern(huisnaam, huisstatus, panic, alarm)
  227. if (huisstatus == 1 or huisstatus == 2 or huisstatus == 3) then
  228. status = "Afwezig"
  229. else
  230. status = "Aanwezig"
  231. end
  232.  
  233. if (alarm == 2) then
  234. return status .. ' (Alarm)'
  235. elseif (panic == true or panic == 1) then
  236. return status .. ' (Panic)'
  237. else
  238. return status
  239. end
  240. end
  241.  
  242. grp.write('32/1/10', getHuisstatusExtern('Beta', grp.getvalue('2/3/27'), grp.getvalue('2/3/28'), grp.getvalue('2/3/29')))
  243. grp.write('32/1/9', getHuisstatusExtern('Gamma', grp.getvalue('3/3/32'), grp.getvalue('3/3/33'), grp.getvalue('3/3/34')))
  244. grp.write('32/1/5', getHuisstatusExtern('Delta', grp.getvalue('4/3/12'), grp.getvalue('4/3/13'), grp.getvalue('4/3/14')))
  245. grp.write('32/1/6', getHuisstatusExtern('Epsilon', grp.getvalue('5/3/50'), grp.getvalue('5/3/51'), grp.getvalue('5/3/52')))
  246. grp.write('32/1/8', getHuisstatusExtern('Theta', grp.getvalue('8/3/75'), grp.getvalue('8/3/76'), grp.getvalue('8/3/77')))
  247.  
  248. -- Verlichting
  249. -- De buitenverlichting dient automatisch aan te gaan bij zonsondergang.
  250. sunrise, sunset = rscalc(52.085665, 5.178099)
  251.  
  252. if (os.date('%H:%M') == os.date('%H:%M', sunset * 60)) then
  253. grp.write('1/1/10', 100)
  254. log('De buitenverlichting dient automatisch aan te gaan bij zonsondergang.')
  255. end
  256.  
  257. -- De buitenverlichting gaat om 11.30 uur op 40% vermogen indien de unit op bewaken staat.
  258. if (getHuisstatus() == 3 and os.date('%H:%M') == "11:30") then
  259. grp.write('1/1/10', 40)
  260. log('De buitenverlichting gaat om 11.30 uur op 40% vermogen indien de unit op bewaken staat.')
  261. end
  262.  
  263. -- Common Functies
  264. -- user function library
  265. function mail(to, subject, message)
  266. --Sender for e-mail
  267. from = '<domotica@vanduijn.xyz>'
  268. alias_from = 'Domotica - Huis Alfa'
  269.  
  270. --Create table to include mail settings
  271. local settings = {
  272. from = from,
  273. rcpt = to,
  274. --user = user,
  275. --password = password,
  276. server = 'vps.onoz.nl',
  277. port = 25,
  278. --secure = 'STARTTLS',
  279. }
  280.  
  281. --Load required modules to send email with attachment
  282. local smtp = require("socket.smtp")
  283.  
  284. --Create e-mail header
  285. settings.source = smtp.message{
  286. headers = {
  287. from = '' .. alias_from .. ' ' .. from .. '',
  288. to = '' .. alias_to .. ' ' .. to .. '',
  289. subject = subject
  290. },
  291.  
  292. --Load attachment inside body
  293. body = messagetxt
  294.  
  295. }
  296.  
  297. --Send the email
  298. r, e = smtp.send(settings)
  299.  
  300. --Create alert when sending gives an error with error message
  301. if (e) then
  302. log("Could not send email: ", e, "\n")
  303. alert("Could not send email: ", e, "\n")
  304. end
  305. end
  306.  
  307. -- mail camera
  308. function mail_camera(to, alias_to, subject, messagetxt, source_image_url, image_type, image_name_attachment)
  309. user = ''
  310. password = ''
  311.  
  312. --Sender for e-mail
  313. from = '<domotica@vanduijn.xyz>'
  314. alias_from = 'Domotica - Huis Alfa'
  315.  
  316. --Attachment and filetype (set filetype as 'gif', 'png', 'bmp', 'jpg' or 'jpeg' according image source)
  317. image_description = 'Schermafbeelding'
  318.  
  319. --Message on bottom of email (will only be showed when client don't understand attachment)
  320. epilogue = 'End of message'
  321.  
  322. --***********************************************************--
  323. --******************** End of parameters ********************--
  324. --***********************************************************--
  325. --********** DON'T CHANGE ANYTHING UNDER THIS LINE **********--
  326. --***********************************************************--
  327.  
  328. --Get remote (from HTTP) image and put image file to HL (will be deleted when end of script)
  329. os.execute('wget -O /www/scada/vis/' .. image_name_attachment .. '.' .. image_type .. ' ' .. source_image_url .. '')
  330.  
  331. --Create filename and location
  332. local fileName = '/www/scada/vis/' .. image_name_attachment .. '.' .. image_type
  333.  
  334. --Create table to include mail settings
  335. local settings = {
  336. from = from,
  337. rcpt = to,
  338. --user = user,
  339. --password = password,
  340. server = 'vps.onoz.nl',
  341. port = 25,
  342. --secure = 'STARTTLS',
  343. }
  344.  
  345. --Load required modules to send email with attachment
  346. local smtp = require("socket.smtp")
  347. local mime = require("mime")
  348. local ltn12 = require("ltn12")
  349.  
  350. --Create e-mail header
  351. settings.source = smtp.message{
  352. headers = {
  353. from = '' .. alias_from .. ' ' .. from .. '',
  354. to = '' .. alias_to .. ' ' .. to .. '',
  355. subject = subject
  356. },
  357.  
  358. --Load attachment inside body
  359. body = {
  360. -- the message content
  361. [1] = {
  362. body = messagetxt
  363. },
  364. --Bijlage
  365. [2] = {
  366. headers = {
  367. ["content-type"] = 'image/' .. image_type .. '; name="' .. image_name_attachment .. '.' .. image_type .. '"',
  368. ["content-disposition"] = 'attachment; filename="' .. image_name_attachment .. '.' .. image_type .. '"',
  369. ["content-description"] = '' .. image_description .. '',
  370. ["content-transfer-encoding"] = "BASE64"
  371. },
  372.  
  373. body = ltn12.source.chain(
  374. ltn12.source.file(io.open(fileName, "rb")),
  375. ltn12.filter.chain(
  376. mime.encode("base64"),
  377. mime.wrap()
  378. )
  379. )
  380. },
  381. epilogue = epilogue
  382. }
  383. }
  384.  
  385. --Send the email
  386. r, e = smtp.send(settings)
  387.  
  388. --Create alert when sending gives an error with error message
  389. if (e) then
  390. log("Could not send email: ", e, "\n")
  391. alert("Could not send email: ", e, "\n")
  392.  
  393. end
  394.  
  395. --Delete downloaded image file from HL
  396. os.remove(fileName)
  397. end
  398.  
  399. -- sunrise / sunset calculation
  400. function rscalc(latitude, longitude, when)
  401. local pi = math.pi
  402. local doublepi = pi * 2
  403. local rads = pi / 180.0
  404.  
  405. local TZ = function(when)
  406. local ts = os.time(when)
  407. local utcdate, localdate = os.date('!*t', ts), os.date('*t', ts)
  408. localdate.isdst = false
  409.  
  410. local diff = os.time(localdate) - os.time(utcdate)
  411. return math.floor(diff / 60) / 60
  412. end
  413.  
  414. local range = function(x)
  415. local a = x / doublepi
  416. local b = doublepi * (a - math.floor(a))
  417. return b < 0 and (doublepi + b) or b
  418. end
  419.  
  420. when = when or os.date('*t')
  421.  
  422. local y2k = { year = 2000, month = 1, day = 1 }
  423. local y2kdays = os.time(when) - os.time(y2k)
  424. y2kdays = math.ceil(y2kdays / 86400)
  425.  
  426. local meanlongitude = range(280.461 * rads + 0.9856474 * rads * y2kdays)
  427. local meananomaly = range(357.528 * rads + 0.9856003 * rads * y2kdays)
  428. local lambda = range(meanlongitude + 1.915 * rads * math.sin(meananomaly) + rads / 50 * math.sin(2 * meananomaly))
  429.  
  430. local obliq = 23.439 * rads - y2kdays * rads / 2500000
  431.  
  432. local alpha = math.atan2(math.cos(obliq) * math.sin(lambda), math.cos(lambda))
  433. local declination = math.asin(math.sin(obliq) * math.sin(lambda))
  434.  
  435. local LL = meanlongitude - alpha
  436. if meanlongitude < pi then
  437. LL = LL + doublepi
  438. end
  439.  
  440. local dfo = pi / 216.45
  441.  
  442. if latitude < 0 then
  443. dfo = -dfo
  444. end
  445.  
  446. local fo = math.min(math.tan(declination + dfo) * math.tan(latitude * rads), 1)
  447. local ha = 12 * math.asin(fo) / pi + 6
  448.  
  449. local timezone = TZ(when)
  450. local equation = 12 + timezone + 24 * (1 - LL / doublepi) - longitude / 15
  451.  
  452. local sunrise, sunset = equation - ha, equation + ha
  453.  
  454. if sunrise > 24 then
  455. sunrise = sunrise - 24
  456. end
  457.  
  458. if sunset > 24 then
  459. sunset = sunset - 24
  460. end
  461.  
  462. return math.floor(sunrise * 60), math.ceil(sunset * 60)
  463. end
  464.  
  465. -- Alarm
  466. -- De buitenverlichting moet op 100% ingeschakeld worden in geval van inbraakalarm.
  467. function setAlarm(active)
  468. value = grp.getvalue('1/3/34')
  469.  
  470. grp.write('1/1/12', 0)
  471. grp.write('1/1/13', 0)
  472. grp.write('1/1/14', 0)
  473.  
  474. grp.write('1/1/20', 0)
  475. grp.write('1/1/21', 0)
  476. grp.write('1/1/22', 0)
  477.  
  478. grp.write('1/0/13', 0)
  479. grp.write('1/1/28', 0)
  480.  
  481. -- Alarm
  482. if (grp.getvalue('1/3/34') == 2 and active == true) then
  483. grp.write('1/3/33', false)
  484.  
  485. repeat
  486. grp.write('1/1/28', 100)
  487.  
  488. if (grp.getvalue('1/1/20') == 255) then
  489. grp.write('1/0/13', 1)
  490. else
  491. grp.write('1/0/13', 0)
  492. end
  493.  
  494. if (grp.getvalue('1/1/20') == 255) then
  495. grp.write('1/1/20', 0)
  496. grp.write('1/1/12', 0)
  497. else
  498. grp.write('1/1/20', 255)
  499. grp.write('1/1/12', 255)
  500. end
  501.  
  502. sleep(1)
  503.  
  504. value = grp.getvalue('1/3/34')
  505. until (value == 0)
  506. end
  507. end
  508.  
  509. -- Panic
  510. -- Middels een drukknop wordt het huis PANIC gezet.
  511. function setPanic(active)
  512. if (grp.getvalue('1/3/34') ~= 2) then
  513. value = grp.getvalue('1/3/33')
  514.  
  515. grp.write('1/1/12', 0)
  516. grp.write('1/1/13', 0)
  517. grp.write('1/1/14', 0)
  518.  
  519. grp.write('1/1/20', 0)
  520. grp.write('1/1/21', 0)
  521. grp.write('1/1/22', 0)
  522.  
  523. grp.write('1/0/13', 0)
  524. grp.write('1/1/10', 0)
  525.  
  526. if (active == false) then
  527. grp.write('1/3/33', false)
  528. end
  529.  
  530. -- Alarm
  531. if (grp.getvalue('1/3/33') == true and active == true) then
  532. log('Middels een drukknop wordt het huis PANIC gezet.')
  533.  
  534. repeat
  535. if (grp.getvalue('1/1/20') == 255) then
  536. grp.write('1/1/20', 0)
  537. grp.write('1/1/12', 0)
  538. else
  539. grp.write('1/1/20', 255)
  540. grp.write('1/1/12', 255)
  541. end
  542.  
  543. sleep(1)
  544.  
  545. value = grp.getvalue('1/3/33')
  546. until (value == false)
  547. end
  548. end
  549.  
  550. if (actice == false) then
  551. grp.write('1/3/33', false)
  552. end
  553. end
  554.  
  555. -- Huisstatus
  556. function getHuisstatus()
  557. return grp.getvalue('1/3/32')
  558. end
Add Comment
Please, Sign In to add comment