169 lines
5.0 KiB
Ruby
169 lines
5.0 KiB
Ruby
class DoorLog < ActiveRecord::Base
|
|
attr_accessible :data, :key
|
|
require 'open-uri'
|
|
|
|
def self.execute_command(command)
|
|
output = ""
|
|
# load config values
|
|
door_access_url = APP_CONFIG['door_access_url']
|
|
door_access_password = APP_CONFIG['door_access_password']
|
|
|
|
#login
|
|
source = open("#{door_access_url}?e=#{door_access_password}").read
|
|
results = source.scan(/ok/)
|
|
|
|
#only continue if we've got an OK login
|
|
if(results.size > 0) then
|
|
# Parse the command and result
|
|
parsing = parse_command(command)
|
|
output += parsing[:output]
|
|
url_param = parsing[:url_param]
|
|
|
|
# Execute the command
|
|
open("#{door_access_url}?#{url_param}")
|
|
|
|
self.download_status # Update the status cache
|
|
else
|
|
output += 'Failed to connect to door system.'
|
|
end
|
|
|
|
#logout
|
|
open("#{door_access_url}?e=0000")
|
|
|
|
return output
|
|
end
|
|
|
|
def self.parse_command(command)
|
|
output = ""
|
|
url_param = ""
|
|
# @commands = [
|
|
# ["Unlock all doors","unlock"],
|
|
# ["Unlock Front door","unlock-front"],
|
|
# ["Unlock Rear door","unlock-rear"],
|
|
# ["Lock all doors","lock"],
|
|
# ["Lock Front door","lock-front"],
|
|
# ["Lock Rear door","lock-rear"],
|
|
# ["Open Front door","open-front"],
|
|
# ["Open Rear door","open-rear"],
|
|
# ["Arm alarm","arm"],
|
|
# ["Disarm alarm","disarm"]
|
|
# ]
|
|
case command
|
|
when "open-front"
|
|
output += "Front door opened."
|
|
url_param = "o1"
|
|
when "open-rear"
|
|
output += "Rear door opened."
|
|
url_param = "o2"
|
|
when "u", "unlock"
|
|
output += "Doors unlocked, remember to re-lock them."
|
|
url_param = "u"
|
|
when "u1", "unlock-front"
|
|
output += "Front Door unlocked, remember to re-lock it."
|
|
url_param = "u=1"
|
|
when "u2", "unlock-rear"
|
|
output += "Rear Door unlocked, remember to re-lock it."
|
|
url_param = "u=2"
|
|
when "lock", "l"
|
|
output += "Doors locked."
|
|
url_param = "l"
|
|
when "lock-front", "l1"
|
|
output += "Front Door locked."
|
|
url_param = "l=1"
|
|
when "lock-rear", "l2"
|
|
output += "Rear Door locked."
|
|
url_param = "l=2"
|
|
when "arm"
|
|
output += "Armed."
|
|
url_param = "2"
|
|
when "disarm"
|
|
output += "Disarmed."
|
|
url_param = "1"
|
|
else
|
|
output += "Fail. Don't be a naughty user!"
|
|
url_param = "9" # Using 9 because it's just status, no harm done
|
|
end
|
|
return {:output => output, :url_param => url_param}
|
|
end
|
|
|
|
def self.show_status
|
|
door_logs = DoorLog.where(key: ["door_1_locked","door_2_locked"]).order('created_at DESC').take(2)
|
|
door_1_locked = parse_locked_status(door_logs, "door_1_locked")
|
|
door_2_locked = parse_locked_status(door_logs, "door_2_locked")
|
|
|
|
# Doors are unlocked if 1 AND 2 are NOT locked
|
|
status = {:unlocked => (!door_1_locked && !door_2_locked), :door_1_locked => door_1_locked, :door_2_locked => door_2_locked }
|
|
end
|
|
|
|
def self.parse_locked_status(door_logs, door_key)
|
|
door_logs_selected = door_logs.select{|s| s.key == door_key }
|
|
if door_logs_selected.present?
|
|
door_data = door_logs_selected.first.data
|
|
if door_data == 0 # 0 = unlocked
|
|
return false
|
|
else
|
|
return true # 1 = locked
|
|
end
|
|
end
|
|
end
|
|
|
|
def self.download_status
|
|
# load config values
|
|
door_access_url = APP_CONFIG['door_access_url']
|
|
door_access_password = APP_CONFIG['door_access_password']
|
|
|
|
# query for status
|
|
source = open("#{door_access_url}?9").read
|
|
# expect {"armed"=>255, "activated"=>255, "alarm_3"=>1, "alarm_2"=>1, "door_1_locked"=>1, "door_2_locked"=>1}
|
|
# See https://github.com/heatsynclabs/Open_Access_Control_Ethernet for more info
|
|
@status = JSON.parse(source)
|
|
@status.each do |key,value|
|
|
DoorLog.create!({:key => key, :data => value})
|
|
end
|
|
end
|
|
|
|
def self.download_from_door
|
|
# load config values
|
|
door_access_url = APP_CONFIG['door_access_url']
|
|
door_access_password = APP_CONFIG['door_access_password']
|
|
|
|
# connect to door access system
|
|
source = open("#{door_access_url}?e=#{door_access_password}").read
|
|
results = source.scan(/ok/)
|
|
if(results.size > 0) then
|
|
@end_results = Array.new
|
|
|
|
#only continue if we've got an OK login
|
|
source = open("#{door_access_url}?z").read
|
|
results = source.scan(/(.*): (.*)\r\n/)
|
|
|
|
results.each do |r|
|
|
if(r[0] != "\000") then
|
|
DoorLog.create!({:key => r[0], :data => r[1]})
|
|
end
|
|
end
|
|
|
|
#clear log
|
|
open("#{door_access_url}?y")
|
|
#logout
|
|
open("#{door_access_url}?e=0000")
|
|
|
|
if(results.size > 0) then
|
|
#only return true if we got some kind of decent response
|
|
return results
|
|
else
|
|
# We didn't get a decent response.
|
|
return false
|
|
end
|
|
else
|
|
# We didn't get an OK login.
|
|
return false
|
|
end
|
|
end
|
|
|
|
def self.key_legend
|
|
{'G' => "Granted", "R" => "Read", "D" => "Denied",
|
|
'g' => "granted", "r" => "read", "d" => "denied"}
|
|
end
|
|
end
|