Advertisement
boomx

RFID-Doorlock Chris

Jan 9th, 2016
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.50 KB | None | 0 0
  1. --[[
  2. %% properties
  3. 96 userCodes
  4. %% globals
  5. --]]
  6.  
  7. -- HIER DIE ARRAYS ANPASSEN (neue IDs können einfach hinzugefügt werden)
  8. local tagReader = 96 -- ID des RFID-Leser (bitte auch in dem Header ändern)
  9. local doorID = {16, 18, 20, 55} -- IDs der Sensoren
  10. local phoneID = {68, 113} -- IDs der Handys, an die eine Push geschickt werden soll
  11. local countID = 1000 -- Anzahl eurer devices (Muss nicht zwangsläufig geändert werden)
  12.  
  13. -- OPTIONEN
  14. -- Prüfung einer globalen Variable für Chip 3/4, ob diese gültig ist.
  15. -- Bei nicht Nutzung dieser Funktion müsst Ihr nichts weiter einrichten.
  16. -- Solltet Ihr diese nutzen wollen, dann müsst Ihr für jeden Chip eine Variable anlegen (z.B rfid_active1)
  17. local rfid_active3 = fibaro:getGlobalValue('rfid_active3') -- Variable zum Prüfen ob RFID-Chip1 gültig ist oder nicht (active = gültig/inactive = ungültig)
  18. local rfid_active4 = fibaro:getGlobalValue('rfid_active4') -- Variable zum Prüfen ob RFID-Chip2 gültig ist oder nicht (active = gültig/inactive = ungültig)
  19.  
  20. -- Hier könnt Ihr mit der 1 setzen, dass die RFID-Tags nur zum entschärfen genutzt werden sollen
  21. local rfid_use1 = 1 -- Wenn Ihr mit dem RFID-Tag1 nur entschärfen wollt, bitte auf 1 setzen
  22. local rfid_use2 = 1 -- Wenn Ihr mit dem RFID-Tag2 nur entschärfen wollt, bitte auf 1 setzen
  23. local rfid_use3 = 0 -- Wenn Ihr mit dem RFID-Tag3 nur entschärfen wollt, bitte auf 1 setzen
  24. local rfid_use4 = 0 -- Wenn Ihr mit dem RFID-Tag4 nur entschärfen wollt, bitte auf 1 setzen
  25.  
  26. -- Prüfung, ob Ihr eigene Aktionen ausführen möchtet (Siehe FUNKTIONEN FÜR AKTIONEN)
  27. local own_action = 1 -- Bitte auf 1 setzen, wenn Ihr eigene Aktionen ausführen wollt.
  28.  
  29. -- 10-stellige Byte-Array's (Bytes, weil RFID-Tags auch Zeichen ausserhalb des lesbaren Bereichs liefern)
  30. local rfid1 = {141, 10, 182, 84, 42, 0, 1, 4, 0, 0} -- <--ANPASSEN: Byte-Array eines RFID-Tags
  31. local rfid2 = {1, 5, 161, 84, 42, 0, 1, 4, 0, 0} -- <--ANPASSEN: Byte-Array eines RFID-Tags
  32. local rfid3 = {143, 80, 84, 84, 42, 0, 1, 4, 0, 0} -- <--ANPASSEN: Byte-Array eines RFID-Tags
  33. local rfid4 = {143, 174, 97, 84, 42, 0, 1, 4, 0, 0} -- <--ANPASSEN: Byte-Array eines RFID-Tags
  34. local code = {49, 49, 50, 50, 0, 0, 0, 0, 0, 0} -- <--ANPASSEN: Byte-Array für Zahlencode (1234 als Unicode)
  35.  
  36. -- DOORLOCK-Integration
  37. -- Hier kann ein Doorlock hinzugefügt werden, was die Tür nach schärfen/entschärfen automatisch auf/zu schließt.
  38. -- Die Option kann über die Variable doorlock auf true/false (Standart ist false) gesetzt werden
  39. -- ACHTUNG: Die Funktion zum Öffnen mit RFID/Code funktioniert nur, wenn presentState auf 'home' steht; NUTZUNG AUF EIGENE GEFAHR
  40. local doorlock = false -- false = Kein Doorlock im Einsatz; true = Doorlock soll über das Skript geschaltet werden
  41. local doorlockID = 211 -- ID des Doorlocks
  42. -- Wie soll der doorlock geöffnet werden (Falls jemand zu Hause ist und Ihr kommt zusätzlich nach Hause und wollt keinen Schlüssel nutzen)
  43. -- rfid = Über den RFID-Chip (dann kann dieser aber nicht mehr zum schärfen der Alarmanlage verwendet werden
  44. -- pin = Dann könnt Ihr mit einem zusätzlichen Code (open_code) die Tür öffnen
  45. local doorlock_open = 'pin'
  46. local open_code = {50, 50, 51, 52, 0, 0, 0, 0, 0, 0} -- <--ANPASSEN: Byte-Array für Zahlencode (1234 als Unicode)
  47. local rfid_doorlock1 = 1 -- Wenn Ihr mit dem RFID-Tag1 nur entschärfen wollt, bitte auf 1 setzen
  48. local rfid_doorlock2 = 1 -- Wenn Ihr mit dem RFID-Tag2 nur entschärfen wollt, bitte auf 1 setzen
  49. local rfid_doorlock3 = 0 -- Wenn Ihr mit dem RFID-Tag3 nur entschärfen wollt, bitte auf 1 setzen
  50. local rfid_doorlock4 = 0 -- Wenn Ihr mit dem RFID-Tag4 nur entschärfen wollt, bitte auf 1 setzen
  51.  
  52. local readerCode = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0} -- leeres Byte-Array, in dem nachher der gelesene Code steht (RFID-Tag oder Zahlencode)
  53.  
  54. -- FUNKTIONEN FÜR AKTIONEN (z.B. TTS, LICHT AUS)
  55. ------------------------------------------------
  56. -- Aktionen nach dem Schärfen mit Delay, bvor die Sensoren geschäft sind
  57. function actionsbeforeArmed()
  58. fibaro:debug('Führe eigene Funktionen vor Schärfen aus')
  59.  
  60. end
  61. -- Aktionen nach dem endgültigen Schärfen
  62. function actionsafterArmed()
  63. fibaro:debug('Führe eigene Funktionen nach dem Schärfen aus')
  64. fibaro:call(206, "turnOff")
  65. fibaro:call(63, "turnOff")
  66. fibaro:call(171, "turnOff")
  67. fibaro:call(199, "turnOff")
  68. end
  69. -- Aktionen nach dem Entschärfen
  70. function actionsafterDisarmed()
  71. fibaro:debug('Führe eigene Funktionen nach dem Entschärfen aus')
  72. fibaro:call(206, "turnOn")
  73. fibaro:call(63, "turnOn")
  74. fibaro:call(171, "turnOn")
  75. fibaro:call(199, "turnOn")
  76.  
  77. end
  78. -------------------------------------------------
  79. -- OPTIONEN ENDE -- AB HIER NICHTS MEHR ÄNDERN --
  80.  
  81. fibaro:debug('RFID-Scene Version 1.3 - Chris Special - gestartet');
  82.  
  83. Debug = function ( color, message )
  84. fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span"))
  85. end
  86.  
  87. if (rfid_active3 == nil) then
  88. fibaro:debug('Keine Variable für RFID3 gesetzt; Funktion wird nicht genutzt')
  89. local rfid_active3 = 'active'
  90. end
  91.  
  92. if (rfid_active4 == nil) then
  93. fibaro:debug('Keine Variable für RFID4 gesetzt; Funktion wird nicht genutzt')
  94. local rfid_active4 = 'active'
  95. end
  96.  
  97. -- FUNKTIONEN (bitte nicht ändern)
  98. function compareCodes(array1, array2)
  99. if (#array1 ~= 10 or #array2 ~= 10) then
  100. fibaro:debug('Grösse der Arrays ungültig...')
  101. return false
  102. end
  103. for i = 1, #array1 do
  104. if (array1[i] ~= array2[i]) then
  105. return false
  106. end
  107. end
  108. return true
  109. end
  110.  
  111. function armedcheckSensorID(array)
  112. for j=1, countID do
  113. if doorID[j] ~= nil then
  114. if (tonumber(fibaro:getValue(doorID[j], 'armed')) == 0) then
  115. return false
  116. end
  117. end
  118. end
  119. return true
  120. end
  121.  
  122. local startSource = fibaro:getSourceTrigger()
  123.  
  124. if (startSource['deviceID'] == tagReader) then
  125.  
  126. local delay = 0
  127.  
  128. -- RFID auslesen
  129. local userCodes = fibaro:get(tagReader, 'userCodes')
  130. jsontbl = json.decode(userCodes)
  131.  
  132. -- nach dem Code mit der ID 0 suchen
  133. for i = 1, #jsontbl do
  134. if (jsontbl[i].id == 0) then
  135.  
  136. -- die 10 Zeichen lesen und in das leere Byte-Array abfüllen
  137. for b = 1, string.len(jsontbl[i].code) do
  138. readerCode[b] = string.byte(jsontbl[i].code,b)
  139. end
  140.  
  141. if (compareCodes(rfid1, readerCode) or compareCodes(rfid2, readerCode) or (compareCodes(rfid3, readerCode) and rfid_active3 == 'active') or (compareCodes(rfid4, readerCode) and rfid_active4 == 'active')) then
  142. if (fibaro:getGlobal('presentState') == 'Home') then
  143.  
  144. -- Prüfung, ob RFID zum Schärfen genutzt werden darf/Zum Öffnen der Tür
  145. if (compareCodes(rfid1, readerCode) and rfid_use1 == 1) then
  146. fibaro:debug('Scene abgebrochen. Mit diesem RFID-Tag 1 dürfen die Sensoren nicht geschärft werden.')
  147. if (doorlock and rfid_doorlock1 == 1) then
  148. fibaro:debug('Doorlock vorhanden, Tür wird geöffnet.')
  149. fibaro:call(doorlockID, 'unsecure')
  150. end
  151. fibaro:abort()
  152. end
  153. ---------------ENDE PRÜFUNG--------------------------
  154. -- Prüfung, ob RFID zum Schärfen genutzt werden darf/Zum Öffnen der Tür
  155. if (compareCodes(rfid2, readerCode) and rfid_use2 == 1) then
  156. fibaro:debug('Scene abgebrochen. Mit diesem RFID-Tag 2 dürfen die Sensoren nicht geschärft werden.')
  157. if (doorlock and rfid_doorlock2 == 1) then
  158. fibaro:debug('Doorlock vorhanden, Tür wird geöffnet.')
  159. fibaro:call(doorlockID, 'unsecure')
  160. end
  161. fibaro:abort()
  162. end
  163. ---------------ENDE PRÜFUNG--------------------------
  164. -- Prüfung, ob RFID zum Schärfen genutzt werden darf/Zum Öffnen der Tür
  165. if (compareCodes(rfid3, readerCode) and rfid_use3 == 1) then
  166. fibaro:debug('Scene abgebrochen. Mit diesem RFID-Tag 3 dürfen die Sensoren nicht geschärft werden.')
  167. if (doorlock and rfid_doorlock3 == 1) then
  168. fibaro:debug('Doorlock vorhanden, Tür wird geöffnet.')
  169. fibaro:call(doorlockID, 'unsecure')
  170. end
  171. fibaro:abort()
  172. end
  173. ---------------ENDE PRÜFUNG--------------------------
  174. -- Prüfung, ob RFID zum Schärfen genutzt werden darf/Zum Öffnen der Tür
  175. if (compareCodes(rfid4, readerCode) and rfid_use4 == 1) then
  176. fibaro:debug('Scene abgebrochen. Mit diesem RFID-Tag 4 dürfen die Sensoren nicht geschärft werden.')
  177. if (doorlock and rfid_doorlock4 == 1) then
  178. fibaro:debug('Doorlock vorhanden, Tür wird geöffnet.')
  179. fibaro:call(doorlockID, 'unsecure')
  180. end
  181. fibaro:abort()
  182. end
  183.  
  184. fibaro:debug('RFID-Tag akzeptiert - Haus wurde verlassen')
  185. fibaro:setGlobal('presentState', 'Away')
  186. if (own_action == 1) then
  187. actionsbeforeArmed()
  188. end
  189. local delay = tonumber(fibaro:getValue(doorID[1], "armDelay"))
  190. if (delay ~= 0) then
  191. fibaro:debug('Arm-Delay erkannt. Arm-Delay: ' ..delay)
  192. end
  193. for j=1, countID do
  194. if doorID[j] ~= nil then
  195. if (tonumber(fibaro:getValue(doorID[j], 'value')) == 0) then
  196. fibaro:call(doorID[j], 'setArmed', '1')
  197. else
  198. local sensorname = fibaro:getName(doorID[j])
  199. local sensorroom = fibaro:getRoomNameByDeviceID(doorID[j])
  200. fibaro:debug('ACHTUNG: ' .. sensorname .. ' im Raum: ' .. sensorroom .. ' nicht sicher. Sende Push.')
  201. for k=1, countID do
  202. if phoneID[k] ~= nil then
  203. fibaro:call(phoneID[k], 'sendPush', 'ACHTUNG: ' .. sensorname .. ' im Raum: ' .. sensorroom .. ' nicht sicher.')
  204. end
  205. end
  206. end
  207. end
  208. end
  209. fibaro:debug('Warte ' .. delay .. ' Sekunden')
  210. delay = delay + 1
  211. fibaro:sleep(delay*1000)
  212. if (fibaro:getGlobal('presentState') == 'Away') then
  213. if (armedcheckSensorID(doorID)) then
  214. if (own_action == 1) then
  215. actionsafterArmed()
  216. end
  217. for l=1, countID do
  218. if phoneID[l] ~= nil then
  219. fibaro:call(phoneID[l], 'sendPush', 'RFID: Alarmanlage SCHARF')
  220. end
  221. end
  222. fibaro:debug('Alle Sensoren geschärft. Sende Push')
  223. if (doorlock) then
  224. fibaro:call(doorlockID, 'secure')
  225. fibaro:debug('doorlock vorhanden, Tür wurde geschlossen!')
  226. end
  227. else
  228. fibaro:debug('Es konnten nicht alle Sensoren scharf geschaltet werden')
  229. end
  230. else
  231. fibaro:debug('Alarm wurde während der Delay-Time deaktiviert')
  232. end
  233.  
  234. elseif (fibaro:getGlobal('presentState') == 'Away') then
  235. fibaro:debug('RFID-Tag akzeptiert - Welcome@Home')
  236. fibaro:setGlobal('presentState', 'Home')
  237. for m=1, countID do
  238. if doorID[m] ~= nil then
  239. fibaro:call(doorID[m], 'setArmed', '0')
  240. end
  241. end
  242.  
  243. if (armedcheckSensorID(doorID)) then
  244. fibaro:debug('Es konnten nicht alle Sensoren entschäft werden');
  245. for t=1, countID do
  246. if doorID[t] ~= nil then
  247. if (tonumber(fibaro:getValue(doorID[t], 'armed')) == 1) then
  248. local sensorname = fibaro:getName(doorID[t])
  249. local sensorroom = fibaro:getRoomNameByDeviceID(doorID[t])
  250. fibaro:debug('ACHTUNG: ' .. sensorname .. ' im Raum: ' .. sensorroom .. ' konnte nicht entschärft werden. Sende Push.')
  251. for o=1, countID do
  252. if phoneID[o] ~= nil then
  253. fibaro:call(phoneID[o], 'sendPush', 'ACHTUNG: ' .. sensorname .. ' im Raum: ' .. sensorroom .. ' nicht entschärft.')
  254. end
  255. end
  256. end
  257. end
  258. end
  259. else
  260. fibaro:debug('Alle Sensoren entschärft. Sende Push')
  261. if (doorlock) then
  262. fibaro:call(doorlockID, 'unsecure')
  263. fibaro:debug('doorlock vorhanden, Tür wurde geöffnet')
  264. end
  265. for l=1, countID do
  266. if phoneID[l] ~= nil then
  267. fibaro:call(phoneID[l], 'sendPush', 'RFID: Alarmanlage entschärft')
  268. end
  269. end
  270. if (own_action == 1) then
  271. actionsafterDisarmed()
  272. end
  273. end
  274.  
  275. else
  276. fibaro:debug('RFID-Tag akzeptiert - Variablen nicht korrekt gesetzt.')
  277. end
  278.  
  279. elseif (compareCodes(code, readerCode)) then
  280. fibaro:debug('PIN-Code akzeptiert.')
  281. fibaro:setGlobal('presentState', 'Away')
  282. for z=1, countID do
  283. if doorID[z] ~= nil then
  284. if (tonumber(fibaro:getValue(doorID[z], 'value')) == 0) then
  285. fibaro:call(doorID[z], 'setArmed', '1')
  286. else
  287. local sensorname = fibaro:getName(doorID[z])
  288. local sensorroom = fibaro:getRoomNameByDeviceID(doorID[z])
  289. fibaro:debug('ACHTUNG: ' .. sensorname .. ' im Raum: ' .. sensorroom .. ' nicht sicher. Sende Push.')
  290. for y=1, countID do
  291. if phoneID[y] ~= nil then
  292. fibaro:call(phoneID[y], 'sendPush', 'ACHTUNG: ' .. sensorname .. ' im Raum: ' .. sensorroom .. ' nicht sicher.')
  293. end
  294. end
  295. end
  296. end
  297. end
  298. if (own_action == 1) then
  299. actionsbeforeArmed()
  300. end
  301. local delay = tonumber(fibaro:getValue(doorID[1], "armDelay"))
  302. if (delay ~= 0) then
  303. fibaro:debug('Arm-Delay erkannt. Arm-Delay: ' ..delay)
  304. end
  305. fibaro:debug('Warte ' .. delay .. ' Sekunden')
  306. delay = delay + 1
  307. fibaro:sleep(delay*1000)
  308. if (fibaro:getGlobal('presentState') == 'Away') then
  309. if (armedcheckSensorID(doorID)) then
  310. if (own_action == 1) then
  311. actionsafterArmed()
  312. end
  313. for l=1, countID do
  314. if phoneID[l] ~= nil then
  315. fibaro:call(phoneID[l], 'sendPush', 'PIN-CODE: Alarmanlage SCHARF')
  316. end
  317. end
  318. fibaro:debug('Alle Sensoren geschärft. Sende Push')
  319. if (doorlock) then
  320. fibaro:call(doorlockID, 'secure')
  321. fibaro:debug('doorlock vorhanden, Tür wurde geschlossen')
  322. end
  323. else
  324. fibaro:debug('Es konnten nicht alle Sensoren scharf geschaltet werden');
  325. end
  326. else
  327. fibaro:debug('Alarm wurde während der Delay-Time deaktiviert');
  328. end
  329.  
  330. elseif (compareCodes(open_code, readerCode) and fibaro:getGlobal('presentState') == 'Home' and doorlock_open == 'pin') then
  331. fibaro:debug('PIN-Code zum Öffnen der Tür akzeptiert.')
  332. fibaro:call(doorlockID, 'unsecure')
  333. fibaro:debug('doorlock vorhanden, es war schon jemand zu Hause, Tür wird geöffnet')
  334. for r=1, countID do
  335. if phoneID[r] ~= nil then
  336. fibaro:call(phoneID[r], 'sendPush', 'Tür würde mit PIN geöffnet')
  337. end
  338. end
  339. else
  340. fibaro:debug('RFID-Tag/PIN-Code wurde abgelehnt. Manipulation oder Karte inaktiv? Push versendet')
  341. for r=1, countID do
  342. if phoneID[r] ~= nil then
  343. fibaro:call(phoneID[r], 'sendPush', 'ACHTUNG: Code falsch eingegeben/RFID inaktiv')
  344. end
  345. end
  346. end
  347. end
  348. end
  349. else
  350. fibaro:debug('Szene manuell gestartet. Auslesen der Informationen')
  351. local userCodes = fibaro:get(tagReader, 'userCodes')
  352. jsontbl = json.decode(userCodes)
  353.  
  354. -- nach dem Code mit der ID 0 suchen
  355. for i = 1, #jsontbl do
  356. if (jsontbl[i].id == 0) then
  357.  
  358. -- die 10 Zeichen lesen und in das leere Byte-Array abfüllen
  359. for b = 1, string.len(jsontbl[i].code) do
  360. readerCode[b] = string.byte(jsontbl[i].code,b)
  361. end
  362. fibaro:debug('RFID-INFO: {' .. readerCode[1] .. ', ' .. readerCode[2] .. ', ' .. readerCode[3] .. ', ' .. readerCode[4] .. ', ' .. readerCode[5] .. ', ' .. readerCode[6] .. ', ' .. readerCode[7] .. ', ' .. readerCode[8] .. ', ' .. readerCode[9] .. ', ' .. readerCode[10] .. '}')
  363. end
  364. end
  365. fibaro:debug('Diese Info in die lokalen Arrays rfid1,rfid2,code eintragen')
  366. if (fibaro:getGlobal('presentState') ~= nil) then
  367. local presentState = fibaro:getGlobal('presentState')
  368. Debug( 'green', 'Die Variable presentState wurde gefunden. Status: ' ..presentState)
  369. else
  370. Debug( 'red', 'Die Variable presentState wurde nicht gefunden. Bitte einrichten! rfid_alarm wird nicht mehr unterstützt.')
  371. end
  372. local delay = tonumber(fibaro:getValue(doorID[1], 'armDelay'))
  373. if (delay ~= 0) then
  374. fibaro:debug('Arm-Delay erkannt. Arm-Delay: ' ..delay)
  375. else
  376. fibaro:debug('Kein Arm-Delay erkannt.')
  377. end
  378. if (doorlock) then
  379. Debug( 'green', 'doorlock mit der ID ' ..doorlockID.. ' erkannt');
  380. else
  381. fibaro:debug('Kein doorlock erkannt')
  382. end
  383. if (doorlock) then
  384. if (doorlock_open == 'rfid') then
  385. Debug( 'white', 'doorlock soll mit den RFID-Tags geöffnet werden können. Prüfe Abhängigkeiten.')
  386. local error_rfid = 0
  387. if (rfid_use1 == 0 and rfid_doorlock1 == 1) then
  388. Debug( 'red', 'RFID-Tag 1 soll zum Schärfen und zum Öffnen genutzt werden. Dies ist nicht möglich. Bitte ändern!')
  389. error_rfid = 1
  390. end
  391. if (rfid_use2 == 0 and rfid_doorlock2 == 1) then
  392. Debug( 'red', 'RFID-Tag 2 soll zum Schärfen und zum Öffnen genutzt werden. Dies ist nicht möglich. Bitte ändern!')
  393. error_rfid = 1
  394. end
  395. if (rfid_use3 == 0 and rfid_doorlock3 == 1) then
  396. Debug( 'red', 'RFID-Tag 3 soll zum Schärfen und zum Öffnen genutzt werden. Dies ist nicht möglich. Bitte ändern!')
  397. error_rfid = 1
  398. end
  399. if (rfid_use4 == 0 and rfid_doorlock4 == 1) then
  400. Debug( 'red', 'RFID-Tag 4 soll zum Schärfen und zum Öffnen genutzt werden. Dies ist nicht möglich. Bitte ändern!')
  401. error_rfid = 1
  402. end
  403. if (error_rfid == 0) then
  404. Debug( 'green', 'Abhängigkeiten bei den RFID-Tags in Ordnung')
  405. end
  406. elseif (doorlock_open == 'pin') then
  407. Debug( 'white', 'doorlock soll mit einem PIN geöffnet werden. Prüfe PINs.')
  408. if (compareCodes(code, open_code)) then
  409. Debug( 'red', 'Die PINs zum öffnen und schärfen sind gleich, bitte einen ändern.')
  410. else
  411. Debug( 'green', 'Die PINs sind in Ordnung')
  412. end
  413. end
  414. end
  415. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement